@storybook/core-server 8.2.0-alpha.5 → 8.2.0-alpha.6

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.
package/dist/index.js CHANGED
@@ -33,7 +33,7 @@ ${this.indexingErrors.map(err=>`- ${err}`).join(`
33
33
  Received:
34
34
 
35
35
  ${previewCode}
36
- `)}return[...defaultTags,...projectTags,...extraTags]}storyFileNames(){return Array.from(this.specifierToCache.values()).flatMap(r2=>Object.keys(r2))}};var PAGE_REGEX=/(page|screen)/i,isPageStory=storyId=>PAGE_REGEX.test(storyId),isCLIExampleEntry=entry=>["example-introduction--docs","configure-your-project--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),isAnyExampleEntry=entry=>entry.id.startsWith("example-button--")||entry.id.startsWith("example-header--")||entry.id.startsWith("example-page--");function summarizeIndex(storyIndex){let storyCount=0,componentTitles=new Set,exampleStoryCount=0,onboardingStoryCount=0,onboardingDocsCount=0,exampleDocsCount=0,pageStoryCount=0,playStoryCount=0,autodocsCount=0,storiesMdxCount=0,mdxCount=0;Object.values(storyIndex.entries).forEach(entry=>{isCLIExampleEntry(entry)?(entry.type==="story"&&(exampleStoryCount+=1),entry.type==="docs"&&(exampleDocsCount+=1)):isAnyExampleEntry(entry)?(entry.type==="story"&&(onboardingStoryCount+=1),entry.type==="docs"&&(onboardingDocsCount+=1)):entry.type==="story"?(storyCount+=1,componentTitles.add(entry.title),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))});let componentCount=componentTitles.size;return{storyCount,componentCount,pageStoryCount,playStoryCount,autodocsCount,storiesMdxCount,mdxCount,exampleStoryCount,exampleDocsCount,onboardingStoryCount,onboardingDocsCount,version:storyIndex.v}}var import_server_errors2=require("@storybook/core-events/server-errors");async function buildOrThrow(callback){try{return await callback()}catch(err){let builderErrors=err.errors;throw builderErrors&&builderErrors.find(er=>er.text?.includes("No matching export"))?new import_server_errors2.NoMatchingExportError(err):err}}async function buildStaticStandalone(options){if(options.configType="PRODUCTION",options.outputDir==="")throw new Error("Won't remove current directory. Check your outputDir!");if(options.outputDir=(0,import_path8.resolve)(options.outputDir),options.configDir=(0,import_path8.resolve)(options.configDir),import_node_logger5.logger.info(import_chalk5.default`=> Cleaning outputDir: {cyan ${(0,import_path8.relative)(process.cwd(),options.outputDir)}}`),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 config=await(0,import_core_common5.loadMainConfig)(options),{framework}=config,corePresets=[],frameworkName=typeof framework=="string"?framework:framework?.name;frameworkName?corePresets.push((0,import_path8.join)(frameworkName,"preset")):options.ignorePreview||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_common5.loadAllPresets)({corePresets:[require.resolve("@storybook/core-server/dist/presets/common-preset"),...corePresets],overridePresets:[require.resolve("@storybook/core-server/dist/presets/common-override-preset")],isCritical:!0,...options}),{renderer}=await presets.apply("core",{}),build2=await presets.apply("build",{}),[previewBuilder,managerBuilder]=await getBuilders({...options,presets,build:build2}),resolvedRenderer=renderer?(0,import_core_common5.resolveAddonName)(options.configDir,renderer,options):void 0;presets=await(0,import_core_common5.loadAllPresets)({corePresets:[require.resolve("@storybook/core-server/dist/presets/common-preset"),...managerBuilder.corePresets||[],...previewBuilder.corePresets||[],...resolvedRenderer?[resolvedRenderer]:[],...corePresets],overridePresets:[...previewBuilder.overridePresets||[],require.resolve("@storybook/core-server/dist/presets/common-override-preset")],...options,build:build2});let[features,core,staticDirs,indexers,stories,docsOptions]=await Promise.all([presets.apply("features"),presets.apply("core"),presets.apply("staticDirs"),presets.apply("experimental_indexers",[]),presets.apply("stories"),presets.apply("docs",{})]),fullOptions={...options,presets,features,build:build2},effects=[];import_global.global.FEATURES=features,await buildOrThrow(async()=>managerBuilder.build({startTime:process.hrtime(),options:fullOptions})),staticDirs&&effects.push(copyAllStaticFilesRelativeToMain(staticDirs,options.outputDir,options.configDir));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(!options.ignorePreview){let workingDir=process.cwd(),directories={configDir:options.configDir,workingDir},normalizedStories=(0,import_core_common5.normalizeStories)(stories,directories),generator=new StoryIndexGenerator(normalizedStories,{...directories,indexers,docs:docsOptions,build:build2});initializedStoryIndexGenerator=generator.initialize().then(()=>generator),effects.push(extractStoriesJson((0,import_path8.join)(options.outputDir,"index.json"),initializedStoryIndexGenerator))}core?.disableProjectJson||effects.push(extractStorybookMetadata((0,import_path8.join)(options.outputDir,"project.json"),options.configDir)),options.debugWebpack&&(0,import_core_common5.logConfig)("Preview webpack config",await previewBuilder.getConfig(fullOptions)),options.ignorePreview?import_node_logger5.logger.info("=> Not building preview"):import_node_logger5.logger.info("=> Building preview..");let startTime=process.hrtime();await Promise.all([...options.ignorePreview?[]:[previewBuilder.build({startTime,options:fullOptions}).then(async previewStats=>{import_node_logger5.logger.trace({message:"=> Preview built",time:process.hrtime(startTime)});let statsOption=options.webpackStatsJson||options.statsJson;if(statsOption){let target=statsOption===!0?options.outputDir:statsOption;await outputStats(target,previewStats)}}).catch(error=>{throw import_node_logger5.logger.error("=> Failed to build the preview"),process.exitCode=1,error})],...effects]),core?.disableTelemetry||effects.push(initializedStoryIndexGenerator.then(async generator=>{let storyIndex=await 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_common12=require("@storybook/core-common"),import_prompts2=__toESM(require("prompts")),import_tiny_invariant4=__toESM(require("tiny-invariant")),import_global2=require("@storybook/global"),import_telemetry5=require("@storybook/telemetry"),import_path10=require("path"),import_node_logger14=require("@storybook/node-logger"),import_ts_dedent7=require("ts-dedent"),import_fs_extra10=require("fs-extra"),import_server_errors4=require("@storybook/core-events/server-errors");var import_express3=__toESM(require("express")),import_compression=__toESM(require("compression")),import_tiny_invariant3=__toESM(require("tiny-invariant")),import_core_common8=require("@storybook/core-common"),import_node_logger10=require("@storybook/node-logger"),import_server_errors3=require("@storybook/core-events/server-errors");var import_path9=__toESM(require("path")),import_fs2=__toESM(require("fs")),fileExists=basename5=>[".js",".cjs"].reduce((found,ext)=>{let filename=`${basename5}${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,initialPath){let address=new URL(`${proto}://localhost:${port}/`),networkAddress=new URL(`${proto}://${host||import_ip.default.address()}:${port}/`);if(initialPath){let searchParams=`?path=${decodeURIComponent(initialPath.startsWith("/")?initialPath:`/${initialPath}`)}`;address.search=searchParams,networkAddress.search=searchParams}return{address:address.href,networkAddress:networkAddress.href}}var getServerPort=(port,{exactPort}={})=>(0,import_detect_port.default)(port).then(freePort=>(freePort!==port&&exactPort&&process.exit(-1),freePort)).catch(error=>{import_node_logger6.logger.error(error),process.exit(-1)}),getServerChannelUrl=(port,{https:https3})=>`${https3?"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"),import_channels=require("@storybook/channels"),ServerChannelTransport=class{constructor(server){this.socket=new import_ws.WebSocketServer({noServer:!0}),server.on("upgrade",(request,socket,head)=>{request.url==="/storybook-server-channel"&&this.socket.handleUpgrade(request,socket,head,ws=>{this.socket.emit("connection",ws,request)})}),this.socket.on("connection",wss=>{wss.on("message",raw=>{let data=raw.toString(),event=typeof data=="string"&&(0,import_telejson.isJSON)(data)?(0,import_telejson.parse)(data,{allowFunction:!1,allowClass:!1}):data;this.handler?.(event)})})}setHandler(handler){this.handler=handler}send(event){let data=(0,import_telejson.stringify)(event,{maxDepth:15,allowFunction:!1,allowClass:!1});Array.from(this.socket.clients).filter(c=>c.readyState===import_ws.default.OPEN).forEach(client=>client.send(data))}};function getServerChannel(server){let transports=[new ServerChannelTransport(server)];return new import_channels.Channel({transports,async:!0})}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){let browserEnvVar=process.env.BROWSER,userBrowserIsChrome=browserEnvVar==="chrome"||browserEnvVar==="chromium"||browserEnvVar==="brave"||browserEnvVar==="com.brave.browser",openOptions=browserEnvVar?{app:{name:browserEnvVar}}:{};(0,import_x_default_browser.default)(async(err,res)=>{try{res&&(res.isChrome||res.isChromium||res.identity==="com.brave.browser"||userBrowserIsChrome)?await(0,import_better_opn.default)(address):await(0,import_open.default)(address,openOptions)}catch{import_node_logger8.logger.error(import_ts_dedent3.dedent`
36
+ `)}return[...defaultTags,...projectTags,...extraTags]}storyFileNames(){return Array.from(this.specifierToCache.values()).flatMap(r2=>Object.keys(r2))}};var PAGE_REGEX=/(page|screen)/i,isPageStory=storyId=>PAGE_REGEX.test(storyId),isCLIExampleEntry=entry=>["example-introduction--docs","configure-your-project--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),isAnyExampleEntry=entry=>entry.id.startsWith("example-button--")||entry.id.startsWith("example-header--")||entry.id.startsWith("example-page--");function summarizeIndex(storyIndex){let storyCount=0,componentTitles=new Set,exampleStoryCount=0,onboardingStoryCount=0,onboardingDocsCount=0,exampleDocsCount=0,pageStoryCount=0,playStoryCount=0,autodocsCount=0,storiesMdxCount=0,mdxCount=0;Object.values(storyIndex.entries).forEach(entry=>{isCLIExampleEntry(entry)?(entry.type==="story"&&(exampleStoryCount+=1),entry.type==="docs"&&(exampleDocsCount+=1)):isAnyExampleEntry(entry)?(entry.type==="story"&&(onboardingStoryCount+=1),entry.type==="docs"&&(onboardingDocsCount+=1)):entry.type==="story"?(storyCount+=1,componentTitles.add(entry.title),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))});let componentCount=componentTitles.size;return{storyCount,componentCount,pageStoryCount,playStoryCount,autodocsCount,storiesMdxCount,mdxCount,exampleStoryCount,exampleDocsCount,onboardingStoryCount,onboardingDocsCount,version:storyIndex.v}}var import_server_errors2=require("@storybook/core-events/server-errors");async function buildOrThrow(callback){try{return await callback()}catch(err){let builderErrors=err.errors;throw builderErrors&&builderErrors.find(er=>er.text?.includes("No matching export"))?new import_server_errors2.NoMatchingExportError(err):err}}async function buildStaticStandalone(options){if(options.configType="PRODUCTION",options.outputDir==="")throw new Error("Won't remove current directory. Check your outputDir!");if(options.outputDir=(0,import_path8.resolve)(options.outputDir),options.configDir=(0,import_path8.resolve)(options.configDir),import_node_logger5.logger.info(import_chalk5.default`=> Cleaning outputDir: {cyan ${(0,import_path8.relative)(process.cwd(),options.outputDir)}}`),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 config=await(0,import_core_common5.loadMainConfig)(options),{framework}=config,corePresets=[],frameworkName=typeof framework=="string"?framework:framework?.name;frameworkName?corePresets.push((0,import_path8.join)(frameworkName,"preset")):options.ignorePreview||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_common5.loadAllPresets)({corePresets:[require.resolve("@storybook/core-server/dist/presets/common-preset"),...corePresets],overridePresets:[require.resolve("@storybook/core-server/dist/presets/common-override-preset")],isCritical:!0,...options}),{renderer}=await presets.apply("core",{}),build2=await presets.apply("build",{}),[previewBuilder,managerBuilder]=await getBuilders({...options,presets,build:build2}),resolvedRenderer=renderer?(0,import_core_common5.resolveAddonName)(options.configDir,renderer,options):void 0;presets=await(0,import_core_common5.loadAllPresets)({corePresets:[require.resolve("@storybook/core-server/dist/presets/common-preset"),...managerBuilder.corePresets||[],...previewBuilder.corePresets||[],...resolvedRenderer?[resolvedRenderer]:[],...corePresets],overridePresets:[...previewBuilder.overridePresets||[],require.resolve("@storybook/core-server/dist/presets/common-override-preset")],...options,build:build2});let[features,core,staticDirs,indexers,stories,docsOptions]=await Promise.all([presets.apply("features"),presets.apply("core"),presets.apply("staticDirs"),presets.apply("experimental_indexers",[]),presets.apply("stories"),presets.apply("docs",{})]),fullOptions={...options,presets,features,build:build2},effects=[];import_global.global.FEATURES=features,await buildOrThrow(async()=>managerBuilder.build({startTime:process.hrtime(),options:fullOptions})),staticDirs&&effects.push(copyAllStaticFilesRelativeToMain(staticDirs,options.outputDir,options.configDir));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(!options.ignorePreview){let workingDir=process.cwd(),directories={configDir:options.configDir,workingDir},normalizedStories=(0,import_core_common5.normalizeStories)(stories,directories),generator=new StoryIndexGenerator(normalizedStories,{...directories,indexers,docs:docsOptions,build:build2});initializedStoryIndexGenerator=generator.initialize().then(()=>generator),effects.push(extractStoriesJson((0,import_path8.join)(options.outputDir,"index.json"),initializedStoryIndexGenerator))}core?.disableProjectJson||effects.push(extractStorybookMetadata((0,import_path8.join)(options.outputDir,"project.json"),options.configDir)),options.debugWebpack&&(0,import_core_common5.logConfig)("Preview webpack config",await previewBuilder.getConfig(fullOptions)),options.ignorePreview?import_node_logger5.logger.info("=> Not building preview"):import_node_logger5.logger.info("=> Building preview..");let startTime=process.hrtime();await Promise.all([...options.ignorePreview?[]:[previewBuilder.build({startTime,options:fullOptions}).then(async previewStats=>{import_node_logger5.logger.trace({message:"=> Preview built",time:process.hrtime(startTime)});let statsOption=options.webpackStatsJson||options.statsJson;if(statsOption){let target=statsOption===!0?options.outputDir:statsOption;await outputStats(target,previewStats)}}).catch(error=>{throw import_node_logger5.logger.error("=> Failed to build the preview"),process.exitCode=1,error})],...effects]),core?.disableTelemetry||effects.push(initializedStoryIndexGenerator.then(async generator=>{let storyIndex=await 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_common12=require("@storybook/core-common"),import_prompts2=__toESM(require("prompts")),import_tiny_invariant4=__toESM(require("tiny-invariant")),import_global2=require("@storybook/global"),import_telemetry5=require("@storybook/telemetry"),import_path10=require("path"),import_node_logger14=require("@storybook/node-logger"),import_ts_dedent7=require("ts-dedent"),import_fs_extra10=require("fs-extra"),import_server_errors4=require("@storybook/core-events/server-errors");var import_express3=__toESM(require("express")),import_compression=__toESM(require("compression")),import_tiny_invariant3=__toESM(require("tiny-invariant")),import_core_common8=require("@storybook/core-common"),import_node_logger10=require("@storybook/node-logger"),import_server_errors3=require("@storybook/core-events/server-errors");var import_path9=__toESM(require("path")),import_fs2=__toESM(require("fs")),fileExists=basename5=>[".js",".cjs"].reduce((found,ext)=>{let filename=`${basename5}${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_os=__toESM(require("os")),import_node_logger6=require("@storybook/node-logger"),import_detect_port=__toESM(require("detect-port"));function getServerAddresses(port,host,proto,initialPath){let address=new URL(`${proto}://localhost:${port}/`),networkAddress=new URL(`${proto}://${host||getLocalIp()}:${port}/`);if(initialPath){let searchParams=`?path=${decodeURIComponent(initialPath.startsWith("/")?initialPath:`/${initialPath}`)}`;address.search=searchParams,networkAddress.search=searchParams}return{address:address.href,networkAddress:networkAddress.href}}var getServerPort=(port,{exactPort}={})=>(0,import_detect_port.default)(port).then(freePort=>(freePort!==port&&exactPort&&process.exit(-1),freePort)).catch(error=>{import_node_logger6.logger.error(error),process.exit(-1)}),getServerChannelUrl=(port,{https:https3})=>`${https3?"wss":"ws"}://localhost:${port}/storybook-server-channel`,getLocalIp=()=>{let allFilteredIps=Object.values(import_os.default.networkInterfaces()).flat().filter(ip=>ip&&ip.family==="IPv4"&&!ip.internal);return allFilteredIps.length?allFilteredIps[0]?.address:"0.0.0.0"};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"),import_channels=require("@storybook/channels"),ServerChannelTransport=class{constructor(server){this.socket=new import_ws.WebSocketServer({noServer:!0}),server.on("upgrade",(request,socket,head)=>{request.url==="/storybook-server-channel"&&this.socket.handleUpgrade(request,socket,head,ws=>{this.socket.emit("connection",ws,request)})}),this.socket.on("connection",wss=>{wss.on("message",raw=>{let data=raw.toString(),event=typeof data=="string"&&(0,import_telejson.isJSON)(data)?(0,import_telejson.parse)(data,{allowFunction:!1,allowClass:!1}):data;this.handler?.(event)})})}setHandler(handler){this.handler=handler}send(event){let data=(0,import_telejson.stringify)(event,{maxDepth:15,allowFunction:!1,allowClass:!1});Array.from(this.socket.clients).filter(c=>c.readyState===import_ws.default.OPEN).forEach(client=>client.send(data))}};function getServerChannel(server){let transports=[new ServerChannelTransport(server)];return new import_channels.Channel({transports,async:!0})}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){let browserEnvVar=process.env.BROWSER,userBrowserIsChrome=browserEnvVar==="chrome"||browserEnvVar==="chromium"||browserEnvVar==="brave"||browserEnvVar==="com.brave.browser",openOptions=browserEnvVar?{app:{name:browserEnvVar}}:{};(0,import_x_default_browser.default)(async(err,res)=>{try{res&&(res.isChrome||res.isChromium||res.identity==="com.brave.browser"||userBrowserIsChrome)?await(0,import_better_opn.default)(address):await(0,import_open.default)(address,openOptions)}catch{import_node_logger8.logger.error(import_ts_dedent3.dedent`
37
37
  Could not open ${address} inside a browser. If you're running this command inside a
38
38
  docker container or on a CI, you need to pass the '--ci' flag to prevent opening a
39
39
  browser by default.
package/dist/index.mjs CHANGED
@@ -24,7 +24,7 @@ import { storyNameFromExport, toId, combineTags } from '@storybook/csf';
24
24
  import { analyze } from '@storybook/docs-mdx';
25
25
  import prompts from 'prompts';
26
26
  import compression from 'compression';
27
- import ip from 'ip';
27
+ import os from 'os';
28
28
  import detectFreePort from 'detect-port';
29
29
  import http2 from 'http';
30
30
  import https from 'https';
@@ -70,7 +70,7 @@ ${this.indexingErrors.map(err=>`- ${err}`).join(`
70
70
  Received:
71
71
 
72
72
  ${previewCode}
73
- `);}return [...defaultTags,...projectTags,...extraTags]}storyFileNames(){return Array.from(this.specifierToCache.values()).flatMap(r=>Object.keys(r))}};var PAGE_REGEX=/(page|screen)/i,isPageStory=storyId=>PAGE_REGEX.test(storyId),isCLIExampleEntry=entry=>["example-introduction--docs","configure-your-project--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),isAnyExampleEntry=entry=>entry.id.startsWith("example-button--")||entry.id.startsWith("example-header--")||entry.id.startsWith("example-page--");function summarizeIndex(storyIndex){let storyCount=0,componentTitles=new Set,exampleStoryCount=0,onboardingStoryCount=0,onboardingDocsCount=0,exampleDocsCount=0,pageStoryCount=0,playStoryCount=0,autodocsCount=0,storiesMdxCount=0,mdxCount=0;Object.values(storyIndex.entries).forEach(entry=>{isCLIExampleEntry(entry)?(entry.type==="story"&&(exampleStoryCount+=1),entry.type==="docs"&&(exampleDocsCount+=1)):isAnyExampleEntry(entry)?(entry.type==="story"&&(onboardingStoryCount+=1),entry.type==="docs"&&(onboardingDocsCount+=1)):entry.type==="story"?(storyCount+=1,componentTitles.add(entry.title),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));});let componentCount=componentTitles.size;return {storyCount,componentCount,pageStoryCount,playStoryCount,autodocsCount,storiesMdxCount,mdxCount,exampleStoryCount,exampleDocsCount,onboardingStoryCount,onboardingDocsCount,version:storyIndex.v}}async function buildOrThrow(callback){try{return await callback()}catch(err){let builderErrors=err.errors;throw builderErrors&&builderErrors.find(er=>er.text?.includes("No matching export"))?new NoMatchingExportError(err):err}}async function buildStaticStandalone(options){if(options.configType="PRODUCTION",options.outputDir==="")throw new Error("Won't remove current directory. Check your outputDir!");if(options.outputDir=resolve(options.outputDir),options.configDir=resolve(options.configDir),logger.info(chalk8`=> Cleaning outputDir: {cyan ${relative(process.cwd(),options.outputDir)}}`),options.outputDir==="/")throw new Error("Won't remove directory '/'. Check your outputDir!");await emptyDir(options.outputDir),await ensureDir(options.outputDir);let config=await loadMainConfig(options),{framework}=config,corePresets=[],frameworkName=typeof framework=="string"?framework:framework?.name;frameworkName?corePresets.push(join(frameworkName,"preset")):options.ignorePreview||logger.warn(`you have not specified a framework in your ${options.configDir}/main.js`),logger.info("=> Loading presets");let presets=await loadAllPresets({corePresets:[__require.resolve("@storybook/core-server/dist/presets/common-preset"),...corePresets],overridePresets:[__require.resolve("@storybook/core-server/dist/presets/common-override-preset")],isCritical:!0,...options}),{renderer}=await presets.apply("core",{}),build2=await presets.apply("build",{}),[previewBuilder,managerBuilder]=await getBuilders({...options,presets,build:build2}),resolvedRenderer=renderer?resolveAddonName(options.configDir,renderer,options):void 0;presets=await loadAllPresets({corePresets:[__require.resolve("@storybook/core-server/dist/presets/common-preset"),...managerBuilder.corePresets||[],...previewBuilder.corePresets||[],...resolvedRenderer?[resolvedRenderer]:[],...corePresets],overridePresets:[...previewBuilder.overridePresets||[],__require.resolve("@storybook/core-server/dist/presets/common-override-preset")],...options,build:build2});let[features,core,staticDirs,indexers,stories,docsOptions]=await Promise.all([presets.apply("features"),presets.apply("core"),presets.apply("staticDirs"),presets.apply("experimental_indexers",[]),presets.apply("stories"),presets.apply("docs",{})]),fullOptions={...options,presets,features,build:build2},effects=[];global$1.FEATURES=features,await buildOrThrow(async()=>managerBuilder.build({startTime:process.hrtime(),options:fullOptions})),staticDirs&&effects.push(copyAllStaticFilesRelativeToMain(staticDirs,options.outputDir,options.configDir));let coreServerPublicDir=join(dirname(__require.resolve("@storybook/core-server/package.json")),"public");effects.push(copy(coreServerPublicDir,options.outputDir));let initializedStoryIndexGenerator=Promise.resolve(void 0);if(!options.ignorePreview){let workingDir=process.cwd(),directories={configDir:options.configDir,workingDir},normalizedStories=normalizeStories(stories,directories),generator=new StoryIndexGenerator(normalizedStories,{...directories,indexers,docs:docsOptions,build:build2});initializedStoryIndexGenerator=generator.initialize().then(()=>generator),effects.push(extractStoriesJson(join(options.outputDir,"index.json"),initializedStoryIndexGenerator));}core?.disableProjectJson||effects.push(extractStorybookMetadata(join(options.outputDir,"project.json"),options.configDir)),options.debugWebpack&&logConfig("Preview webpack config",await previewBuilder.getConfig(fullOptions)),options.ignorePreview?logger.info("=> Not building preview"):logger.info("=> Building preview..");let startTime=process.hrtime();await Promise.all([...options.ignorePreview?[]:[previewBuilder.build({startTime,options:fullOptions}).then(async previewStats=>{logger.trace({message:"=> Preview built",time:process.hrtime(startTime)});let statsOption=options.webpackStatsJson||options.statsJson;if(statsOption){let target=statsOption===!0?options.outputDir:statsOption;await outputStats(target,previewStats);}}).catch(error=>{throw logger.error("=> Failed to build the preview"),process.exitCode=1,error})],...effects]),core?.disableTelemetry||effects.push(initializedStoryIndexGenerator.then(async generator=>{let storyIndex=await generator?.getIndex(),payload={precedingUpgrade:await getPrecedingUpgrade()};storyIndex&&Object.assign(payload,{storyIndex:summarizeIndex(storyIndex)}),await telemetry("build",payload,{configDir:options.configDir});})),logger.info(`=> Output directory: ${options.outputDir}`);}var fileExists=basename4=>[".js",".cjs"].reduce((found,ext)=>{let filename=`${basename4}${ext}`;return !found&&fs3.existsSync(filename)?filename:found},"");function getMiddleware(configDir){let middlewarePath=fileExists(path4.resolve(configDir,"middleware"));if(middlewarePath){let middlewareModule=__require(middlewarePath);return middlewareModule.__esModule&&(middlewareModule=middlewareModule.default),middlewareModule}return ()=>{}}function getServerAddresses(port,host,proto,initialPath){let address=new URL(`${proto}://localhost:${port}/`),networkAddress=new URL(`${proto}://${host||ip.address()}:${port}/`);if(initialPath){let searchParams=`?path=${decodeURIComponent(initialPath.startsWith("/")?initialPath:`/${initialPath}`)}`;address.search=searchParams,networkAddress.search=searchParams;}return {address:address.href,networkAddress:networkAddress.href}}var getServerPort=(port,{exactPort}={})=>detectFreePort(port).then(freePort=>(freePort!==port&&exactPort&&process.exit(-1),freePort)).catch(error=>{logger.error(error),process.exit(-1);}),getServerChannelUrl=(port,{https:https3})=>`${https3?"wss":"ws"}://localhost:${port}/storybook-server-channel`;async function getServer(app,options){if(!options.https)return http2.createServer(app);options.sslCert||(logger.error("Error: --ssl-cert is required with --https"),process.exit(-1)),options.sslKey||(logger.error("Error: --ssl-key is required with --https"),process.exit(-1));let sslOptions={ca:await Promise.all((options.sslCa||[]).map(ca=>readFile(ca,"utf-8"))),cert:await readFile(options.sslCert,"utf-8"),key:await readFile(options.sslKey,"utf-8")};return https.createServer(sslOptions,app)}var ServerChannelTransport=class{constructor(server){this.socket=new WebSocketServer({noServer:!0}),server.on("upgrade",(request,socket,head)=>{request.url==="/storybook-server-channel"&&this.socket.handleUpgrade(request,socket,head,ws=>{this.socket.emit("connection",ws,request);});}),this.socket.on("connection",wss=>{wss.on("message",raw=>{let data=raw.toString(),event=typeof data=="string"&&isJSON(data)?parse(data,{allowFunction:!1,allowClass:!1}):data;this.handler?.(event);});});}setHandler(handler){this.handler=handler;}send(event){let data=stringify(event,{maxDepth:15,allowFunction:!1,allowClass:!1});Array.from(this.socket.clients).filter(c=>c.readyState===WebSocket.OPEN).forEach(client=>client.send(data));}};function getServerChannel(server){let transports=[new ServerChannelTransport(server)];return new Channel({transports,async:!0})}function openInBrowser(address){let browserEnvVar=process.env.BROWSER,userBrowserIsChrome=browserEnvVar==="chrome"||browserEnvVar==="chromium"||browserEnvVar==="brave"||browserEnvVar==="com.brave.browser",openOptions=browserEnvVar?{app:{name:browserEnvVar}}:{};getDefaultBrowser(async(err,res)=>{try{res&&(res.isChrome||res.isChromium||res.identity==="com.brave.browser"||userBrowserIsChrome)?await betterOpn(address):await open(address,openOptions);}catch{logger.error(dedent`
73
+ `);}return [...defaultTags,...projectTags,...extraTags]}storyFileNames(){return Array.from(this.specifierToCache.values()).flatMap(r=>Object.keys(r))}};var PAGE_REGEX=/(page|screen)/i,isPageStory=storyId=>PAGE_REGEX.test(storyId),isCLIExampleEntry=entry=>["example-introduction--docs","configure-your-project--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),isAnyExampleEntry=entry=>entry.id.startsWith("example-button--")||entry.id.startsWith("example-header--")||entry.id.startsWith("example-page--");function summarizeIndex(storyIndex){let storyCount=0,componentTitles=new Set,exampleStoryCount=0,onboardingStoryCount=0,onboardingDocsCount=0,exampleDocsCount=0,pageStoryCount=0,playStoryCount=0,autodocsCount=0,storiesMdxCount=0,mdxCount=0;Object.values(storyIndex.entries).forEach(entry=>{isCLIExampleEntry(entry)?(entry.type==="story"&&(exampleStoryCount+=1),entry.type==="docs"&&(exampleDocsCount+=1)):isAnyExampleEntry(entry)?(entry.type==="story"&&(onboardingStoryCount+=1),entry.type==="docs"&&(onboardingDocsCount+=1)):entry.type==="story"?(storyCount+=1,componentTitles.add(entry.title),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));});let componentCount=componentTitles.size;return {storyCount,componentCount,pageStoryCount,playStoryCount,autodocsCount,storiesMdxCount,mdxCount,exampleStoryCount,exampleDocsCount,onboardingStoryCount,onboardingDocsCount,version:storyIndex.v}}async function buildOrThrow(callback){try{return await callback()}catch(err){let builderErrors=err.errors;throw builderErrors&&builderErrors.find(er=>er.text?.includes("No matching export"))?new NoMatchingExportError(err):err}}async function buildStaticStandalone(options){if(options.configType="PRODUCTION",options.outputDir==="")throw new Error("Won't remove current directory. Check your outputDir!");if(options.outputDir=resolve(options.outputDir),options.configDir=resolve(options.configDir),logger.info(chalk8`=> Cleaning outputDir: {cyan ${relative(process.cwd(),options.outputDir)}}`),options.outputDir==="/")throw new Error("Won't remove directory '/'. Check your outputDir!");await emptyDir(options.outputDir),await ensureDir(options.outputDir);let config=await loadMainConfig(options),{framework}=config,corePresets=[],frameworkName=typeof framework=="string"?framework:framework?.name;frameworkName?corePresets.push(join(frameworkName,"preset")):options.ignorePreview||logger.warn(`you have not specified a framework in your ${options.configDir}/main.js`),logger.info("=> Loading presets");let presets=await loadAllPresets({corePresets:[__require.resolve("@storybook/core-server/dist/presets/common-preset"),...corePresets],overridePresets:[__require.resolve("@storybook/core-server/dist/presets/common-override-preset")],isCritical:!0,...options}),{renderer}=await presets.apply("core",{}),build2=await presets.apply("build",{}),[previewBuilder,managerBuilder]=await getBuilders({...options,presets,build:build2}),resolvedRenderer=renderer?resolveAddonName(options.configDir,renderer,options):void 0;presets=await loadAllPresets({corePresets:[__require.resolve("@storybook/core-server/dist/presets/common-preset"),...managerBuilder.corePresets||[],...previewBuilder.corePresets||[],...resolvedRenderer?[resolvedRenderer]:[],...corePresets],overridePresets:[...previewBuilder.overridePresets||[],__require.resolve("@storybook/core-server/dist/presets/common-override-preset")],...options,build:build2});let[features,core,staticDirs,indexers,stories,docsOptions]=await Promise.all([presets.apply("features"),presets.apply("core"),presets.apply("staticDirs"),presets.apply("experimental_indexers",[]),presets.apply("stories"),presets.apply("docs",{})]),fullOptions={...options,presets,features,build:build2},effects=[];global$1.FEATURES=features,await buildOrThrow(async()=>managerBuilder.build({startTime:process.hrtime(),options:fullOptions})),staticDirs&&effects.push(copyAllStaticFilesRelativeToMain(staticDirs,options.outputDir,options.configDir));let coreServerPublicDir=join(dirname(__require.resolve("@storybook/core-server/package.json")),"public");effects.push(copy(coreServerPublicDir,options.outputDir));let initializedStoryIndexGenerator=Promise.resolve(void 0);if(!options.ignorePreview){let workingDir=process.cwd(),directories={configDir:options.configDir,workingDir},normalizedStories=normalizeStories(stories,directories),generator=new StoryIndexGenerator(normalizedStories,{...directories,indexers,docs:docsOptions,build:build2});initializedStoryIndexGenerator=generator.initialize().then(()=>generator),effects.push(extractStoriesJson(join(options.outputDir,"index.json"),initializedStoryIndexGenerator));}core?.disableProjectJson||effects.push(extractStorybookMetadata(join(options.outputDir,"project.json"),options.configDir)),options.debugWebpack&&logConfig("Preview webpack config",await previewBuilder.getConfig(fullOptions)),options.ignorePreview?logger.info("=> Not building preview"):logger.info("=> Building preview..");let startTime=process.hrtime();await Promise.all([...options.ignorePreview?[]:[previewBuilder.build({startTime,options:fullOptions}).then(async previewStats=>{logger.trace({message:"=> Preview built",time:process.hrtime(startTime)});let statsOption=options.webpackStatsJson||options.statsJson;if(statsOption){let target=statsOption===!0?options.outputDir:statsOption;await outputStats(target,previewStats);}}).catch(error=>{throw logger.error("=> Failed to build the preview"),process.exitCode=1,error})],...effects]),core?.disableTelemetry||effects.push(initializedStoryIndexGenerator.then(async generator=>{let storyIndex=await generator?.getIndex(),payload={precedingUpgrade:await getPrecedingUpgrade()};storyIndex&&Object.assign(payload,{storyIndex:summarizeIndex(storyIndex)}),await telemetry("build",payload,{configDir:options.configDir});})),logger.info(`=> Output directory: ${options.outputDir}`);}var fileExists=basename4=>[".js",".cjs"].reduce((found,ext)=>{let filename=`${basename4}${ext}`;return !found&&fs3.existsSync(filename)?filename:found},"");function getMiddleware(configDir){let middlewarePath=fileExists(path4.resolve(configDir,"middleware"));if(middlewarePath){let middlewareModule=__require(middlewarePath);return middlewareModule.__esModule&&(middlewareModule=middlewareModule.default),middlewareModule}return ()=>{}}function getServerAddresses(port,host,proto,initialPath){let address=new URL(`${proto}://localhost:${port}/`),networkAddress=new URL(`${proto}://${host||getLocalIp()}:${port}/`);if(initialPath){let searchParams=`?path=${decodeURIComponent(initialPath.startsWith("/")?initialPath:`/${initialPath}`)}`;address.search=searchParams,networkAddress.search=searchParams;}return {address:address.href,networkAddress:networkAddress.href}}var getServerPort=(port,{exactPort}={})=>detectFreePort(port).then(freePort=>(freePort!==port&&exactPort&&process.exit(-1),freePort)).catch(error=>{logger.error(error),process.exit(-1);}),getServerChannelUrl=(port,{https:https3})=>`${https3?"wss":"ws"}://localhost:${port}/storybook-server-channel`,getLocalIp=()=>{let allFilteredIps=Object.values(os.networkInterfaces()).flat().filter(ip=>ip&&ip.family==="IPv4"&&!ip.internal);return allFilteredIps.length?allFilteredIps[0]?.address:"0.0.0.0"};async function getServer(app,options){if(!options.https)return http2.createServer(app);options.sslCert||(logger.error("Error: --ssl-cert is required with --https"),process.exit(-1)),options.sslKey||(logger.error("Error: --ssl-key is required with --https"),process.exit(-1));let sslOptions={ca:await Promise.all((options.sslCa||[]).map(ca=>readFile(ca,"utf-8"))),cert:await readFile(options.sslCert,"utf-8"),key:await readFile(options.sslKey,"utf-8")};return https.createServer(sslOptions,app)}var ServerChannelTransport=class{constructor(server){this.socket=new WebSocketServer({noServer:!0}),server.on("upgrade",(request,socket,head)=>{request.url==="/storybook-server-channel"&&this.socket.handleUpgrade(request,socket,head,ws=>{this.socket.emit("connection",ws,request);});}),this.socket.on("connection",wss=>{wss.on("message",raw=>{let data=raw.toString(),event=typeof data=="string"&&isJSON(data)?parse(data,{allowFunction:!1,allowClass:!1}):data;this.handler?.(event);});});}setHandler(handler){this.handler=handler;}send(event){let data=stringify(event,{maxDepth:15,allowFunction:!1,allowClass:!1});Array.from(this.socket.clients).filter(c=>c.readyState===WebSocket.OPEN).forEach(client=>client.send(data));}};function getServerChannel(server){let transports=[new ServerChannelTransport(server)];return new Channel({transports,async:!0})}function openInBrowser(address){let browserEnvVar=process.env.BROWSER,userBrowserIsChrome=browserEnvVar==="chrome"||browserEnvVar==="chromium"||browserEnvVar==="brave"||browserEnvVar==="com.brave.browser",openOptions=browserEnvVar?{app:{name:browserEnvVar}}:{};getDefaultBrowser(async(err,res)=>{try{res&&(res.isChrome||res.isChromium||res.identity==="com.brave.browser"||userBrowserIsChrome)?await betterOpn(address):await open(address,openOptions);}catch{logger.error(dedent`
74
74
  Could not open ${address} inside a browser. If you're running this command inside a
75
75
  docker container or on a CI, you need to pass the '--ci' flag to prevent opening a
76
76
  browser by default.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@storybook/core-server",
3
- "version": "8.2.0-alpha.5",
3
+ "version": "8.2.0-alpha.6",
4
4
  "description": "Storybook framework-agnostic API",
5
5
  "keywords": [
6
6
  "storybook"
@@ -23,8 +23,8 @@
23
23
  ".": {
24
24
  "types": "./dist/index.d.ts",
25
25
  "node": "./dist/index.js",
26
- "require": "./dist/index.js",
27
- "import": "./dist/index.mjs"
26
+ "import": "./dist/index.mjs",
27
+ "require": "./dist/index.js"
28
28
  },
29
29
  "./dist/presets/common-preset": {
30
30
  "types": "./dist/presets/common-preset.d.ts",
@@ -59,20 +59,20 @@
59
59
  "@babel/core": "^7.24.4",
60
60
  "@babel/parser": "^7.24.4",
61
61
  "@discoveryjs/json-ext": "^0.5.3",
62
- "@storybook/builder-manager": "8.2.0-alpha.5",
63
- "@storybook/channels": "8.2.0-alpha.5",
64
- "@storybook/core-common": "8.2.0-alpha.5",
65
- "@storybook/core-events": "8.2.0-alpha.5",
62
+ "@storybook/builder-manager": "8.2.0-alpha.6",
63
+ "@storybook/channels": "8.2.0-alpha.6",
64
+ "@storybook/core-common": "8.2.0-alpha.6",
65
+ "@storybook/core-events": "8.2.0-alpha.6",
66
66
  "@storybook/csf": "^0.1.7",
67
- "@storybook/csf-tools": "8.2.0-alpha.5",
67
+ "@storybook/csf-tools": "8.2.0-alpha.6",
68
68
  "@storybook/docs-mdx": "3.1.0-next.0",
69
69
  "@storybook/global": "^5.0.0",
70
- "@storybook/manager": "8.2.0-alpha.5",
71
- "@storybook/manager-api": "8.2.0-alpha.5",
72
- "@storybook/node-logger": "8.2.0-alpha.5",
73
- "@storybook/preview-api": "8.2.0-alpha.5",
74
- "@storybook/telemetry": "8.2.0-alpha.5",
75
- "@storybook/types": "8.2.0-alpha.5",
70
+ "@storybook/manager": "8.2.0-alpha.6",
71
+ "@storybook/manager-api": "8.2.0-alpha.6",
72
+ "@storybook/node-logger": "8.2.0-alpha.6",
73
+ "@storybook/preview-api": "8.2.0-alpha.6",
74
+ "@storybook/telemetry": "8.2.0-alpha.6",
75
+ "@storybook/types": "8.2.0-alpha.6",
76
76
  "@types/detect-port": "^1.3.0",
77
77
  "@types/diff": "^5.0.9",
78
78
  "@types/node": "^18.0.0",
@@ -87,7 +87,6 @@
87
87
  "express": "^4.19.2",
88
88
  "fs-extra": "^11.1.0",
89
89
  "globby": "^14.0.1",
90
- "ip": "^2.0.1",
91
90
  "lodash": "^4.17.21",
92
91
  "open": "^8.4.0",
93
92
  "pretty-hrtime": "^1.0.3",
@@ -103,9 +102,8 @@
103
102
  "ws": "^8.2.3"
104
103
  },
105
104
  "devDependencies": {
106
- "@storybook/addon-docs": "8.2.0-alpha.5",
105
+ "@storybook/addon-docs": "8.2.0-alpha.6",
107
106
  "@types/compression": "^1.7.0",
108
- "@types/ip": "^1.1.0",
109
107
  "@types/node-fetch": "^2.5.7",
110
108
  "@types/ws": "^8",
111
109
  "boxen": "^7.1.1",