import { dedent } from 'ts-dedent'; import { once, logger } from '@storybook/node-logger'; import path5, { parse, join, dirname } from 'path'; import { CriticalPresetLoadError, InvalidStoriesEntryError, MissingFrameworkFieldError, InvalidFrameworkNameError, CouldNotEvaluateFrameworkError } from '@storybook/core-events/server-errors'; import fs3 from 'fs'; import { glob } from 'glob'; import resolveFrom from 'resolve-from'; import Cache from 'file-system-cache'; import findCacheDirectory from 'find-cache-dir'; import { getEnvironment } from 'lazy-universal-dotenv'; import findUp, { sync } from 'find-up'; import fse, { readJSON } from 'fs-extra'; import fetch from 'node-fetch'; import * as pico from 'picomatch'; import Handlebars from 'handlebars'; import chalk from 'chalk'; import { sync as sync$1 } from 'pkg-dir'; var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var boost=new Set([".js",".jsx",".ts",".tsx",".cts",".mts",".cjs",".mjs"]);function sortExtensions(){return [...Array.from(boost)]}var possibleExtensions=sortExtensions();function getInterpretedFile(pathToFile){return possibleExtensions.map(ext=>pathToFile.endsWith(ext)?pathToFile:`${pathToFile}${ext}`).find(candidate=>fs3.existsSync(candidate))}function getInterpretedFileWithExt(pathToFile){return possibleExtensions.map(ext=>({path:pathToFile.endsWith(ext)?pathToFile:`${pathToFile}${ext}`,ext})).find(candidate=>fs3.existsSync(candidate.path))}var registered=!1;function interopRequireDefault(filePath){let hasEsbuildBeenRegistered=!!__require("module")._extensions[".ts"];if(registered===!1&&!hasEsbuildBeenRegistered){let{register}=__require("esbuild-register/dist/node");registered=!0,register({target:`node${process.version.slice(1)}`,format:"cjs",hookIgnoreNodeModules:!0,keepNames:!0,tsconfigRaw:`{ "compilerOptions": { "strict": false, "skipLibCheck": true, }, }`});}let result=__require(filePath);return typeof result=="object"&&result!==null&&typeof result.default<"u"?result.default:result}function getCandidate(paths){for(let i=0;i1&&once.warn(dedent` Multiple main files found in your configDir (${path5.resolve(configDir)}). Storybook will use the first one found and ignore the others. Please remove the extra files. `),!mainConfigPath)throw new Error(dedent` No configuration files have been found in your configDir (${path5.resolve(configDir)}). Storybook needs "main.js" file, please add it (or pass a custom config dir flag to Storybook to tell where your main.js file is located at). `)}function loadCustomPresets({configDir}){validateConfigurationFiles(configDir);let presets=serverRequire(path5.resolve(configDir,"presets"));if(serverRequire(path5.resolve(configDir,"main"))){let resolved=serverResolve(path5.resolve(configDir,"main"));if(resolved)return [resolved]}return presets||[]}var safeResolveFrom=(path13,file)=>{try{return resolveFrom(path13,file)}catch{return}},safeResolve=file=>{try{return __require.resolve(file)}catch{return}};function normalizePath(id){return path5.posix.normalize(slash(id))}function stripAbsNodeModulesPath(absPath){let splits=absPath.split(`node_modules${path5.sep}`);return normalizePath(splits[splits.length-1])}var isObject=val=>val!=null&&typeof val=="object"&&Array.isArray(val)===!1,isFunction=val=>typeof val=="function";function filterPresetsConfig(presetsConfig){return presetsConfig.filter(preset=>{let presetName=typeof preset=="string"?preset:preset.name;return !/@storybook[\\\\/]preset-typescript/.test(presetName)})}function resolvePathToMjs(filePath){let{dir,name}=parse(filePath),mjsPath=join(dir,`${name}.mjs`);return safeResolve(mjsPath)?mjsPath:filePath}function resolvePresetFunction(input,presetOptions,storybookOptions){return isFunction(input)?[...input({...storybookOptions,...presetOptions})]:Array.isArray(input)?[...input]:[]}var resolveAddonName=(configDir,name,options)=>{let resolve=name.startsWith("/")?safeResolve:safeResolveFrom.bind(null,configDir),resolved=resolve(name);if(resolved){let{dir:fdir,name:fname}=parse(resolved);if(name.match(/\/(manager|register(-panel)?)(\.(js|mjs|ts|tsx|jsx))?$/))return {type:"virtual",name,managerEntries:[resolvePathToMjs(join(fdir,fname))]};if(name.match(/\/(preset)(\.(js|mjs|ts|tsx|jsx))?$/))return {type:"presets",name:resolved}}let checkExists=exportName=>{if(resolve(`${name}${exportName}`))return `${name}${exportName}`},absolutizeExport=(exportName,preferMJS)=>{let found=resolve(`${name}${exportName}`);if(found)return preferMJS?resolvePathToMjs(found):found},managerFile=absolutizeExport("/manager",!0),registerFile=absolutizeExport("/register",!0)||absolutizeExport("/register-panel",!0),previewFile=checkExists("/preview"),previewFileAbsolute=absolutizeExport("/preview",!0),presetFile=absolutizeExport("/preset",!1);if(!(managerFile||previewFile)&&presetFile)return {type:"presets",name:presetFile};if(managerFile||registerFile||previewFile||presetFile){let managerEntries=[];return managerFile&&managerEntries.push(managerFile),!managerFile&®isterFile&&!presetFile&&managerEntries.push(registerFile),{type:"virtual",name,...managerEntries.length?{managerEntries}:{},...previewFile?{previewAnnotations:[previewFileAbsolute?{bare:previewFile.includes("node_modules")?stripAbsNodeModulesPath(previewFile):previewFile,absolute:previewFileAbsolute}:previewFile]}:{},...presetFile?{presets:[{name:presetFile,options}]}:{}}}if(resolved)return {type:"presets",name:resolved}},map=({configDir})=>item=>{let options=isObject(item)&&item.options||void 0,name=isObject(item)?item.name:item,resolved;try{resolved=resolveAddonName(configDir,name,options);}catch{logger.error(`Addon value should end in /manager or /preview or /register OR it should be a valid preset https://storybook.js.org/docs/react/addons/writing-presets/ ${item}`);return}if(!resolved){logger.warn(`Could not resolve addon "${name}", skipping. Is it installed?`);return}return {...options?{options}:{},...resolved}};async function getContent(input){if(input.type==="virtual"){let{type,name:name2,...rest}=input;return rest}let name=input.name?input.name:input;return interopRequireDefault(name)}async function loadPreset(input,level,storybookOptions){let presetName=input.name?input.name:input;try{let presetOptions=input.options?input.options:{},contents=await getContent(input);if(typeof contents=="function"&&(contents=contents(storybookOptions,presetOptions)),Array.isArray(contents))return await loadPresets(contents,level+1,storybookOptions);if(isObject(contents)){let{addons:addonsInput=[],presets:presetsInput=[],...rest}=contents,filter=i=>!0;storybookOptions.isCritical!==!0&&(storybookOptions.build?.test?.disabledAddons?.length||0)>0&&(filter=i=>{let name=i.name?i.name:i;return !storybookOptions.build?.test?.disabledAddons?.find(n=>name.includes(n))});let subPresets=resolvePresetFunction(presetsInput,presetOptions,storybookOptions).filter(filter),subAddons=resolvePresetFunction(addonsInput,presetOptions,storybookOptions).filter(filter);return [...await loadPresets([...subPresets],level+1,storybookOptions),...await loadPresets([...subAddons.map(map(storybookOptions))].filter(Boolean),level+1,storybookOptions),{name:presetName,preset:rest,options:presetOptions}]}throw new Error(dedent` ${input} is not a valid preset `)}catch(error){if(storybookOptions?.isCritical)throw new CriticalPresetLoadError({error,presetName});let warning=level>0?` Failed to load preset: ${JSON.stringify(input)} on level ${level}`:` Failed to load preset: ${JSON.stringify(input)}`;return logger.warn(warning),logger.error(error),[]}}async function loadPresets(presets,level,storybookOptions){return !presets||!Array.isArray(presets)||!presets.length?[]:(await Promise.all(presets.map(async preset=>loadPreset(preset,level,storybookOptions)))).reduce((acc,loaded)=>acc.concat(loaded),[])}function applyPresets(presets,extension,config,args,storybookOptions){let presetResult=new Promise(res=>res(config));return presets.length?presets.reduce((accumulationPromise,{preset,options})=>{let change=preset[extension];if(!change)return accumulationPromise;if(typeof change=="function"){let extensionFn=change,context={preset,combinedOptions:{...storybookOptions,...args,...options,presetsList:presets,presets:{apply:async(ext,c,a={})=>applyPresets(presets,ext,c,a,storybookOptions)}}};return accumulationPromise.then(newConfig=>extensionFn.call(context.preset,newConfig,context.combinedOptions))}return accumulationPromise.then(newConfig=>Array.isArray(newConfig)&&Array.isArray(change)?[...newConfig,...change]:isObject(newConfig)&&isObject(change)?{...newConfig,...change}:change)},presetResult):presetResult}async function getPresets(presets,storybookOptions){let loadedPresets=await loadPresets(presets,0,storybookOptions);return {apply:async(extension,config,args={})=>applyPresets(loadedPresets,extension,config,args,storybookOptions)}}async function loadAllPresets(options){let{corePresets=[],overridePresets=[],...restOptions}=options,presetsConfig=[...corePresets,...loadCustomPresets(options),...overridePresets],filteredPresetConfig=filterPresetsConfig(presetsConfig);return filteredPresetConfig.lengthentry=>{let name=entry.name||entry;return name&&name.includes(addon)},isCorrectOrder=(addons,before,after)=>{let essentialsIndex=addons.findIndex(predicateFor("@storybook/addon-essentials")),beforeIndex=addons.findIndex(predicateFor(before.name)),afterIndex=addons.findIndex(predicateFor(after.name));return beforeIndex===-1&&before.inEssentials&&(beforeIndex=essentialsIndex),afterIndex===-1&&after.inEssentials&&(afterIndex=essentialsIndex),beforeIndex!==-1&&afterIndex!==-1&&beforeIndex<=afterIndex},checkAddonOrder=async({before,after,configFile,getConfig})=>{try{let config=await getConfig(configFile);if(!config?.addons){logger.warn("Unable to find 'addons' config in main Storybook config");return}if(!isCorrectOrder(config.addons,before,after)){let orEssentials=" (or '@storybook/addon-essentials')",beforeText=`'${before.name}'${before.inEssentials?orEssentials:""}`,afterText=`'${after.name}'${after.inEssentials?orEssentials:""}`;logger.warn(`Expected ${beforeText} to be listed before ${afterText} in main Storybook config.`);}}catch{logger.warn(`Unable to load config file: ${configFile}`);}};var getProjectRoot=()=>{let result;try{let found=findUp.sync(".git",{type:"directory"});found&&(result=path5.join(found,".."));}catch{}try{let found=findUp.sync(".svn",{type:"directory"});found&&(result=result||path5.join(found,".."));}catch{}try{let found=findUp.sync(".yarn",{type:"directory"});found&&(result=result||path5.join(found,".."));}catch{}try{result=result||__dirname.split("node_modules")[0];}catch{}return result||process.cwd()},nodePathsToArray=nodePath=>nodePath.split(process.platform==="win32"?";":":").filter(Boolean).map(p=>path5.resolve("./",p)),relativePattern=/^\.{1,2}([/\\]|$)/;function normalizeStoryPath(filename){return relativePattern.test(filename)?filename:`.${path5.sep}${filename}`}function loadEnvs(options={}){let defaultNodeEnv=options.production?"production":"development",env={NODE_ENV:process.env.NODE_ENV||defaultNodeEnv,NODE_PATH:process.env.NODE_PATH||"",STORYBOOK:process.env.STORYBOOK||"true",PUBLIC_URL:options.production?".":""};Object.keys(process.env).filter(name=>/^STORYBOOK_/.test(name)).forEach(name=>{env[name]=process.env[name];});let base=Object.entries(env).reduce((acc,[k,v])=>Object.assign(acc,{[k]:JSON.stringify(v)}),{}),{stringified,raw}=getEnvironment({nodeEnv:env.NODE_ENV}),fullRaw={...env,...raw};return fullRaw.NODE_PATH=nodePathsToArray(fullRaw.NODE_PATH||""),{stringified:{...base,...stringified},raw:fullRaw}}var stringifyEnvs=raw=>Object.entries(raw).reduce((acc,[key,value])=>(acc[key]=JSON.stringify(value),acc),{}),stringifyProcessEnvs=raw=>Object.entries(raw).reduce((acc,[key,value])=>(acc[`process.env.${key}`]=JSON.stringify(value),acc),{});var findDistEsm=(cwd,relativePath)=>{let nearestPackageJson=sync("package.json",{cwd});if(!nearestPackageJson)throw new Error(`Could not find package.json in: ${cwd}`);let packageDir=path5.dirname(nearestPackageJson);return path5.join(packageDir,"dist","esm",relativePath)};var NODE_MODULES_RE=/node_modules/,commonGlobOptions=glob2=>NODE_MODULES_RE.test(glob2)?{}:{ignore:["**/node_modules/**"]};async function getBuilderOptions(options){let framework=await options.presets.apply("framework",{},options);if(typeof framework!="string"&&framework?.options?.builder)return framework.options.builder;let{builder}=await options.presets.apply("core",{},options);return typeof builder!="string"&&builder?.options?builder.options:{}}async function getFrameworkName(options){let framework=await options.presets.apply("framework","",options);if(!framework)throw new Error(dedent` You must specify a framework in '.storybook/main.js' config. https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#framework-field-mandatory `);return typeof framework=="object"?framework.name:framework}async function getRendererName(options){let{renderer}=await options.presets.apply("core",{},options);return renderer||getFrameworkName(options)}function getStorybookConfiguration(storybookScript,shortName,longName){if(!storybookScript)return null;let parts=storybookScript.split(/[\s='"]+/),index=parts.indexOf(longName);return index===-1&&(index=parts.indexOf(shortName)),index===-1?null:parts[index+1]}var rendererPackages={"@storybook/react":"react","@storybook/vue":"vue","@storybook/vue3":"vue3","@storybook/angular":"angular","@storybook/html":"html","@storybook/web-components":"web-components","@storybook/polymer":"polymer","@storybook/ember":"ember","@storybook/svelte":"svelte","@storybook/preact":"preact","@storybook/server":"server","storybook-framework-qwik":"qwik","storybook-solidjs":"solid"},frameworkPackages={"@storybook/angular":"angular","@storybook/ember":"ember","@storybook/html-vite":"html-vite","@storybook/html-webpack5":"html-webpack5","@storybook/nextjs":"nextjs","@storybook/preact-vite":"preact-vite","@storybook/preact-webpack5":"preact-webpack5","@storybook/react-vite":"react-vite","@storybook/react-webpack5":"react-webpack5","@storybook/server-webpack5":"server-webpack5","@storybook/svelte-vite":"svelte-vite","@storybook/svelte-webpack5":"svelte-webpack5","@storybook/sveltekit":"sveltekit","@storybook/vue3-vite":"vue3-vite","@storybook/vue3-webpack5":"vue3-webpack5","@storybook/vue-vite":"vue-vite","@storybook/vue-webpack5":"vue-webpack5","@storybook/web-components-vite":"web-components-vite","@storybook/web-components-webpack5":"web-components-webpack5","storybook-framework-qwik":"qwik","storybook-solidjs-vite":"solid"},builderPackages=["@storybook/builder-webpack5","@storybook/builder-vite"],logger3=console,findDependency=({dependencies,devDependencies,peerDependencies},predicate)=>[Object.entries(dependencies||{}).find(predicate),Object.entries(devDependencies||{}).find(predicate),Object.entries(peerDependencies||{}).find(predicate)],getRendererInfo=packageJson=>{let[dep,devDep,peerDep]=findDependency(packageJson,([key])=>rendererPackages[key]),[pkg,version]=dep||devDep||peerDep||[];return dep&&devDep&&dep[0]===devDep[0]&&logger3.warn(`Found "${dep[0]}" in both "dependencies" and "devDependencies". This is probably a mistake.`),dep&&peerDep&&dep[0]===peerDep[0]&&logger3.warn(`Found "${dep[0]}" in both "dependencies" and "peerDependencies". This is probably a mistake.`),{version,frameworkPackage:pkg}},validConfigExtensions=["ts","js","tsx","jsx","mjs","cjs"],findConfigFile=(prefix,configDir)=>{let filePrefix=path5.join(configDir,prefix),extension=validConfigExtensions.find(ext=>fse.existsSync(`${filePrefix}.${ext}`));return extension?`${filePrefix}.${extension}`:null},getConfigInfo=(packageJson,configDir)=>{let storybookConfigDir=configDir??".storybook",storybookScript=packageJson.scripts?.storybook;if(storybookScript&&!configDir){let configParam=getStorybookConfiguration(storybookScript,"-c","--config-dir");configParam&&(storybookConfigDir=configParam);}return {configDir:storybookConfigDir,mainConfig:findConfigFile("main",storybookConfigDir),previewConfig:findConfigFile("preview",storybookConfigDir),managerConfig:findConfigFile("manager",storybookConfigDir)}},getStorybookInfo=(packageJson,configDir)=>{let rendererInfo=getRendererInfo(packageJson),configInfo=getConfigInfo(packageJson,configDir);return {...rendererInfo,...configInfo}};var getAutoRefs=async options=>{let location=await findUp("package.json",{cwd:options.configDir});if(!location)return {};let directory=dirname(location),{dependencies=[],devDependencies=[]}=await readJSON(location)||{},deps=Object.keys({...dependencies,...devDependencies});return (await Promise.all(deps.map(async d=>{try{let l=resolveFrom(directory,join(d,"package.json")),{storybook,name,version}=await readJSON(l)||{};if(storybook?.url)return {id:name,...storybook,version}}catch(error){if(error.code==="ERR_PACKAGE_PATH_NOT_EXPORTED")return;logger.warn(`unable to find package.json for ${d}`);return}}))).filter(Boolean).reduce((acc,cur)=>({...acc,[cur.id]:{id:cur.id.toLowerCase(),url:stripTrailingSlash(cur.url),title:cur.title,version:cur.version}}),{})},checkRef=url=>fetch(`${url}/iframe.html`).then(async({ok,status})=>{if(ok){if(status!==200)return !1;let data=await fetch(`${url}/iframe.html`,{headers:{Accept:"application/json"}});if(data.ok&&(await data.json().catch(e=>({}))).loginUrl)return !1}return ok},()=>!1),stripTrailingSlash=url=>url.replace(/\/$/,""),toTitle=input=>{let result=input.replace(/[A-Z]/g,f=>` ${f}`).replace(/[-_][A-Z]/gi,f=>` ${f.toUpperCase()}`).replace(/-/g," ").replace(/_/g," ");return `${result.substring(0,1).toUpperCase()}${result.substring(1)}`.trim()};async function getRefs(options){if(options.test)return {};let refs=await options.presets.apply("refs",await getAutoRefs(options));return Object.entries(refs).forEach(([key,value])=>{if(value.disable){delete refs[key];return}refs[key.toLowerCase()]={...value,id:key.toLowerCase(),title:value.title||toTitle(value.id||key),url:stripTrailingSlash(value.url)};}),await Promise.all(Object.entries(refs).map(async([k,value])=>{let ok=await checkRef(value.url);refs[k]={...value,type:ok?"server-checked":"unknown"};})),refs}function globToRegexp(glob2){let regex=pico.makeRe(glob2,{fastpaths:!1,noglobstar:!1,bash:!1});if(!regex.source.startsWith("^"))throw new Error(`Invalid glob: >> ${glob2} >> ${regex}`);return glob2.startsWith("./")?new RegExp(["^\\.",glob2.startsWith("./**")?"":"[\\\\/]",regex.source.substring(1)].join("")):regex}function handlebars(source,data){return Handlebars.compile(source)(data)}var interpolate=(template,bindings)=>Object.entries(bindings).reduce((acc,[k,v])=>{let escapedString=v.replace(/\\/g,"/").replace(/\$/g,"$$$");return acc.replace(new RegExp(`{{${k}}}`,"g"),escapedString)},template);async function loadMainConfig({configDir=".storybook",noCache=!1}){await validateConfigurationFiles(configDir);let mainJsPath=serverResolve(path5.resolve(configDir,"main"));return noCache&&mainJsPath&&__require.cache[mainJsPath]&&delete __require.cache[mainJsPath],serverRequire(mainJsPath)}function loadManagerOrAddonsFile({configDir}){let storybookCustomAddonsPath=getInterpretedFile(path5.resolve(configDir,"addons")),storybookCustomManagerPath=getInterpretedFile(path5.resolve(configDir,"manager"));if((storybookCustomAddonsPath||storybookCustomManagerPath)&&logger.info("=> Loading custom manager config"),storybookCustomAddonsPath&&storybookCustomManagerPath)throw new Error(dedent` You have both a "addons.js" and a "manager.js", remove the "addons.js" file from your configDir (${path5.resolve(configDir,"addons")})`);return storybookCustomManagerPath||storybookCustomAddonsPath}function loadPreviewOrConfigFile({configDir}){let storybookConfigPath=getInterpretedFile(path5.resolve(configDir,"config")),storybookPreviewPath=getInterpretedFile(path5.resolve(configDir,"preview"));if(storybookConfigPath&&storybookPreviewPath)throw new Error(dedent` You have both a "config.js" and a "preview.js", remove the "config.js" file from your configDir (${path5.resolve(configDir,"config")})`);return storybookPreviewPath||storybookConfigPath}function logConfig(caption,config){console.log(chalk.cyan(caption)),console.dir(config,{depth:null});}var DEFAULT_TITLE_PREFIX="",DEFAULT_FILES_PATTERN="**/*.@(mdx|stories.@(js|jsx|mjs|ts|tsx))",isDirectory=(configDir,entry)=>{try{return fs3.lstatSync(path5.resolve(configDir,entry)).isDirectory()}catch{return !1}},getDirectoryFromWorkingDir=({configDir,workingDir,directory})=>{let directoryFromConfig=path5.resolve(configDir,directory),directoryFromWorking=path5.relative(workingDir,directoryFromConfig);return normalizeStoryPath(directoryFromWorking)},normalizeStoriesEntry=(entry,{configDir,workingDir,defaultFilesPattern=DEFAULT_FILES_PATTERN})=>{let specifierWithoutMatcher;if(typeof entry=="string"){let globResult=pico.scan(entry);if(globResult.isGlob){let directory2=globResult.prefix+globResult.base,files2=globResult.glob;specifierWithoutMatcher={titlePrefix:DEFAULT_TITLE_PREFIX,directory:directory2,files:files2};}else isDirectory(configDir,entry)?specifierWithoutMatcher={titlePrefix:DEFAULT_TITLE_PREFIX,directory:entry,files:defaultFilesPattern}:specifierWithoutMatcher={titlePrefix:DEFAULT_TITLE_PREFIX,directory:path5.dirname(entry),files:path5.basename(entry)};}else specifierWithoutMatcher={titlePrefix:DEFAULT_TITLE_PREFIX,files:defaultFilesPattern,...entry};let files=slash(specifierWithoutMatcher.files),{directory:directoryRelativeToConfig}=specifierWithoutMatcher,directory=slash(getDirectoryFromWorkingDir({configDir,workingDir,directory:directoryRelativeToConfig})).replace(/\/$/,""),importPathMatcher=globToRegexp(`${directory}/${files}`);return {...specifierWithoutMatcher,directory,importPathMatcher}},normalizeStories=(entries,options)=>{if(!entries||Array.isArray(entries)&&entries.length===0)throw new InvalidStoriesEntryError;return entries.map(entry=>normalizeStoriesEntry(entry,options))};async function readTemplate(filename){return fse.readFile(filename,{encoding:"utf8"})}function isPreservingSymlinks(){let{NODE_OPTIONS,NODE_PRESERVE_SYMLINKS}=process.env;return !!NODE_PRESERVE_SYMLINKS||NODE_OPTIONS?.includes("--preserve-symlinks")}var interpolate2=(string,data={})=>Object.entries(data).reduce((acc,[k,v])=>acc.replace(new RegExp(`%${k}%`,"g"),v),string);function getPreviewBodyTemplate(configDirPath,interpolations){let base=fs3.readFileSync(`${sync$1(__dirname)}/templates/base-preview-body.html`,"utf8"),bodyHtmlPath=path5.resolve(configDirPath,"preview-body.html"),result=base;return fs3.existsSync(bodyHtmlPath)&&(result=fs3.readFileSync(bodyHtmlPath,"utf8")+result),interpolate2(result,interpolations)}function getPreviewHeadTemplate(configDirPath,interpolations){let base=fs3.readFileSync(`${sync$1(__dirname)}/templates/base-preview-head.html`,"utf8"),headHtmlPath=path5.resolve(configDirPath,"preview-head.html"),result=base;return fs3.existsSync(headHtmlPath)&&(result+=fs3.readFileSync(headHtmlPath,"utf8")),interpolate2(result,interpolations)}var renderers=["html","preact","react","server","svelte","vue","vue3","web-components"],rendererNames=[...renderers,...renderers.map(renderer=>`@storybook/${renderer}`)];function validateFrameworkName(frameworkName){if(!frameworkName)throw new MissingFrameworkFieldError;if(rendererNames.includes(frameworkName))throw new InvalidFrameworkNameError({frameworkName});if(!Object.keys(frameworkPackages).includes(frameworkName))try{__require.resolve(join(frameworkName,"preset"));}catch{throw new CouldNotEvaluateFrameworkError({frameworkName})}}function satisfies(){return x=>x} export { boost, builderPackages, cache, checkAddonOrder, commonGlobOptions, createFileSystemCache, filterPresetsConfig, findConfigFile, findDistEsm, frameworkPackages, getAutoRefs, getBuilderOptions, getDirectoryFromWorkingDir, getFrameworkName, getInterpretedFile, getInterpretedFileWithExt, getPresets, getPreviewBodyTemplate, getPreviewHeadTemplate, getProjectRoot, getRefs, getRendererName, getStorybookConfiguration, getStorybookInfo, globToRegexp, handlebars, interopRequireDefault, interpolate, isPreservingSymlinks, loadAllPresets, loadCustomPresets, loadEnvs, loadMainConfig, loadManagerOrAddonsFile, loadPreset, loadPreviewOrConfigFile, logConfig, nodePathsToArray, normalizeStories, normalizeStoriesEntry, normalizeStoryPath, readTemplate, rendererPackages, resolveAddonName, resolvePathInStorybookCache, satisfies, serverRequire, serverResolve, stringifyEnvs, stringifyProcessEnvs, stripAbsNodeModulesPath, validateConfigurationFiles, validateFrameworkName };