@storybook/core-server 7.0.0-beta.46 → 7.0.0-beta.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ import{__require}from"./chunk-R4NKYYJA.mjs";import{dirname,join}from"path";var defaultStaticDirs=[{from:join(dirname(__require.resolve("@storybook/manager/package.json")),"static"),to:"/sb-common-assets"}];import{logger}from"@storybook/node-logger";import{getDirectoryFromWorkingDir}from"@storybook/core-common";import chalk from"chalk";import express from"express";import{pathExists}from"fs-extra";import path from"path";import favicon from"serve-favicon";import isEqual from"lodash/isEqual.js";import{dedent}from"ts-dedent";async function useStatics(router,options){let staticDirs=await options.presets.apply("staticDirs"),faviconPath=await options.presets.apply("favicon");if(staticDirs&&options.staticDir&&!isEqual(staticDirs,defaultStaticDirs))throw new Error(dedent`
2
+ Conflict when trying to read staticDirs:
3
+ * Storybook's configuration option: 'staticDirs'
4
+ * Storybook's CLI flag: '--staticDir' or '-s'
5
+
6
+ Choose one of them, but not both.
7
+ `);let statics=staticDirs&&!isEqual(staticDirs,defaultStaticDirs)?staticDirs.map(dir=>typeof dir=="string"?dir:`${dir.from}:${dir.to}`):options.staticDir;statics&&statics.length>0&&await Promise.all(statics.map(async dir=>{try{let relativeDir=staticDirs?getDirectoryFromWorkingDir({configDir:options.configDir,workingDir:process.cwd(),directory:dir}):dir,{staticDir,staticPath,targetEndpoint}=await parseStaticDir(relativeDir);logger.info(chalk`=> Serving static files from {cyan ${staticDir}} at {cyan ${targetEndpoint}}`),router.use(targetEndpoint,express.static(staticPath,{index:!1}))}catch(e){logger.warn(e.message)}})),router.use(favicon(faviconPath))}var parseStaticDir=async arg=>{let lastColonIndex=arg.lastIndexOf(":"),isWindowsRawDirOnly=path.win32.isAbsolute(arg)&&lastColonIndex===1,splitIndex=lastColonIndex!==-1&&!isWindowsRawDirOnly?lastColonIndex:arg.length,target=(arg.substring(splitIndex+1)||"/").split(path.sep).join(path.posix.sep),rawDir=arg.substring(0,splitIndex),staticDir=path.isAbsolute(rawDir)?rawDir:`./${rawDir}`,staticPath=path.resolve(staticDir),targetDir=target.replace(/^\/?/,"./"),targetEndpoint=targetDir.substring(1);if(!await pathExists(staticPath))throw new Error(dedent(chalk`
8
+ Failed to load static files, no such directory: {cyan ${staticPath}}
9
+ Make sure this directory exists, or omit the {bold -s (--static-dir)} option.
10
+ `));return{staticDir,staticPath,targetDir,targetEndpoint}};export{defaultStaticDirs,useStatics,parseStaticDir};
package/dist/index.js CHANGED
@@ -1,19 +1,19 @@
1
- var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var src_exports={};__export(src_exports,{build:()=>standalone_default,buildDevStandalone:()=>buildDevStandalone,buildStaticStandalone:()=>buildStaticStandalone,getPreviewBodyTemplate:()=>import_core_common10.getPreviewBodyTemplate,getPreviewHeadTemplate:()=>import_core_common10.getPreviewHeadTemplate,withTelemetry:()=>withTelemetry});module.exports=__toCommonJS(src_exports);var import_core_common10=require("@storybook/core-common");var import_chalk5=__toESM(require("chalk")),import_fs_extra7=require("fs-extra"),import_path7=require("path"),import_ts_dedent2=require("ts-dedent"),import_global=require("@storybook/global"),import_node_logger5=require("@storybook/node-logger"),import_telemetry2=require("@storybook/telemetry"),import_core_common4=require("@storybook/core-common");var import_json_ext=require("@discoveryjs/json-ext"),import_node_logger=require("@storybook/node-logger"),import_chalk=__toESM(require("chalk")),import_fs_extra=__toESM(require("fs-extra")),import_path=__toESM(require("path"));async function outputStats(directory,previewStats,managerStats){if(previewStats){let filePath=await writeStats(directory,"preview",previewStats);import_node_logger.logger.info(`=> preview stats written to ${import_chalk.default.cyan(filePath)}`)}if(managerStats){let filePath=await writeStats(directory,"manager",managerStats);import_node_logger.logger.info(`=> manager stats written to ${import_chalk.default.cyan(filePath)}`)}}var writeStats=async(directory,name,stats)=>{let filePath=import_path.default.join(directory,`${name}-stats.json`),{chunks,...data}=stats.toJson();return await new Promise((resolve3,reject)=>{(0,import_json_ext.stringifyStream)(data,null,2).on("error",reject).pipe(import_fs_extra.default.createWriteStream(filePath)).on("error",reject).on("finish",resolve3)}),filePath};var import_chalk3=__toESM(require("chalk")),import_fs_extra3=__toESM(require("fs-extra")),import_path3=__toESM(require("path")),import_node_logger3=require("@storybook/node-logger"),import_core_common2=require("@storybook/core-common");var import_node_logger2=require("@storybook/node-logger"),import_core_common=require("@storybook/core-common"),import_chalk2=__toESM(require("chalk")),import_express=__toESM(require("express")),import_fs_extra2=require("fs-extra"),import_path2=__toESM(require("path")),import_serve_favicon=__toESM(require("serve-favicon")),import_ts_dedent=require("ts-dedent");async function useStatics(router2,options){let staticDirs=await options.presets.apply("staticDirs"),faviconPath=await options.presets.apply("favicon");if(staticDirs&&options.staticDir)throw new Error(import_ts_dedent.dedent`
1
+ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var src_exports={};__export(src_exports,{build:()=>standalone_default,buildDevStandalone:()=>buildDevStandalone,buildStaticStandalone:()=>buildStaticStandalone,getPreviewBodyTemplate:()=>import_core_common10.getPreviewBodyTemplate,getPreviewHeadTemplate:()=>import_core_common10.getPreviewHeadTemplate,withTelemetry:()=>withTelemetry});module.exports=__toCommonJS(src_exports);var import_core_common10=require("@storybook/core-common");var import_chalk5=__toESM(require("chalk")),import_fs_extra7=require("fs-extra"),import_path8=require("path"),import_ts_dedent2=require("ts-dedent"),import_global=require("@storybook/global"),import_node_logger5=require("@storybook/node-logger"),import_telemetry2=require("@storybook/telemetry"),import_core_common4=require("@storybook/core-common");var import_json_ext=require("@discoveryjs/json-ext"),import_node_logger=require("@storybook/node-logger"),import_chalk=__toESM(require("chalk")),import_fs_extra=__toESM(require("fs-extra")),import_path=__toESM(require("path"));async function outputStats(directory,previewStats,managerStats){if(previewStats){let filePath=await writeStats(directory,"preview",previewStats);import_node_logger.logger.info(`=> preview stats written to ${import_chalk.default.cyan(filePath)}`)}if(managerStats){let filePath=await writeStats(directory,"manager",managerStats);import_node_logger.logger.info(`=> manager stats written to ${import_chalk.default.cyan(filePath)}`)}}var writeStats=async(directory,name,stats)=>{let filePath=import_path.default.join(directory,`${name}-stats.json`),{chunks,...data}=stats.toJson();return await new Promise((resolve3,reject)=>{(0,import_json_ext.stringifyStream)(data,null,2).on("error",reject).pipe(import_fs_extra.default.createWriteStream(filePath)).on("error",reject).on("finish",resolve3)}),filePath};var import_chalk3=__toESM(require("chalk")),import_fs_extra3=__toESM(require("fs-extra")),import_path4=__toESM(require("path")),import_node_logger3=require("@storybook/node-logger"),import_core_common2=require("@storybook/core-common");var import_node_logger2=require("@storybook/node-logger"),import_core_common=require("@storybook/core-common"),import_chalk2=__toESM(require("chalk")),import_express=__toESM(require("express")),import_fs_extra2=require("fs-extra"),import_path3=__toESM(require("path")),import_serve_favicon=__toESM(require("serve-favicon")),import_isEqual=__toESM(require("lodash/isEqual.js")),import_ts_dedent=require("ts-dedent");var import_path2=require("path");var defaultStaticDirs=[{from:(0,import_path2.join)((0,import_path2.dirname)(require.resolve("@storybook/manager/package.json")),"static"),to:"/sb-common-assets"}];async function useStatics(router2,options){let staticDirs=await options.presets.apply("staticDirs"),faviconPath=await options.presets.apply("favicon");if(staticDirs&&options.staticDir&&!(0,import_isEqual.default)(staticDirs,defaultStaticDirs))throw new Error(import_ts_dedent.dedent`
2
2
  Conflict when trying to read staticDirs:
3
3
  * Storybook's configuration option: 'staticDirs'
4
4
  * Storybook's CLI flag: '--staticDir' or '-s'
5
5
 
6
6
  Choose one of them, but not both.
7
- `);let statics=staticDirs?staticDirs.map(dir=>typeof dir=="string"?dir:`${dir.from}:${dir.to}`):options.staticDir;statics&&statics.length>0&&await Promise.all(statics.map(async dir=>{try{let relativeDir=staticDirs?(0,import_core_common.getDirectoryFromWorkingDir)({configDir:options.configDir,workingDir:process.cwd(),directory:dir}):dir,{staticDir,staticPath,targetEndpoint}=await parseStaticDir(relativeDir);import_node_logger2.logger.info(import_chalk2.default`=> Serving static files from {cyan ${staticDir}} at {cyan ${targetEndpoint}}`),router2.use(targetEndpoint,import_express.default.static(staticPath,{index:!1}))}catch(e){import_node_logger2.logger.warn(e.message)}})),router2.use((0,import_serve_favicon.default)(faviconPath))}var parseStaticDir=async arg=>{let lastColonIndex=arg.lastIndexOf(":"),isWindowsRawDirOnly=import_path2.default.win32.isAbsolute(arg)&&lastColonIndex===1,splitIndex=lastColonIndex!==-1&&!isWindowsRawDirOnly?lastColonIndex:arg.length,target=(arg.substring(splitIndex+1)||"/").split(import_path2.default.sep).join(import_path2.default.posix.sep),rawDir=arg.substring(0,splitIndex),staticDir=import_path2.default.isAbsolute(rawDir)?rawDir:`./${rawDir}`,staticPath=import_path2.default.resolve(staticDir),targetDir=target.replace(/^\/?/,"./"),targetEndpoint=targetDir.substring(1);if(!await(0,import_fs_extra2.pathExists)(staticPath))throw new Error((0,import_ts_dedent.dedent)(import_chalk2.default`
7
+ `);let statics=staticDirs&&!(0,import_isEqual.default)(staticDirs,defaultStaticDirs)?staticDirs.map(dir=>typeof dir=="string"?dir:`${dir.from}:${dir.to}`):options.staticDir;statics&&statics.length>0&&await Promise.all(statics.map(async dir=>{try{let relativeDir=staticDirs?(0,import_core_common.getDirectoryFromWorkingDir)({configDir:options.configDir,workingDir:process.cwd(),directory:dir}):dir,{staticDir,staticPath,targetEndpoint}=await parseStaticDir(relativeDir);import_node_logger2.logger.info(import_chalk2.default`=> Serving static files from {cyan ${staticDir}} at {cyan ${targetEndpoint}}`),router2.use(targetEndpoint,import_express.default.static(staticPath,{index:!1}))}catch(e){import_node_logger2.logger.warn(e.message)}})),router2.use((0,import_serve_favicon.default)(faviconPath))}var parseStaticDir=async arg=>{let lastColonIndex=arg.lastIndexOf(":"),isWindowsRawDirOnly=import_path3.default.win32.isAbsolute(arg)&&lastColonIndex===1,splitIndex=lastColonIndex!==-1&&!isWindowsRawDirOnly?lastColonIndex:arg.length,target=(arg.substring(splitIndex+1)||"/").split(import_path3.default.sep).join(import_path3.default.posix.sep),rawDir=arg.substring(0,splitIndex),staticDir=import_path3.default.isAbsolute(rawDir)?rawDir:`./${rawDir}`,staticPath=import_path3.default.resolve(staticDir),targetDir=target.replace(/^\/?/,"./"),targetEndpoint=targetDir.substring(1);if(!await(0,import_fs_extra2.pathExists)(staticPath))throw new Error((0,import_ts_dedent.dedent)(import_chalk2.default`
8
8
  Failed to load static files, no such directory: {cyan ${staticPath}}
9
9
  Make sure this directory exists, or omit the {bold -s (--static-dir)} option.
10
- `));return{staticDir,staticPath,targetDir,targetEndpoint}};async function copyAllStaticFiles(staticDirs,outputDir){staticDirs&&staticDirs.length>0&&await Promise.all(staticDirs.map(async dir=>{try{let{staticDir,staticPath,targetDir}=await parseStaticDir(dir),targetPath=import_path3.default.join(outputDir,targetDir);import_node_logger3.logger.info(import_chalk3.default`=> Copying static files: {cyan ${staticDir}} => {cyan ${targetDir}}`);let skipPaths=["index.html","iframe.html"].map(f=>import_path3.default.join(targetPath,f));await import_fs_extra3.default.copy(staticPath,targetPath,{dereference:!0,preserveTimestamps:!0,filter:(_,dest)=>!skipPaths.includes(dest)})}catch(e){import_node_logger3.logger.error(e.message),process.exit(-1)}}))}async function copyAllStaticFilesRelativeToMain(staticDirs,outputDir,configDir){let workingDir=process.cwd();return staticDirs.reduce(async(acc,dir)=>{await acc;let staticDirAndTarget=typeof dir=="string"?dir:`${dir.from}:${dir.to}`,{staticPath:from,targetEndpoint:to}=await parseStaticDir((0,import_core_common2.getDirectoryFromWorkingDir)({configDir,workingDir,directory:staticDirAndTarget})),targetPath=import_path3.default.join(outputDir,to),skipPaths=["index.html","iframe.html"].map(f=>import_path3.default.join(targetPath,f));import_node_logger3.logger.info(import_chalk3.default`=> Copying static files: {cyan ${from}} at {cyan ${targetPath}}`),await import_fs_extra3.default.copy(from,targetPath,{dereference:!0,preserveTimestamps:!0,filter:(_,dest)=>!skipPaths.includes(dest)})},Promise.resolve())}var import_node_url=require("url");async function getManagerBuilder(){return import("@storybook/builder-manager")}async function getPreviewBuilder(builderName,configDir){let builderPackage;if(builderName)builderPackage=require.resolve(["webpack5"].includes(builderName)?`@storybook/builder-${builderName}`:builderName,{paths:[configDir]});else throw new Error("no builder configured!");return await import((0,import_node_url.pathToFileURL)(builderPackage).href)}async function getBuilders({presets,configDir}){let{builder}=await presets.apply("core",{}),builderName=typeof builder=="string"?builder:builder==null?void 0:builder.name;return Promise.all([getPreviewBuilder(builderName,configDir),getManagerBuilder()])}var import_fs_extra4=require("fs-extra"),import_debounce=__toESM(require("lodash/debounce.js")),import_core_events=require("@storybook/core-events");var import_watchpack=__toESM(require("watchpack")),import_slash=__toESM(require("slash")),import_fs=__toESM(require("fs")),import_path4=__toESM(require("path")),import_globby=__toESM(require("globby")),import_uniq=__toESM(require("lodash/uniq.js")),isDirectory=directory=>{try{return import_fs.default.lstatSync(directory).isDirectory()}catch{return!1}};function toImportPath(relativePath){return relativePath.startsWith(".")?relativePath:`./${relativePath}`}function watchStorySpecifiers(specifiers,options,onInvalidate){let wp=new import_watchpack.default({followSymlinks:!1,ignored:["**/.git","node_modules"]});wp.watch({directories:(0,import_uniq.default)(specifiers.map(ns=>ns.directory))});async function onChangeOrRemove(watchpackPath,removed){let importPath=(0,import_slash.default)(watchpackPath.startsWith(".")?watchpackPath:`./${watchpackPath}`),matchingSpecifier=specifiers.find(ns=>ns.importPathMatcher.exec(importPath));if(matchingSpecifier){onInvalidate(matchingSpecifier,importPath,removed);return}let absolutePath=import_path4.default.join(options.workingDir,importPath);!removed&&isDirectory(absolutePath)&&await Promise.all(specifiers.filter(specifier=>importPath.startsWith(specifier.directory)).map(async specifier=>{let dirGlob=import_path4.default.join(options.workingDir,importPath,"**",import_path4.default.basename(specifier.files));(await(0,import_globby.default)((0,import_slash.default)(dirGlob))).forEach(filePath=>{let fileImportPath=toImportPath(import_path4.default.relative(options.workingDir,filePath).replace(/\\/g,"/"));specifier.importPathMatcher.exec(fileImportPath)&&onInvalidate(specifier,fileImportPath,removed)})}))}return wp.on("change",async(filePath,mtime,explanation)=>{await onChangeOrRemove(filePath,!mtime)}),wp.on("remove",async(filePath,explanation)=>{await onChangeOrRemove(filePath,!0)}),()=>wp.close()}var DEBOUNCE=100;async function extractStoriesJson(outputFile,initializedStoryIndexGenerator,transform){let storyIndex=await(await initializedStoryIndexGenerator).getIndex();await(0,import_fs_extra4.writeJSON)(outputFile,transform?transform(storyIndex):storyIndex)}function useStoriesJson({router:router2,initializedStoryIndexGenerator,workingDir=process.cwd(),serverChannel,normalizedStories}){let maybeInvalidate=(0,import_debounce.default)(()=>serverChannel.emit(import_core_events.STORY_INDEX_INVALIDATED),DEBOUNCE,{leading:!0});watchStorySpecifiers(normalizedStories,{workingDir},async(specifier,path7,removed)=>{(await initializedStoryIndexGenerator).invalidate(specifier,path7,removed),maybeInvalidate()}),router2.use("/index.json",async(req,res)=>{try{let index=await(await initializedStoryIndexGenerator).getIndex();res.header("Content-Type","application/json"),res.send(JSON.stringify(index))}catch(err){res.status(500),res.send(err.message)}}),router2.use("/stories.json",async(req,res)=>{try{let generator=await initializedStoryIndexGenerator,index=convertToIndexV3(await generator.getIndex());res.header("Content-Type","application/json"),res.send(JSON.stringify(index))}catch(err){res.status(500),res.send(err.message)}})}var convertToIndexV3=index=>{let{entries}=index;return{v:3,stories:Object.entries(entries).reduce((acc,[id,entry])=>{let{type,...rest}=entry;return acc[id]={...rest,kind:rest.title,story:rest.name,parameters:{__id:rest.id,docsOnly:type==="docs",fileName:rest.importPath}},acc},{})}};var import_fs_extra5=require("fs-extra"),import_telemetry=require("@storybook/telemetry");async function extractStorybookMetadata(outputFile,configDir){let storybookMetadata=await(0,import_telemetry.getStorybookMetadata)(configDir);await(0,import_fs_extra5.writeJSON)(outputFile,storybookMetadata)}function useStorybookMetadata(router2,configDir){router2.use("/project.json",async(req,res)=>{let storybookMetadata=await(0,import_telemetry.getStorybookMetadata)(configDir);res.header("Content-Type","application/json"),res.send(JSON.stringify(storybookMetadata))})}var import_path6=__toESM(require("path")),import_chalk4=__toESM(require("chalk")),import_fs_extra6=__toESM(require("fs-extra")),import_globby2=__toESM(require("globby")),import_slash2=__toESM(require("slash")),import_preview_api=require("@storybook/preview-api"),import_core_common3=require("@storybook/core-common"),import_node_logger4=require("@storybook/node-logger"),import_csf_tools=require("@storybook/csf-tools"),import_csf=require("@storybook/csf"),import_docs_mdx=require("@storybook/docs-mdx");var import_path5=require("path");function autoName(mdxImportPath,csfImportPath,defaultName){let mdxBasename=(0,import_path5.basename)(mdxImportPath),csfBasename=(0,import_path5.basename)(csfImportPath),[mdxFilename]=mdxBasename.split("."),[csfFilename]=csfBasename.split(".");return mdxFilename===csfFilename?defaultName:mdxFilename}var AUTODOCS_TAG="autodocs",STORIES_MDX_TAG="stories-mdx",PLAY_FN_TAG="play-fn";function isMdxEntry({tags}){return!(tags!=null&&tags.includes(AUTODOCS_TAG))&&!(tags!=null&&tags.includes(STORIES_MDX_TAG))}var DuplicateEntriesError=class extends Error{constructor(message,entries){super();this.message=message,this.entries=entries}},makeAbsolute=(otherImport,normalizedPath,workingDir)=>otherImport.startsWith(".")?(0,import_slash2.default)(import_path6.default.resolve(workingDir,(0,import_core_common3.normalizeStoryPath)(import_path6.default.join(import_path6.default.dirname(normalizedPath),otherImport)))):otherImport,StoryIndexGenerator=class{constructor(specifiers,options){this.specifiers=specifiers;this.options=options;this.specifierToCache=new Map}async initialize(){(await Promise.all(this.specifiers.map(async specifier=>{let pathToSubIndex={},fullGlob=(0,import_slash2.default)(import_path6.default.join(this.options.workingDir,specifier.directory,specifier.files));return(await(0,import_globby2.default)(fullGlob)).sort().forEach(absolutePath=>{let ext=import_path6.default.extname(absolutePath);if(ext===".storyshot"){let relativePath=import_path6.default.relative(this.options.workingDir,absolutePath);import_node_logger4.logger.info(`Skipping ${ext} file ${relativePath}`);return}pathToSubIndex[absolutePath]=!1}),[specifier,pathToSubIndex]}))).forEach(([specifier,cache4])=>this.specifierToCache.set(specifier,cache4)),await this.ensureExtracted()}async updateExtracted(updater,overwrite=!1){await Promise.all(this.specifiers.map(async specifier=>{let entry=this.specifierToCache.get(specifier);return Promise.all(Object.keys(entry).map(async absolutePath=>{entry[absolutePath]&&!overwrite||(entry[absolutePath]=await updater(specifier,absolutePath,entry[absolutePath]))}))}))}isDocsMdx(absolutePath){return/(?<!\.stories)\.mdx$/i.test(absolutePath)}async ensureExtracted(){return await this.updateExtracted(async(specifier,absolutePath)=>this.isDocsMdx(absolutePath)?!1:this.extractStories(specifier,absolutePath)),this.options.docs.disable||await this.updateExtracted(async(specifier,absolutePath)=>this.extractDocs(specifier,absolutePath)),this.specifiers.flatMap(specifier=>{let cache4=this.specifierToCache.get(specifier);return Object.values(cache4).flatMap(entry=>entry?entry.type==="docs"?[entry]:entry.entries:[])})}findDependencies(absoluteImports){let dependencies=[],foundImports=new Set;return this.specifierToCache.forEach(cache4=>{Object.keys(cache4).filter(fileName=>{let foundImport=absoluteImports.find(storyImport=>fileName.startsWith(storyImport));return foundImport&&foundImports.add(foundImport),!!foundImport}).forEach(fileName=>{let cacheEntry=cache4[fileName];if(cacheEntry&&cacheEntry.type==="stories")dependencies.push(cacheEntry);else throw new Error(`Unexpected dependency: ${cacheEntry}`)})}),dependencies}async extractStories(specifier,absolutePath){let relativePath=import_path6.default.relative(this.options.workingDir,absolutePath),entries=[];try{let importPath=(0,import_slash2.default)((0,import_core_common3.normalizeStoryPath)(relativePath)),makeTitle=userTitle=>(0,import_preview_api.userOrAutoTitleFromSpecifier)(importPath,specifier,userTitle),storyIndexer=this.options.storyIndexers.find(indexer=>indexer.test.exec(absolutePath));if(!storyIndexer)throw new Error(`No matching story indexer found for ${absolutePath}`);let csf=await storyIndexer.indexer(absolutePath,{makeTitle}),componentTags=csf.meta.tags||[];if(csf.stories.forEach(({id,name,tags:storyTags,parameters})=>{if(!(parameters!=null&&parameters.docsOnly)){let tags=[...storyTags||componentTags,"story"];entries.push({id,title:csf.meta.title,name,importPath,tags,type:"story"})}}),!this.options.docs.disable&&csf.stories.length){let{autodocs}=this.options.docs,componentAutodocs=componentTags.includes(AUTODOCS_TAG),autodocsOptedIn=autodocs===!0||autodocs==="tag"&&componentAutodocs;if(componentTags.includes(STORIES_MDX_TAG)||autodocsOptedIn){let name=this.options.docs.defaultName,id=(0,import_csf.toId)(csf.meta.title,name);entries.unshift({id,title:csf.meta.title,name,importPath,type:"docs",tags:[...componentTags,"docs",...autodocsOptedIn&&!componentAutodocs?[AUTODOCS_TAG]:[]],storiesImports:[]})}}}catch(err){if(err instanceof import_csf_tools.NoMetaError)import_node_logger4.logger.info(`\u{1F4A1} Skipping ${relativePath}: ${err}`);else throw import_node_logger4.logger.warn(`\u{1F6A8} Extraction error on ${relativePath}: ${err}`),err}return{entries,type:"stories",dependents:[]}}async extractDocs(specifier,absolutePath){var _a;let relativePath=import_path6.default.relative(this.options.workingDir,absolutePath);try{if(!this.options.storyStoreV7)throw new Error("You cannot use `.mdx` files without using `storyStoreV7`.");let normalizedPath=(0,import_core_common3.normalizeStoryPath)(relativePath),importPath=(0,import_slash2.default)(normalizedPath),content=await import_fs_extra6.default.readFile(absolutePath,"utf8"),result=(0,import_docs_mdx.analyze)(content);if(result.isTemplate)return!1;let absoluteImports=result.imports.map(p=>makeAbsolute(p,normalizedPath,this.options.workingDir)),dependencies=this.findDependencies(absoluteImports),csfEntry;if(result.of){let absoluteOf=makeAbsolute(result.of,normalizedPath,this.options.workingDir);if(dependencies.forEach(dep=>{if(dep.entries.length>0){let first=dep.entries.find(e=>e.type!=="docs");import_path6.default.normalize(import_path6.default.resolve(this.options.workingDir,first.importPath)).startsWith(import_path6.default.normalize(absoluteOf))&&(csfEntry=first)}}),!csfEntry)throw new Error(`Could not find "${result.of}" for docs file "${relativePath}".`)}dependencies.forEach(dep=>{dep.dependents.push(absolutePath)});let title=(csfEntry==null?void 0:csfEntry.title)||(0,import_preview_api.userOrAutoTitleFromSpecifier)(importPath,specifier,result.title),{defaultName}=this.options.docs,name=result.name||(csfEntry?autoName(importPath,csfEntry.importPath,defaultName):defaultName);return{id:(0,import_csf.toId)(title,name),title,name,importPath,storiesImports:dependencies.map(dep=>dep.entries[0].importPath),type:"docs",tags:[...result.tags||[],"docs"]}}catch(err){throw import_node_logger4.logger.warn(`\u{1F6A8} Extraction error on ${import_chalk4.default.blue(relativePath)}: ${err}`),(_a=err.source)!=null&&_a.match(/mdast-util-mdx-jsx/g)&&import_node_logger4.logger.warn(`\u{1F4A1} This seems to be an MDX2 syntax error. Please refer to the MDX section in the following resource for assistance on how to fix this: ${import_chalk4.default.yellow("https://storybook.js.org/migration-guides/7.0")}`),err}}chooseDuplicate(firstEntry,secondEntry){var _a;let firstIsBetter=!0;(secondEntry.type==="story"||isMdxEntry(secondEntry)&&firstEntry.type==="docs"&&!isMdxEntry(firstEntry))&&(firstIsBetter=!1);let betterEntry=firstIsBetter?firstEntry:secondEntry,worseEntry=firstIsBetter?secondEntry:firstEntry,changeDocsName='Use `<Meta of={} name="Other Name">` to distinguish them.';if(worseEntry.type==="story")throw new DuplicateEntriesError(`Duplicate stories with id: ${firstEntry.id}`,[firstEntry,secondEntry]);if(betterEntry.type==="story"){let worseDescriptor=isMdxEntry(worseEntry)?"component docs page":"automatically generated docs page";betterEntry.name===this.options.docs.defaultName?import_node_logger4.logger.warn(`\u{1F6A8} You have a story for ${betterEntry.title} with the same name as your default docs entry name (${betterEntry.name}), so the docs page is being dropped. Consider changing the story name.`):import_node_logger4.logger.warn(`\u{1F6A8} You have a story for ${betterEntry.title} with the same name as your ${worseDescriptor} (${worseEntry.name}), so the docs page is being dropped. ${changeDocsName}`)}else if(isMdxEntry(betterEntry)){if(isMdxEntry(worseEntry)&&import_node_logger4.logger.warn(`\u{1F6A8} You have two component docs pages with the same name ${betterEntry.title}:${betterEntry.name}. ${changeDocsName}`),(_a=worseEntry.tags)!=null&&_a.includes(AUTODOCS_TAG)&&this.options.docs.autodocs!==!0)throw new Error(`You created a component docs page for ${worseEntry.title} (${betterEntry.importPath}), but also tagged the CSF file (${worseEntry.importPath}) with '${AUTODOCS_TAG}'. This is probably a mistake.`)}else return{...betterEntry,storiesImports:[...betterEntry.storiesImports,worseEntry.importPath,...worseEntry.storiesImports]};return betterEntry}async sortStories(storiesList){let entries={};storiesList.forEach(entry=>{let existing=entries[entry.id];existing?entries[entry.id]=this.chooseDuplicate(existing,entry):entries[entry.id]=entry});let sortableStories=Object.values(entries);if(this.options.storyStoreV7){let storySortParameter=await this.getStorySortParameter(),fileNameOrder=this.storyFileNames();(0,import_preview_api.sortStoriesV7)(sortableStories,storySortParameter,fileNameOrder)}return sortableStories.reduce((acc,item)=>(acc[item.id]=item,acc),{})}async getIndex(){if(this.lastIndex)return this.lastIndex;let storiesList=await this.ensureExtracted(),sorted=await this.sortStories(storiesList),compat=sorted;if(this.options.storiesV2Compatibility){let titleToStoryCount=Object.values(sorted).reduce((acc,story)=>(acc[story.title]=(acc[story.title]||0)+1,acc),{});compat=Object.entries(sorted).reduce((acc,entry)=>{let[id,story]=entry;return story.type==="docs"||(acc[id]={...story,kind:story.title,story:story.name,parameters:{__id:story.id,docsOnly:titleToStoryCount[story.title]===1&&story.name==="Page",fileName:story.importPath}}),acc},{})}return this.lastIndex={v:4,entries:compat},this.lastIndex}invalidate(specifier,importPath,removed){let absolutePath=(0,import_slash2.default)(import_path6.default.resolve(this.options.workingDir,importPath)),cache4=this.specifierToCache.get(specifier),cacheEntry=cache4[absolutePath];if(cacheEntry&&cacheEntry.type==="stories"){let{dependents}=cacheEntry,invalidated=new Set;this.specifierToCache.forEach(otherCache=>{dependents.forEach(dep=>{otherCache[dep]&&(invalidated.add(dep),otherCache[dep]=!1)})})}if(removed){if(cacheEntry&&cacheEntry.type==="docs"){let absoluteImports=cacheEntry.storiesImports.map(p=>import_path6.default.resolve(this.options.workingDir,p));this.findDependencies(absoluteImports).forEach(dep=>dep.dependents.splice(dep.dependents.indexOf(absolutePath),1))}delete cache4[absolutePath]}else cache4[absolutePath]=!1;this.lastIndex=null}async getStorySortParameter(){let previewFile=["js","jsx","ts","tsx"].map(ext=>import_path6.default.join(this.options.configDir,`preview.${ext}`)).find(fname=>import_fs_extra6.default.existsSync(fname)),storySortParameter;if(previewFile){let previewCode=(await import_fs_extra6.default.readFile(previewFile,"utf-8")).toString();storySortParameter=await(0,import_csf_tools.getStorySortParameter)(previewCode)}return storySortParameter}storyFileNames(){return Array.from(this.specifierToCache.values()).flatMap(r=>Object.keys(r))}};var PAGE_REGEX=/(page|screen)/i,isPageStory=storyId=>PAGE_REGEX.test(storyId),isExampleEntry=entry=>["example-introduction--docs","example-button--docs","example-button--primary","example-button--secondary","example-button--large","example-button--small","example-header--docs","example-header--logged-in","example-header--logged-out","example-page--logged-in","example-page--logged-out"].includes(entry.id);function summarizeIndex(storyIndex){let storyCount=0,exampleStoryCount=0,exampleDocsCount=0,pageStoryCount=0,playStoryCount=0,autodocsCount=0,storiesMdxCount=0,mdxCount=0;return Object.values(storyIndex.entries).forEach(entry=>{var _a,_b,_c;isExampleEntry(entry)?(entry.type==="story"&&(exampleStoryCount+=1),entry.type==="docs"&&(exampleDocsCount+=1)):entry.type==="story"?(storyCount+=1,isPageStory(entry.title)&&(pageStoryCount+=1),(_a=entry.tags)!=null&&_a.includes(PLAY_FN_TAG)&&(playStoryCount+=1)):entry.type==="docs"&&(isMdxEntry(entry)?mdxCount+=1:(_b=entry.tags)!=null&&_b.includes(STORIES_MDX_TAG)?storiesMdxCount+=1:(_c=entry.tags)!=null&&_c.includes(AUTODOCS_TAG)&&(autodocsCount+=1))}),{storyCount,pageStoryCount,playStoryCount,autodocsCount,storiesMdxCount,mdxCount,exampleStoryCount,exampleDocsCount,version:storyIndex.v}}async function buildStaticStandalone(options){var _a;if(options.configType="PRODUCTION",options.outputDir==="")throw new Error("Won't remove current directory. Check your outputDir!");if((_a=options.staticDir)!=null&&_a.includes("/"))throw new Error("Won't copy root directory. Check your staticDirs!");if(options.outputDir=(0,import_path7.isAbsolute)(options.outputDir)?options.outputDir:(0,import_path7.join)(process.cwd(),options.outputDir),options.configDir=(0,import_path7.resolve)(options.configDir),import_node_logger5.logger.info(import_chalk5.default`=> Cleaning outputDir: {cyan ${options.outputDir.replace(process.cwd(),"")}}`),options.outputDir==="/")throw new Error("Won't remove directory '/'. Check your outputDir!");await(0,import_fs_extra7.emptyDir)(options.outputDir),await(0,import_fs_extra7.ensureDir)(options.outputDir);let{framework}=await(0,import_core_common4.loadMainConfig)(options),corePresets=[],frameworkName=typeof framework=="string"?framework:framework==null?void 0:framework.name;frameworkName?corePresets.push((0,import_path7.join)(frameworkName,"preset")):import_node_logger5.logger.warn(`you have not specified a framework in your ${options.configDir}/main.js`),import_node_logger5.logger.info("=> Loading presets");let presets=await(0,import_core_common4.loadAllPresets)({corePresets:[require.resolve("@storybook/core-server/dist/presets/common-preset"),...corePresets],overridePresets:[],...options}),[previewBuilder,managerBuilder]=await getBuilders({...options,presets}),{renderer}=await presets.apply("core",{});presets=await(0,import_core_common4.loadAllPresets)({corePresets:[require.resolve("@storybook/core-server/dist/presets/common-preset"),...managerBuilder.corePresets||[],...previewBuilder.corePresets||[],...renderer?[(0,import_core_common4.resolveAddonName)(options.configDir,renderer,options)]:[],...corePresets,require.resolve("@storybook/core-server/dist/presets/babel-cache-preset")],overridePresets:previewBuilder.overridePresets||[],...options});let[features,core,staticDirs,storyIndexers,stories,docsOptions]=await Promise.all([presets.apply("features"),presets.apply("core"),presets.apply("staticDirs"),presets.apply("storyIndexers",[]),presets.apply("stories"),presets.apply("docs",{})]),fullOptions={...options,presets,features};if(staticDirs&&options.staticDir)throw new Error(import_ts_dedent2.dedent`
10
+ `));return{staticDir,staticPath,targetDir,targetEndpoint}};async function copyAllStaticFiles(staticDirs,outputDir){staticDirs&&staticDirs.length>0&&await Promise.all(staticDirs.map(async dir=>{try{let{staticDir,staticPath,targetDir}=await parseStaticDir(dir),targetPath=import_path4.default.join(outputDir,targetDir);import_node_logger3.logger.info(import_chalk3.default`=> Copying static files: {cyan ${staticDir}} => {cyan ${targetDir}}`);let skipPaths=["index.html","iframe.html"].map(f=>import_path4.default.join(targetPath,f));await import_fs_extra3.default.copy(staticPath,targetPath,{dereference:!0,preserveTimestamps:!0,filter:(_,dest)=>!skipPaths.includes(dest)})}catch(e){import_node_logger3.logger.error(e.message),process.exit(-1)}}))}async function copyAllStaticFilesRelativeToMain(staticDirs,outputDir,configDir){let workingDir=process.cwd();return staticDirs.reduce(async(acc,dir)=>{await acc;let staticDirAndTarget=typeof dir=="string"?dir:`${dir.from}:${dir.to}`,{staticPath:from,targetEndpoint:to}=await parseStaticDir((0,import_core_common2.getDirectoryFromWorkingDir)({configDir,workingDir,directory:staticDirAndTarget})),targetPath=import_path4.default.join(outputDir,to),skipPaths=["index.html","iframe.html"].map(f=>import_path4.default.join(targetPath,f));import_node_logger3.logger.info(import_chalk3.default`=> Copying static files: {cyan ${from}} at {cyan ${targetPath}}`),await import_fs_extra3.default.copy(from,targetPath,{dereference:!0,preserveTimestamps:!0,filter:(_,dest)=>!skipPaths.includes(dest)})},Promise.resolve())}var import_node_url=require("url");async function getManagerBuilder(){return import("@storybook/builder-manager")}async function getPreviewBuilder(builderName,configDir){let builderPackage;if(builderName)builderPackage=require.resolve(["webpack5"].includes(builderName)?`@storybook/builder-${builderName}`:builderName,{paths:[configDir]});else throw new Error("no builder configured!");return await import((0,import_node_url.pathToFileURL)(builderPackage).href)}async function getBuilders({presets,configDir}){let{builder}=await presets.apply("core",{}),builderName=typeof builder=="string"?builder:builder==null?void 0:builder.name;return Promise.all([getPreviewBuilder(builderName,configDir),getManagerBuilder()])}var import_fs_extra4=require("fs-extra"),import_debounce=__toESM(require("lodash/debounce.js")),import_core_events=require("@storybook/core-events");var import_watchpack=__toESM(require("watchpack")),import_slash=__toESM(require("slash")),import_fs=__toESM(require("fs")),import_path5=__toESM(require("path")),import_globby=__toESM(require("globby")),import_uniq=__toESM(require("lodash/uniq.js")),isDirectory=directory=>{try{return import_fs.default.lstatSync(directory).isDirectory()}catch{return!1}};function toImportPath(relativePath){return relativePath.startsWith(".")?relativePath:`./${relativePath}`}function watchStorySpecifiers(specifiers,options,onInvalidate){let wp=new import_watchpack.default({followSymlinks:!1,ignored:["**/.git","node_modules"]});wp.watch({directories:(0,import_uniq.default)(specifiers.map(ns=>ns.directory))});async function onChangeOrRemove(watchpackPath,removed){let importPath=(0,import_slash.default)(watchpackPath.startsWith(".")?watchpackPath:`./${watchpackPath}`),matchingSpecifier=specifiers.find(ns=>ns.importPathMatcher.exec(importPath));if(matchingSpecifier){onInvalidate(matchingSpecifier,importPath,removed);return}let absolutePath=import_path5.default.join(options.workingDir,importPath);!removed&&isDirectory(absolutePath)&&await Promise.all(specifiers.filter(specifier=>importPath.startsWith(specifier.directory)).map(async specifier=>{let dirGlob=import_path5.default.join(options.workingDir,importPath,"**",import_path5.default.basename(specifier.files));(await(0,import_globby.default)((0,import_slash.default)(dirGlob))).forEach(filePath=>{let fileImportPath=toImportPath(import_path5.default.relative(options.workingDir,filePath).replace(/\\/g,"/"));specifier.importPathMatcher.exec(fileImportPath)&&onInvalidate(specifier,fileImportPath,removed)})}))}return wp.on("change",async(filePath,mtime,explanation)=>{await onChangeOrRemove(filePath,!mtime)}),wp.on("remove",async(filePath,explanation)=>{await onChangeOrRemove(filePath,!0)}),()=>wp.close()}var DEBOUNCE=100;async function extractStoriesJson(outputFile,initializedStoryIndexGenerator,transform){let storyIndex=await(await initializedStoryIndexGenerator).getIndex();await(0,import_fs_extra4.writeJSON)(outputFile,transform?transform(storyIndex):storyIndex)}function useStoriesJson({router:router2,initializedStoryIndexGenerator,workingDir=process.cwd(),serverChannel,normalizedStories}){let maybeInvalidate=(0,import_debounce.default)(()=>serverChannel.emit(import_core_events.STORY_INDEX_INVALIDATED),DEBOUNCE,{leading:!0});watchStorySpecifiers(normalizedStories,{workingDir},async(specifier,path7,removed)=>{(await initializedStoryIndexGenerator).invalidate(specifier,path7,removed),maybeInvalidate()}),router2.use("/index.json",async(req,res)=>{try{let index=await(await initializedStoryIndexGenerator).getIndex();res.header("Content-Type","application/json"),res.send(JSON.stringify(index))}catch(err){res.status(500),res.send(err.message)}}),router2.use("/stories.json",async(req,res)=>{try{let generator=await initializedStoryIndexGenerator,index=convertToIndexV3(await generator.getIndex());res.header("Content-Type","application/json"),res.send(JSON.stringify(index))}catch(err){res.status(500),res.send(err.message)}})}var convertToIndexV3=index=>{let{entries}=index;return{v:3,stories:Object.entries(entries).reduce((acc,[id,entry])=>{let{type,...rest}=entry;return acc[id]={...rest,kind:rest.title,story:rest.name,parameters:{__id:rest.id,docsOnly:type==="docs",fileName:rest.importPath}},acc},{})}};var import_fs_extra5=require("fs-extra"),import_telemetry=require("@storybook/telemetry");async function extractStorybookMetadata(outputFile,configDir){let storybookMetadata=await(0,import_telemetry.getStorybookMetadata)(configDir);await(0,import_fs_extra5.writeJSON)(outputFile,storybookMetadata)}function useStorybookMetadata(router2,configDir){router2.use("/project.json",async(req,res)=>{let storybookMetadata=await(0,import_telemetry.getStorybookMetadata)(configDir);res.header("Content-Type","application/json"),res.send(JSON.stringify(storybookMetadata))})}var import_path7=__toESM(require("path")),import_chalk4=__toESM(require("chalk")),import_fs_extra6=__toESM(require("fs-extra")),import_globby2=__toESM(require("globby")),import_slash2=__toESM(require("slash")),import_preview_api=require("@storybook/preview-api"),import_core_common3=require("@storybook/core-common"),import_node_logger4=require("@storybook/node-logger"),import_csf_tools=require("@storybook/csf-tools"),import_csf=require("@storybook/csf"),import_docs_mdx=require("@storybook/docs-mdx");var import_path6=require("path");function autoName(mdxImportPath,csfImportPath,defaultName){let mdxBasename=(0,import_path6.basename)(mdxImportPath),csfBasename=(0,import_path6.basename)(csfImportPath),[mdxFilename]=mdxBasename.split("."),[csfFilename]=csfBasename.split(".");return mdxFilename===csfFilename?defaultName:mdxFilename}var AUTODOCS_TAG="autodocs",STORIES_MDX_TAG="stories-mdx",PLAY_FN_TAG="play-fn";function isMdxEntry({tags}){return!(tags!=null&&tags.includes(AUTODOCS_TAG))&&!(tags!=null&&tags.includes(STORIES_MDX_TAG))}var DuplicateEntriesError=class extends Error{constructor(message,entries){super();this.message=message,this.entries=entries}},makeAbsolute=(otherImport,normalizedPath,workingDir)=>otherImport.startsWith(".")?(0,import_slash2.default)(import_path7.default.resolve(workingDir,(0,import_core_common3.normalizeStoryPath)(import_path7.default.join(import_path7.default.dirname(normalizedPath),otherImport)))):otherImport,StoryIndexGenerator=class{constructor(specifiers,options){this.specifiers=specifiers;this.options=options;this.specifierToCache=new Map}async initialize(){(await Promise.all(this.specifiers.map(async specifier=>{let pathToSubIndex={},fullGlob=(0,import_slash2.default)(import_path7.default.join(this.options.workingDir,specifier.directory,specifier.files));return(await(0,import_globby2.default)(fullGlob)).sort().forEach(absolutePath=>{let ext=import_path7.default.extname(absolutePath);if(ext===".storyshot"){let relativePath=import_path7.default.relative(this.options.workingDir,absolutePath);import_node_logger4.logger.info(`Skipping ${ext} file ${relativePath}`);return}pathToSubIndex[absolutePath]=!1}),[specifier,pathToSubIndex]}))).forEach(([specifier,cache4])=>this.specifierToCache.set(specifier,cache4)),await this.ensureExtracted()}async updateExtracted(updater,overwrite=!1){await Promise.all(this.specifiers.map(async specifier=>{let entry=this.specifierToCache.get(specifier);return Promise.all(Object.keys(entry).map(async absolutePath=>{entry[absolutePath]&&!overwrite||(entry[absolutePath]=await updater(specifier,absolutePath,entry[absolutePath]))}))}))}isDocsMdx(absolutePath){return/(?<!\.stories)\.mdx$/i.test(absolutePath)}async ensureExtracted(){return await this.updateExtracted(async(specifier,absolutePath)=>this.isDocsMdx(absolutePath)?!1:this.extractStories(specifier,absolutePath)),this.options.docs.disable||await this.updateExtracted(async(specifier,absolutePath)=>this.extractDocs(specifier,absolutePath)),this.specifiers.flatMap(specifier=>{let cache4=this.specifierToCache.get(specifier);return Object.values(cache4).flatMap(entry=>entry?entry.type==="docs"?[entry]:entry.entries:[])})}findDependencies(absoluteImports){let dependencies=[],foundImports=new Set;return this.specifierToCache.forEach(cache4=>{Object.keys(cache4).filter(fileName=>{let foundImport=absoluteImports.find(storyImport=>fileName.startsWith(storyImport));return foundImport&&foundImports.add(foundImport),!!foundImport}).forEach(fileName=>{let cacheEntry=cache4[fileName];if(cacheEntry&&cacheEntry.type==="stories")dependencies.push(cacheEntry);else throw new Error(`Unexpected dependency: ${cacheEntry}`)})}),dependencies}async extractStories(specifier,absolutePath){let relativePath=import_path7.default.relative(this.options.workingDir,absolutePath),entries=[];try{let importPath=(0,import_slash2.default)((0,import_core_common3.normalizeStoryPath)(relativePath)),makeTitle=userTitle=>(0,import_preview_api.userOrAutoTitleFromSpecifier)(importPath,specifier,userTitle),storyIndexer=this.options.storyIndexers.find(indexer=>indexer.test.exec(absolutePath));if(!storyIndexer)throw new Error(`No matching story indexer found for ${absolutePath}`);let csf=await storyIndexer.indexer(absolutePath,{makeTitle}),componentTags=csf.meta.tags||[];if(csf.stories.forEach(({id,name,tags:storyTags,parameters})=>{if(!(parameters!=null&&parameters.docsOnly)){let tags=[...storyTags||componentTags,"story"];entries.push({id,title:csf.meta.title,name,importPath,tags,type:"story"})}}),!this.options.docs.disable&&csf.stories.length){let{autodocs}=this.options.docs,componentAutodocs=componentTags.includes(AUTODOCS_TAG),autodocsOptedIn=autodocs===!0||autodocs==="tag"&&componentAutodocs;if(componentTags.includes(STORIES_MDX_TAG)||autodocsOptedIn){let name=this.options.docs.defaultName,id=(0,import_csf.toId)(csf.meta.title,name);entries.unshift({id,title:csf.meta.title,name,importPath,type:"docs",tags:[...componentTags,"docs",...autodocsOptedIn&&!componentAutodocs?[AUTODOCS_TAG]:[]],storiesImports:[]})}}}catch(err){if(err instanceof import_csf_tools.NoMetaError)import_node_logger4.logger.info(`\u{1F4A1} Skipping ${relativePath}: ${err}`);else throw import_node_logger4.logger.warn(`\u{1F6A8} Extraction error on ${relativePath}: ${err}`),err}return{entries,type:"stories",dependents:[]}}async extractDocs(specifier,absolutePath){var _a;let relativePath=import_path7.default.relative(this.options.workingDir,absolutePath);try{if(!this.options.storyStoreV7)throw new Error("You cannot use `.mdx` files without using `storyStoreV7`.");let normalizedPath=(0,import_core_common3.normalizeStoryPath)(relativePath),importPath=(0,import_slash2.default)(normalizedPath),content=await import_fs_extra6.default.readFile(absolutePath,"utf8"),result=(0,import_docs_mdx.analyze)(content);if(result.isTemplate)return!1;let absoluteImports=result.imports.map(p=>makeAbsolute(p,normalizedPath,this.options.workingDir)),dependencies=this.findDependencies(absoluteImports),csfEntry;if(result.of){let absoluteOf=makeAbsolute(result.of,normalizedPath,this.options.workingDir);if(dependencies.forEach(dep=>{if(dep.entries.length>0){let first=dep.entries.find(e=>e.type!=="docs");import_path7.default.normalize(import_path7.default.resolve(this.options.workingDir,first.importPath)).startsWith(import_path7.default.normalize(absoluteOf))&&(csfEntry=first)}}),!csfEntry)throw new Error(`Could not find "${result.of}" for docs file "${relativePath}".`)}dependencies.forEach(dep=>{dep.dependents.push(absolutePath)});let title=(csfEntry==null?void 0:csfEntry.title)||(0,import_preview_api.userOrAutoTitleFromSpecifier)(importPath,specifier,result.title),{defaultName}=this.options.docs,name=result.name||(csfEntry?autoName(importPath,csfEntry.importPath,defaultName):defaultName);return{id:(0,import_csf.toId)(title,name),title,name,importPath,storiesImports:dependencies.map(dep=>dep.entries[0].importPath),type:"docs",tags:[...result.tags||[],"docs"]}}catch(err){throw import_node_logger4.logger.warn(`\u{1F6A8} Extraction error on ${import_chalk4.default.blue(relativePath)}: ${err}`),(_a=err.source)!=null&&_a.match(/mdast-util-mdx-jsx/g)&&import_node_logger4.logger.warn(`\u{1F4A1} This seems to be an MDX2 syntax error. Please refer to the MDX section in the following resource for assistance on how to fix this: ${import_chalk4.default.yellow("https://storybook.js.org/migration-guides/7.0")}`),err}}chooseDuplicate(firstEntry,secondEntry){var _a;let firstIsBetter=!0;(secondEntry.type==="story"||isMdxEntry(secondEntry)&&firstEntry.type==="docs"&&!isMdxEntry(firstEntry))&&(firstIsBetter=!1);let betterEntry=firstIsBetter?firstEntry:secondEntry,worseEntry=firstIsBetter?secondEntry:firstEntry,changeDocsName='Use `<Meta of={} name="Other Name">` to distinguish them.';if(worseEntry.type==="story")throw new DuplicateEntriesError(`Duplicate stories with id: ${firstEntry.id}`,[firstEntry,secondEntry]);if(betterEntry.type==="story"){let worseDescriptor=isMdxEntry(worseEntry)?"component docs page":"automatically generated docs page";betterEntry.name===this.options.docs.defaultName?import_node_logger4.logger.warn(`\u{1F6A8} You have a story for ${betterEntry.title} with the same name as your default docs entry name (${betterEntry.name}), so the docs page is being dropped. Consider changing the story name.`):import_node_logger4.logger.warn(`\u{1F6A8} You have a story for ${betterEntry.title} with the same name as your ${worseDescriptor} (${worseEntry.name}), so the docs page is being dropped. ${changeDocsName}`)}else if(isMdxEntry(betterEntry)){if(isMdxEntry(worseEntry)&&import_node_logger4.logger.warn(`\u{1F6A8} You have two component docs pages with the same name ${betterEntry.title}:${betterEntry.name}. ${changeDocsName}`),(_a=worseEntry.tags)!=null&&_a.includes(AUTODOCS_TAG)&&this.options.docs.autodocs!==!0)throw new Error(`You created a component docs page for ${worseEntry.title} (${betterEntry.importPath}), but also tagged the CSF file (${worseEntry.importPath}) with '${AUTODOCS_TAG}'. This is probably a mistake.`)}else return{...betterEntry,storiesImports:[...betterEntry.storiesImports,worseEntry.importPath,...worseEntry.storiesImports]};return betterEntry}async sortStories(storiesList){let entries={};storiesList.forEach(entry=>{let existing=entries[entry.id];existing?entries[entry.id]=this.chooseDuplicate(existing,entry):entries[entry.id]=entry});let sortableStories=Object.values(entries);if(this.options.storyStoreV7){let storySortParameter=await this.getStorySortParameter(),fileNameOrder=this.storyFileNames();(0,import_preview_api.sortStoriesV7)(sortableStories,storySortParameter,fileNameOrder)}return sortableStories.reduce((acc,item)=>(acc[item.id]=item,acc),{})}async getIndex(){if(this.lastIndex)return this.lastIndex;let storiesList=await this.ensureExtracted(),sorted=await this.sortStories(storiesList),compat=sorted;if(this.options.storiesV2Compatibility){let titleToStoryCount=Object.values(sorted).reduce((acc,story)=>(acc[story.title]=(acc[story.title]||0)+1,acc),{});compat=Object.entries(sorted).reduce((acc,entry)=>{let[id,story]=entry;return story.type==="docs"||(acc[id]={...story,kind:story.title,story:story.name,parameters:{__id:story.id,docsOnly:titleToStoryCount[story.title]===1&&story.name==="Page",fileName:story.importPath}}),acc},{})}return this.lastIndex={v:4,entries:compat},this.lastIndex}invalidate(specifier,importPath,removed){let absolutePath=(0,import_slash2.default)(import_path7.default.resolve(this.options.workingDir,importPath)),cache4=this.specifierToCache.get(specifier),cacheEntry=cache4[absolutePath];if(cacheEntry&&cacheEntry.type==="stories"){let{dependents}=cacheEntry,invalidated=new Set;this.specifierToCache.forEach(otherCache=>{dependents.forEach(dep=>{otherCache[dep]&&(invalidated.add(dep),otherCache[dep]=!1)})})}if(removed){if(cacheEntry&&cacheEntry.type==="docs"){let absoluteImports=cacheEntry.storiesImports.map(p=>import_path7.default.resolve(this.options.workingDir,p));this.findDependencies(absoluteImports).forEach(dep=>dep.dependents.splice(dep.dependents.indexOf(absolutePath),1))}delete cache4[absolutePath]}else cache4[absolutePath]=!1;this.lastIndex=null}async getStorySortParameter(){let previewFile=["js","jsx","ts","tsx"].map(ext=>import_path7.default.join(this.options.configDir,`preview.${ext}`)).find(fname=>import_fs_extra6.default.existsSync(fname)),storySortParameter;if(previewFile){let previewCode=(await import_fs_extra6.default.readFile(previewFile,"utf-8")).toString();storySortParameter=await(0,import_csf_tools.getStorySortParameter)(previewCode)}return storySortParameter}storyFileNames(){return Array.from(this.specifierToCache.values()).flatMap(r=>Object.keys(r))}};var PAGE_REGEX=/(page|screen)/i,isPageStory=storyId=>PAGE_REGEX.test(storyId),isExampleEntry=entry=>["example-introduction--docs","example-button--docs","example-button--primary","example-button--secondary","example-button--large","example-button--small","example-header--docs","example-header--logged-in","example-header--logged-out","example-page--logged-in","example-page--logged-out"].includes(entry.id);function summarizeIndex(storyIndex){let storyCount=0,exampleStoryCount=0,exampleDocsCount=0,pageStoryCount=0,playStoryCount=0,autodocsCount=0,storiesMdxCount=0,mdxCount=0;return Object.values(storyIndex.entries).forEach(entry=>{var _a,_b,_c;isExampleEntry(entry)?(entry.type==="story"&&(exampleStoryCount+=1),entry.type==="docs"&&(exampleDocsCount+=1)):entry.type==="story"?(storyCount+=1,isPageStory(entry.title)&&(pageStoryCount+=1),(_a=entry.tags)!=null&&_a.includes(PLAY_FN_TAG)&&(playStoryCount+=1)):entry.type==="docs"&&(isMdxEntry(entry)?mdxCount+=1:(_b=entry.tags)!=null&&_b.includes(STORIES_MDX_TAG)?storiesMdxCount+=1:(_c=entry.tags)!=null&&_c.includes(AUTODOCS_TAG)&&(autodocsCount+=1))}),{storyCount,pageStoryCount,playStoryCount,autodocsCount,storiesMdxCount,mdxCount,exampleStoryCount,exampleDocsCount,version:storyIndex.v}}async function buildStaticStandalone(options){var _a;if(options.configType="PRODUCTION",options.outputDir==="")throw new Error("Won't remove current directory. Check your outputDir!");if((_a=options.staticDir)!=null&&_a.includes("/"))throw new Error("Won't copy root directory. Check your staticDirs!");if(options.outputDir=(0,import_path8.isAbsolute)(options.outputDir)?options.outputDir:(0,import_path8.join)(process.cwd(),options.outputDir),options.configDir=(0,import_path8.resolve)(options.configDir),import_node_logger5.logger.info(import_chalk5.default`=> Cleaning outputDir: {cyan ${options.outputDir.replace(process.cwd(),"")}}`),options.outputDir==="/")throw new Error("Won't remove directory '/'. Check your outputDir!");await(0,import_fs_extra7.emptyDir)(options.outputDir),await(0,import_fs_extra7.ensureDir)(options.outputDir);let{framework}=await(0,import_core_common4.loadMainConfig)(options),corePresets=[],frameworkName=typeof framework=="string"?framework:framework==null?void 0:framework.name;frameworkName?corePresets.push((0,import_path8.join)(frameworkName,"preset")):import_node_logger5.logger.warn(`you have not specified a framework in your ${options.configDir}/main.js`),import_node_logger5.logger.info("=> Loading presets");let presets=await(0,import_core_common4.loadAllPresets)({corePresets:[require.resolve("@storybook/core-server/dist/presets/common-preset"),...corePresets],overridePresets:[],...options}),[previewBuilder,managerBuilder]=await getBuilders({...options,presets}),{renderer}=await presets.apply("core",{});presets=await(0,import_core_common4.loadAllPresets)({corePresets:[require.resolve("@storybook/core-server/dist/presets/common-preset"),...managerBuilder.corePresets||[],...previewBuilder.corePresets||[],...renderer?[(0,import_core_common4.resolveAddonName)(options.configDir,renderer,options)]:[],...corePresets,require.resolve("@storybook/core-server/dist/presets/babel-cache-preset")],overridePresets:previewBuilder.overridePresets||[],...options});let[features,core,staticDirs,storyIndexers,stories,docsOptions]=await Promise.all([presets.apply("features"),presets.apply("core"),presets.apply("staticDirs"),presets.apply("storyIndexers",[]),presets.apply("stories"),presets.apply("docs",{})]),fullOptions={...options,presets,features};if(staticDirs&&options.staticDir)throw new Error(import_ts_dedent2.dedent`
11
11
  Conflict when trying to read staticDirs:
12
12
  * Storybook's configuration option: 'staticDirs'
13
13
  * Storybook's CLI flag: '--staticDir' or '-s'
14
14
 
15
15
  Choose one of them, but not both.
16
- `);let effects=[];import_global.global.FEATURES=features,await managerBuilder.build({startTime:process.hrtime(),options:fullOptions}),staticDirs&&effects.push(copyAllStaticFilesRelativeToMain(staticDirs,options.outputDir,options.configDir)),options.staticDir&&effects.push(copyAllStaticFiles(options.staticDir,options.outputDir));let coreServerPublicDir=(0,import_path7.join)((0,import_path7.dirname)(require.resolve("@storybook/core-server/package.json")),"public");effects.push((0,import_fs_extra7.copy)(coreServerPublicDir,options.outputDir));let initializedStoryIndexGenerator=Promise.resolve(void 0);if((features!=null&&features.buildStoriesJson||features!=null&&features.storyStoreV7)&&!options.ignorePreview){let workingDir=process.cwd(),directories={configDir:options.configDir,workingDir},normalizedStories=(0,import_core_common4.normalizeStories)(stories,directories),generator=new StoryIndexGenerator(normalizedStories,{...directories,storyIndexers,docs:docsOptions,storiesV2Compatibility:!(features!=null&&features.breakingChangesV7)&&!(features!=null&&features.storyStoreV7),storyStoreV7:!!(features!=null&&features.storyStoreV7)});initializedStoryIndexGenerator=generator.initialize().then(()=>generator),effects.push(extractStoriesJson((0,import_path7.join)(options.outputDir,"stories.json"),initializedStoryIndexGenerator,convertToIndexV3)),effects.push(extractStoriesJson((0,import_path7.join)(options.outputDir,"index.json"),initializedStoryIndexGenerator))}core!=null&&core.disableProjectJson||effects.push(extractStorybookMetadata((0,import_path7.join)(options.outputDir,"project.json"),options.configDir)),options.debugWebpack&&(0,import_core_common4.logConfig)("Preview webpack config",await previewBuilder.getConfig(fullOptions)),options.ignorePreview&&import_node_logger5.logger.info("=> Not building preview"),await Promise.all([...options.ignorePreview?[]:[previewBuilder.build({startTime:process.hrtime(),options:fullOptions}).then(async previewStats=>{if(options.webpackStatsJson){let target=options.webpackStatsJson===!0?options.outputDir:options.webpackStatsJson;await outputStats(target,previewStats)}})],...effects]),core!=null&&core.disableTelemetry||effects.push(initializedStoryIndexGenerator.then(async generator=>{let storyIndex=await(generator==null?void 0:generator.getIndex()),payload={precedingUpgrade:await(0,import_telemetry2.getPrecedingUpgrade)()};storyIndex&&Object.assign(payload,{storyIndex:summarizeIndex(storyIndex)}),await(0,import_telemetry2.telemetry)("build",payload,{configDir:options.configDir})})),import_node_logger5.logger.info(`=> Output directory: ${options.outputDir}`)}var import_core_common8=require("@storybook/core-common"),import_prompts=__toESM(require("prompts")),import_global2=require("@storybook/global"),import_telemetry4=require("@storybook/telemetry"),import_path9=require("path"),import_node_logger11=require("@storybook/node-logger");var import_express3=__toESM(require("express")),import_compression=__toESM(require("compression")),import_core_common6=require("@storybook/core-common");var import_path8=__toESM(require("path")),import_fs2=__toESM(require("fs")),fileExists=basename2=>[".js",".cjs"].reduce((found,ext)=>{let filename=`${basename2}${ext}`;return!found&&import_fs2.default.existsSync(filename)?filename:found},"");function getMiddleware(configDir){let middlewarePath=fileExists(import_path8.default.resolve(configDir,"middleware"));if(middlewarePath){let middlewareModule=require(middlewarePath);return middlewareModule.__esModule&&(middlewareModule=middlewareModule.default),middlewareModule}return()=>{}}var import_ip=__toESM(require("ip")),import_node_logger6=require("@storybook/node-logger"),import_detect_port=__toESM(require("detect-port"));function getServerAddresses(port,host,proto){return{address:`${proto}://localhost:${port}/`,networkAddress:`${proto}://${host||import_ip.default.address()}:${port}/`}}var getServerPort=port=>(0,import_detect_port.default)(port).catch(error=>{import_node_logger6.logger.error(error),process.exit(-1)}),getServerChannelUrl=(port,{https:https2})=>`${https2?"wss":"ws"}://localhost:${port}/storybook-server-channel`;var import_node_logger7=require("@storybook/node-logger"),import_fs_extra8=require("fs-extra"),import_http=__toESM(require("http")),import_https=__toESM(require("https"));async function getServer(app,options){if(!options.https)return import_http.default.createServer(app);options.sslCert||(import_node_logger7.logger.error("Error: --ssl-cert is required with --https"),process.exit(-1)),options.sslKey||(import_node_logger7.logger.error("Error: --ssl-key is required with --https"),process.exit(-1));let sslOptions={ca:await Promise.all((options.sslCa||[]).map(ca=>(0,import_fs_extra8.readFile)(ca,"utf-8"))),cert:await(0,import_fs_extra8.readFile)(options.sslCert,"utf-8"),key:await(0,import_fs_extra8.readFile)(options.sslKey,"utf-8")};return import_https.default.createServer(sslOptions,app)}var import_ws=__toESM(require("ws")),import_telejson=require("telejson"),ServerChannel=class{constructor(server){this.webSocketServer=new import_ws.WebSocketServer({noServer:!0}),server.on("upgrade",(request,socket,head)=>{request.url==="/storybook-server-channel"&&this.webSocketServer.handleUpgrade(request,socket,head,ws=>{this.webSocketServer.emit("connection",ws,request)})})}emit(type,args=[]){let data=(0,import_telejson.stringify)({type,args},{maxDepth:15,allowFunction:!0});Array.from(this.webSocketServer.clients).filter(c=>c.readyState===import_ws.default.OPEN).forEach(client=>client.send(data))}};function getServerChannel(server){return new ServerChannel(server)}var import_node_logger8=require("@storybook/node-logger"),import_better_opn=__toESM(require("better-opn")),import_open=__toESM(require("open")),import_x_default_browser=__toESM(require("@aw-web-design/x-default-browser")),import_ts_dedent3=require("ts-dedent");function openInBrowser(address){(0,import_x_default_browser.default)(async(err,res)=>{try{res&&(res.isChrome||res.isChromium||res.identity==="com.brave.browser")?(0,import_better_opn.default)(address):await(0,import_open.default)(address)}catch{import_node_logger8.logger.error(import_ts_dedent3.dedent`
16
+ `);let effects=[];import_global.global.FEATURES=features,await managerBuilder.build({startTime:process.hrtime(),options:fullOptions}),staticDirs&&effects.push(copyAllStaticFilesRelativeToMain(staticDirs,options.outputDir,options.configDir)),options.staticDir&&effects.push(copyAllStaticFiles(options.staticDir,options.outputDir));let coreServerPublicDir=(0,import_path8.join)((0,import_path8.dirname)(require.resolve("@storybook/core-server/package.json")),"public");effects.push((0,import_fs_extra7.copy)(coreServerPublicDir,options.outputDir));let initializedStoryIndexGenerator=Promise.resolve(void 0);if((features!=null&&features.buildStoriesJson||features!=null&&features.storyStoreV7)&&!options.ignorePreview){let workingDir=process.cwd(),directories={configDir:options.configDir,workingDir},normalizedStories=(0,import_core_common4.normalizeStories)(stories,directories),generator=new StoryIndexGenerator(normalizedStories,{...directories,storyIndexers,docs:docsOptions,storiesV2Compatibility:!(features!=null&&features.breakingChangesV7)&&!(features!=null&&features.storyStoreV7),storyStoreV7:!!(features!=null&&features.storyStoreV7)});initializedStoryIndexGenerator=generator.initialize().then(()=>generator),effects.push(extractStoriesJson((0,import_path8.join)(options.outputDir,"stories.json"),initializedStoryIndexGenerator,convertToIndexV3)),effects.push(extractStoriesJson((0,import_path8.join)(options.outputDir,"index.json"),initializedStoryIndexGenerator))}core!=null&&core.disableProjectJson||effects.push(extractStorybookMetadata((0,import_path8.join)(options.outputDir,"project.json"),options.configDir)),options.debugWebpack&&(0,import_core_common4.logConfig)("Preview webpack config",await previewBuilder.getConfig(fullOptions)),options.ignorePreview&&import_node_logger5.logger.info("=> Not building preview"),await Promise.all([...options.ignorePreview?[]:[previewBuilder.build({startTime:process.hrtime(),options:fullOptions}).then(async previewStats=>{if(options.webpackStatsJson){let target=options.webpackStatsJson===!0?options.outputDir:options.webpackStatsJson;await outputStats(target,previewStats)}})],...effects]),core!=null&&core.disableTelemetry||effects.push(initializedStoryIndexGenerator.then(async generator=>{let storyIndex=await(generator==null?void 0:generator.getIndex()),payload={precedingUpgrade:await(0,import_telemetry2.getPrecedingUpgrade)()};storyIndex&&Object.assign(payload,{storyIndex:summarizeIndex(storyIndex)}),await(0,import_telemetry2.telemetry)("build",payload,{configDir:options.configDir})})),import_node_logger5.logger.info(`=> Output directory: ${options.outputDir}`)}var import_core_common8=require("@storybook/core-common"),import_prompts=__toESM(require("prompts")),import_global2=require("@storybook/global"),import_telemetry4=require("@storybook/telemetry"),import_path10=require("path"),import_node_logger11=require("@storybook/node-logger");var import_express3=__toESM(require("express")),import_compression=__toESM(require("compression")),import_core_common6=require("@storybook/core-common");var import_path9=__toESM(require("path")),import_fs2=__toESM(require("fs")),fileExists=basename2=>[".js",".cjs"].reduce((found,ext)=>{let filename=`${basename2}${ext}`;return!found&&import_fs2.default.existsSync(filename)?filename:found},"");function getMiddleware(configDir){let middlewarePath=fileExists(import_path9.default.resolve(configDir,"middleware"));if(middlewarePath){let middlewareModule=require(middlewarePath);return middlewareModule.__esModule&&(middlewareModule=middlewareModule.default),middlewareModule}return()=>{}}var import_ip=__toESM(require("ip")),import_node_logger6=require("@storybook/node-logger"),import_detect_port=__toESM(require("detect-port"));function getServerAddresses(port,host,proto){return{address:`${proto}://localhost:${port}/`,networkAddress:`${proto}://${host||import_ip.default.address()}:${port}/`}}var getServerPort=port=>(0,import_detect_port.default)(port).catch(error=>{import_node_logger6.logger.error(error),process.exit(-1)}),getServerChannelUrl=(port,{https:https2})=>`${https2?"wss":"ws"}://localhost:${port}/storybook-server-channel`;var import_node_logger7=require("@storybook/node-logger"),import_fs_extra8=require("fs-extra"),import_http=__toESM(require("http")),import_https=__toESM(require("https"));async function getServer(app,options){if(!options.https)return import_http.default.createServer(app);options.sslCert||(import_node_logger7.logger.error("Error: --ssl-cert is required with --https"),process.exit(-1)),options.sslKey||(import_node_logger7.logger.error("Error: --ssl-key is required with --https"),process.exit(-1));let sslOptions={ca:await Promise.all((options.sslCa||[]).map(ca=>(0,import_fs_extra8.readFile)(ca,"utf-8"))),cert:await(0,import_fs_extra8.readFile)(options.sslCert,"utf-8"),key:await(0,import_fs_extra8.readFile)(options.sslKey,"utf-8")};return import_https.default.createServer(sslOptions,app)}var import_ws=__toESM(require("ws")),import_telejson=require("telejson"),ServerChannel=class{constructor(server){this.webSocketServer=new import_ws.WebSocketServer({noServer:!0}),server.on("upgrade",(request,socket,head)=>{request.url==="/storybook-server-channel"&&this.webSocketServer.handleUpgrade(request,socket,head,ws=>{this.webSocketServer.emit("connection",ws,request)})})}emit(type,args=[]){let data=(0,import_telejson.stringify)({type,args},{maxDepth:15,allowFunction:!0});Array.from(this.webSocketServer.clients).filter(c=>c.readyState===import_ws.default.OPEN).forEach(client=>client.send(data))}};function getServerChannel(server){return new ServerChannel(server)}var import_node_logger8=require("@storybook/node-logger"),import_better_opn=__toESM(require("better-opn")),import_open=__toESM(require("open")),import_x_default_browser=__toESM(require("@aw-web-design/x-default-browser")),import_ts_dedent3=require("ts-dedent");function openInBrowser(address){(0,import_x_default_browser.default)(async(err,res)=>{try{res&&(res.isChrome||res.isChromium||res.identity==="com.brave.browser")?(0,import_better_opn.default)(address):await(0,import_open.default)(address)}catch{import_node_logger8.logger.error(import_ts_dedent3.dedent`
17
17
  Could not open ${address} inside a browser. If you're running this command inside a
18
18
  docker container or on a CI, you need to pass the '--ci' flag to prevent opening a
19
19
  browser by default.
@@ -30,4 +30,4 @@ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropD
30
30
  ${serveMessage.toString()}${updateMessage?`
31
31
 
32
32
  ${updateMessage}`:""}
33
- `,{borderStyle:"round",padding:1,borderColor:"#F1618C"}))}async function buildDevStandalone(options){var _a,_b;let{packageJson,versionUpdates,releaseNotes}=options,{version}=packageJson,[port,versionCheck,releaseNotesData]=await Promise.all([getServerPort(options.port),versionUpdates?updateCheck(version):Promise.resolve({success:!1,cached:!1,data:{},time:Date.now()}),releaseNotes?getReleaseNotesData(version,import_core_common8.cache):Promise.resolve(getReleaseNotesFailedState(version))]);if(!options.ci&&!options.smokeTest&&options.port!=null&&port!==options.port){let{shouldChangePort}=await(0,import_prompts.default)({type:"confirm",initial:!0,name:"shouldChangePort",message:`Port ${options.port} is not available. Would you like to run Storybook on port ${port} instead?`});shouldChangePort||process.exit(1)}options.port=port,options.versionCheck=versionCheck,options.releaseNotesData=releaseNotesData,options.configType="DEVELOPMENT",options.configDir=(0,import_path9.resolve)(options.configDir),options.outputDir=options.smokeTest?(0,import_core_common8.resolvePathInStorybookCache)("public"):(0,import_path9.resolve)(options.outputDir||(0,import_core_common8.resolvePathInStorybookCache)("public")),options.serverChannelUrl=getServerChannelUrl(port,options);let{framework}=await(0,import_core_common8.loadMainConfig)(options),corePresets=[],frameworkName=typeof framework=="string"?framework:framework==null?void 0:framework.name;(0,import_core_common8.validateFrameworkName)(frameworkName),frameworkName?corePresets.push((0,import_path9.join)(frameworkName,"preset")):import_node_logger11.logger.warn(`you have not specified a framework in your ${options.configDir}/main.js`);let presets=await(0,import_core_common8.loadAllPresets)({corePresets,overridePresets:[],...options}),{renderer,builder,disableTelemetry}=await presets.apply("core",{});!options.disableTelemetry&&!disableTelemetry&&versionCheck.success&&!versionCheck.cached&&(0,import_telemetry4.telemetry)("version-update");let builderName=typeof builder=="string"?builder:builder==null?void 0:builder.name,[previewBuilder,managerBuilder]=await Promise.all([getPreviewBuilder(builderName,options.configDir),getManagerBuilder()]);presets=await(0,import_core_common8.loadAllPresets)({corePresets:[require.resolve("@storybook/core-server/dist/presets/common-preset"),...managerBuilder.corePresets||[],...previewBuilder.corePresets||[],...renderer?[(0,import_core_common8.resolveAddonName)(options.configDir,renderer,options)]:[],...corePresets,require.resolve("@storybook/core-server/dist/presets/babel-cache-preset")],overridePresets:previewBuilder.overridePresets,...options});let features=await presets.apply("features");import_global2.global.FEATURES=features;let fullOptions={...options,presets,features},{address,networkAddress,managerResult,previewResult}=await storybookDevServer(fullOptions),previewTotalTime=previewResult&&previewResult.totalTime,managerTotalTime=managerResult&&managerResult.totalTime,previewStats=previewResult&&previewResult.stats,managerStats=managerResult&&managerResult.stats;if(options.webpackStatsJson){let target=options.webpackStatsJson===!0?options.outputDir:options.webpackStatsJson;await outputStats(target,previewStats)}if(options.smokeTest){let warnings=[];warnings.push(...((_a=managerStats==null?void 0:managerStats.toJson())==null?void 0:_a.warnings)||[]),warnings.push(...((_b=previewStats==null?void 0:previewStats.toJson())==null?void 0:_b.warnings)||[]);let problems=warnings.filter(warning=>!warning.message.includes("export 'useInsertionEffect'")).filter(warning=>!warning.message.includes("compilation but it's unused")).filter(warning=>!warning.message.includes("Conflicting values for 'process.env.NODE_ENV'"));console.log(problems.map(p=>p.stack)),process.exit(problems.length>0?1:0)}else{let name=frameworkName.split("@storybook/").length>1?frameworkName.split("@storybook/")[1]:frameworkName;outputStartupInformation({updateInfo:versionCheck,version,name,address,networkAddress,managerTotalTime,previewTotalTime})}return{port,address,networkAddress}}var import_prompts2=__toESM(require("prompts")),import_core_common9=require("@storybook/core-common"),import_telemetry5=require("@storybook/telemetry"),promptCrashReports=async()=>{if(process.env.CI&&process.env.NODE_ENV!=="test")return;let{enableCrashReports}=await(0,import_prompts2.default)({type:"confirm",name:"enableCrashReports",message:"Would you like to send crash reports to Storybook?",initial:!0});return await import_core_common9.cache.set("enableCrashReports",enableCrashReports),enableCrashReports};async function getErrorLevel({cliOptions,presetOptions}){if(cliOptions.disableTelemetry)return"none";if(!presetOptions)return"full";let core=await(await(0,import_core_common9.loadAllPresets)({corePresets:[require.resolve("@storybook/core-server/dist/presets/common-preset")],overridePresets:[],...presetOptions})).apply("core");if((core==null?void 0:core.enableCrashReports)!==void 0)return core.enableCrashReports?"full":"error";if(core!=null&&core.disableTelemetry)return"none";let valueFromCache=await import_core_common9.cache.get("enableCrashReports")??await import_core_common9.cache.get("enableCrashreports");if(valueFromCache!==void 0)return valueFromCache?"full":"error";let valueFromPrompt=await promptCrashReports();return valueFromPrompt!==void 0?valueFromPrompt?"full":"error":"full"}async function withTelemetry(eventType,options,run){var _a;options.cliOptions.disableTelemetry||(0,import_telemetry5.telemetry)("boot",{eventType},{stripMetadata:!0});try{await run()}catch(error){try{let errorLevel=await getErrorLevel(options);if(errorLevel!=="none"){let precedingUpgrade=await(0,import_telemetry5.getPrecedingUpgrade)();await(0,import_telemetry5.telemetry)("error",{eventType,precedingUpgrade,error:errorLevel==="full"?error:void 0,errorHash:(0,import_telemetry5.oneWayHash)(error.message)},{immediate:!0,configDir:options.cliOptions.configDir||((_a=options.presetOptions)==null?void 0:_a.configDir),enableCrashReports:errorLevel==="full"})}}catch{}throw error}}var import_read_pkg_up=require("read-pkg-up");async function build(options={},frameworkOptions={}){let{mode="dev"}=options,{packageJson}=(0,import_read_pkg_up.sync)({cwd:__dirname}),commonOptions={...options,...frameworkOptions,frameworkPresets:[...options.frameworkPresets||[],...frameworkOptions.frameworkPresets||[]],packageJson};if(mode==="dev")return buildDevStandalone(commonOptions);if(mode==="static")return buildStaticStandalone(commonOptions);throw new Error("'mode' parameter should be either 'dev' or 'static'")}var standalone_default=build;0&&(module.exports={build,buildDevStandalone,buildStaticStandalone,getPreviewBodyTemplate,getPreviewHeadTemplate,withTelemetry});
33
+ `,{borderStyle:"round",padding:1,borderColor:"#F1618C"}))}async function buildDevStandalone(options){var _a,_b;let{packageJson,versionUpdates,releaseNotes}=options,{version}=packageJson,[port,versionCheck,releaseNotesData]=await Promise.all([getServerPort(options.port),versionUpdates?updateCheck(version):Promise.resolve({success:!1,cached:!1,data:{},time:Date.now()}),releaseNotes?getReleaseNotesData(version,import_core_common8.cache):Promise.resolve(getReleaseNotesFailedState(version))]);if(!options.ci&&!options.smokeTest&&options.port!=null&&port!==options.port){let{shouldChangePort}=await(0,import_prompts.default)({type:"confirm",initial:!0,name:"shouldChangePort",message:`Port ${options.port} is not available. Would you like to run Storybook on port ${port} instead?`});shouldChangePort||process.exit(1)}options.port=port,options.versionCheck=versionCheck,options.releaseNotesData=releaseNotesData,options.configType="DEVELOPMENT",options.configDir=(0,import_path10.resolve)(options.configDir),options.outputDir=options.smokeTest?(0,import_core_common8.resolvePathInStorybookCache)("public"):(0,import_path10.resolve)(options.outputDir||(0,import_core_common8.resolvePathInStorybookCache)("public")),options.serverChannelUrl=getServerChannelUrl(port,options);let{framework}=await(0,import_core_common8.loadMainConfig)(options),corePresets=[],frameworkName=typeof framework=="string"?framework:framework==null?void 0:framework.name;(0,import_core_common8.validateFrameworkName)(frameworkName),frameworkName?corePresets.push((0,import_path10.join)(frameworkName,"preset")):import_node_logger11.logger.warn(`you have not specified a framework in your ${options.configDir}/main.js`);let presets=await(0,import_core_common8.loadAllPresets)({corePresets,overridePresets:[],...options}),{renderer,builder,disableTelemetry}=await presets.apply("core",{});!options.disableTelemetry&&!disableTelemetry&&versionCheck.success&&!versionCheck.cached&&(0,import_telemetry4.telemetry)("version-update");let builderName=typeof builder=="string"?builder:builder==null?void 0:builder.name,[previewBuilder,managerBuilder]=await Promise.all([getPreviewBuilder(builderName,options.configDir),getManagerBuilder()]);presets=await(0,import_core_common8.loadAllPresets)({corePresets:[require.resolve("@storybook/core-server/dist/presets/common-preset"),...managerBuilder.corePresets||[],...previewBuilder.corePresets||[],...renderer?[(0,import_core_common8.resolveAddonName)(options.configDir,renderer,options)]:[],...corePresets,require.resolve("@storybook/core-server/dist/presets/babel-cache-preset")],overridePresets:previewBuilder.overridePresets,...options});let features=await presets.apply("features");import_global2.global.FEATURES=features;let fullOptions={...options,presets,features},{address,networkAddress,managerResult,previewResult}=await storybookDevServer(fullOptions),previewTotalTime=previewResult&&previewResult.totalTime,managerTotalTime=managerResult&&managerResult.totalTime,previewStats=previewResult&&previewResult.stats,managerStats=managerResult&&managerResult.stats;if(options.webpackStatsJson){let target=options.webpackStatsJson===!0?options.outputDir:options.webpackStatsJson;await outputStats(target,previewStats)}if(options.smokeTest){let warnings=[];warnings.push(...((_a=managerStats==null?void 0:managerStats.toJson())==null?void 0:_a.warnings)||[]),warnings.push(...((_b=previewStats==null?void 0:previewStats.toJson())==null?void 0:_b.warnings)||[]);let problems=warnings.filter(warning=>!warning.message.includes("export 'useInsertionEffect'")).filter(warning=>!warning.message.includes("compilation but it's unused")).filter(warning=>!warning.message.includes("Conflicting values for 'process.env.NODE_ENV'"));console.log(problems.map(p=>p.stack)),process.exit(problems.length>0?1:0)}else{let name=frameworkName.split("@storybook/").length>1?frameworkName.split("@storybook/")[1]:frameworkName;outputStartupInformation({updateInfo:versionCheck,version,name,address,networkAddress,managerTotalTime,previewTotalTime})}return{port,address,networkAddress}}var import_prompts2=__toESM(require("prompts")),import_core_common9=require("@storybook/core-common"),import_telemetry5=require("@storybook/telemetry"),promptCrashReports=async()=>{if(process.env.CI&&process.env.NODE_ENV!=="test")return;let{enableCrashReports}=await(0,import_prompts2.default)({type:"confirm",name:"enableCrashReports",message:"Would you like to send crash reports to Storybook?",initial:!0});return await import_core_common9.cache.set("enableCrashReports",enableCrashReports),enableCrashReports};async function getErrorLevel({cliOptions,presetOptions}){if(cliOptions.disableTelemetry)return"none";if(!presetOptions)return"full";let core=await(await(0,import_core_common9.loadAllPresets)({corePresets:[require.resolve("@storybook/core-server/dist/presets/common-preset")],overridePresets:[],...presetOptions})).apply("core");if((core==null?void 0:core.enableCrashReports)!==void 0)return core.enableCrashReports?"full":"error";if(core!=null&&core.disableTelemetry)return"none";let valueFromCache=await import_core_common9.cache.get("enableCrashReports")??await import_core_common9.cache.get("enableCrashreports");if(valueFromCache!==void 0)return valueFromCache?"full":"error";let valueFromPrompt=await promptCrashReports();return valueFromPrompt!==void 0?valueFromPrompt?"full":"error":"full"}async function withTelemetry(eventType,options,run){var _a;options.cliOptions.disableTelemetry||(0,import_telemetry5.telemetry)("boot",{eventType},{stripMetadata:!0});try{await run()}catch(error){try{let errorLevel=await getErrorLevel(options);if(errorLevel!=="none"){let precedingUpgrade=await(0,import_telemetry5.getPrecedingUpgrade)();await(0,import_telemetry5.telemetry)("error",{eventType,precedingUpgrade,error:errorLevel==="full"?error:void 0,errorHash:(0,import_telemetry5.oneWayHash)(error.message)},{immediate:!0,configDir:options.cliOptions.configDir||((_a=options.presetOptions)==null?void 0:_a.configDir),enableCrashReports:errorLevel==="full"})}}catch{}throw error}}var import_read_pkg_up=require("read-pkg-up");async function build(options={},frameworkOptions={}){let{mode="dev"}=options,{packageJson}=(0,import_read_pkg_up.sync)({cwd:__dirname}),commonOptions={...options,...frameworkOptions,frameworkPresets:[...options.frameworkPresets||[],...frameworkOptions.frameworkPresets||[]],packageJson};if(mode==="dev")return buildDevStandalone(commonOptions);if(mode==="static")return buildStaticStandalone(commonOptions);throw new Error("'mode' parameter should be either 'dev' or 'static'")}var standalone_default=build;0&&(module.exports={build,buildDevStandalone,buildStaticStandalone,getPreviewBodyTemplate,getPreviewHeadTemplate,withTelemetry});
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import{parseStaticDir,useStatics}from"./chunk-GEVOWSTY.mjs";import{__require}from"./chunk-R4NKYYJA.mjs";import{getPreviewHeadTemplate,getPreviewBodyTemplate}from"@storybook/core-common";import chalk4 from"chalk";import{copy,emptyDir,ensureDir}from"fs-extra";import{dirname,isAbsolute,join,resolve}from"path";import{dedent}from"ts-dedent";import{global as global2}from"@storybook/global";import{logger as logger4}from"@storybook/node-logger";import{telemetry,getPrecedingUpgrade}from"@storybook/telemetry";import{loadAllPresets,loadMainConfig,logConfig,normalizeStories,resolveAddonName}from"@storybook/core-common";import{stringifyStream}from"@discoveryjs/json-ext";import{logger}from"@storybook/node-logger";import chalk from"chalk";import fs from"fs-extra";import path from"path";async function outputStats(directory,previewStats,managerStats){if(previewStats){let filePath=await writeStats(directory,"preview",previewStats);logger.info(`=> preview stats written to ${chalk.cyan(filePath)}`)}if(managerStats){let filePath=await writeStats(directory,"manager",managerStats);logger.info(`=> manager stats written to ${chalk.cyan(filePath)}`)}}var writeStats=async(directory,name,stats)=>{let filePath=path.join(directory,`${name}-stats.json`),{chunks,...data}=stats.toJson();return await new Promise((resolve3,reject)=>{stringifyStream(data,null,2).on("error",reject).pipe(fs.createWriteStream(filePath)).on("error",reject).on("finish",resolve3)}),filePath};import chalk2 from"chalk";import fs2 from"fs-extra";import path2 from"path";import{logger as logger2}from"@storybook/node-logger";import{getDirectoryFromWorkingDir}from"@storybook/core-common";async function copyAllStaticFiles(staticDirs,outputDir){staticDirs&&staticDirs.length>0&&await Promise.all(staticDirs.map(async dir=>{try{let{staticDir,staticPath,targetDir}=await parseStaticDir(dir),targetPath=path2.join(outputDir,targetDir);logger2.info(chalk2`=> Copying static files: {cyan ${staticDir}} => {cyan ${targetDir}}`);let skipPaths=["index.html","iframe.html"].map(f=>path2.join(targetPath,f));await fs2.copy(staticPath,targetPath,{dereference:!0,preserveTimestamps:!0,filter:(_,dest)=>!skipPaths.includes(dest)})}catch(e){logger2.error(e.message),process.exit(-1)}}))}async function copyAllStaticFilesRelativeToMain(staticDirs,outputDir,configDir){let workingDir=process.cwd();return staticDirs.reduce(async(acc,dir)=>{await acc;let staticDirAndTarget=typeof dir=="string"?dir:`${dir.from}:${dir.to}`,{staticPath:from,targetEndpoint:to}=await parseStaticDir(getDirectoryFromWorkingDir({configDir,workingDir,directory:staticDirAndTarget})),targetPath=path2.join(outputDir,to),skipPaths=["index.html","iframe.html"].map(f=>path2.join(targetPath,f));logger2.info(chalk2`=> Copying static files: {cyan ${from}} at {cyan ${targetPath}}`),await fs2.copy(from,targetPath,{dereference:!0,preserveTimestamps:!0,filter:(_,dest)=>!skipPaths.includes(dest)})},Promise.resolve())}import{pathToFileURL}from"url";async function getManagerBuilder(){return import("@storybook/builder-manager")}async function getPreviewBuilder(builderName,configDir){let builderPackage;if(builderName)builderPackage=__require.resolve(["webpack5"].includes(builderName)?`@storybook/builder-${builderName}`:builderName,{paths:[configDir]});else throw new Error("no builder configured!");return await import(pathToFileURL(builderPackage).href)}async function getBuilders({presets,configDir}){let{builder}=await presets.apply("core",{}),builderName=typeof builder=="string"?builder:builder?.name;return Promise.all([getPreviewBuilder(builderName,configDir),getManagerBuilder()])}import{writeJSON}from"fs-extra";import debounce from"lodash/debounce.js";import{STORY_INDEX_INVALIDATED}from"@storybook/core-events";import Watchpack from"watchpack";import slash from"slash";import fs3 from"fs";import path3 from"path";import glob from"globby";import uniq from"lodash/uniq.js";var isDirectory=directory=>{try{return fs3.lstatSync(directory).isDirectory()}catch{return!1}};function toImportPath(relativePath){return relativePath.startsWith(".")?relativePath:`./${relativePath}`}function watchStorySpecifiers(specifiers,options,onInvalidate){let wp=new Watchpack({followSymlinks:!1,ignored:["**/.git","node_modules"]});wp.watch({directories:uniq(specifiers.map(ns=>ns.directory))});async function onChangeOrRemove(watchpackPath,removed){let importPath=slash(watchpackPath.startsWith(".")?watchpackPath:`./${watchpackPath}`),matchingSpecifier=specifiers.find(ns=>ns.importPathMatcher.exec(importPath));if(matchingSpecifier){onInvalidate(matchingSpecifier,importPath,removed);return}let absolutePath=path3.join(options.workingDir,importPath);!removed&&isDirectory(absolutePath)&&await Promise.all(specifiers.filter(specifier=>importPath.startsWith(specifier.directory)).map(async specifier=>{let dirGlob=path3.join(options.workingDir,importPath,"**",path3.basename(specifier.files));(await glob(slash(dirGlob))).forEach(filePath=>{let fileImportPath=toImportPath(path3.relative(options.workingDir,filePath).replace(/\\/g,"/"));specifier.importPathMatcher.exec(fileImportPath)&&onInvalidate(specifier,fileImportPath,removed)})}))}return wp.on("change",async(filePath,mtime,explanation)=>{await onChangeOrRemove(filePath,!mtime)}),wp.on("remove",async(filePath,explanation)=>{await onChangeOrRemove(filePath,!0)}),()=>wp.close()}var DEBOUNCE=100;async function extractStoriesJson(outputFile,initializedStoryIndexGenerator,transform){let storyIndex=await(await initializedStoryIndexGenerator).getIndex();await writeJSON(outputFile,transform?transform(storyIndex):storyIndex)}function useStoriesJson({router:router2,initializedStoryIndexGenerator,workingDir=process.cwd(),serverChannel,normalizedStories}){let maybeInvalidate=debounce(()=>serverChannel.emit(STORY_INDEX_INVALIDATED),DEBOUNCE,{leading:!0});watchStorySpecifiers(normalizedStories,{workingDir},async(specifier,path6,removed)=>{(await initializedStoryIndexGenerator).invalidate(specifier,path6,removed),maybeInvalidate()}),router2.use("/index.json",async(req,res)=>{try{let index=await(await initializedStoryIndexGenerator).getIndex();res.header("Content-Type","application/json"),res.send(JSON.stringify(index))}catch(err){res.status(500),res.send(err.message)}}),router2.use("/stories.json",async(req,res)=>{try{let generator=await initializedStoryIndexGenerator,index=convertToIndexV3(await generator.getIndex());res.header("Content-Type","application/json"),res.send(JSON.stringify(index))}catch(err){res.status(500),res.send(err.message)}})}var convertToIndexV3=index=>{let{entries}=index;return{v:3,stories:Object.entries(entries).reduce((acc,[id,entry])=>{let{type,...rest}=entry;return acc[id]={...rest,kind:rest.title,story:rest.name,parameters:{__id:rest.id,docsOnly:type==="docs",fileName:rest.importPath}},acc},{})}};import{writeJSON as writeJSON2}from"fs-extra";import{getStorybookMetadata}from"@storybook/telemetry";async function extractStorybookMetadata(outputFile,configDir){let storybookMetadata=await getStorybookMetadata(configDir);await writeJSON2(outputFile,storybookMetadata)}function useStorybookMetadata(router2,configDir){router2.use("/project.json",async(req,res)=>{let storybookMetadata=await getStorybookMetadata(configDir);res.header("Content-Type","application/json"),res.send(JSON.stringify(storybookMetadata))})}import path4 from"path";import chalk3 from"chalk";import fs4 from"fs-extra";import glob2 from"globby";import slash2 from"slash";import{userOrAutoTitleFromSpecifier,sortStoriesV7}from"@storybook/preview-api";import{normalizeStoryPath}from"@storybook/core-common";import{logger as logger3}from"@storybook/node-logger";import{getStorySortParameter,NoMetaError}from"@storybook/csf-tools";import{toId}from"@storybook/csf";import{analyze}from"@storybook/docs-mdx";import{basename}from"path";function autoName(mdxImportPath,csfImportPath,defaultName){let mdxBasename=basename(mdxImportPath),csfBasename=basename(csfImportPath),[mdxFilename]=mdxBasename.split("."),[csfFilename]=csfBasename.split(".");return mdxFilename===csfFilename?defaultName:mdxFilename}var AUTODOCS_TAG="autodocs",STORIES_MDX_TAG="stories-mdx",PLAY_FN_TAG="play-fn";function isMdxEntry({tags}){return!tags?.includes(AUTODOCS_TAG)&&!tags?.includes(STORIES_MDX_TAG)}var DuplicateEntriesError=class extends Error{constructor(message,entries){super();this.message=message,this.entries=entries}},makeAbsolute=(otherImport,normalizedPath,workingDir)=>otherImport.startsWith(".")?slash2(path4.resolve(workingDir,normalizeStoryPath(path4.join(path4.dirname(normalizedPath),otherImport)))):otherImport,StoryIndexGenerator=class{constructor(specifiers,options){this.specifiers=specifiers;this.options=options;this.specifierToCache=new Map}async initialize(){(await Promise.all(this.specifiers.map(async specifier=>{let pathToSubIndex={},fullGlob=slash2(path4.join(this.options.workingDir,specifier.directory,specifier.files));return(await glob2(fullGlob)).sort().forEach(absolutePath=>{let ext=path4.extname(absolutePath);if(ext===".storyshot"){let relativePath=path4.relative(this.options.workingDir,absolutePath);logger3.info(`Skipping ${ext} file ${relativePath}`);return}pathToSubIndex[absolutePath]=!1}),[specifier,pathToSubIndex]}))).forEach(([specifier,cache4])=>this.specifierToCache.set(specifier,cache4)),await this.ensureExtracted()}async updateExtracted(updater,overwrite=!1){await Promise.all(this.specifiers.map(async specifier=>{let entry=this.specifierToCache.get(specifier);return Promise.all(Object.keys(entry).map(async absolutePath=>{entry[absolutePath]&&!overwrite||(entry[absolutePath]=await updater(specifier,absolutePath,entry[absolutePath]))}))}))}isDocsMdx(absolutePath){return/(?<!\.stories)\.mdx$/i.test(absolutePath)}async ensureExtracted(){return await this.updateExtracted(async(specifier,absolutePath)=>this.isDocsMdx(absolutePath)?!1:this.extractStories(specifier,absolutePath)),this.options.docs.disable||await this.updateExtracted(async(specifier,absolutePath)=>this.extractDocs(specifier,absolutePath)),this.specifiers.flatMap(specifier=>{let cache4=this.specifierToCache.get(specifier);return Object.values(cache4).flatMap(entry=>entry?entry.type==="docs"?[entry]:entry.entries:[])})}findDependencies(absoluteImports){let dependencies=[],foundImports=new Set;return this.specifierToCache.forEach(cache4=>{Object.keys(cache4).filter(fileName=>{let foundImport=absoluteImports.find(storyImport=>fileName.startsWith(storyImport));return foundImport&&foundImports.add(foundImport),!!foundImport}).forEach(fileName=>{let cacheEntry=cache4[fileName];if(cacheEntry&&cacheEntry.type==="stories")dependencies.push(cacheEntry);else throw new Error(`Unexpected dependency: ${cacheEntry}`)})}),dependencies}async extractStories(specifier,absolutePath){let relativePath=path4.relative(this.options.workingDir,absolutePath),entries=[];try{let importPath=slash2(normalizeStoryPath(relativePath)),makeTitle=userTitle=>userOrAutoTitleFromSpecifier(importPath,specifier,userTitle),storyIndexer=this.options.storyIndexers.find(indexer=>indexer.test.exec(absolutePath));if(!storyIndexer)throw new Error(`No matching story indexer found for ${absolutePath}`);let csf=await storyIndexer.indexer(absolutePath,{makeTitle}),componentTags=csf.meta.tags||[];if(csf.stories.forEach(({id,name,tags:storyTags,parameters})=>{if(!parameters?.docsOnly){let tags=[...storyTags||componentTags,"story"];entries.push({id,title:csf.meta.title,name,importPath,tags,type:"story"})}}),!this.options.docs.disable&&csf.stories.length){let{autodocs}=this.options.docs,componentAutodocs=componentTags.includes(AUTODOCS_TAG),autodocsOptedIn=autodocs===!0||autodocs==="tag"&&componentAutodocs;if(componentTags.includes(STORIES_MDX_TAG)||autodocsOptedIn){let name=this.options.docs.defaultName,id=toId(csf.meta.title,name);entries.unshift({id,title:csf.meta.title,name,importPath,type:"docs",tags:[...componentTags,"docs",...autodocsOptedIn&&!componentAutodocs?[AUTODOCS_TAG]:[]],storiesImports:[]})}}}catch(err){if(err instanceof NoMetaError)logger3.info(`\u{1F4A1} Skipping ${relativePath}: ${err}`);else throw logger3.warn(`\u{1F6A8} Extraction error on ${relativePath}: ${err}`),err}return{entries,type:"stories",dependents:[]}}async extractDocs(specifier,absolutePath){let relativePath=path4.relative(this.options.workingDir,absolutePath);try{if(!this.options.storyStoreV7)throw new Error("You cannot use `.mdx` files without using `storyStoreV7`.");let normalizedPath=normalizeStoryPath(relativePath),importPath=slash2(normalizedPath),content=await fs4.readFile(absolutePath,"utf8"),result=analyze(content);if(result.isTemplate)return!1;let absoluteImports=result.imports.map(p=>makeAbsolute(p,normalizedPath,this.options.workingDir)),dependencies=this.findDependencies(absoluteImports),csfEntry;if(result.of){let absoluteOf=makeAbsolute(result.of,normalizedPath,this.options.workingDir);if(dependencies.forEach(dep=>{if(dep.entries.length>0){let first=dep.entries.find(e=>e.type!=="docs");path4.normalize(path4.resolve(this.options.workingDir,first.importPath)).startsWith(path4.normalize(absoluteOf))&&(csfEntry=first)}}),!csfEntry)throw new Error(`Could not find "${result.of}" for docs file "${relativePath}".`)}dependencies.forEach(dep=>{dep.dependents.push(absolutePath)});let title=csfEntry?.title||userOrAutoTitleFromSpecifier(importPath,specifier,result.title),{defaultName}=this.options.docs,name=result.name||(csfEntry?autoName(importPath,csfEntry.importPath,defaultName):defaultName);return{id:toId(title,name),title,name,importPath,storiesImports:dependencies.map(dep=>dep.entries[0].importPath),type:"docs",tags:[...result.tags||[],"docs"]}}catch(err){throw logger3.warn(`\u{1F6A8} Extraction error on ${chalk3.blue(relativePath)}: ${err}`),err.source?.match(/mdast-util-mdx-jsx/g)&&logger3.warn(`\u{1F4A1} This seems to be an MDX2 syntax error. Please refer to the MDX section in the following resource for assistance on how to fix this: ${chalk3.yellow("https://storybook.js.org/migration-guides/7.0")}`),err}}chooseDuplicate(firstEntry,secondEntry){let firstIsBetter=!0;(secondEntry.type==="story"||isMdxEntry(secondEntry)&&firstEntry.type==="docs"&&!isMdxEntry(firstEntry))&&(firstIsBetter=!1);let betterEntry=firstIsBetter?firstEntry:secondEntry,worseEntry=firstIsBetter?secondEntry:firstEntry,changeDocsName='Use `<Meta of={} name="Other Name">` to distinguish them.';if(worseEntry.type==="story")throw new DuplicateEntriesError(`Duplicate stories with id: ${firstEntry.id}`,[firstEntry,secondEntry]);if(betterEntry.type==="story"){let worseDescriptor=isMdxEntry(worseEntry)?"component docs page":"automatically generated docs page";betterEntry.name===this.options.docs.defaultName?logger3.warn(`\u{1F6A8} You have a story for ${betterEntry.title} with the same name as your default docs entry name (${betterEntry.name}), so the docs page is being dropped. Consider changing the story name.`):logger3.warn(`\u{1F6A8} You have a story for ${betterEntry.title} with the same name as your ${worseDescriptor} (${worseEntry.name}), so the docs page is being dropped. ${changeDocsName}`)}else if(isMdxEntry(betterEntry)){if(isMdxEntry(worseEntry)&&logger3.warn(`\u{1F6A8} You have two component docs pages with the same name ${betterEntry.title}:${betterEntry.name}. ${changeDocsName}`),worseEntry.tags?.includes(AUTODOCS_TAG)&&this.options.docs.autodocs!==!0)throw new Error(`You created a component docs page for ${worseEntry.title} (${betterEntry.importPath}), but also tagged the CSF file (${worseEntry.importPath}) with '${AUTODOCS_TAG}'. This is probably a mistake.`)}else return{...betterEntry,storiesImports:[...betterEntry.storiesImports,worseEntry.importPath,...worseEntry.storiesImports]};return betterEntry}async sortStories(storiesList){let entries={};storiesList.forEach(entry=>{let existing=entries[entry.id];existing?entries[entry.id]=this.chooseDuplicate(existing,entry):entries[entry.id]=entry});let sortableStories=Object.values(entries);if(this.options.storyStoreV7){let storySortParameter=await this.getStorySortParameter(),fileNameOrder=this.storyFileNames();sortStoriesV7(sortableStories,storySortParameter,fileNameOrder)}return sortableStories.reduce((acc,item)=>(acc[item.id]=item,acc),{})}async getIndex(){if(this.lastIndex)return this.lastIndex;let storiesList=await this.ensureExtracted(),sorted=await this.sortStories(storiesList),compat=sorted;if(this.options.storiesV2Compatibility){let titleToStoryCount=Object.values(sorted).reduce((acc,story)=>(acc[story.title]=(acc[story.title]||0)+1,acc),{});compat=Object.entries(sorted).reduce((acc,entry)=>{let[id,story]=entry;return story.type==="docs"||(acc[id]={...story,kind:story.title,story:story.name,parameters:{__id:story.id,docsOnly:titleToStoryCount[story.title]===1&&story.name==="Page",fileName:story.importPath}}),acc},{})}return this.lastIndex={v:4,entries:compat},this.lastIndex}invalidate(specifier,importPath,removed){let absolutePath=slash2(path4.resolve(this.options.workingDir,importPath)),cache4=this.specifierToCache.get(specifier),cacheEntry=cache4[absolutePath];if(cacheEntry&&cacheEntry.type==="stories"){let{dependents}=cacheEntry,invalidated=new Set;this.specifierToCache.forEach(otherCache=>{dependents.forEach(dep=>{otherCache[dep]&&(invalidated.add(dep),otherCache[dep]=!1)})})}if(removed){if(cacheEntry&&cacheEntry.type==="docs"){let absoluteImports=cacheEntry.storiesImports.map(p=>path4.resolve(this.options.workingDir,p));this.findDependencies(absoluteImports).forEach(dep=>dep.dependents.splice(dep.dependents.indexOf(absolutePath),1))}delete cache4[absolutePath]}else cache4[absolutePath]=!1;this.lastIndex=null}async getStorySortParameter(){let previewFile=["js","jsx","ts","tsx"].map(ext=>path4.join(this.options.configDir,`preview.${ext}`)).find(fname=>fs4.existsSync(fname)),storySortParameter;if(previewFile){let previewCode=(await fs4.readFile(previewFile,"utf-8")).toString();storySortParameter=await getStorySortParameter(previewCode)}return storySortParameter}storyFileNames(){return Array.from(this.specifierToCache.values()).flatMap(r=>Object.keys(r))}};var PAGE_REGEX=/(page|screen)/i,isPageStory=storyId=>PAGE_REGEX.test(storyId),isExampleEntry=entry=>["example-introduction--docs","example-button--docs","example-button--primary","example-button--secondary","example-button--large","example-button--small","example-header--docs","example-header--logged-in","example-header--logged-out","example-page--logged-in","example-page--logged-out"].includes(entry.id);function summarizeIndex(storyIndex){let storyCount=0,exampleStoryCount=0,exampleDocsCount=0,pageStoryCount=0,playStoryCount=0,autodocsCount=0,storiesMdxCount=0,mdxCount=0;return Object.values(storyIndex.entries).forEach(entry=>{isExampleEntry(entry)?(entry.type==="story"&&(exampleStoryCount+=1),entry.type==="docs"&&(exampleDocsCount+=1)):entry.type==="story"?(storyCount+=1,isPageStory(entry.title)&&(pageStoryCount+=1),entry.tags?.includes(PLAY_FN_TAG)&&(playStoryCount+=1)):entry.type==="docs"&&(isMdxEntry(entry)?mdxCount+=1:entry.tags?.includes(STORIES_MDX_TAG)?storiesMdxCount+=1:entry.tags?.includes(AUTODOCS_TAG)&&(autodocsCount+=1))}),{storyCount,pageStoryCount,playStoryCount,autodocsCount,storiesMdxCount,mdxCount,exampleStoryCount,exampleDocsCount,version:storyIndex.v}}async function buildStaticStandalone(options){if(options.configType="PRODUCTION",options.outputDir==="")throw new Error("Won't remove current directory. Check your outputDir!");if(options.staticDir?.includes("/"))throw new Error("Won't copy root directory. Check your staticDirs!");if(options.outputDir=isAbsolute(options.outputDir)?options.outputDir:join(process.cwd(),options.outputDir),options.configDir=resolve(options.configDir),logger4.info(chalk4`=> Cleaning outputDir: {cyan ${options.outputDir.replace(process.cwd(),"")}}`),options.outputDir==="/")throw new Error("Won't remove directory '/'. Check your outputDir!");await emptyDir(options.outputDir),await ensureDir(options.outputDir);let{framework}=await loadMainConfig(options),corePresets=[],frameworkName=typeof framework=="string"?framework:framework?.name;frameworkName?corePresets.push(join(frameworkName,"preset")):logger4.warn(`you have not specified a framework in your ${options.configDir}/main.js`),logger4.info("=> Loading presets");let presets=await loadAllPresets({corePresets:[__require.resolve("@storybook/core-server/dist/presets/common-preset"),...corePresets],overridePresets:[],...options}),[previewBuilder,managerBuilder]=await getBuilders({...options,presets}),{renderer}=await presets.apply("core",{});presets=await loadAllPresets({corePresets:[__require.resolve("@storybook/core-server/dist/presets/common-preset"),...managerBuilder.corePresets||[],...previewBuilder.corePresets||[],...renderer?[resolveAddonName(options.configDir,renderer,options)]:[],...corePresets,__require.resolve("@storybook/core-server/dist/presets/babel-cache-preset")],overridePresets:previewBuilder.overridePresets||[],...options});let[features,core,staticDirs,storyIndexers,stories,docsOptions]=await Promise.all([presets.apply("features"),presets.apply("core"),presets.apply("staticDirs"),presets.apply("storyIndexers",[]),presets.apply("stories"),presets.apply("docs",{})]),fullOptions={...options,presets,features};if(staticDirs&&options.staticDir)throw new Error(dedent`
1
+ import{parseStaticDir,useStatics}from"./chunk-DPAUPMCQ.mjs";import{__require}from"./chunk-R4NKYYJA.mjs";import{getPreviewHeadTemplate,getPreviewBodyTemplate}from"@storybook/core-common";import chalk4 from"chalk";import{copy,emptyDir,ensureDir}from"fs-extra";import{dirname,isAbsolute,join,resolve}from"path";import{dedent}from"ts-dedent";import{global as global2}from"@storybook/global";import{logger as logger4}from"@storybook/node-logger";import{telemetry,getPrecedingUpgrade}from"@storybook/telemetry";import{loadAllPresets,loadMainConfig,logConfig,normalizeStories,resolveAddonName}from"@storybook/core-common";import{stringifyStream}from"@discoveryjs/json-ext";import{logger}from"@storybook/node-logger";import chalk from"chalk";import fs from"fs-extra";import path from"path";async function outputStats(directory,previewStats,managerStats){if(previewStats){let filePath=await writeStats(directory,"preview",previewStats);logger.info(`=> preview stats written to ${chalk.cyan(filePath)}`)}if(managerStats){let filePath=await writeStats(directory,"manager",managerStats);logger.info(`=> manager stats written to ${chalk.cyan(filePath)}`)}}var writeStats=async(directory,name,stats)=>{let filePath=path.join(directory,`${name}-stats.json`),{chunks,...data}=stats.toJson();return await new Promise((resolve3,reject)=>{stringifyStream(data,null,2).on("error",reject).pipe(fs.createWriteStream(filePath)).on("error",reject).on("finish",resolve3)}),filePath};import chalk2 from"chalk";import fs2 from"fs-extra";import path2 from"path";import{logger as logger2}from"@storybook/node-logger";import{getDirectoryFromWorkingDir}from"@storybook/core-common";async function copyAllStaticFiles(staticDirs,outputDir){staticDirs&&staticDirs.length>0&&await Promise.all(staticDirs.map(async dir=>{try{let{staticDir,staticPath,targetDir}=await parseStaticDir(dir),targetPath=path2.join(outputDir,targetDir);logger2.info(chalk2`=> Copying static files: {cyan ${staticDir}} => {cyan ${targetDir}}`);let skipPaths=["index.html","iframe.html"].map(f=>path2.join(targetPath,f));await fs2.copy(staticPath,targetPath,{dereference:!0,preserveTimestamps:!0,filter:(_,dest)=>!skipPaths.includes(dest)})}catch(e){logger2.error(e.message),process.exit(-1)}}))}async function copyAllStaticFilesRelativeToMain(staticDirs,outputDir,configDir){let workingDir=process.cwd();return staticDirs.reduce(async(acc,dir)=>{await acc;let staticDirAndTarget=typeof dir=="string"?dir:`${dir.from}:${dir.to}`,{staticPath:from,targetEndpoint:to}=await parseStaticDir(getDirectoryFromWorkingDir({configDir,workingDir,directory:staticDirAndTarget})),targetPath=path2.join(outputDir,to),skipPaths=["index.html","iframe.html"].map(f=>path2.join(targetPath,f));logger2.info(chalk2`=> Copying static files: {cyan ${from}} at {cyan ${targetPath}}`),await fs2.copy(from,targetPath,{dereference:!0,preserveTimestamps:!0,filter:(_,dest)=>!skipPaths.includes(dest)})},Promise.resolve())}import{pathToFileURL}from"url";async function getManagerBuilder(){return import("@storybook/builder-manager")}async function getPreviewBuilder(builderName,configDir){let builderPackage;if(builderName)builderPackage=__require.resolve(["webpack5"].includes(builderName)?`@storybook/builder-${builderName}`:builderName,{paths:[configDir]});else throw new Error("no builder configured!");return await import(pathToFileURL(builderPackage).href)}async function getBuilders({presets,configDir}){let{builder}=await presets.apply("core",{}),builderName=typeof builder=="string"?builder:builder?.name;return Promise.all([getPreviewBuilder(builderName,configDir),getManagerBuilder()])}import{writeJSON}from"fs-extra";import debounce from"lodash/debounce.js";import{STORY_INDEX_INVALIDATED}from"@storybook/core-events";import Watchpack from"watchpack";import slash from"slash";import fs3 from"fs";import path3 from"path";import glob from"globby";import uniq from"lodash/uniq.js";var isDirectory=directory=>{try{return fs3.lstatSync(directory).isDirectory()}catch{return!1}};function toImportPath(relativePath){return relativePath.startsWith(".")?relativePath:`./${relativePath}`}function watchStorySpecifiers(specifiers,options,onInvalidate){let wp=new Watchpack({followSymlinks:!1,ignored:["**/.git","node_modules"]});wp.watch({directories:uniq(specifiers.map(ns=>ns.directory))});async function onChangeOrRemove(watchpackPath,removed){let importPath=slash(watchpackPath.startsWith(".")?watchpackPath:`./${watchpackPath}`),matchingSpecifier=specifiers.find(ns=>ns.importPathMatcher.exec(importPath));if(matchingSpecifier){onInvalidate(matchingSpecifier,importPath,removed);return}let absolutePath=path3.join(options.workingDir,importPath);!removed&&isDirectory(absolutePath)&&await Promise.all(specifiers.filter(specifier=>importPath.startsWith(specifier.directory)).map(async specifier=>{let dirGlob=path3.join(options.workingDir,importPath,"**",path3.basename(specifier.files));(await glob(slash(dirGlob))).forEach(filePath=>{let fileImportPath=toImportPath(path3.relative(options.workingDir,filePath).replace(/\\/g,"/"));specifier.importPathMatcher.exec(fileImportPath)&&onInvalidate(specifier,fileImportPath,removed)})}))}return wp.on("change",async(filePath,mtime,explanation)=>{await onChangeOrRemove(filePath,!mtime)}),wp.on("remove",async(filePath,explanation)=>{await onChangeOrRemove(filePath,!0)}),()=>wp.close()}var DEBOUNCE=100;async function extractStoriesJson(outputFile,initializedStoryIndexGenerator,transform){let storyIndex=await(await initializedStoryIndexGenerator).getIndex();await writeJSON(outputFile,transform?transform(storyIndex):storyIndex)}function useStoriesJson({router:router2,initializedStoryIndexGenerator,workingDir=process.cwd(),serverChannel,normalizedStories}){let maybeInvalidate=debounce(()=>serverChannel.emit(STORY_INDEX_INVALIDATED),DEBOUNCE,{leading:!0});watchStorySpecifiers(normalizedStories,{workingDir},async(specifier,path6,removed)=>{(await initializedStoryIndexGenerator).invalidate(specifier,path6,removed),maybeInvalidate()}),router2.use("/index.json",async(req,res)=>{try{let index=await(await initializedStoryIndexGenerator).getIndex();res.header("Content-Type","application/json"),res.send(JSON.stringify(index))}catch(err){res.status(500),res.send(err.message)}}),router2.use("/stories.json",async(req,res)=>{try{let generator=await initializedStoryIndexGenerator,index=convertToIndexV3(await generator.getIndex());res.header("Content-Type","application/json"),res.send(JSON.stringify(index))}catch(err){res.status(500),res.send(err.message)}})}var convertToIndexV3=index=>{let{entries}=index;return{v:3,stories:Object.entries(entries).reduce((acc,[id,entry])=>{let{type,...rest}=entry;return acc[id]={...rest,kind:rest.title,story:rest.name,parameters:{__id:rest.id,docsOnly:type==="docs",fileName:rest.importPath}},acc},{})}};import{writeJSON as writeJSON2}from"fs-extra";import{getStorybookMetadata}from"@storybook/telemetry";async function extractStorybookMetadata(outputFile,configDir){let storybookMetadata=await getStorybookMetadata(configDir);await writeJSON2(outputFile,storybookMetadata)}function useStorybookMetadata(router2,configDir){router2.use("/project.json",async(req,res)=>{let storybookMetadata=await getStorybookMetadata(configDir);res.header("Content-Type","application/json"),res.send(JSON.stringify(storybookMetadata))})}import path4 from"path";import chalk3 from"chalk";import fs4 from"fs-extra";import glob2 from"globby";import slash2 from"slash";import{userOrAutoTitleFromSpecifier,sortStoriesV7}from"@storybook/preview-api";import{normalizeStoryPath}from"@storybook/core-common";import{logger as logger3}from"@storybook/node-logger";import{getStorySortParameter,NoMetaError}from"@storybook/csf-tools";import{toId}from"@storybook/csf";import{analyze}from"@storybook/docs-mdx";import{basename}from"path";function autoName(mdxImportPath,csfImportPath,defaultName){let mdxBasename=basename(mdxImportPath),csfBasename=basename(csfImportPath),[mdxFilename]=mdxBasename.split("."),[csfFilename]=csfBasename.split(".");return mdxFilename===csfFilename?defaultName:mdxFilename}var AUTODOCS_TAG="autodocs",STORIES_MDX_TAG="stories-mdx",PLAY_FN_TAG="play-fn";function isMdxEntry({tags}){return!tags?.includes(AUTODOCS_TAG)&&!tags?.includes(STORIES_MDX_TAG)}var DuplicateEntriesError=class extends Error{constructor(message,entries){super();this.message=message,this.entries=entries}},makeAbsolute=(otherImport,normalizedPath,workingDir)=>otherImport.startsWith(".")?slash2(path4.resolve(workingDir,normalizeStoryPath(path4.join(path4.dirname(normalizedPath),otherImport)))):otherImport,StoryIndexGenerator=class{constructor(specifiers,options){this.specifiers=specifiers;this.options=options;this.specifierToCache=new Map}async initialize(){(await Promise.all(this.specifiers.map(async specifier=>{let pathToSubIndex={},fullGlob=slash2(path4.join(this.options.workingDir,specifier.directory,specifier.files));return(await glob2(fullGlob)).sort().forEach(absolutePath=>{let ext=path4.extname(absolutePath);if(ext===".storyshot"){let relativePath=path4.relative(this.options.workingDir,absolutePath);logger3.info(`Skipping ${ext} file ${relativePath}`);return}pathToSubIndex[absolutePath]=!1}),[specifier,pathToSubIndex]}))).forEach(([specifier,cache4])=>this.specifierToCache.set(specifier,cache4)),await this.ensureExtracted()}async updateExtracted(updater,overwrite=!1){await Promise.all(this.specifiers.map(async specifier=>{let entry=this.specifierToCache.get(specifier);return Promise.all(Object.keys(entry).map(async absolutePath=>{entry[absolutePath]&&!overwrite||(entry[absolutePath]=await updater(specifier,absolutePath,entry[absolutePath]))}))}))}isDocsMdx(absolutePath){return/(?<!\.stories)\.mdx$/i.test(absolutePath)}async ensureExtracted(){return await this.updateExtracted(async(specifier,absolutePath)=>this.isDocsMdx(absolutePath)?!1:this.extractStories(specifier,absolutePath)),this.options.docs.disable||await this.updateExtracted(async(specifier,absolutePath)=>this.extractDocs(specifier,absolutePath)),this.specifiers.flatMap(specifier=>{let cache4=this.specifierToCache.get(specifier);return Object.values(cache4).flatMap(entry=>entry?entry.type==="docs"?[entry]:entry.entries:[])})}findDependencies(absoluteImports){let dependencies=[],foundImports=new Set;return this.specifierToCache.forEach(cache4=>{Object.keys(cache4).filter(fileName=>{let foundImport=absoluteImports.find(storyImport=>fileName.startsWith(storyImport));return foundImport&&foundImports.add(foundImport),!!foundImport}).forEach(fileName=>{let cacheEntry=cache4[fileName];if(cacheEntry&&cacheEntry.type==="stories")dependencies.push(cacheEntry);else throw new Error(`Unexpected dependency: ${cacheEntry}`)})}),dependencies}async extractStories(specifier,absolutePath){let relativePath=path4.relative(this.options.workingDir,absolutePath),entries=[];try{let importPath=slash2(normalizeStoryPath(relativePath)),makeTitle=userTitle=>userOrAutoTitleFromSpecifier(importPath,specifier,userTitle),storyIndexer=this.options.storyIndexers.find(indexer=>indexer.test.exec(absolutePath));if(!storyIndexer)throw new Error(`No matching story indexer found for ${absolutePath}`);let csf=await storyIndexer.indexer(absolutePath,{makeTitle}),componentTags=csf.meta.tags||[];if(csf.stories.forEach(({id,name,tags:storyTags,parameters})=>{if(!parameters?.docsOnly){let tags=[...storyTags||componentTags,"story"];entries.push({id,title:csf.meta.title,name,importPath,tags,type:"story"})}}),!this.options.docs.disable&&csf.stories.length){let{autodocs}=this.options.docs,componentAutodocs=componentTags.includes(AUTODOCS_TAG),autodocsOptedIn=autodocs===!0||autodocs==="tag"&&componentAutodocs;if(componentTags.includes(STORIES_MDX_TAG)||autodocsOptedIn){let name=this.options.docs.defaultName,id=toId(csf.meta.title,name);entries.unshift({id,title:csf.meta.title,name,importPath,type:"docs",tags:[...componentTags,"docs",...autodocsOptedIn&&!componentAutodocs?[AUTODOCS_TAG]:[]],storiesImports:[]})}}}catch(err){if(err instanceof NoMetaError)logger3.info(`\u{1F4A1} Skipping ${relativePath}: ${err}`);else throw logger3.warn(`\u{1F6A8} Extraction error on ${relativePath}: ${err}`),err}return{entries,type:"stories",dependents:[]}}async extractDocs(specifier,absolutePath){let relativePath=path4.relative(this.options.workingDir,absolutePath);try{if(!this.options.storyStoreV7)throw new Error("You cannot use `.mdx` files without using `storyStoreV7`.");let normalizedPath=normalizeStoryPath(relativePath),importPath=slash2(normalizedPath),content=await fs4.readFile(absolutePath,"utf8"),result=analyze(content);if(result.isTemplate)return!1;let absoluteImports=result.imports.map(p=>makeAbsolute(p,normalizedPath,this.options.workingDir)),dependencies=this.findDependencies(absoluteImports),csfEntry;if(result.of){let absoluteOf=makeAbsolute(result.of,normalizedPath,this.options.workingDir);if(dependencies.forEach(dep=>{if(dep.entries.length>0){let first=dep.entries.find(e=>e.type!=="docs");path4.normalize(path4.resolve(this.options.workingDir,first.importPath)).startsWith(path4.normalize(absoluteOf))&&(csfEntry=first)}}),!csfEntry)throw new Error(`Could not find "${result.of}" for docs file "${relativePath}".`)}dependencies.forEach(dep=>{dep.dependents.push(absolutePath)});let title=csfEntry?.title||userOrAutoTitleFromSpecifier(importPath,specifier,result.title),{defaultName}=this.options.docs,name=result.name||(csfEntry?autoName(importPath,csfEntry.importPath,defaultName):defaultName);return{id:toId(title,name),title,name,importPath,storiesImports:dependencies.map(dep=>dep.entries[0].importPath),type:"docs",tags:[...result.tags||[],"docs"]}}catch(err){throw logger3.warn(`\u{1F6A8} Extraction error on ${chalk3.blue(relativePath)}: ${err}`),err.source?.match(/mdast-util-mdx-jsx/g)&&logger3.warn(`\u{1F4A1} This seems to be an MDX2 syntax error. Please refer to the MDX section in the following resource for assistance on how to fix this: ${chalk3.yellow("https://storybook.js.org/migration-guides/7.0")}`),err}}chooseDuplicate(firstEntry,secondEntry){let firstIsBetter=!0;(secondEntry.type==="story"||isMdxEntry(secondEntry)&&firstEntry.type==="docs"&&!isMdxEntry(firstEntry))&&(firstIsBetter=!1);let betterEntry=firstIsBetter?firstEntry:secondEntry,worseEntry=firstIsBetter?secondEntry:firstEntry,changeDocsName='Use `<Meta of={} name="Other Name">` to distinguish them.';if(worseEntry.type==="story")throw new DuplicateEntriesError(`Duplicate stories with id: ${firstEntry.id}`,[firstEntry,secondEntry]);if(betterEntry.type==="story"){let worseDescriptor=isMdxEntry(worseEntry)?"component docs page":"automatically generated docs page";betterEntry.name===this.options.docs.defaultName?logger3.warn(`\u{1F6A8} You have a story for ${betterEntry.title} with the same name as your default docs entry name (${betterEntry.name}), so the docs page is being dropped. Consider changing the story name.`):logger3.warn(`\u{1F6A8} You have a story for ${betterEntry.title} with the same name as your ${worseDescriptor} (${worseEntry.name}), so the docs page is being dropped. ${changeDocsName}`)}else if(isMdxEntry(betterEntry)){if(isMdxEntry(worseEntry)&&logger3.warn(`\u{1F6A8} You have two component docs pages with the same name ${betterEntry.title}:${betterEntry.name}. ${changeDocsName}`),worseEntry.tags?.includes(AUTODOCS_TAG)&&this.options.docs.autodocs!==!0)throw new Error(`You created a component docs page for ${worseEntry.title} (${betterEntry.importPath}), but also tagged the CSF file (${worseEntry.importPath}) with '${AUTODOCS_TAG}'. This is probably a mistake.`)}else return{...betterEntry,storiesImports:[...betterEntry.storiesImports,worseEntry.importPath,...worseEntry.storiesImports]};return betterEntry}async sortStories(storiesList){let entries={};storiesList.forEach(entry=>{let existing=entries[entry.id];existing?entries[entry.id]=this.chooseDuplicate(existing,entry):entries[entry.id]=entry});let sortableStories=Object.values(entries);if(this.options.storyStoreV7){let storySortParameter=await this.getStorySortParameter(),fileNameOrder=this.storyFileNames();sortStoriesV7(sortableStories,storySortParameter,fileNameOrder)}return sortableStories.reduce((acc,item)=>(acc[item.id]=item,acc),{})}async getIndex(){if(this.lastIndex)return this.lastIndex;let storiesList=await this.ensureExtracted(),sorted=await this.sortStories(storiesList),compat=sorted;if(this.options.storiesV2Compatibility){let titleToStoryCount=Object.values(sorted).reduce((acc,story)=>(acc[story.title]=(acc[story.title]||0)+1,acc),{});compat=Object.entries(sorted).reduce((acc,entry)=>{let[id,story]=entry;return story.type==="docs"||(acc[id]={...story,kind:story.title,story:story.name,parameters:{__id:story.id,docsOnly:titleToStoryCount[story.title]===1&&story.name==="Page",fileName:story.importPath}}),acc},{})}return this.lastIndex={v:4,entries:compat},this.lastIndex}invalidate(specifier,importPath,removed){let absolutePath=slash2(path4.resolve(this.options.workingDir,importPath)),cache4=this.specifierToCache.get(specifier),cacheEntry=cache4[absolutePath];if(cacheEntry&&cacheEntry.type==="stories"){let{dependents}=cacheEntry,invalidated=new Set;this.specifierToCache.forEach(otherCache=>{dependents.forEach(dep=>{otherCache[dep]&&(invalidated.add(dep),otherCache[dep]=!1)})})}if(removed){if(cacheEntry&&cacheEntry.type==="docs"){let absoluteImports=cacheEntry.storiesImports.map(p=>path4.resolve(this.options.workingDir,p));this.findDependencies(absoluteImports).forEach(dep=>dep.dependents.splice(dep.dependents.indexOf(absolutePath),1))}delete cache4[absolutePath]}else cache4[absolutePath]=!1;this.lastIndex=null}async getStorySortParameter(){let previewFile=["js","jsx","ts","tsx"].map(ext=>path4.join(this.options.configDir,`preview.${ext}`)).find(fname=>fs4.existsSync(fname)),storySortParameter;if(previewFile){let previewCode=(await fs4.readFile(previewFile,"utf-8")).toString();storySortParameter=await getStorySortParameter(previewCode)}return storySortParameter}storyFileNames(){return Array.from(this.specifierToCache.values()).flatMap(r=>Object.keys(r))}};var PAGE_REGEX=/(page|screen)/i,isPageStory=storyId=>PAGE_REGEX.test(storyId),isExampleEntry=entry=>["example-introduction--docs","example-button--docs","example-button--primary","example-button--secondary","example-button--large","example-button--small","example-header--docs","example-header--logged-in","example-header--logged-out","example-page--logged-in","example-page--logged-out"].includes(entry.id);function summarizeIndex(storyIndex){let storyCount=0,exampleStoryCount=0,exampleDocsCount=0,pageStoryCount=0,playStoryCount=0,autodocsCount=0,storiesMdxCount=0,mdxCount=0;return Object.values(storyIndex.entries).forEach(entry=>{isExampleEntry(entry)?(entry.type==="story"&&(exampleStoryCount+=1),entry.type==="docs"&&(exampleDocsCount+=1)):entry.type==="story"?(storyCount+=1,isPageStory(entry.title)&&(pageStoryCount+=1),entry.tags?.includes(PLAY_FN_TAG)&&(playStoryCount+=1)):entry.type==="docs"&&(isMdxEntry(entry)?mdxCount+=1:entry.tags?.includes(STORIES_MDX_TAG)?storiesMdxCount+=1:entry.tags?.includes(AUTODOCS_TAG)&&(autodocsCount+=1))}),{storyCount,pageStoryCount,playStoryCount,autodocsCount,storiesMdxCount,mdxCount,exampleStoryCount,exampleDocsCount,version:storyIndex.v}}async function buildStaticStandalone(options){if(options.configType="PRODUCTION",options.outputDir==="")throw new Error("Won't remove current directory. Check your outputDir!");if(options.staticDir?.includes("/"))throw new Error("Won't copy root directory. Check your staticDirs!");if(options.outputDir=isAbsolute(options.outputDir)?options.outputDir:join(process.cwd(),options.outputDir),options.configDir=resolve(options.configDir),logger4.info(chalk4`=> Cleaning outputDir: {cyan ${options.outputDir.replace(process.cwd(),"")}}`),options.outputDir==="/")throw new Error("Won't remove directory '/'. Check your outputDir!");await emptyDir(options.outputDir),await ensureDir(options.outputDir);let{framework}=await loadMainConfig(options),corePresets=[],frameworkName=typeof framework=="string"?framework:framework?.name;frameworkName?corePresets.push(join(frameworkName,"preset")):logger4.warn(`you have not specified a framework in your ${options.configDir}/main.js`),logger4.info("=> Loading presets");let presets=await loadAllPresets({corePresets:[__require.resolve("@storybook/core-server/dist/presets/common-preset"),...corePresets],overridePresets:[],...options}),[previewBuilder,managerBuilder]=await getBuilders({...options,presets}),{renderer}=await presets.apply("core",{});presets=await loadAllPresets({corePresets:[__require.resolve("@storybook/core-server/dist/presets/common-preset"),...managerBuilder.corePresets||[],...previewBuilder.corePresets||[],...renderer?[resolveAddonName(options.configDir,renderer,options)]:[],...corePresets,__require.resolve("@storybook/core-server/dist/presets/babel-cache-preset")],overridePresets:previewBuilder.overridePresets||[],...options});let[features,core,staticDirs,storyIndexers,stories,docsOptions]=await Promise.all([presets.apply("features"),presets.apply("core"),presets.apply("staticDirs"),presets.apply("storyIndexers",[]),presets.apply("stories"),presets.apply("docs",{})]),fullOptions={...options,presets,features};if(staticDirs&&options.staticDir)throw new Error(dedent`
2
2
  Conflict when trying to read staticDirs:
3
3
  * Storybook's configuration option: 'staticDirs'
4
4
  * Storybook's CLI flag: '--staticDir' or '-s'
@@ -1,7 +1,7 @@
1
- var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var common_preset_exports={};__export(common_preset_exports,{babel:()=>babel,core:()=>core,docs:()=>docs,env:()=>env,favicon:()=>favicon2,features:()=>features,frameworkOptions:()=>frameworkOptions,logLevel:()=>logLevel,previewAnnotations:()=>previewAnnotations,previewBody:()=>previewBody,previewHead:()=>previewHead,staticDirs:()=>staticDirs,storyIndexers:()=>storyIndexers,title:()=>title,typescript:()=>typescript});module.exports=__toCommonJS(common_preset_exports);var import_fs_extra2=require("fs-extra"),import_node_logger2=require("@storybook/node-logger"),import_core_common2=require("@storybook/core-common"),import_csf_tools=require("@storybook/csf-tools"),import_path2=require("path"),import_ts_dedent2=require("ts-dedent");var import_node_logger=require("@storybook/node-logger"),import_core_common=require("@storybook/core-common"),import_chalk=__toESM(require("chalk")),import_express=__toESM(require("express")),import_fs_extra=require("fs-extra"),import_path=__toESM(require("path")),import_serve_favicon=__toESM(require("serve-favicon")),import_ts_dedent=require("ts-dedent");var parseStaticDir=async arg=>{let lastColonIndex=arg.lastIndexOf(":"),isWindowsRawDirOnly=import_path.default.win32.isAbsolute(arg)&&lastColonIndex===1,splitIndex=lastColonIndex!==-1&&!isWindowsRawDirOnly?lastColonIndex:arg.length,target=(arg.substring(splitIndex+1)||"/").split(import_path.default.sep).join(import_path.default.posix.sep),rawDir=arg.substring(0,splitIndex),staticDir=import_path.default.isAbsolute(rawDir)?rawDir:`./${rawDir}`,staticPath=import_path.default.resolve(staticDir),targetDir=target.replace(/^\/?/,"./"),targetEndpoint=targetDir.substring(1);if(!await(0,import_fs_extra.pathExists)(staticPath))throw new Error((0,import_ts_dedent.dedent)(import_chalk.default`
1
+ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var common_preset_exports={};__export(common_preset_exports,{babel:()=>babel,core:()=>core,docs:()=>docs,env:()=>env,favicon:()=>favicon2,features:()=>features,frameworkOptions:()=>frameworkOptions,logLevel:()=>logLevel,previewAnnotations:()=>previewAnnotations,previewBody:()=>previewBody,previewHead:()=>previewHead,staticDirs:()=>staticDirs,storyIndexers:()=>storyIndexers,title:()=>title,typescript:()=>typescript});module.exports=__toCommonJS(common_preset_exports);var import_fs_extra2=require("fs-extra"),import_node_logger2=require("@storybook/node-logger"),import_core_common2=require("@storybook/core-common"),import_csf_tools=require("@storybook/csf-tools"),import_path3=require("path"),import_ts_dedent2=require("ts-dedent");var import_node_logger=require("@storybook/node-logger"),import_core_common=require("@storybook/core-common"),import_chalk=__toESM(require("chalk")),import_express=__toESM(require("express")),import_fs_extra=require("fs-extra"),import_path2=__toESM(require("path")),import_serve_favicon=__toESM(require("serve-favicon")),import_isEqual=__toESM(require("lodash/isEqual.js")),import_ts_dedent=require("ts-dedent");var import_path=require("path");var defaultStaticDirs=[{from:(0,import_path.join)((0,import_path.dirname)(require.resolve("@storybook/manager/package.json")),"static"),to:"/sb-common-assets"}];var parseStaticDir=async arg=>{let lastColonIndex=arg.lastIndexOf(":"),isWindowsRawDirOnly=import_path2.default.win32.isAbsolute(arg)&&lastColonIndex===1,splitIndex=lastColonIndex!==-1&&!isWindowsRawDirOnly?lastColonIndex:arg.length,target=(arg.substring(splitIndex+1)||"/").split(import_path2.default.sep).join(import_path2.default.posix.sep),rawDir=arg.substring(0,splitIndex),staticDir=import_path2.default.isAbsolute(rawDir)?rawDir:`./${rawDir}`,staticPath=import_path2.default.resolve(staticDir),targetDir=target.replace(/^\/?/,"./"),targetEndpoint=targetDir.substring(1);if(!await(0,import_fs_extra.pathExists)(staticPath))throw new Error((0,import_ts_dedent.dedent)(import_chalk.default`
2
2
  Failed to load static files, no such directory: {cyan ${staticPath}}
3
3
  Make sure this directory exists, or omit the {bold -s (--static-dir)} option.
4
- `));return{staticDir,staticPath,targetDir,targetEndpoint}};var defaultFavicon=require.resolve("@storybook/core-server/public/favicon.svg"),staticDirs=async(values=[])=>[{from:(0,import_path2.join)((0,import_path2.dirname)(require.resolve("@storybook/manager/package.json")),"static"),to:"/sb-common-assets"},...values],favicon2=async(value,options)=>{if(value)return value;let staticDirsValue=await options.presets.apply("staticDirs"),statics=staticDirsValue?staticDirsValue.map(dir=>typeof dir=="string"?dir:`${dir.from}:${dir.to}`):options.staticDir;if(statics&&statics.length>0){let flatlist=(await Promise.all(statics.map(async dir=>{let results=[],relativeDir=staticDirsValue?(0,import_core_common2.getDirectoryFromWorkingDir)({configDir:options.configDir,workingDir:process.cwd(),directory:dir}):dir,{staticPath,targetEndpoint}=await parseStaticDir(relativeDir);if(targetEndpoint==="/"){let path2=(0,import_path2.join)(staticPath,"favicon.svg");await(0,import_fs_extra2.pathExists)(path2)&&results.push(path2)}if(targetEndpoint==="/"){let path2=(0,import_path2.join)(staticPath,"favicon.ico");await(0,import_fs_extra2.pathExists)(path2)&&results.push(path2)}return results}))).reduce((l1,l2)=>l1.concat(l2),[]);return flatlist.length>1&&import_node_logger2.logger.warn(import_ts_dedent2.dedent`
4
+ `));return{staticDir,staticPath,targetDir,targetEndpoint}};var defaultFavicon=require.resolve("@storybook/core-server/public/favicon.svg"),staticDirs=async(values=[])=>[...defaultStaticDirs,...values],favicon2=async(value,options)=>{if(value)return value;let staticDirsValue=await options.presets.apply("staticDirs"),statics=staticDirsValue?staticDirsValue.map(dir=>typeof dir=="string"?dir:`${dir.from}:${dir.to}`):options.staticDir;if(statics&&statics.length>0){let flatlist=(await Promise.all(statics.map(async dir=>{let results=[],relativeDir=staticDirsValue?(0,import_core_common2.getDirectoryFromWorkingDir)({configDir:options.configDir,workingDir:process.cwd(),directory:dir}):dir,{staticPath,targetEndpoint}=await parseStaticDir(relativeDir);if(targetEndpoint==="/"){let path2=(0,import_path3.join)(staticPath,"favicon.svg");await(0,import_fs_extra2.pathExists)(path2)&&results.push(path2)}if(targetEndpoint==="/"){let path2=(0,import_path3.join)(staticPath,"favicon.ico");await(0,import_fs_extra2.pathExists)(path2)&&results.push(path2)}return results}))).reduce((l1,l2)=>l1.concat(l2),[]);return flatlist.length>1&&import_node_logger2.logger.warn(import_ts_dedent2.dedent`
5
5
  Looks like multiple favicons were detected. Using the first one.
6
6
 
7
7
  ${flatlist.join(", ")}
@@ -1,4 +1,4 @@
1
- import{parseStaticDir}from"../chunk-GEVOWSTY.mjs";import{__require}from"../chunk-R4NKYYJA.mjs";import{pathExists,readFile}from"fs-extra";import{deprecate,logger}from"@storybook/node-logger";import{getDirectoryFromWorkingDir,getPreviewBodyTemplate,getPreviewHeadTemplate,loadEnvs}from"@storybook/core-common";import{loadCsf}from"@storybook/csf-tools";import{dirname,join}from"path";import{dedent}from"ts-dedent";var defaultFavicon=__require.resolve("@storybook/core-server/public/favicon.svg"),staticDirs=async(values=[])=>[{from:join(dirname(__require.resolve("@storybook/manager/package.json")),"static"),to:"/sb-common-assets"},...values],favicon=async(value,options)=>{if(value)return value;let staticDirsValue=await options.presets.apply("staticDirs"),statics=staticDirsValue?staticDirsValue.map(dir=>typeof dir=="string"?dir:`${dir.from}:${dir.to}`):options.staticDir;if(statics&&statics.length>0){let flatlist=(await Promise.all(statics.map(async dir=>{let results=[],relativeDir=staticDirsValue?getDirectoryFromWorkingDir({configDir:options.configDir,workingDir:process.cwd(),directory:dir}):dir,{staticPath,targetEndpoint}=await parseStaticDir(relativeDir);if(targetEndpoint==="/"){let path=join(staticPath,"favicon.svg");await pathExists(path)&&results.push(path)}if(targetEndpoint==="/"){let path=join(staticPath,"favicon.ico");await pathExists(path)&&results.push(path)}return results}))).reduce((l1,l2)=>l1.concat(l2),[]);return flatlist.length>1&&logger.warn(dedent`
1
+ import{defaultStaticDirs,parseStaticDir}from"../chunk-DPAUPMCQ.mjs";import{__require}from"../chunk-R4NKYYJA.mjs";import{pathExists,readFile}from"fs-extra";import{deprecate,logger}from"@storybook/node-logger";import{getDirectoryFromWorkingDir,getPreviewBodyTemplate,getPreviewHeadTemplate,loadEnvs}from"@storybook/core-common";import{loadCsf}from"@storybook/csf-tools";import{join}from"path";import{dedent}from"ts-dedent";var defaultFavicon=__require.resolve("@storybook/core-server/public/favicon.svg"),staticDirs=async(values=[])=>[...defaultStaticDirs,...values],favicon=async(value,options)=>{if(value)return value;let staticDirsValue=await options.presets.apply("staticDirs"),statics=staticDirsValue?staticDirsValue.map(dir=>typeof dir=="string"?dir:`${dir.from}:${dir.to}`):options.staticDir;if(statics&&statics.length>0){let flatlist=(await Promise.all(statics.map(async dir=>{let results=[],relativeDir=staticDirsValue?getDirectoryFromWorkingDir({configDir:options.configDir,workingDir:process.cwd(),directory:dir}):dir,{staticPath,targetEndpoint}=await parseStaticDir(relativeDir);if(targetEndpoint==="/"){let path=join(staticPath,"favicon.svg");await pathExists(path)&&results.push(path)}if(targetEndpoint==="/"){let path=join(staticPath,"favicon.ico");await pathExists(path)&&results.push(path)}return results}))).reduce((l1,l2)=>l1.concat(l2),[]);return flatlist.length>1&&logger.warn(dedent`
2
2
  Looks like multiple favicons were detected. Using the first one.
3
3
 
4
4
  ${flatlist.join(", ")}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@storybook/core-server",
3
- "version": "7.0.0-beta.46",
3
+ "version": "7.0.0-beta.47",
4
4
  "description": "Storybook framework-agnostic API",
5
5
  "keywords": [
6
6
  "storybook"
@@ -58,18 +58,18 @@
58
58
  "dependencies": {
59
59
  "@aw-web-design/x-default-browser": "1.4.88",
60
60
  "@discoveryjs/json-ext": "^0.5.3",
61
- "@storybook/builder-manager": "7.0.0-beta.46",
62
- "@storybook/core-common": "7.0.0-beta.46",
63
- "@storybook/core-events": "7.0.0-beta.46",
61
+ "@storybook/builder-manager": "7.0.0-beta.47",
62
+ "@storybook/core-common": "7.0.0-beta.47",
63
+ "@storybook/core-events": "7.0.0-beta.47",
64
64
  "@storybook/csf": "next",
65
- "@storybook/csf-tools": "7.0.0-beta.46",
65
+ "@storybook/csf-tools": "7.0.0-beta.47",
66
66
  "@storybook/docs-mdx": "next",
67
67
  "@storybook/global": "^5.0.0",
68
- "@storybook/manager": "7.0.0-beta.46",
69
- "@storybook/node-logger": "7.0.0-beta.46",
70
- "@storybook/preview-api": "7.0.0-beta.46",
71
- "@storybook/telemetry": "7.0.0-beta.46",
72
- "@storybook/types": "7.0.0-beta.46",
68
+ "@storybook/manager": "7.0.0-beta.47",
69
+ "@storybook/node-logger": "7.0.0-beta.47",
70
+ "@storybook/preview-api": "7.0.0-beta.47",
71
+ "@storybook/telemetry": "7.0.0-beta.47",
72
+ "@storybook/types": "7.0.0-beta.47",
73
73
  "@types/detect-port": "^1.3.0",
74
74
  "@types/node": "^16.0.0",
75
75
  "@types/node-fetch": "^2.5.7",
@@ -120,5 +120,5 @@
120
120
  ],
121
121
  "platform": "node"
122
122
  },
123
- "gitHead": "ddbb9cfded3d2e6374a9abc9a6e8990a2f0052ed"
123
+ "gitHead": "a591d8eb579e68b26c277ab8ebdcafc2611530a5"
124
124
  }
@@ -1,10 +0,0 @@
1
- import{logger}from"@storybook/node-logger";import{getDirectoryFromWorkingDir}from"@storybook/core-common";import chalk from"chalk";import express from"express";import{pathExists}from"fs-extra";import path from"path";import favicon from"serve-favicon";import{dedent}from"ts-dedent";async function useStatics(router,options){let staticDirs=await options.presets.apply("staticDirs"),faviconPath=await options.presets.apply("favicon");if(staticDirs&&options.staticDir)throw new Error(dedent`
2
- Conflict when trying to read staticDirs:
3
- * Storybook's configuration option: 'staticDirs'
4
- * Storybook's CLI flag: '--staticDir' or '-s'
5
-
6
- Choose one of them, but not both.
7
- `);let statics=staticDirs?staticDirs.map(dir=>typeof dir=="string"?dir:`${dir.from}:${dir.to}`):options.staticDir;statics&&statics.length>0&&await Promise.all(statics.map(async dir=>{try{let relativeDir=staticDirs?getDirectoryFromWorkingDir({configDir:options.configDir,workingDir:process.cwd(),directory:dir}):dir,{staticDir,staticPath,targetEndpoint}=await parseStaticDir(relativeDir);logger.info(chalk`=> Serving static files from {cyan ${staticDir}} at {cyan ${targetEndpoint}}`),router.use(targetEndpoint,express.static(staticPath,{index:!1}))}catch(e){logger.warn(e.message)}})),router.use(favicon(faviconPath))}var parseStaticDir=async arg=>{let lastColonIndex=arg.lastIndexOf(":"),isWindowsRawDirOnly=path.win32.isAbsolute(arg)&&lastColonIndex===1,splitIndex=lastColonIndex!==-1&&!isWindowsRawDirOnly?lastColonIndex:arg.length,target=(arg.substring(splitIndex+1)||"/").split(path.sep).join(path.posix.sep),rawDir=arg.substring(0,splitIndex),staticDir=path.isAbsolute(rawDir)?rawDir:`./${rawDir}`,staticPath=path.resolve(staticDir),targetDir=target.replace(/^\/?/,"./"),targetEndpoint=targetDir.substring(1);if(!await pathExists(staticPath))throw new Error(dedent(chalk`
8
- Failed to load static files, no such directory: {cyan ${staticPath}}
9
- Make sure this directory exists, or omit the {bold -s (--static-dir)} option.
10
- `));return{staticDir,staticPath,targetDir,targetEndpoint}};export{useStatics,parseStaticDir};