@storybook/cli 7.1.0-alpha.13 → 7.1.0-alpha.14
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/chunk-N63O6VK4.mjs +39 -0
- package/dist/generate.js +67 -64
- package/dist/generate.mjs +32 -32
- package/dist/index.d.ts +32 -19
- package/dist/index.js +8 -5
- package/dist/index.mjs +1 -1
- package/package.json +10 -10
- package/rendererAssets/common/header.css +5 -5
- package/rendererAssets/common/page.css +10 -10
- package/dist/chunk-VJGD3C7H.mjs +0 -34
package/dist/generate.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { versions_default, parseList, getEnvConfig, JsPackageManagerFactory, useNpmWarning, getStorybookVersionSpecifier, commandLog, installableProjectTypes, paddedLog, HandledError, codeLog, __require, SUPPORTED_RENDERERS, getBowerJson, isNxProject, getPackageDetails, supportedTemplates, unsupportedTemplate, getCliDir, copyTemplate, getBabelDependencies, copyTemplateFiles, readFileAsJson, writeFileAsJson, externalFrameworks } from './chunk-
|
|
1
|
+
import { versions_default, parseList, getEnvConfig, JsPackageManagerFactory, useNpmWarning, getStorybookVersionSpecifier, commandLog, installableProjectTypes, paddedLog, HandledError, codeLog, __require, SUPPORTED_RENDERERS, getBowerJson, isNxProject, getPackageDetails, supportedTemplates, unsupportedTemplate, getCliDir, copyTemplate, getBabelDependencies, copyTemplateFiles, readFileAsJson, writeFileAsJson, externalFrameworks } from './chunk-N63O6VK4.mjs';
|
|
2
2
|
import program from 'commander';
|
|
3
3
|
import path9, { join, basename } from 'path';
|
|
4
4
|
import chalk12 from 'chalk';
|
|
@@ -31,7 +31,7 @@ import getPort from 'get-port';
|
|
|
31
31
|
import { downloadTemplate } from 'giget';
|
|
32
32
|
import shell from 'shelljs';
|
|
33
33
|
|
|
34
|
-
var detectWebpack=packageManager=>{try{let out="";if(packageManager.type==="npm")try{out=packageManager.executeCommand("npm",["ls","webpack"]);}catch{out=packageManager.executeCommand("npm",["why","webpack"]);}else out=packageManager.executeCommand("yarn",["why","webpack"]);if(out.includes("webpack@4")||out.includes("webpack@npm:4"))return 4;if(out.includes("webpack@5")||out.includes("webpack@npm:5"))return 5}catch{}return !1};var viteConfigFiles=["vite.config.ts","vite.config.js","vite.config.mjs"],hasDependency=(packageJson,name,matcher)=>{let version=packageJson.dependencies?.[name]||packageJson.devDependencies?.[name];return version&&typeof matcher=="function"?matcher(version):!!version},hasPeerDependency=(packageJson,name,matcher)=>{let version=packageJson.peerDependencies?.[name];return version&&typeof matcher=="function"?matcher(version):!!version},getFrameworkPreset=(packageJson,framework)=>{let matcher={dependencies:[!1],peerDependencies:[!1],files:[!1]},{preset,files,dependencies,peerDependencies,matcherFunction}=framework,dependencySearches=[];Array.isArray(dependencies)?dependencySearches=dependencies.map(name=>[name,void 0]):typeof dependencies=="object"&&(dependencySearches=Object.entries(dependencies)),dependencySearches.length>0&&(matcher.dependencies=dependencySearches.map(([name,matchFn])=>hasDependency(packageJson,name,matchFn)));let peerDependencySearches=[];return Array.isArray(peerDependencies)?peerDependencySearches=peerDependencies.map(name=>[name,void 0]):typeof peerDependencies=="object"&&(peerDependencySearches=Object.entries(peerDependencies)),peerDependencySearches.length>0&&(matcher.peerDependencies=peerDependencySearches.map(([name,matchFn])=>hasPeerDependency(packageJson,name,matchFn))),Array.isArray(files)&&files.length>0&&(matcher.files=files.map(name=>fs5.existsSync(name))),matcherFunction(matcher)?preset:null};function detectFrameworkPreset(packageJson={}){let result=[...supportedTemplates,unsupportedTemplate].find(framework=>getFrameworkPreset(packageJson,framework)!==null);return result?result.preset:"UNDETECTED"}function detectBuilder(packageManager,projectType){if(findUp2.sync(viteConfigFiles))return paddedLog("Detected Vite project. Setting builder to Vite"),"vite";if(detectWebpack(packageManager))return paddedLog("Detected webpack project. Setting builder to webpack"),"webpack5";switch(projectType){case"SVELTE":case"SVELTEKIT":case"VUE":case"VUE3":case"SFC_VUE":return "vite";default:return "webpack5"}}function isStorybookInstalled(dependencies,force){return dependencies?!!(!force&&dependencies.devDependencies&&SUPPORTED_RENDERERS.reduce((storybookPresent,framework)=>storybookPresent||!!dependencies.devDependencies[`@storybook/${framework}`],!1)):!1}function detectPnp(){return pathExistsSync(join(process.cwd(),".pnp.cjs"))}function detectLanguage(packageJson){let language="javascript";return !packageJson||fs5.existsSync("jsconfig.json")||(hasDependency(packageJson,"typescript",version=>semver.gte(semver.coerce(version),"4.9.0"))&&(!hasDependency(packageJson,"prettier")||hasDependency(packageJson,"prettier",version=>semver.gte(semver.coerce(version),"2.8.0")))&&(!hasDependency(packageJson,"@babel/plugin-transform-typescript")||hasDependency(packageJson,"@babel/plugin-transform-typescript",version=>semver.gte(semver.coerce(version),"7.20.0")))&&(!hasDependency(packageJson,"@typescript-eslint/parser")||hasDependency(packageJson,"@typescript-eslint/parser",version=>semver.gte(semver.coerce(version),"5.44.0")))&&(!hasDependency(packageJson,"eslint-plugin-storybook")||hasDependency(packageJson,"eslint-plugin-storybook",version=>semver.gte(semver.coerce(version),"0.6.8")))?language="typescript-4-9":hasDependency(packageJson,"typescript",version=>semver.gte(semver.coerce(version),"3.8.0"))?language="typescript-3-8":hasDependency(packageJson,"typescript",version=>semver.lt(semver.coerce(version),"3.8.0"))&&logger.warn("Detected TypeScript < 3.8, populating with JavaScript examples")),language}function detect(packageJson,options={}){let bowerJson=getBowerJson();return !packageJson&&!bowerJson?"UNDETECTED":isNxProject(packageJson)?"NX":options.html?"HTML":detectFrameworkPreset(packageJson||bowerJson)}var logger2=console,sanitizeFramework=framework=>{let matches=framework.match(/(@storybook\/\w+(?:-\w+)*)|(storybook-(\w+(?:-\w+)*))/g);if(matches)return matches[0]};async function configureMain({addons,extensions=["js","jsx","ts","tsx"],storybookConfigFolder,language,...custom}){let srcPath=path9.resolve(storybookConfigFolder,"../src"),prefix=await fse__default.pathExists(srcPath)?"../src":"../stories",config={stories:[`${prefix}/**/*.mdx`,`${prefix}/**/*.stories.@(${extensions.join("|")})`],addons,...custom},isTypescript=language==="typescript-4-9"||language==="typescript-3-8",mainConfigTemplate=dedent`<<import>>const config<<type>> = <<mainContents>>;
|
|
34
|
+
var detectWebpack=async packageManager=>{try{let out="";if(packageManager.type==="npm")try{out=await packageManager.executeCommand({command:"npm",args:["ls","webpack"]});}catch{out=await packageManager.executeCommand({command:"npm",args:["why","webpack"]});}else out=await packageManager.executeCommand({command:"yarn",args:["why","webpack"]});if(out.includes("webpack@4")||out.includes("webpack@npm:4"))return 4;if(out.includes("webpack@5")||out.includes("webpack@npm:5"))return 5}catch{}return !1};var viteConfigFiles=["vite.config.ts","vite.config.js","vite.config.mjs"],hasDependency=(packageJson,name,matcher)=>{let version=packageJson.dependencies?.[name]||packageJson.devDependencies?.[name];return version&&typeof matcher=="function"?matcher(version):!!version},hasPeerDependency=(packageJson,name,matcher)=>{let version=packageJson.peerDependencies?.[name];return version&&typeof matcher=="function"?matcher(version):!!version},getFrameworkPreset=(packageJson,framework)=>{let matcher={dependencies:[!1],peerDependencies:[!1],files:[!1]},{preset,files,dependencies,peerDependencies,matcherFunction}=framework,dependencySearches=[];Array.isArray(dependencies)?dependencySearches=dependencies.map(name=>[name,void 0]):typeof dependencies=="object"&&(dependencySearches=Object.entries(dependencies)),dependencySearches.length>0&&(matcher.dependencies=dependencySearches.map(([name,matchFn])=>hasDependency(packageJson,name,matchFn)));let peerDependencySearches=[];return Array.isArray(peerDependencies)?peerDependencySearches=peerDependencies.map(name=>[name,void 0]):typeof peerDependencies=="object"&&(peerDependencySearches=Object.entries(peerDependencies)),peerDependencySearches.length>0&&(matcher.peerDependencies=peerDependencySearches.map(([name,matchFn])=>hasPeerDependency(packageJson,name,matchFn))),Array.isArray(files)&&files.length>0&&(matcher.files=files.map(name=>fs5.existsSync(name))),matcherFunction(matcher)?preset:null};function detectFrameworkPreset(packageJson={}){let result=[...supportedTemplates,unsupportedTemplate].find(framework=>getFrameworkPreset(packageJson,framework)!==null);return result?result.preset:"UNDETECTED"}function detectBuilder(packageManager,projectType){if(findUp2.sync(viteConfigFiles))return paddedLog("Detected Vite project. Setting builder to Vite"),"vite";if(detectWebpack(packageManager))return paddedLog("Detected webpack project. Setting builder to webpack"),"webpack5";switch(projectType){case"SVELTE":case"SVELTEKIT":case"VUE":case"VUE3":case"SFC_VUE":return "vite";default:return "webpack5"}}function isStorybookInstalled(dependencies,force){return dependencies?!!(!force&&dependencies.devDependencies&&SUPPORTED_RENDERERS.reduce((storybookPresent,framework)=>storybookPresent||!!dependencies.devDependencies[`@storybook/${framework}`],!1)):!1}function detectPnp(){return pathExistsSync(join(process.cwd(),".pnp.cjs"))}function detectLanguage(packageJson){let language="javascript";return !packageJson||fs5.existsSync("jsconfig.json")||(hasDependency(packageJson,"typescript",version=>semver.gte(semver.coerce(version),"4.9.0"))&&(!hasDependency(packageJson,"prettier")||hasDependency(packageJson,"prettier",version=>semver.gte(semver.coerce(version),"2.8.0")))&&(!hasDependency(packageJson,"@babel/plugin-transform-typescript")||hasDependency(packageJson,"@babel/plugin-transform-typescript",version=>semver.gte(semver.coerce(version),"7.20.0")))&&(!hasDependency(packageJson,"@typescript-eslint/parser")||hasDependency(packageJson,"@typescript-eslint/parser",version=>semver.gte(semver.coerce(version),"5.44.0")))&&(!hasDependency(packageJson,"eslint-plugin-storybook")||hasDependency(packageJson,"eslint-plugin-storybook",version=>semver.gte(semver.coerce(version),"0.6.8")))?language="typescript-4-9":hasDependency(packageJson,"typescript",version=>semver.gte(semver.coerce(version),"3.8.0"))?language="typescript-3-8":hasDependency(packageJson,"typescript",version=>semver.lt(semver.coerce(version),"3.8.0"))&&logger.warn("Detected TypeScript < 3.8, populating with JavaScript examples")),language}function detect(packageJson,options={}){let bowerJson=getBowerJson();return !packageJson&&!bowerJson?"UNDETECTED":isNxProject(packageJson)?"NX":options.html?"HTML":detectFrameworkPreset(packageJson||bowerJson)}var logger2=console,sanitizeFramework=framework=>{let matches=framework.match(/(@storybook\/\w+(?:-\w+)*)|(storybook-(\w+(?:-\w+)*))/g);if(matches)return matches[0]};async function configureMain({addons,extensions=["js","jsx","ts","tsx"],storybookConfigFolder,language,...custom}){let srcPath=path9.resolve(storybookConfigFolder,"../src"),prefix=await fse__default.pathExists(srcPath)?"../src":"../stories",config={stories:[`${prefix}/**/*.mdx`,`${prefix}/**/*.stories.@(${extensions.join("|")})`],addons,...custom},isTypescript=language==="typescript-4-9"||language==="typescript-3-8",mainConfigTemplate=dedent`<<import>>const config<<type>> = <<mainContents>>;
|
|
35
35
|
export default config;`,frameworkPackage=sanitizeFramework(custom.framework?.name);frameworkPackage||(mainConfigTemplate=mainConfigTemplate.replace("<<import>>","").replace("<<type>>",""),logger2.warn("Could not find framework package name"));let mainContents=JSON.stringify(config,null,2).replace(/['"]%%/g,"").replace(/%%['"]/g,""),imports=[];custom.framework?.name.includes("path.dirname(")&&imports.push("import path from 'path';"),isTypescript?imports.push(`import type { StorybookConfig } from '${frameworkPackage}';`):imports.push(`/** @type { import('${frameworkPackage}').StorybookConfig } */`);let mainJsContents=mainConfigTemplate.replace("<<import>>",`${imports.join(`
|
|
36
36
|
|
|
37
37
|
`)}
|
|
@@ -54,15 +54,15 @@ var detectWebpack=packageManager=>{try{let out="";if(packageManager.type==="npm"
|
|
|
54
54
|
|
|
55
55
|
export default preview;
|
|
56
56
|
`.replace(`
|
|
57
|
-
`,"").trim(),prettier=(await import('prettier')).default,prettyPreview=prettier.format(preview,{...prettier.resolveConfig.sync(process.cwd()),filepath:previewPath});await fse__default.writeFile(previewPath,prettyPreview,{encoding:"utf8"});}var generateStorybookBabelConfigInCWD=async()=>{let target=process.cwd();return generateStorybookBabelConfig({target})},generateStorybookBabelConfig=async({target})=>{logger.info(`Generating the storybook default babel config at ${target}`);let fileName=".babelrc.json",location=path9.join(target,fileName);if(await pathExists(location)){let{overwrite}=await prompts({type:"confirm",initial:!1,name:"overwrite",message:`${fileName} already exists. Would you like overwrite it?`});if(overwrite===!1){logger.warn("Cancelled, babel config file was NOT written to file-system.");return}}logger.info(`The config will contain ${chalk12.yellow("@babel/preset-env")} and you will be prompted for additional presets, if you wish to add them depending on your project needs.`);let{typescript,jsx}=await prompts([{type:"confirm",initial:!1,name:"typescript",message:"Do you want to add the TypeScript preset?"},{type:"confirm",initial:!1,name:"jsx",message:"Do you want to add the React preset?"}]),added=["@babel/preset-env"],presets=[["@babel/preset-env",{targets:{chrome:100}}]];typescript&&(added.push("@babel/preset-typescript"),presets.push("@babel/preset-typescript")),jsx&&(added.push("@babel/preset-react"),presets.push("@babel/preset-react"));let contents=JSON.stringify({sourceType:"unambiguous",presets,plugins:[]},null,2);logger.info(`Writing file to ${location}`),await writeFile(location,contents);let{runInstall}=await prompts({type:"confirm",initial:!0,name:"runInstall",message:`Shall we install the required dependencies now? (${added.join(", ")})`});runInstall?(logger.info("Installing dependencies..."),JsPackageManagerFactory.getPackageManager().addDependencies({installAsDevDependencies:!0},added)):logger.info(`\u26A0\uFE0F Please remember to install the required dependencies yourself: (${added.join(", ")})`);};var defaultOptions={extraPackages:[],extraAddons:[],staticDir:void 0,addScripts:!0,addMainFile:!0,addComponents:!0,addBabel:!1,addESLint:!1,extraMain:void 0,framework:void 0,extensions:void 0,componentsDestinationPath:void 0,storybookConfigFolder:".storybook"},getBuilderDetails=builder=>{let map=versions_default;if(map[builder])return builder;let builderPackage=`@storybook/${builder}`;return map[builderPackage]?builderPackage:builder},getExternalFramework=framework=>externalFrameworks.find(exFramework=>framework!==void 0&&(exFramework.name===framework||exFramework.packageName===framework||exFramework?.frameworks?.some?.(item=>item===framework))),getFrameworkPackage=(framework,renderer,builder)=>{let externalFramework=getExternalFramework(framework);return externalFramework===void 0?framework?`@storybook/${framework}`:`@storybook/${renderer}-${builder}`:externalFramework.frameworks!==void 0?externalFramework.frameworks.find(item=>item.match(new RegExp(`-${builder}`))):externalFramework.packageName},getRendererPackage=(framework,renderer)=>{let externalFramework=getExternalFramework(framework);return externalFramework!==void 0?externalFramework.renderer||externalFramework.packageName:`@storybook/${renderer}`},wrapForPnp=packageName=>`%%path.dirname(require.resolve(path.join('${packageName}', 'package.json')))%%`,getFrameworkDetails=(renderer,builder,pnp,framework)=>{let frameworkPackage=getFrameworkPackage(framework,renderer,builder),frameworkPackagePath=pnp?wrapForPnp(frameworkPackage):frameworkPackage,rendererPackage=getRendererPackage(framework,renderer),rendererPackagePath=pnp?wrapForPnp(rendererPackage):rendererPackage,builderPackage=getBuilderDetails(builder),builderPackagePath=pnp?wrapForPnp(builderPackage):builderPackage,isKnownFramework=!!getExternalFramework(frameworkPackage)||!!versions_default[frameworkPackage],isKnownRenderer=!!versions_default[rendererPackage];if(isKnownFramework)return {packages:[rendererPackage,frameworkPackage],framework:frameworkPackagePath,rendererId:renderer,type:"framework"};if(isKnownRenderer)return {packages:[rendererPackage,builderPackage],builder:builderPackagePath,renderer:rendererPackagePath,rendererId:renderer,type:"renderer"};throw new Error(`Could not find the framework (${frameworkPackage}) or renderer (${rendererPackage}) package`)},stripVersions=addons=>addons.map(addon=>getPackageDetails(addon)[0]),hasInteractiveStories=rendererId=>["react","angular","preact","svelte","vue","vue3","html","solid","qwik"].includes(rendererId),hasFrameworkTemplates=framework=>["angular","nextjs"].includes(framework);async function baseGenerator(packageManager,npmOptions,{language,builder="webpack5",pnp,frameworkPreviewParts},renderer,options=defaultOptions,framework){let{extraAddons:extraAddonPackages,extraPackages,staticDir,addScripts,addMainFile,addComponents,addBabel,addESLint,extraMain,extensions,storybookConfigFolder,componentsDestinationPath}={...defaultOptions,...options},{packages:frameworkPackages4,type,rendererId,framework:frameworkInclude,builder:builderInclude}=getFrameworkDetails(renderer,builder,pnp,framework),addons=["@storybook/addon-links","@storybook/addon-essentials",...stripVersions(extraAddonPackages)],addonPackages=["@storybook/addon-links","@storybook/addon-essentials","@storybook/blocks",...extraAddonPackages];hasInteractiveStories(rendererId)&&(addons.push("@storybook/addon-interactions"),addonPackages.push("@storybook/addon-interactions","@storybook/testing-library@^0.0.14-next.1"));let files=await fse__default.readdir(process.cwd()),packageJson=packageManager.retrievePackageJson(),installedDependencies=new Set(Object.keys({...packageJson.dependencies,...packageJson.devDependencies}));if(installedDependencies.has("react")||addonPackages.push("react"),installedDependencies.has("react-dom")||addonPackages.push("react-dom"),type==="renderer")throw new Error(dedent`
|
|
57
|
+
`,"").trim(),prettier=(await import('prettier')).default,prettyPreview=prettier.format(preview,{...prettier.resolveConfig.sync(process.cwd()),filepath:previewPath});await fse__default.writeFile(previewPath,prettyPreview,{encoding:"utf8"});}var generateStorybookBabelConfigInCWD=async()=>{let target=process.cwd();return generateStorybookBabelConfig({target})},generateStorybookBabelConfig=async({target})=>{logger.info(`Generating the storybook default babel config at ${target}`);let fileName=".babelrc.json",location=path9.join(target,fileName);if(await pathExists(location)){let{overwrite}=await prompts({type:"confirm",initial:!1,name:"overwrite",message:`${fileName} already exists. Would you like overwrite it?`});if(overwrite===!1){logger.warn("Cancelled, babel config file was NOT written to file-system.");return}}logger.info(`The config will contain ${chalk12.yellow("@babel/preset-env")} and you will be prompted for additional presets, if you wish to add them depending on your project needs.`);let{typescript,jsx}=await prompts([{type:"confirm",initial:!1,name:"typescript",message:"Do you want to add the TypeScript preset?"},{type:"confirm",initial:!1,name:"jsx",message:"Do you want to add the React preset?"}]),added=["@babel/preset-env"],presets=[["@babel/preset-env",{targets:{chrome:100}}]];typescript&&(added.push("@babel/preset-typescript"),presets.push("@babel/preset-typescript")),jsx&&(added.push("@babel/preset-react"),presets.push("@babel/preset-react"));let contents=JSON.stringify({sourceType:"unambiguous",presets,plugins:[]},null,2);logger.info(`Writing file to ${location}`),await writeFile(location,contents);let{runInstall}=await prompts({type:"confirm",initial:!0,name:"runInstall",message:`Shall we install the required dependencies now? (${added.join(", ")})`});runInstall?(logger.info("Installing dependencies..."),await JsPackageManagerFactory.getPackageManager().addDependencies({installAsDevDependencies:!0},added)):logger.info(`\u26A0\uFE0F Please remember to install the required dependencies yourself: (${added.join(", ")})`);};var defaultOptions={extraPackages:[],extraAddons:[],staticDir:void 0,addScripts:!0,addMainFile:!0,addComponents:!0,addBabel:!1,addESLint:!1,extraMain:void 0,framework:void 0,extensions:void 0,componentsDestinationPath:void 0,storybookConfigFolder:".storybook"},getBuilderDetails=builder=>{let map=versions_default;if(map[builder])return builder;let builderPackage=`@storybook/${builder}`;return map[builderPackage]?builderPackage:builder},getExternalFramework=framework=>externalFrameworks.find(exFramework=>framework!==void 0&&(exFramework.name===framework||exFramework.packageName===framework||exFramework?.frameworks?.some?.(item=>item===framework))),getFrameworkPackage=(framework,renderer,builder)=>{let externalFramework=getExternalFramework(framework);return externalFramework===void 0?framework?`@storybook/${framework}`:`@storybook/${renderer}-${builder}`:externalFramework.frameworks!==void 0?externalFramework.frameworks.find(item=>item.match(new RegExp(`-${builder}`))):externalFramework.packageName},getRendererPackage=(framework,renderer)=>{let externalFramework=getExternalFramework(framework);return externalFramework!==void 0?externalFramework.renderer||externalFramework.packageName:`@storybook/${renderer}`},wrapForPnp=packageName=>`%%path.dirname(require.resolve(path.join('${packageName}', 'package.json')))%%`,getFrameworkDetails=(renderer,builder,pnp,framework)=>{let frameworkPackage=getFrameworkPackage(framework,renderer,builder),frameworkPackagePath=pnp?wrapForPnp(frameworkPackage):frameworkPackage,rendererPackage=getRendererPackage(framework,renderer),rendererPackagePath=pnp?wrapForPnp(rendererPackage):rendererPackage,builderPackage=getBuilderDetails(builder),builderPackagePath=pnp?wrapForPnp(builderPackage):builderPackage,isKnownFramework=!!getExternalFramework(frameworkPackage)||!!versions_default[frameworkPackage],isKnownRenderer=!!versions_default[rendererPackage];if(isKnownFramework)return {packages:[rendererPackage,frameworkPackage],framework:frameworkPackagePath,rendererId:renderer,type:"framework"};if(isKnownRenderer)return {packages:[rendererPackage,builderPackage],builder:builderPackagePath,renderer:rendererPackagePath,rendererId:renderer,type:"renderer"};throw new Error(`Could not find the framework (${frameworkPackage}) or renderer (${rendererPackage}) package`)},stripVersions=addons=>addons.map(addon=>getPackageDetails(addon)[0]),hasInteractiveStories=rendererId=>["react","angular","preact","svelte","vue","vue3","html","solid","qwik"].includes(rendererId),hasFrameworkTemplates=framework=>["angular","nextjs"].includes(framework);async function baseGenerator(packageManager,npmOptions,{language,builder="webpack5",pnp,frameworkPreviewParts},renderer,options=defaultOptions,framework){let{extraAddons:extraAddonPackages,extraPackages,staticDir,addScripts,addMainFile,addComponents,addBabel,addESLint,extraMain,extensions,storybookConfigFolder,componentsDestinationPath}={...defaultOptions,...options},{packages:frameworkPackages4,type,rendererId,framework:frameworkInclude,builder:builderInclude}=getFrameworkDetails(renderer,builder,pnp,framework),addons=["@storybook/addon-links","@storybook/addon-essentials",...stripVersions(extraAddonPackages)],addonPackages=["@storybook/addon-links","@storybook/addon-essentials","@storybook/blocks",...extraAddonPackages];hasInteractiveStories(rendererId)&&(addons.push("@storybook/addon-interactions"),addonPackages.push("@storybook/addon-interactions","@storybook/testing-library@^0.0.14-next.1"));let files=await fse__default.readdir(process.cwd()),packageJson=await packageManager.retrievePackageJson(),installedDependencies=new Set(Object.keys({...packageJson.dependencies,...packageJson.devDependencies}));if(installedDependencies.has("react")||addonPackages.push("react"),installedDependencies.has("react-dom")||addonPackages.push("react-dom"),type==="renderer")throw new Error(dedent`
|
|
58
58
|
Sorry, for now, you can not do this, please use a framework such as @storybook/react-webpack5
|
|
59
59
|
|
|
60
60
|
https://github.com/storybookjs/storybook/issues/18360
|
|
61
|
-
`);let packages=["storybook",getExternalFramework(rendererId)?void 0:`@storybook/${rendererId}`,...frameworkPackages4,...addonPackages,...extraPackages].filter(Boolean).filter(packageToInstall=>!installedDependencies.has(getPackageDetails(packageToInstall)[0])),versionedPackages=await packageManager.getVersionedPackages(packages);await fse__default.ensureDir(`./${storybookConfigFolder}`),addMainFile&&await configureMain({framework:{name:frameworkInclude,options:options.framework||{}},storybookConfigFolder,docs:{autodocs:"tag"},addons:pnp?addons.map(wrapForPnp):addons,extensions,language,...staticDir?{staticDirs:[path9.join("..",staticDir)]}:null,...extraMain,...type!=="framework"?{core:{builder:builderInclude}}:{}}),await configurePreview({frameworkPreviewParts,storybookConfigFolder,language,rendererId});let babelDependencies=addBabel&&builder!=="vite"?await getBabelDependencies(packageManager,packageJson):[];!files.some(fname=>fname.startsWith(".babel")||fname.startsWith("babel")||fname==="package.json")&&await generateStorybookBabelConfigInCWD();let depsToInstall=[...versionedPackages,...babelDependencies];if(depsToInstall.length>0&&packageManager.addDependencies({...npmOptions,packageJson},depsToInstall),addScripts&&packageManager.addStorybookCommandInScripts({port:6006}),addESLint&&packageManager.addESLintConfig(),addComponents){let templateLocation=hasFrameworkTemplates(framework)?framework:rendererId;await copyTemplateFiles({renderer:templateLocation,packageManager,language,destination:componentsDestinationPath});}}var ANGULAR_JSON_PATH="angular.json",compoDocPreviewPrefix=dedent16`
|
|
61
|
+
`);let packages=["storybook",getExternalFramework(rendererId)?void 0:`@storybook/${rendererId}`,...frameworkPackages4,...addonPackages,...extraPackages].filter(Boolean).filter(packageToInstall=>!installedDependencies.has(getPackageDetails(packageToInstall)[0])),versionedPackages=await packageManager.getVersionedPackages(packages);await fse__default.ensureDir(`./${storybookConfigFolder}`),addMainFile&&await configureMain({framework:{name:frameworkInclude,options:options.framework||{}},storybookConfigFolder,docs:{autodocs:"tag"},addons:pnp?addons.map(wrapForPnp):addons,extensions,language,...staticDir?{staticDirs:[path9.join("..",staticDir)]}:null,...extraMain,...type!=="framework"?{core:{builder:builderInclude}}:{}}),await configurePreview({frameworkPreviewParts,storybookConfigFolder,language,rendererId});let babelDependencies=addBabel&&builder!=="vite"?await getBabelDependencies(packageManager,packageJson):[];!files.some(fname=>fname.startsWith(".babel")||fname.startsWith("babel")||fname==="package.json")&&await generateStorybookBabelConfigInCWD();let depsToInstall=[...versionedPackages,...babelDependencies];if(depsToInstall.length>0&&await packageManager.addDependencies({...npmOptions,packageJson},depsToInstall),addScripts&&await packageManager.addStorybookCommandInScripts({port:6006}),addESLint&&await packageManager.addESLintConfig(),addComponents){let templateLocation=hasFrameworkTemplates(framework)?framework:rendererId;await copyTemplateFiles({renderer:templateLocation,packageManager,language,destination:componentsDestinationPath});}}var ANGULAR_JSON_PATH="angular.json",compoDocPreviewPrefix=dedent16`
|
|
62
62
|
import { setCompodocJson } from "@storybook/addon-docs/angular";
|
|
63
63
|
import docJson from "../documentation.json";
|
|
64
64
|
setCompodocJson(docJson);
|
|
65
|
-
`.trimStart(),promptForCompoDocs=async()=>{let{useCompoDoc}=await prompts({type:"confirm",name:"useCompoDoc",message:"Do you want to use Compodoc for documentation?"});return useCompoDoc},AngularJSON=class{constructor(){if(!fs5.existsSync(ANGULAR_JSON_PATH))throw
|
|
65
|
+
`.trimStart(),promptForCompoDocs=async()=>{let{useCompoDoc}=await prompts({type:"confirm",name:"useCompoDoc",message:"Do you want to use Compodoc for documentation?"});return useCompoDoc},AngularJSON=class{constructor(){if(!fs5.existsSync(ANGULAR_JSON_PATH))throw new Error("An angular.json file was not found in the current working directory. Storybook needs it to work properly, so please rerun the command at the root of your project, where the angular.json file is located. More info: https://storybook.js.org/docs/angular/faq#error-no-angularjson-file-found");let jsonContent=fs5.readFileSync(ANGULAR_JSON_PATH,"utf8");this.json=JSON.parse(jsonContent);}get projects(){return this.json.projects}get projectsWithoutStorybook(){return Object.keys(this.projects).filter(projectName=>{let{architect}=this.projects[projectName];return !architect.storybook})}get hasStorybookBuilder(){return Object.keys(this.projects).some(projectName=>{let{architect}=this.projects[projectName];return Object.keys(architect).some(key=>architect[key].builder==="@storybook/angular:start-storybook")})}get rootProject(){let rootProjectName=Object.keys(this.projects).find(projectName=>{let{root}=this.projects[projectName];return root===""||root==="."});return rootProjectName?this.projects[rootProjectName]:null}getProjectSettingsByName(projectName){return this.projects[projectName]}async getProjectName(){if(this.projectsWithoutStorybook.length>1){let{projectName}=await prompts({type:"select",name:"projectName",message:"For which project do you want to generate Storybook configuration?",choices:this.projectsWithoutStorybook.map(name=>({title:name,value:name}))});return projectName}return this.projectsWithoutStorybook[0]}addStorybookEntries({angularProjectName,storybookFolder,useCompodoc,root}){let{architect}=this.projects[angularProjectName],baseOptions={configDir:storybookFolder,browserTarget:`${angularProjectName}:build`,compodoc:useCompodoc,...useCompodoc&&{compodocArgs:["-e","json","-d",root||"."]}};architect.storybook||(architect.storybook={builder:"@storybook/angular:start-storybook",options:{...baseOptions,port:6006}}),architect["build-storybook"]||(architect["build-storybook"]={builder:"@storybook/angular:build-storybook",options:{...baseOptions,outputDir:Object.keys(this.projects).length===1?"storybook-static":`dist/storybook/${angularProjectName}`}});}write(){fs5.writeFileSync(ANGULAR_JSON_PATH,JSON.stringify(this.json,null,2));}};var generator=async(packageManager,npmOptions,options,commandOptions)=>{let angularVersionFromDependencies=semver.coerce((await packageManager.retrievePackageJson()).dependencies["@angular/core"])?.version,angularVersionFromDevDependencies=semver.coerce((await packageManager.retrievePackageJson()).devDependencies["@angular/core"])?.version,angularVersion=angularVersionFromDependencies||angularVersionFromDevDependencies,updatedOptions=semver.gte(angularVersion,"12.0.0")?{...options,builder:"webpack5"}:options,angularJSON=new AngularJSON;if(angularJSON.projectsWithoutStorybook.length===0)return paddedLog("Every project in your workspace is already set up with Storybook. There is nothing to do!"),Promise.reject();let angularProjectName=await angularJSON.getProjectName();paddedLog(`Adding Storybook support to your "${angularProjectName}" project`);let{root,projectType}=angularJSON.getProjectSettingsByName(angularProjectName),{projects}=angularJSON,useCompodoc=commandOptions.yes?!0:await promptForCompoDocs(),storybookFolder=root?`${root}/.storybook`:".storybook";angularJSON.addStorybookEntries({angularProjectName,storybookFolder,useCompodoc,root}),angularJSON.write(),await baseGenerator(packageManager,npmOptions,{...updatedOptions,...useCompodoc&&{frameworkPreviewParts:{prefix:compoDocPreviewPrefix}}},"angular",{...useCompodoc&&{extraPackages:["@compodoc/compodoc"]},addScripts:!1,componentsDestinationPath:root?`${root}/src/stories`:void 0,storybookConfigFolder:storybookFolder},"angular"),Object.keys(projects).length===1&&packageManager.addScripts({storybook:`ng run ${angularProjectName}:storybook`,"build-storybook":`ng run ${angularProjectName}:build-storybook`});let projectTypeValue=projectType||"application";projectTypeValue!=="application"&&projectTypeValue!=="library"&&(projectTypeValue="application");let templateDir=join(getCliDir(),"templates","angular",projectTypeValue);return templateDir&©Template(templateDir,root||void 0),{projectName:angularProjectName,configDir:storybookFolder}},ANGULAR_default=generator;function addStorybookExcludeGlobToTsConfig(){let tsConfigJson=readFileAsJson("tsconfig.json",!0),glob2="**/*.stories.ts";if(!tsConfigJson)return;let{exclude=[]}=tsConfigJson;exclude.includes(glob2)||(tsConfigJson.exclude=[...exclude,glob2],writeFileAsJson("tsconfig.json",tsConfigJson));}var generator2=async(packageManager,npmOptions,options)=>{addStorybookExcludeGlobToTsConfig(),await baseGenerator(packageManager,npmOptions,options,"aurelia",{extraPackages:["aurelia"]});let templateDir=join(getCliDir(),"templates","aurelia");templateDir&©Template(templateDir);},AURELIA_default=generator2;var generator3=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"ember",{extraPackages:["babel-plugin-ember-modules-api-polyfill","babel-plugin-htmlbars-inline-precompile"],staticDir:"dist"});},EMBER_default=generator3;var generator4=async(packageManager,npmOptions,options)=>{let extraPackages=detectLanguage()==="javascript"?["prop-types"]:[];await baseGenerator(packageManager,npmOptions,options,"react",{extraPackages});},REACT_default=generator4;var generator5=async(packageManager,npmOptions)=>{let packageJson=await packageManager.retrievePackageJson(),missingReactDom=!packageJson.dependencies["react-dom"]&&!packageJson.devDependencies["react-dom"],reactVersion=packageJson.dependencies.react,packagesToResolve=["react-native-safe-area-context","@react-native-async-storage/async-storage","@react-native-community/datetimepicker","@react-native-community/slider","@storybook/addon-ondevice-controls","@storybook/addon-ondevice-actions","@storybook/react-native"],packagesWithFixedVersion=["@storybook/addon-actions@^6.5.16","@storybook/addon-controls@^6.5.16"],resolvedPackages=await packageManager.getVersionedPackages(packagesToResolve),packages=[...await getBabelDependencies(packageManager,packageJson),...packagesWithFixedVersion,...resolvedPackages,missingReactDom&&reactVersion&&`react-dom@${reactVersion}`].filter(Boolean);await packageManager.addDependencies({...npmOptions,packageJson},packages),packageManager.addScripts({"storybook-generate":"sb-rn-get-stories","storybook-watch":"sb-rn-watcher"});let storybookConfigFolder=".storybook";await copyTemplateFiles({packageManager,renderer:"react-native",language:"javascript",destination:storybookConfigFolder,includeCommonAssets:!1});},REACT_NATIVE_default=generator5;var generator6=async(packageManager,npmOptions,options)=>{let monorepoRootPath=path9.join(__dirname,"..","..","..","..","..",".."),extraMain=options.linkable?{webpackFinal:`%%(config) => {
|
|
66
66
|
// add monorepo root as a valid directory to import modules from
|
|
67
67
|
config.resolve.plugins.forEach((p) => {
|
|
68
68
|
if (Array.isArray(p.appSrcs)) {
|
|
@@ -71,11 +71,11 @@ var detectWebpack=packageManager=>{try{let out="";if(packageManager.type==="npm"
|
|
|
71
71
|
});
|
|
72
72
|
return config;
|
|
73
73
|
}
|
|
74
|
-
%%`}:{},craVersion=semver.coerce(
|
|
74
|
+
%%`}:{},packageJson=await packageManager.retrievePackageJson(),craVersion=semver.coerce(packageJson.dependencies["react-scripts"])?.version,isCra5OrHigher=craVersion&&semver.gte(craVersion,"5.0.0"),updatedOptions=isCra5OrHigher?{...options,builder:"webpack5"}:options,extraPackages=[];isCra5OrHigher&&(extraPackages.push("webpack"),extraPackages.push("babel-plugin-named-exports-order"),extraPackages.push("prop-types"));let extraAddons=[`@storybook/preset-create-react-app@${versions_default["@storybook/preset-create-react-app"]}`];if(!isCra5OrHigher)throw new Error(dedent16`
|
|
75
75
|
Storybook 7.0+ doesn't support react-scripts@<5.0.0.
|
|
76
76
|
|
|
77
77
|
https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#create-react-app-dropped-cra4-support
|
|
78
|
-
`);await baseGenerator(packageManager,npmOptions,updatedOptions,"react",{extraAddons,extraPackages,staticDir:fs5.existsSync(path9.resolve("./public"))?"public":void 0,addBabel:!1,addESLint:!0,extraMain});},REACT_SCRIPTS_default=generator6;var generator7=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"react",void 0,"nextjs");},NEXTJS_default=generator7;var generator8=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"vue");},SFC_VUE_default=generator8;var generator9=async(packageManager,npmOptions,options)=>{let extraPackages=options.builder==="webpack5"?["vue-loader@^15.7.0"]:[];await baseGenerator(packageManager,npmOptions,options,"vue",{extraPackages});},VUE_default=generator9;var generator10=async(packageManager,npmOptions,options)=>{let extraPackages=options.builder==="webpack5"?["vue-loader@^17.0.0","@vue/compiler-sfc@^3.2.0"]:[];await baseGenerator(packageManager,npmOptions,options,"vue3",{extraPackages});},VUE3_default=generator10;var generator11=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"react");},WEBPACK_REACT_default=generator11;var generator12=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"mithril");},MITHRIL_default=generator12;var generator13=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"marionette");},MARIONETTE_default=generator13;var generator14=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"marko");},MARKO_default=generator14;var generator15=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"html");},HTML_default=generator15;var generator16=async(packageManager,npmOptions,options)=>baseGenerator(packageManager,npmOptions,options,"web-components",{extraPackages:["lit"]}),WEB_COMPONENTS_default=generator16;var generator17=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"riot",{extraPackages:["riot-tag-loader"]});},RIOT_default=generator17;var generator18=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"preact");},PREACT_default=generator18;var generator19=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"svelte",{extensions:["js","jsx","ts","tsx","svelte"]});},SVELTE_default=generator19;var generator20=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"qwik",{},"qwik");},QWIK_default=generator20;var generator21=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"svelte",void 0,"sveltekit");},SVELTEKIT_default=generator21;var generator22=async(packageManager,npmOptions,options)=>{let[latestRaxVersion]=await packageManager.getVersions("rax"),packageJson=packageManager.retrievePackageJson(),raxVersion=packageJson.dependencies.rax||latestRaxVersion;packageJson.dependencies.rax=packageJson.dependencies.rax||raxVersion,packageJson.dependencies["rax-image"]=packageJson.dependencies["rax-image"]||raxVersion,packageJson.dependencies["rax-link"]=packageJson.dependencies["rax-link"]||raxVersion,packageJson.dependencies["rax-text"]=packageJson.dependencies["rax-text"]||raxVersion,packageJson.dependencies["rax-view"]=packageJson.dependencies["rax-view"]||raxVersion,packageManager.writePackageJson(packageJson),await baseGenerator(packageManager,npmOptions,options,"rax",{extraPackages:["rax"]});},RAX_default=generator22;var generator23=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"solid",{},"solid");},SOLID_default=generator23;var generator24=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"server",{extensions:["json"]});
|
|
78
|
+
`);await baseGenerator(packageManager,npmOptions,updatedOptions,"react",{extraAddons,extraPackages,staticDir:fs5.existsSync(path9.resolve("./public"))?"public":void 0,addBabel:!1,addESLint:!0,extraMain});},REACT_SCRIPTS_default=generator6;var generator7=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"react",void 0,"nextjs");},NEXTJS_default=generator7;var generator8=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"vue");},SFC_VUE_default=generator8;var generator9=async(packageManager,npmOptions,options)=>{let extraPackages=options.builder==="webpack5"?["vue-loader@^15.7.0"]:[];await baseGenerator(packageManager,npmOptions,options,"vue",{extraPackages});},VUE_default=generator9;var generator10=async(packageManager,npmOptions,options)=>{let extraPackages=options.builder==="webpack5"?["vue-loader@^17.0.0","@vue/compiler-sfc@^3.2.0"]:[];await baseGenerator(packageManager,npmOptions,options,"vue3",{extraPackages});},VUE3_default=generator10;var generator11=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"react");},WEBPACK_REACT_default=generator11;var generator12=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"mithril");},MITHRIL_default=generator12;var generator13=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"marionette");},MARIONETTE_default=generator13;var generator14=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"marko");},MARKO_default=generator14;var generator15=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"html");},HTML_default=generator15;var generator16=async(packageManager,npmOptions,options)=>baseGenerator(packageManager,npmOptions,options,"web-components",{extraPackages:["lit"]}),WEB_COMPONENTS_default=generator16;var generator17=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"riot",{extraPackages:["riot-tag-loader"]});},RIOT_default=generator17;var generator18=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"preact");},PREACT_default=generator18;var generator19=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"svelte",{extensions:["js","jsx","ts","tsx","svelte"]});},SVELTE_default=generator19;var generator20=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"qwik",{},"qwik");},QWIK_default=generator20;var generator21=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"svelte",void 0,"sveltekit");},SVELTEKIT_default=generator21;var generator22=async(packageManager,npmOptions,options)=>{let[latestRaxVersion]=await packageManager.getVersions("rax"),packageJson=await packageManager.retrievePackageJson(),raxVersion=packageJson.dependencies.rax||latestRaxVersion;packageJson.dependencies.rax=packageJson.dependencies.rax||raxVersion,packageJson.dependencies["rax-image"]=packageJson.dependencies["rax-image"]||raxVersion,packageJson.dependencies["rax-link"]=packageJson.dependencies["rax-link"]||raxVersion,packageJson.dependencies["rax-text"]=packageJson.dependencies["rax-text"]||raxVersion,packageJson.dependencies["rax-view"]=packageJson.dependencies["rax-view"]||raxVersion,await packageManager.writePackageJson(packageJson),await baseGenerator(packageManager,npmOptions,options,"rax",{extraPackages:["rax"]});},RAX_default=generator22;var generator23=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"solid",{},"solid");},SOLID_default=generator23;var generator24=async(packageManager,npmOptions,options)=>{await baseGenerator(packageManager,npmOptions,options,"server",{extensions:["json"]});},SERVER_default=generator24;var logger4=console,getStorybookData=async({packageManager,configDir:userDefinedConfigDir})=>{let packageJson=await packageManager.retrievePackageJson(),{mainConfig:mainConfigPath,version:storybookVersionSpecifier,configDir:configDirFromScript,previewConfig:previewConfigPath}=getStorybookInfo(packageJson,userDefinedConfigDir),storybookVersion=storybookVersionSpecifier&&semver.coerce(storybookVersionSpecifier)?.version,configDir=userDefinedConfigDir||configDirFromScript||".storybook",mainConfig;try{mainConfig=await loadMainConfig({configDir,noCache:!0});}catch(err){throw new Error(dedent16`Unable to find or evaluate ${chalk12.blue(mainConfigPath)}: ${err.message}`)}return {configDir,mainConfig,storybookVersionSpecifier,storybookVersion,mainConfigPath,previewConfigPath}},updateMainConfig=async({mainConfigPath,dryRun},callback)=>{try{let main=await readConfig(mainConfigPath);await callback(main),dryRun||await writeConfig(main);}catch(e){logger4.info(`\u274C The migration failed to update your ${chalk12.blue(mainConfigPath)} on your behalf because of the following error:
|
|
79
79
|
${e}
|
|
80
80
|
`),logger4.info(`\u26A0\uFE0F Storybook automigrations are based on AST parsing and it's possible that your ${chalk12.blue(mainConfigPath)} file contains a non-standard format (e.g. your export is not an object) or that there was an error when parsing dynamic values (e.g. "require" calls, or usage of environment variables). When your main config is non-standard, automigrations are unfortunately not possible. Please follow the instructions given previously and follow the documentation to make the updates manually.`);}},getAddonNames=mainConfig=>(mainConfig.addons||[]).map(addon=>{let name="";if(typeof addon=="string"?name=addon:typeof addon=="object"&&(name=addon.name),!name.startsWith("."))return name.replace(/\/dist\/.*/,"").replace(/\.[mc]?[tj]?s[x]?$/,"").replace(/\/register$/,"").replace(/\/manager$/,"").replace(/\/preset$/,"")}).filter(Boolean);var logger5=console,checkWebpack5Builder=async({configDir,packageManager})=>{let{mainConfig,storybookVersion}=await getStorybookData({configDir,packageManager});if(semver.lt(storybookVersion,"6.3.0"))return logger5.warn(dedent16`
|
|
81
81
|
Detected SB 6.3 or below, please upgrade storybook to use webpack5.
|
|
@@ -85,28 +85,28 @@ var detectWebpack=packageManager=>{try{let out="";if(packageManager.type==="npm"
|
|
|
85
85
|
${chalk12.cyan("npx storybook upgrade")}
|
|
86
86
|
|
|
87
87
|
Add the ${chalk12.cyan("--prerelease")} flag to get the latest prerelease.
|
|
88
|
-
`.trim()),null;if(semver.gte(storybookVersion,"7.0.0"))return null;if(!mainConfig)return logger5.warn("Unable to find storybook main.js config"),null;let builder=mainConfig.core?.builder;return builder&&builder!=="webpack4"?(logger5.info(`Found builder ${builder}, skipping`),null):{storybookVersion}};var logger6=console,webpack5={id:"webpack5",async check({configDir,packageManager}){let webpackVersion=packageManager.retrievePackageJson().dependencies.webpack,webpackCoerced=semver.coerce(webpackVersion)?.version;if(!webpackCoerced||semver.lt(webpackCoerced,"5.0.0")||semver.gte(webpackCoerced,"6.0.0"))return null;let builderInfo=await checkWebpack5Builder({configDir,packageManager});return builderInfo?{webpackVersion,...builderInfo}:null},prompt({webpackVersion}){let webpackFormatted=chalk12.cyan(`webpack ${webpackVersion}`);return dedent`
|
|
88
|
+
`.trim()),null;if(semver.gte(storybookVersion,"7.0.0"))return null;if(!mainConfig)return logger5.warn("Unable to find storybook main.js config"),null;let builder=mainConfig.core?.builder;return builder&&builder!=="webpack4"?(logger5.info(`Found builder ${builder}, skipping`),null):{storybookVersion}};var logger6=console,webpack5={id:"webpack5",async check({configDir,packageManager}){let webpackVersion=(await packageManager.retrievePackageJson()).dependencies.webpack,webpackCoerced=semver.coerce(webpackVersion)?.version;if(!webpackCoerced||semver.lt(webpackCoerced,"5.0.0")||semver.gte(webpackCoerced,"6.0.0"))return null;let builderInfo=await checkWebpack5Builder({configDir,packageManager});return builderInfo?{webpackVersion,...builderInfo}:null},prompt({webpackVersion}){let webpackFormatted=chalk12.cyan(`webpack ${webpackVersion}`);return dedent`
|
|
89
89
|
We've detected you're running ${webpackFormatted}.
|
|
90
90
|
Your Storybook's main.js files specifies webpack4, which is incompatible.
|
|
91
91
|
|
|
92
92
|
To run Storybook in webpack5-mode, we can install Storybook's ${chalk12.cyan("@storybook/builder-webpack5")} for you.
|
|
93
93
|
|
|
94
94
|
More info: ${chalk12.yellow("https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#webpack-5-manager-build")}
|
|
95
|
-
`},async run({result:{storybookVersion,webpackVersion},packageManager,dryRun,mainConfigPath}){let deps=[`@storybook/builder-webpack5@${storybookVersion}`];webpackVersion||deps.push("webpack@5"),logger6.info(`\u2705 Adding dependencies: ${deps}`),dryRun||packageManager.addDependencies({installAsDevDependencies:!0},deps),logger6.info("\u2705 Setting `core.builder` to `@storybook/builder-webpack5` in main.js"),dryRun||await updateMainConfig({mainConfigPath,dryRun},async main=>{main.setFieldValue(["core","builder"],"@storybook/builder-webpack5");});}};var cra5={id:"cra5",async check({packageManager,configDir}){let craVersion=packageManager.getAllDependencies()["react-scripts"],craCoerced=semver.coerce(craVersion)?.version;if(!craCoerced||semver.lt(craCoerced,"5.0.0"))return null;let builderInfo=await checkWebpack5Builder({configDir,packageManager});return builderInfo?{craVersion,...builderInfo}:null},prompt({craVersion}){let craFormatted=chalk12.cyan(`Create React App (CRA) ${craVersion}`);return dedent`
|
|
95
|
+
`},async run({result:{storybookVersion,webpackVersion},packageManager,dryRun,mainConfigPath}){let deps=[`@storybook/builder-webpack5@${storybookVersion}`];webpackVersion||deps.push("webpack@5"),logger6.info(`\u2705 Adding dependencies: ${deps}`),dryRun||await packageManager.addDependencies({installAsDevDependencies:!0},deps),logger6.info("\u2705 Setting `core.builder` to `@storybook/builder-webpack5` in main.js"),dryRun||await updateMainConfig({mainConfigPath,dryRun},async main=>{main.setFieldValue(["core","builder"],"@storybook/builder-webpack5");});}};var cra5={id:"cra5",async check({packageManager,configDir}){let craVersion=(await packageManager.getAllDependencies())["react-scripts"],craCoerced=semver.coerce(craVersion)?.version;if(!craCoerced||semver.lt(craCoerced,"5.0.0"))return null;let builderInfo=await checkWebpack5Builder({configDir,packageManager});return builderInfo?{craVersion,...builderInfo}:null},prompt({craVersion}){let craFormatted=chalk12.cyan(`Create React App (CRA) ${craVersion}`);return dedent`
|
|
96
96
|
We've detected you are running ${craFormatted} which is powered by webpack5.
|
|
97
97
|
Your Storybook's main.js files specifies webpack4, which is incompatible.
|
|
98
98
|
|
|
99
99
|
In order to work with your version of CRA, we need to install Storybook's ${chalk12.cyan("@storybook/builder-webpack5")}.
|
|
100
100
|
|
|
101
101
|
More info: ${chalk12.yellow("https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#cra5-upgrade")}
|
|
102
|
-
`},async run(options){return webpack5.run({...options,result:{webpackVersion:null,...options.result}})}};var angular12={id:"angular12",async check({packageManager,configDir}){let angularVersion=packageManager.getAllDependencies()["@angular/core"],angularCoerced=semver.coerce(angularVersion)?.version;if(!angularCoerced||semver.lt(angularCoerced,"12.0.0"))return null;let builderInfo=await checkWebpack5Builder({packageManager,configDir});return builderInfo?{angularVersion,...builderInfo}:null},prompt({angularVersion}){let angularFormatted=chalk12.cyan(`Angular ${angularVersion}`);return dedent`
|
|
102
|
+
`},async run(options){return webpack5.run({...options,result:{webpackVersion:null,...options.result}})}};var angular12={id:"angular12",async check({packageManager,configDir}){let angularVersion=(await packageManager.getAllDependencies())["@angular/core"],angularCoerced=semver.coerce(angularVersion)?.version;if(!angularCoerced||semver.lt(angularCoerced,"12.0.0"))return null;let builderInfo=await checkWebpack5Builder({packageManager,configDir});return builderInfo?{angularVersion,...builderInfo}:null},prompt({angularVersion}){let angularFormatted=chalk12.cyan(`Angular ${angularVersion}`);return dedent`
|
|
103
103
|
We've detected you are running ${angularFormatted} which is powered by webpack5.
|
|
104
104
|
Your Storybook's main.js files specifies webpack4, which is incompatible.
|
|
105
105
|
|
|
106
106
|
In order to work with your version of Angular, we need to install Storybook's ${chalk12.cyan("@storybook/builder-webpack5")}.
|
|
107
107
|
|
|
108
108
|
More info: ${chalk12.yellow("https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#angular12-upgrade")}
|
|
109
|
-
`},async run(options){return webpack5.run({...options,result:{webpackVersion:null,...options.result}})}};var vue3={id:"vue3",async check({configDir,packageManager}){let vueVersion=packageManager.getAllDependencies().vue,vueCoerced=semver.coerce(vueVersion)?.version;if(!vueCoerced||semver.lt(vueCoerced,"3.0.0"))return null;let builderInfo=await checkWebpack5Builder({configDir,packageManager});return builderInfo?{vueVersion,...builderInfo}:null},prompt({vueVersion,storybookVersion}){let vueFormatted=chalk12.cyan(`Vue ${vueVersion}`),sbFormatted=chalk12.cyan(`Storybook ${storybookVersion}`);return dedent`
|
|
109
|
+
`},async run(options){return webpack5.run({...options,result:{webpackVersion:null,...options.result}})}};var vue3={id:"vue3",async check({configDir,packageManager}){let vueVersion=(await packageManager.getAllDependencies()).vue,vueCoerced=semver.coerce(vueVersion)?.version;if(!vueCoerced||semver.lt(vueCoerced,"3.0.0"))return null;let builderInfo=await checkWebpack5Builder({configDir,packageManager});return builderInfo?{vueVersion,...builderInfo}:null},prompt({vueVersion,storybookVersion}){let vueFormatted=chalk12.cyan(`Vue ${vueVersion}`),sbFormatted=chalk12.cyan(`Storybook ${storybookVersion}`);return dedent`
|
|
110
110
|
We've detected you are running ${vueFormatted} with Storybook.
|
|
111
111
|
${sbFormatted} runs webpack4 by default, which is incompatible.
|
|
112
112
|
|
|
@@ -122,20 +122,20 @@ var detectWebpack=packageManager=>{try{let out="";if(packageManager.type==="npm"
|
|
|
122
122
|
|
|
123
123
|
We recommend you follow the guide on the link above, however we can add a temporary storybook addon that helps make this migration easier.
|
|
124
124
|
We'll install the addon and add it to your storybook config.
|
|
125
|
-
`},async run({packageManager,dryRun,mainConfigPath,skipInstall}){if(!dryRun){let packageJson=packageManager.retrievePackageJson(),versionToInstall=getStorybookVersionSpecifier(packageManager.retrievePackageJson());await packageManager.addDependencies({installAsDevDependencies:!0,skipInstall,packageJson},[`@storybook/addon-mdx-gfm@${versionToInstall}`]),await updateMainConfig({mainConfigPath,dryRun},async main=>{logger7.info('\u2705 Adding "@storybook/addon-mdx-gfm" addon'),dryRun||main.appendValueToArray(["addons"],"@storybook/addon-mdx-gfm");});}}};var SUPPORTED_ESLINT_EXTENSIONS=["js","cjs","json"],UNSUPPORTED_ESLINT_EXTENSIONS=["yaml","yml"],findEslintFile=()=>{let filePrefix=".eslintrc",unsupportedExtension=UNSUPPORTED_ESLINT_EXTENSIONS.find(ext=>fse__default.existsSync(`${filePrefix}.${ext}`));if(unsupportedExtension)throw new Error(unsupportedExtension);let extension=SUPPORTED_ESLINT_EXTENSIONS.find(ext=>fse__default.existsSync(`${filePrefix}.${ext}`));return extension?`${filePrefix}.${extension}`:null};var logger8=console,eslintPlugin={id:"eslintPlugin",async check({packageManager}){let allDependencies=packageManager.getAllDependencies(),eslintPluginStorybook=allDependencies["eslint-plugin-storybook"],eslintDependency=allDependencies.eslint;if(eslintPluginStorybook||!eslintDependency)return null;let eslintFile,unsupportedExtension;try{eslintFile=findEslintFile();}catch(err){unsupportedExtension=err.message;}return !eslintFile&&!unsupportedExtension?(logger8.warn("Unable to find .eslintrc config file, skipping"),null):{eslintFile,unsupportedExtension}},prompt(){return dedent`
|
|
125
|
+
`},async run({packageManager,dryRun,mainConfigPath,skipInstall}){if(!dryRun){let packageJson=await packageManager.retrievePackageJson(),versionToInstall=getStorybookVersionSpecifier(await packageManager.retrievePackageJson());await packageManager.addDependencies({installAsDevDependencies:!0,skipInstall,packageJson},[`@storybook/addon-mdx-gfm@${versionToInstall}`]),await updateMainConfig({mainConfigPath,dryRun},async main=>{logger7.info('\u2705 Adding "@storybook/addon-mdx-gfm" addon'),dryRun||main.appendValueToArray(["addons"],"@storybook/addon-mdx-gfm");});}}};var SUPPORTED_ESLINT_EXTENSIONS=["js","cjs","json"],UNSUPPORTED_ESLINT_EXTENSIONS=["yaml","yml"],findEslintFile=()=>{let filePrefix=".eslintrc",unsupportedExtension=UNSUPPORTED_ESLINT_EXTENSIONS.find(ext=>fse__default.existsSync(`${filePrefix}.${ext}`));if(unsupportedExtension)throw new Error(unsupportedExtension);let extension=SUPPORTED_ESLINT_EXTENSIONS.find(ext=>fse__default.existsSync(`${filePrefix}.${ext}`));return extension?`${filePrefix}.${extension}`:null};var logger8=console,eslintPlugin={id:"eslintPlugin",async check({packageManager}){let allDependencies=await packageManager.getAllDependencies(),eslintPluginStorybook=allDependencies["eslint-plugin-storybook"],eslintDependency=allDependencies.eslint;if(eslintPluginStorybook||!eslintDependency)return null;let eslintFile,unsupportedExtension;try{eslintFile=findEslintFile();}catch(err){unsupportedExtension=err.message;}return !eslintFile&&!unsupportedExtension?(logger8.warn("Unable to find .eslintrc config file, skipping"),null):{eslintFile,unsupportedExtension}},prompt(){return dedent`
|
|
126
126
|
We've detected you are not using our eslint-plugin.
|
|
127
127
|
|
|
128
128
|
In order to have the best experience with Storybook and follow best practices, we advise you to install eslint-plugin-storybook.
|
|
129
129
|
|
|
130
130
|
More info: ${chalk12.yellow("https://github.com/storybookjs/eslint-plugin-storybook#readme")}
|
|
131
|
-
`},async run({result:{eslintFile,unsupportedExtension},packageManager,dryRun,skipInstall}){let deps=["eslint-plugin-storybook"];if(logger8.info(`\u2705 Adding dependencies: ${deps}`),dryRun||packageManager.addDependencies({installAsDevDependencies:!0,skipInstall},deps),!dryRun&&unsupportedExtension){logger8.info(dedent`
|
|
131
|
+
`},async run({result:{eslintFile,unsupportedExtension},packageManager,dryRun,skipInstall}){let deps=["eslint-plugin-storybook"];if(logger8.info(`\u2705 Adding dependencies: ${deps}`),dryRun||await packageManager.addDependencies({installAsDevDependencies:!0,skipInstall},deps),!dryRun&&unsupportedExtension){logger8.info(dedent`
|
|
132
132
|
⚠️ The plugin was successfully installed but failed to configure.
|
|
133
133
|
|
|
134
134
|
Found an eslint config file with an unsupported automigration format: .eslintrc.${unsupportedExtension}.
|
|
135
135
|
The supported formats for this automigration are: ${SUPPORTED_ESLINT_EXTENSIONS.join(", ")}.
|
|
136
136
|
|
|
137
137
|
Please refer to https://github.com/storybookjs/eslint-plugin-storybook#usage to finish setting up the plugin manually.
|
|
138
|
-
`);return}if(logger8.info(`\u2705 Adding Storybook plugin to ${eslintFile}`),!dryRun)if(eslintFile.endsWith("json")){let eslintConfig=await readJson(eslintFile),existingConfigValue=Array.isArray(eslintConfig.extends)?eslintConfig.extends:[eslintConfig.extends];eslintConfig.extends=[...existingConfigValue||[],"plugin:storybook/recommended"];let eslintFileContents=await readFile(eslintFile,"utf8"),spaces=detectIndent(eslintFileContents).amount||2;await writeJson(eslintFile,eslintConfig,{spaces});}else {let eslint=await readConfig(eslintFile),extendsConfig=eslint.getFieldValue(["extends"])||[],existingConfigValue=Array.isArray(extendsConfig)?extendsConfig:[extendsConfig];eslint.setFieldValue(["extends"],[...existingConfigValue,"plugin:storybook/recommended"]),await writeConfig(eslint);}}};var logger9=console,builderVite={id:"builder-vite",async check({configDir,packageManager}){let packageJson=packageManager.retrievePackageJson(),{mainConfig}=await getStorybookData({configDir,packageManager}),builder=mainConfig.core?.builder;return (typeof builder=="string"?builder:builder?.name)!=="storybook-builder-vite"?null:{builder,packageJson}},prompt({builder}){let builderFormatted=chalk12.cyan(JSON.stringify(builder,null,2));return dedent`
|
|
138
|
+
`);return}if(logger8.info(`\u2705 Adding Storybook plugin to ${eslintFile}`),!dryRun)if(eslintFile.endsWith("json")){let eslintConfig=await readJson(eslintFile),existingConfigValue=Array.isArray(eslintConfig.extends)?eslintConfig.extends:[eslintConfig.extends];eslintConfig.extends=[...existingConfigValue||[],"plugin:storybook/recommended"];let eslintFileContents=await readFile(eslintFile,"utf8"),spaces=detectIndent(eslintFileContents).amount||2;await writeJson(eslintFile,eslintConfig,{spaces});}else {let eslint=await readConfig(eslintFile),extendsConfig=eslint.getFieldValue(["extends"])||[],existingConfigValue=Array.isArray(extendsConfig)?extendsConfig:[extendsConfig];eslint.setFieldValue(["extends"],[...existingConfigValue,"plugin:storybook/recommended"]),await writeConfig(eslint);}}};var logger9=console,builderVite={id:"builder-vite",async check({configDir,packageManager}){let packageJson=await packageManager.retrievePackageJson(),{mainConfig}=await getStorybookData({configDir,packageManager}),builder=mainConfig.core?.builder;return (typeof builder=="string"?builder:builder?.name)!=="storybook-builder-vite"?null:{builder,packageJson}},prompt({builder}){let builderFormatted=chalk12.cyan(JSON.stringify(builder,null,2));return dedent`
|
|
139
139
|
We've detected you're using the community vite builder: ${builderFormatted}
|
|
140
140
|
|
|
141
141
|
'storybook-builder-vite' is deprecated and now located at ${chalk12.cyan("@storybook/builder-vite")}.
|
|
@@ -143,7 +143,7 @@ var detectWebpack=packageManager=>{try{let out="";if(packageManager.type==="npm"
|
|
|
143
143
|
We can upgrade your project to use the new builder automatically.
|
|
144
144
|
|
|
145
145
|
More info: ${chalk12.yellow("https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#vite-builder-renamed")}
|
|
146
|
-
`},async run({result:{builder,packageJson},packageManager,dryRun,mainConfigPath}){let{dependencies={},devDependencies={}}=packageJson;logger9.info("\u2705 Removing existing 'storybook-builder-vite' dependency"),dryRun||(delete dependencies["storybook-builder-vite"],delete devDependencies["storybook-builder-vite"],packageManager.writePackageJson(packageJson)),logger9.info("\u2705 Adding '@storybook/builder-vite' as dev dependency"),dryRun||packageManager.addDependencies({installAsDevDependencies:!0},["@storybook/builder-vite"]),logger9.info("\u2705 Updating main.js to use vite builder"),dryRun||await updateMainConfig({dryRun,mainConfigPath},async main=>{let updatedBuilder=typeof builder=="string"?"@storybook/builder-vite":{name:"@storybook/builder-vite",options:builder.options};main.setFieldValue(["core","builder"],updatedBuilder),await writeConfig(main);});}};var logger10=console,getStorybookScripts=allScripts=>Object.keys(allScripts).reduce((acc,key)=>{let isStorybookScript=!1,allWordsFromScript=allScripts[key].split(" "),newScript=allWordsFromScript.map((currentWord,index)=>{let previousWord=allWordsFromScript[index-1],isSbBinary=currentWord==="build-storybook"||currentWord==="start-storybook"||currentWord==="sb",isPrependedByPkgManager=previousWord&&["npx","run","yarn","pnpx","pnpm dlx"].some(cmd=>previousWord.includes(cmd));return isSbBinary&&!isPrependedByPkgManager?(isStorybookScript=!0,currentWord.replace("sb","storybook").replace("start-storybook","storybook dev").replace("build-storybook","storybook build")):currentWord}).join(" ");return isStorybookScript&&(acc[key]={before:allScripts[key],after:newScript}),acc},{}),sbScripts={id:"sb-scripts",async check({packageManager,configDir}){let packageJson=packageManager.retrievePackageJson(),{scripts={}}=packageJson,{storybookVersion}=await getStorybookData({packageManager,configDir});if(semver.lt(storybookVersion,"7.0.0"))return null;let storybookScripts=getStorybookScripts(scripts);return Object.keys(storybookScripts).length===0?null:{packageJson,storybookScripts,storybookVersion}},prompt({storybookVersion,storybookScripts}){let sbFormatted=chalk12.cyan(`Storybook ${storybookVersion}`),newScriptsMessage=Object.keys(storybookScripts).reduce((acc,scriptKey)=>(acc.push([chalk12.bold(scriptKey),"from:",chalk12.cyan(storybookScripts[scriptKey].before),"to:",chalk12.cyan(storybookScripts[scriptKey].after)].join(`
|
|
146
|
+
`},async run({result:{builder,packageJson},packageManager,dryRun,mainConfigPath}){let{dependencies={},devDependencies={}}=packageJson;logger9.info("\u2705 Removing existing 'storybook-builder-vite' dependency"),dryRun||(delete dependencies["storybook-builder-vite"],delete devDependencies["storybook-builder-vite"],await packageManager.writePackageJson(packageJson)),logger9.info("\u2705 Adding '@storybook/builder-vite' as dev dependency"),dryRun||await packageManager.addDependencies({installAsDevDependencies:!0},["@storybook/builder-vite"]),logger9.info("\u2705 Updating main.js to use vite builder"),dryRun||await updateMainConfig({dryRun,mainConfigPath},async main=>{let updatedBuilder=typeof builder=="string"?"@storybook/builder-vite":{name:"@storybook/builder-vite",options:builder.options};main.setFieldValue(["core","builder"],updatedBuilder),await writeConfig(main);});}};var logger10=console,getStorybookScripts=allScripts=>Object.keys(allScripts).reduce((acc,key)=>{let isStorybookScript=!1,allWordsFromScript=allScripts[key].split(" "),newScript=allWordsFromScript.map((currentWord,index)=>{let previousWord=allWordsFromScript[index-1],isSbBinary=currentWord==="build-storybook"||currentWord==="start-storybook"||currentWord==="sb",isPrependedByPkgManager=previousWord&&["npx","run","yarn","pnpx","pnpm dlx"].some(cmd=>previousWord.includes(cmd));return isSbBinary&&!isPrependedByPkgManager?(isStorybookScript=!0,currentWord.replace("sb","storybook").replace("start-storybook","storybook dev").replace("build-storybook","storybook build")):currentWord}).join(" ");return isStorybookScript&&(acc[key]={before:allScripts[key],after:newScript}),acc},{}),sbScripts={id:"sb-scripts",async check({packageManager,configDir}){let packageJson=await packageManager.retrievePackageJson(),{scripts={}}=packageJson,{storybookVersion}=await getStorybookData({packageManager,configDir});if(semver.lt(storybookVersion,"7.0.0"))return null;let storybookScripts=getStorybookScripts(scripts);return Object.keys(storybookScripts).length===0?null:{packageJson,storybookScripts,storybookVersion}},prompt({storybookVersion,storybookScripts}){let sbFormatted=chalk12.cyan(`Storybook ${storybookVersion}`),newScriptsMessage=Object.keys(storybookScripts).reduce((acc,scriptKey)=>(acc.push([chalk12.bold(scriptKey),"from:",chalk12.cyan(storybookScripts[scriptKey].before),"to:",chalk12.cyan(storybookScripts[scriptKey].after)].join(`
|
|
147
147
|
`)),acc),[]);return dedent`
|
|
148
148
|
We've detected you are using ${sbFormatted} with scripts from previous versions of Storybook.
|
|
149
149
|
Starting in Storybook 7, the ${chalk12.yellow("start-storybook")} and ${chalk12.yellow("build-storybook")} binaries have changed to ${chalk12.magenta("storybook dev")} and ${chalk12.magenta("storybook build")} respectively.
|
|
@@ -154,13 +154,13 @@ var detectWebpack=packageManager=>{try{let out="";if(packageManager.type==="npm"
|
|
|
154
154
|
`)}
|
|
155
155
|
|
|
156
156
|
In case this migration did not cover all of your scripts, or you'd like more info: ${chalk12.yellow("https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#start-storybook--build-storybook-binaries-removed")}
|
|
157
|
-
`},async run({result:{storybookScripts},packageManager,dryRun}){if(logger10.info("\u2705 Updating scripts in package.json"),logger10.log(),!dryRun){let newScripts=Object.keys(storybookScripts).reduce((acc,scriptKey)=>(acc[scriptKey]=storybookScripts[scriptKey].after,acc),{});logger10.log(),packageManager.addScripts(newScripts);}}};var logger11=console,sbBinary={id:"storybook-binary",async check({packageManager,configDir}){let packageJson=packageManager.retrievePackageJson(),allDependencies=packageManager.getAllDependencies(),{storybookVersion}=await getStorybookData({packageManager,configDir});if(allDependencies["@nrwl/storybook"]||semver.lt(storybookVersion,"7.0.0"))return null;let hasSbBinary=!!allDependencies.sb,hasStorybookBinary=!!allDependencies.storybook;return !hasSbBinary&&hasStorybookBinary?null:{hasSbBinary,hasStorybookBinary,storybookVersion,packageJson}},prompt({storybookVersion,hasSbBinary,hasStorybookBinary}){let sbFormatted=chalk12.cyan(`Storybook ${storybookVersion}`),storybookBinaryMessage=hasStorybookBinary?"":`We've detected you are using ${sbFormatted} without Storybook's ${chalk12.magenta("storybook")} binary. Starting in Storybook 7.0, it has to be installed.`;return dedent`
|
|
157
|
+
`},async run({result:{storybookScripts},packageManager,dryRun}){if(logger10.info("\u2705 Updating scripts in package.json"),logger10.log(),!dryRun){let newScripts=Object.keys(storybookScripts).reduce((acc,scriptKey)=>(acc[scriptKey]=storybookScripts[scriptKey].after,acc),{});logger10.log(),await packageManager.addScripts(newScripts);}}};var logger11=console,sbBinary={id:"storybook-binary",async check({packageManager,configDir}){let packageJson=await packageManager.retrievePackageJson(),allDependencies=await packageManager.getAllDependencies(),{storybookVersion}=await getStorybookData({packageManager,configDir});if(allDependencies["@nrwl/storybook"]||semver.lt(storybookVersion,"7.0.0"))return null;let hasSbBinary=!!allDependencies.sb,hasStorybookBinary=!!allDependencies.storybook;return !hasSbBinary&&hasStorybookBinary?null:{hasSbBinary,hasStorybookBinary,storybookVersion,packageJson}},prompt({storybookVersion,hasSbBinary,hasStorybookBinary}){let sbFormatted=chalk12.cyan(`Storybook ${storybookVersion}`),storybookBinaryMessage=hasStorybookBinary?"":`We've detected you are using ${sbFormatted} without Storybook's ${chalk12.magenta("storybook")} binary. Starting in Storybook 7.0, it has to be installed.`;return dedent`
|
|
158
158
|
${storybookBinaryMessage}
|
|
159
159
|
${hasSbBinary?`You're using the 'sb' binary and it should be replaced, as 'storybook' is the recommended way to run Storybook.
|
|
160
160
|
`:""}
|
|
161
161
|
|
|
162
162
|
More info: ${chalk12.yellow("https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#start-storybook--build-storybook-binaries-removed")}
|
|
163
|
-
`},async run({result:{packageJson,hasSbBinary,hasStorybookBinary},packageManager,dryRun,skipInstall}){if(hasSbBinary&&(logger11.info("\u2705 Removing 'sb' dependency"),dryRun||packageManager.removeDependencies({skipInstall:skipInstall||!hasStorybookBinary,packageJson},["sb"])),!hasStorybookBinary&&(logger11.log(),logger11.info("\u2705 Adding 'storybook' as dev dependency"),logger11.log(),!dryRun)){let versionToInstall=getStorybookVersionSpecifier(packageJson);packageManager.addDependencies({installAsDevDependencies:!0,packageJson,skipInstall},[`storybook@${versionToInstall}`]);}}};var detectRenderer=async packageJson=>{let allDependencies={...packageJson.dependencies,...packageJson.devDependencies,...packageJson.peerDependencies},matches=Object.keys(rendererPackages).filter(pkg2=>!!allDependencies[pkg2]),[rendererPackage]=matches;return matches.length>1&&(rendererPackage=(await prompts([{type:"select",name:"rendererPackage",hint:"> - Use arrow-keys. Return to submit. To automate this next time, you can pass the renderer to the CLI via the --renderer flag",message:"Tried to detect a Storybook renderer in your project but found multiple. This could happen in monorepos, when projects contain multiple Storybook packages in package.json. Please select the correct one:",choices:matches.map(type=>({title:type,value:type}))}])).rendererPackage),rendererPackage};var logger12=console,packagesMap={"@storybook/react":{webpack5:"@storybook/react-webpack5",vite:"@storybook/react-vite"},"@storybook/preact":{webpack5:"@storybook/preact-webpack5",vite:"@storybook/preact-vite"},"@storybook/server":{webpack5:"@storybook/server-webpack5"},"@storybook/ember":{webpack5:"@storybook/ember"},"@storybook/angular":{webpack5:"@storybook/angular"},"@storybook/vue":{webpack5:"@storybook/vue-webpack5",vite:"@storybook/vue-vite"},"@storybook/vue3":{webpack5:"@storybook/vue3-webpack5",vite:"@storybook/vue3-vite"},"@storybook/svelte":{webpack5:"@storybook/svelte-webpack5",vite:"@storybook/svelte-vite"},"@storybook/web-components":{webpack5:"@storybook/web-components-webpack5",vite:"@storybook/web-components-vite"},"@storybook/html":{webpack5:"@storybook/html-webpack5",vite:"@storybook/html-vite"}},communityFrameworks={vite:["storybook-framework-qwik","storybook-solidjs-vite"],webpack5:[]},viteConfigFiles2=["vite.config.js","vite.config.cjs","vite.config.mjs","vite.config.ts"],webpackConfigFiles=["webpack.config.js","webpack.config.cjs","webpack.config.mjs","webpack.config.ts"],detectBuilderInfo=async({mainConfig,configDir,packageDependencies})=>{let builderOptions={},builderName,builderOrFrameworkName,{core={},framework}=mainConfig,{builder}=core;if(builder)typeof builder=="string"?builderOrFrameworkName=builder:(builderOrFrameworkName=builder.name,builderOptions=builder.options||{});else if(framework){let frameworkName=typeof framework=="string"?framework:framework.name;Object.keys(frameworkPackages).includes(frameworkName)&&(builderOrFrameworkName=frameworkName,builderOptions=typeof framework=="object"?framework.options?.builder:{});}if(!builderOrFrameworkName){let viteConfigFile=await findUp2(viteConfigFiles2,{cwd:configDir});if(viteConfigFile)logger12.info(`No builder or framework field, detected Storybook builder via: ${viteConfigFile}`),builderOrFrameworkName="vite";else {let webpackConfigFile=await findUp2(webpackConfigFiles,{cwd:configDir});webpackConfigFile&&(logger12.info(`No builder or framework field, detected Storybook builder via: ${webpackConfigFile}`),builderOrFrameworkName="webpack5");}}return builderOrFrameworkName||(packageDependencies["@storybook/builder-vite"]||packageDependencies["storybook-builder-vite"]?builderOrFrameworkName="vite":(packageDependencies["@storybook/builder-webpack5"]||packageDependencies["@storybook/manager-webpack5"])&&(builderOrFrameworkName="webpack5")),builderOrFrameworkName?.includes("vite")||communityFrameworks.vite.includes(builderOrFrameworkName)?builderName="vite":(builderOrFrameworkName?.includes("webpack")||communityFrameworks.webpack5.includes(builderOrFrameworkName),builderName="webpack5"),{name:builderName,options:builderOptions}},getNextjsAddonOptions=addons=>{let nextjsAddon=addons?.find(addon=>typeof addon=="string"?addon==="storybook-addon-next":addon.name==="storybook-addon-next");return !nextjsAddon||typeof nextjsAddon=="string"?{}:nextjsAddon.options||{}};var logger13=console,nextJsConfigFiles=["next.config.js","next.config.cjs","next.config.mjs","next.config.ts"],newFrameworks={id:"new-frameworks",async check({rendererPackage:userDefinedRendererPackage,configDir:userDefinedConfigDir,packageManager}){let packageJson=packageManager.retrievePackageJson(),{storybookVersion,mainConfig,mainConfigPath,configDir}=await getStorybookData({packageManager,configDir:userDefinedConfigDir});if(!semver.gte(storybookVersion,"7.0.0"))return null;let frameworkPackage=typeof mainConfig.framework=="string"?mainConfig.framework:mainConfig.framework?.name,hasFrameworkInMainConfig=!!frameworkPackage,rendererPackage=userDefinedRendererPackage;rendererPackage||(frameworkPackage&&Object.keys(rendererPackages).includes(frameworkPackage)?rendererPackage=frameworkPackage:frameworkPackage&&Object.values(rendererPackages).includes(frameworkPackage)?(rendererPackage=Object.keys(rendererPackages).find(k=>rendererPackages[k]===frameworkPackage),hasFrameworkInMainConfig=!1):rendererPackage=await detectRenderer(packageJson));let builderConfig=mainConfig.core?.builder;if(!Object.keys(packagesMap).includes(rendererPackage))return null;let allDependencies=packageManager.getAllDependencies(),builderInfo=await detectBuilderInfo({mainConfig,configDir,packageDependencies:allDependencies}),newFrameworkPackage=Object.keys(frameworkPackages).find(pkg2=>pkg2===frameworkPackage);if(newFrameworkPackage||(newFrameworkPackage=packagesMap[rendererPackage]&&packagesMap[rendererPackage][builderInfo.name]),!newFrameworkPackage)return null;let renderer=rendererPackages[rendererPackage],rendererOptions=mainConfig[`${renderer}Options`]||{},frameworkOptions=typeof mainConfig.framework=="string"?{}:mainConfig.framework?.options,dependenciesToRemove=["@storybook/builder-webpack5","@storybook/manager-webpack5","@storybook/builder-webpack4","@storybook/manager-webpack4","@storybook/builder-vite","storybook-builder-vite"],addonsToRemove=[],addonOptions={},metaFramework;if(rendererPackage==="@storybook/react"&&allDependencies.next){let nextConfigFile=await findUp2(nextJsConfigFiles,{cwd:configDir}),nextAddonOptions=getNextjsAddonOptions(mainConfig.addons);(semver.gte(semver.coerce(allDependencies.next).version,"12.0.0")&&nextConfigFile||Object.keys(nextAddonOptions).length>0)&&(metaFramework="nextjs",(newFrameworkPackage==="@storybook/react-webpack5"||newFrameworkPackage==="@storybook/nextjs")&&(newFrameworkPackage="@storybook/nextjs",addonsToRemove=["storybook-addon-next","storybook-addon-next-router"].filter(dep=>allDependencies[dep]||mainConfig.addons?.find(addon=>typeof addon=="string"?dep===addon:dep===addon.name)),addonOptions=nextAddonOptions,dependenciesToRemove.push("@storybook/react-webpack5","storybook-addon-next","storybook-addon-next-router")));}else rendererPackage==="@storybook/svelte"&&allDependencies["@sveltejs/kit"]&&semver.gte(semver.coerce(allDependencies["@sveltejs/kit"]).version,"1.0.0")&&(metaFramework="sveltekit",newFrameworkPackage==="@storybook/svelte-vite"&&(newFrameworkPackage="@storybook/sveltekit",rendererOptions={},dependenciesToRemove.push("@storybook/svelte-vite")));let dependenciesToAdd=[newFrameworkPackage].filter(dep=>!allDependencies[dep]).filter(Boolean);if(dependenciesToRemove=dependenciesToRemove.filter(dep=>allDependencies[dep]).filter(Boolean),hasFrameworkInMainConfig&&!builderConfig&&!Object.keys(rendererOptions).length&&!Object.keys(addonOptions).length&&!dependenciesToRemove.length&&!dependenciesToAdd.length)return null;if(allDependencies.vite&&semver.lt(semver.coerce(allDependencies.vite).version,"3.0.0"))throw new Error(dedent16`
|
|
163
|
+
`},async run({result:{packageJson,hasSbBinary,hasStorybookBinary},packageManager,dryRun,skipInstall}){if(hasSbBinary&&(logger11.info("\u2705 Removing 'sb' dependency"),dryRun||await packageManager.removeDependencies({skipInstall:skipInstall||!hasStorybookBinary,packageJson},["sb"])),!hasStorybookBinary&&(logger11.log(),logger11.info("\u2705 Adding 'storybook' as dev dependency"),logger11.log(),!dryRun)){let versionToInstall=getStorybookVersionSpecifier(packageJson);await packageManager.addDependencies({installAsDevDependencies:!0,packageJson,skipInstall},[`storybook@${versionToInstall}`]);}}};var detectRenderer=async packageJson=>{let allDependencies={...packageJson.dependencies,...packageJson.devDependencies,...packageJson.peerDependencies},matches=Object.keys(rendererPackages).filter(pkg2=>!!allDependencies[pkg2]),[rendererPackage]=matches;return matches.length>1&&(rendererPackage=(await prompts([{type:"select",name:"rendererPackage",hint:"> - Use arrow-keys. Return to submit. To automate this next time, you can pass the renderer to the CLI via the --renderer flag",message:"Tried to detect a Storybook renderer in your project but found multiple. This could happen in monorepos, when projects contain multiple Storybook packages in package.json. Please select the correct one:",choices:matches.map(type=>({title:type,value:type}))}])).rendererPackage),rendererPackage};var logger12=console,packagesMap={"@storybook/react":{webpack5:"@storybook/react-webpack5",vite:"@storybook/react-vite"},"@storybook/preact":{webpack5:"@storybook/preact-webpack5",vite:"@storybook/preact-vite"},"@storybook/server":{webpack5:"@storybook/server-webpack5"},"@storybook/ember":{webpack5:"@storybook/ember"},"@storybook/angular":{webpack5:"@storybook/angular"},"@storybook/vue":{webpack5:"@storybook/vue-webpack5",vite:"@storybook/vue-vite"},"@storybook/vue3":{webpack5:"@storybook/vue3-webpack5",vite:"@storybook/vue3-vite"},"@storybook/svelte":{webpack5:"@storybook/svelte-webpack5",vite:"@storybook/svelte-vite"},"@storybook/web-components":{webpack5:"@storybook/web-components-webpack5",vite:"@storybook/web-components-vite"},"@storybook/html":{webpack5:"@storybook/html-webpack5",vite:"@storybook/html-vite"}},communityFrameworks={vite:["storybook-framework-qwik","storybook-solidjs-vite"],webpack5:[]},viteConfigFiles2=["vite.config.js","vite.config.cjs","vite.config.mjs","vite.config.ts"],webpackConfigFiles=["webpack.config.js","webpack.config.cjs","webpack.config.mjs","webpack.config.ts"],detectBuilderInfo=async({mainConfig,configDir,packageDependencies})=>{let builderOptions={},builderName,builderOrFrameworkName,{core={},framework}=mainConfig,{builder}=core;if(builder)typeof builder=="string"?builderOrFrameworkName=builder:(builderOrFrameworkName=builder.name,builderOptions=builder.options||{});else if(framework){let frameworkName=typeof framework=="string"?framework:framework.name;Object.keys(frameworkPackages).includes(frameworkName)&&(builderOrFrameworkName=frameworkName,builderOptions=typeof framework=="object"?framework.options?.builder:{});}if(!builderOrFrameworkName){let viteConfigFile=await findUp2(viteConfigFiles2,{cwd:configDir});if(viteConfigFile)logger12.info(`No builder or framework field, detected Storybook builder via: ${viteConfigFile}`),builderOrFrameworkName="vite";else {let webpackConfigFile=await findUp2(webpackConfigFiles,{cwd:configDir});webpackConfigFile&&(logger12.info(`No builder or framework field, detected Storybook builder via: ${webpackConfigFile}`),builderOrFrameworkName="webpack5");}}return builderOrFrameworkName||(packageDependencies["@storybook/builder-vite"]||packageDependencies["storybook-builder-vite"]?builderOrFrameworkName="vite":(packageDependencies["@storybook/builder-webpack5"]||packageDependencies["@storybook/manager-webpack5"])&&(builderOrFrameworkName="webpack5")),builderOrFrameworkName?.includes("vite")||communityFrameworks.vite.includes(builderOrFrameworkName)?builderName="vite":(builderOrFrameworkName?.includes("webpack")||communityFrameworks.webpack5.includes(builderOrFrameworkName),builderName="webpack5"),{name:builderName,options:builderOptions}},getNextjsAddonOptions=addons=>{let nextjsAddon=addons?.find(addon=>typeof addon=="string"?addon==="storybook-addon-next":addon.name==="storybook-addon-next");return !nextjsAddon||typeof nextjsAddon=="string"?{}:nextjsAddon.options||{}};var logger13=console,nextJsConfigFiles=["next.config.js","next.config.cjs","next.config.mjs","next.config.ts"],newFrameworks={id:"new-frameworks",async check({rendererPackage:userDefinedRendererPackage,configDir:userDefinedConfigDir,packageManager}){let packageJson=await packageManager.retrievePackageJson(),{storybookVersion,mainConfig,mainConfigPath,configDir}=await getStorybookData({packageManager,configDir:userDefinedConfigDir});if(!semver.gte(storybookVersion,"7.0.0"))return null;let frameworkPackage=typeof mainConfig.framework=="string"?mainConfig.framework:mainConfig.framework?.name,hasFrameworkInMainConfig=!!frameworkPackage,rendererPackage=userDefinedRendererPackage;rendererPackage||(frameworkPackage&&Object.keys(rendererPackages).includes(frameworkPackage)?rendererPackage=frameworkPackage:frameworkPackage&&Object.values(rendererPackages).includes(frameworkPackage)?(rendererPackage=Object.keys(rendererPackages).find(k=>rendererPackages[k]===frameworkPackage),hasFrameworkInMainConfig=!1):rendererPackage=await detectRenderer(packageJson));let builderConfig=mainConfig.core?.builder;if(!Object.keys(packagesMap).includes(rendererPackage))return null;let allDependencies=await packageManager.getAllDependencies(),builderInfo=await detectBuilderInfo({mainConfig,configDir,packageDependencies:allDependencies}),newFrameworkPackage=Object.keys(frameworkPackages).find(pkg2=>pkg2===frameworkPackage);if(newFrameworkPackage||(newFrameworkPackage=packagesMap[rendererPackage]&&packagesMap[rendererPackage][builderInfo.name]),!newFrameworkPackage)return null;let renderer=rendererPackages[rendererPackage],rendererOptions=mainConfig[`${renderer}Options`]||{},frameworkOptions=typeof mainConfig.framework=="string"?{}:mainConfig.framework?.options,dependenciesToRemove=["@storybook/builder-webpack5","@storybook/manager-webpack5","@storybook/builder-webpack4","@storybook/manager-webpack4","@storybook/builder-vite","storybook-builder-vite"],addonsToRemove=[],addonOptions={},metaFramework;if(rendererPackage==="@storybook/react"&&allDependencies.next){let nextConfigFile=await findUp2(nextJsConfigFiles,{cwd:configDir}),nextAddonOptions=getNextjsAddonOptions(mainConfig.addons);(semver.gte(semver.coerce(allDependencies.next).version,"12.0.0")&&nextConfigFile||Object.keys(nextAddonOptions).length>0)&&(metaFramework="nextjs",(newFrameworkPackage==="@storybook/react-webpack5"||newFrameworkPackage==="@storybook/nextjs")&&(newFrameworkPackage="@storybook/nextjs",addonsToRemove=["storybook-addon-next","storybook-addon-next-router"].filter(dep=>allDependencies[dep]||mainConfig.addons?.find(addon=>typeof addon=="string"?dep===addon:dep===addon.name)),addonOptions=nextAddonOptions,dependenciesToRemove.push("@storybook/react-webpack5","storybook-addon-next","storybook-addon-next-router")));}else rendererPackage==="@storybook/svelte"&&allDependencies["@sveltejs/kit"]&&semver.gte(semver.coerce(allDependencies["@sveltejs/kit"]).version,"1.0.0")&&(metaFramework="sveltekit",newFrameworkPackage==="@storybook/svelte-vite"&&(newFrameworkPackage="@storybook/sveltekit",rendererOptions={},dependenciesToRemove.push("@storybook/svelte-vite")));let dependenciesToAdd=[newFrameworkPackage].filter(dep=>!allDependencies[dep]).filter(Boolean);if(dependenciesToRemove=dependenciesToRemove.filter(dep=>allDependencies[dep]).filter(Boolean),hasFrameworkInMainConfig&&!builderConfig&&!Object.keys(rendererOptions).length&&!Object.keys(addonOptions).length&&!dependenciesToRemove.length&&!dependenciesToAdd.length)return null;if(allDependencies.vite&&semver.lt(semver.coerce(allDependencies.vite).version,"3.0.0"))throw new Error(dedent16`
|
|
164
164
|
❌ Your project should be upgraded to use the framework package ${chalk12.bold(newFrameworkPackage)}, but we detected that you are using Vite ${chalk12.bold(allDependencies.vite)}, which is unsupported in ${chalk12.bold("Storybook 7.0")}. Please upgrade Vite to ${chalk12.bold("3.0.0 or higher")} and rerun this migration.
|
|
165
165
|
`);return {mainConfigPath,dependenciesToAdd,dependenciesToRemove,frameworkPackage:newFrameworkPackage,hasFrameworkInMainConfig,frameworkOptions:{...frameworkOptions,...rendererOptions,...addonOptions},rendererOptions,addonOptions,addonsToRemove,builderInfo,packageJson,renderer,builderConfig,metaFramework}},prompt({dependenciesToRemove,dependenciesToAdd,hasFrameworkInMainConfig,mainConfigPath,frameworkPackage,addonOptions,renderer,rendererOptions,builderConfig,addonsToRemove,metaFramework}){let disclaimer="",migrationSteps="";return dependenciesToRemove.length>0&&(migrationSteps+=`- Remove the following dependencies:
|
|
166
166
|
${dependenciesToRemove.map(dep=>`- * ${chalk12.cyan(dep)}`).join(`
|
|
@@ -217,7 +217,7 @@ var detectWebpack=packageManager=>{try{let out="";if(packageManager.type==="npm"
|
|
|
217
217
|
${migrationSteps}
|
|
218
218
|
|
|
219
219
|
To learn more about the new framework format, see: ${chalk12.yellow("https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#new-framework-api")}${disclaimer}
|
|
220
|
-
`},async run({result:{dependenciesToAdd,dependenciesToRemove,frameworkPackage,frameworkOptions,builderInfo,packageJson,renderer,addonsToRemove},packageManager,dryRun,mainConfigPath,skipInstall}){if(dependenciesToRemove.length>0&&(logger13.info(`\u2705 Removing dependencies: ${dependenciesToRemove.join(", ")}`),dryRun||packageManager.removeDependencies({skipInstall:skipInstall||dependenciesToAdd.length>0,packageJson},dependenciesToRemove)),dependenciesToAdd.length>0&&(logger13.info(`\u2705 Installing new dependencies: ${dependenciesToAdd.join(", ")}`),!dryRun)){let versionToInstall=getStorybookVersionSpecifier(packageJson),depsToAdd=dependenciesToAdd.map(dep=>`${dep}@${versionToInstall}`);packageManager.addDependencies({installAsDevDependencies:!0,skipInstall,packageJson},depsToAdd);}await updateMainConfig({mainConfigPath,dryRun},async main=>{logger13.info("\u2705 Updating main.js"),logger13.info('\u2705 Updating "framework" field'),dryRun||main.setFieldValue(["framework","name"],frameworkPackage),dryRun||main.setFieldValue(["framework","options"],frameworkOptions),main.getFieldNode([`${renderer}Options`])&&(logger13.info(`\u2705 Moving "${renderer}Options" to "framework.options"`),dryRun||main.removeField([`${renderer}Options`])),main.getFieldNode(["core","builder"])&&(logger13.info('\u2705 Removing "core.builder" field'),dryRun||main.removeField(["core","builder"])),Object.keys(builderInfo.options).length>0&&(logger13.info('\u2705 Moving "core.builder.options" into "framework.options.builder"'),dryRun||main.setFieldValue(["framework","options","builder"],builderInfo.options));let currentCore=main.getFieldValue(["core"]);if(currentCore&&Object.keys(currentCore).length===0&&(logger13.info('\u2705 Removing "core" field'),dryRun||main.removeField(["core"])),addonsToRemove.length>0){let updatedAddons=main.getFieldValue(["addons"]).filter(addon=>typeof addon=="string"?!addonsToRemove.includes(addon):addon.name?!addonsToRemove.includes(addon.name):!1);logger13.info("\u2705 Removing unnecessary addons"),dryRun||main.setFieldValue(["addons"],updatedAddons);}});}};var RemovedAPIs=(RemovedAPIs2=>(RemovedAPIs2.addDecorator="addDecorator",RemovedAPIs2.addParameters="addParameters",RemovedAPIs2.addLoader="addLoader",RemovedAPIs2.getStorybook="getStorybook",RemovedAPIs2.setAddon="setAddon",RemovedAPIs2.clearDecorators="clearDecorators",RemovedAPIs2))(RemovedAPIs||{}),removedGlobalClientAPIs={id:"removedglobalclientapis",promptOnly:!0,async check({packageManager,configDir}){let packageJson=packageManager.retrievePackageJson(),{previewConfig}=getStorybookInfo(packageJson,configDir);if(previewConfig){let contents=await readFile(previewConfig,"utf8"),usedAPIs=Object.values(RemovedAPIs).reduce((acc,item)=>(contents.includes(item)&&acc.push(item),acc),[]);if(usedAPIs.length)return {usedAPIs,previewPath:previewConfig}}return null},prompt({usedAPIs,previewPath}){return dedent16`
|
|
220
|
+
`},async run({result:{dependenciesToAdd,dependenciesToRemove,frameworkPackage,frameworkOptions,builderInfo,packageJson,renderer,addonsToRemove},packageManager,dryRun,mainConfigPath,skipInstall}){if(dependenciesToRemove.length>0&&(logger13.info(`\u2705 Removing dependencies: ${dependenciesToRemove.join(", ")}`),dryRun||await packageManager.removeDependencies({skipInstall:skipInstall||dependenciesToAdd.length>0,packageJson},dependenciesToRemove)),dependenciesToAdd.length>0&&(logger13.info(`\u2705 Installing new dependencies: ${dependenciesToAdd.join(", ")}`),!dryRun)){let versionToInstall=getStorybookVersionSpecifier(packageJson),depsToAdd=dependenciesToAdd.map(dep=>`${dep}@${versionToInstall}`);await packageManager.addDependencies({installAsDevDependencies:!0,skipInstall,packageJson},depsToAdd);}await updateMainConfig({mainConfigPath,dryRun},async main=>{logger13.info("\u2705 Updating main.js"),logger13.info('\u2705 Updating "framework" field'),dryRun||main.setFieldValue(["framework","name"],frameworkPackage),dryRun||main.setFieldValue(["framework","options"],frameworkOptions),main.getFieldNode([`${renderer}Options`])&&(logger13.info(`\u2705 Moving "${renderer}Options" to "framework.options"`),dryRun||main.removeField([`${renderer}Options`])),main.getFieldNode(["core","builder"])&&(logger13.info('\u2705 Removing "core.builder" field'),dryRun||main.removeField(["core","builder"])),Object.keys(builderInfo.options).length>0&&(logger13.info('\u2705 Moving "core.builder.options" into "framework.options.builder"'),dryRun||main.setFieldValue(["framework","options","builder"],builderInfo.options));let currentCore=main.getFieldValue(["core"]);if(currentCore&&Object.keys(currentCore).length===0&&(logger13.info('\u2705 Removing "core" field'),dryRun||main.removeField(["core"])),addonsToRemove.length>0){let updatedAddons=main.getFieldValue(["addons"]).filter(addon=>typeof addon=="string"?!addonsToRemove.includes(addon):addon.name?!addonsToRemove.includes(addon.name):!1);logger13.info("\u2705 Removing unnecessary addons"),dryRun||main.setFieldValue(["addons"],updatedAddons);}});}};var RemovedAPIs=(RemovedAPIs2=>(RemovedAPIs2.addDecorator="addDecorator",RemovedAPIs2.addParameters="addParameters",RemovedAPIs2.addLoader="addLoader",RemovedAPIs2.getStorybook="getStorybook",RemovedAPIs2.setAddon="setAddon",RemovedAPIs2.clearDecorators="clearDecorators",RemovedAPIs2))(RemovedAPIs||{}),removedGlobalClientAPIs={id:"removedglobalclientapis",promptOnly:!0,async check({packageManager,configDir}){let packageJson=await packageManager.retrievePackageJson(),{previewConfig}=getStorybookInfo(packageJson,configDir);if(previewConfig){let contents=await readFile(previewConfig,"utf8"),usedAPIs=Object.values(RemovedAPIs).reduce((acc,item)=>(contents.includes(item)&&acc.push(item),acc),[]);if(usedAPIs.length)return {usedAPIs,previewPath:previewConfig}}return null},prompt({usedAPIs,previewPath}){return dedent16`
|
|
221
221
|
${chalk12.bold(chalk12.red("Attention"))}: We could not automatically make this change. You'll need to do it manually.
|
|
222
222
|
|
|
223
223
|
The following APIs (used in "${chalk12.yellow(previewPath)}") have been removed from Storybook:
|
|
@@ -259,7 +259,7 @@ var detectWebpack=packageManager=>{try{let out="";if(packageManager.type==="npm"
|
|
|
259
259
|
${autodocsFormatted}
|
|
260
260
|
|
|
261
261
|
More info: ${chalk12.yellow("https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#autodocs-changes")}
|
|
262
|
-
`},async run({result:{value},dryRun,mainConfigPath}){logger15.info("\u2705 Setting 'docs.autodocs' to true in main.js"),dryRun||await updateMainConfig({mainConfigPath,dryRun},async main=>{main.removeField(["docs","docsPage"]),main.setFieldValue(["docs","autodocs"],value??!0);});}};var addReact={id:"addReact",async check({packageManager}){let packageJson=packageManager.retrievePackageJson(),installedDependencies=new Set(Object.keys({...packageJson.dependencies,...packageJson.devDependencies})),dependents=["@storybook/addon-essentials","@storybook/addon-docs"].filter(pkg2=>installedDependencies.has(pkg2)),additionalDependencies=[];return dependents.length>0&&(installedDependencies.has("react")||additionalDependencies.push("react"),installedDependencies.has("react-dom")||additionalDependencies.push("react-dom")),additionalDependencies.length>0?{dependents,additionalDependencies}:null},prompt({dependents,additionalDependencies}){let dependentsFormatted=dependents.map(pkg2=>chalk12.cyan(pkg2)).join(" & "),additionalDependenciesFormatted=additionalDependencies.map(pkg2=>`- ${chalk12.cyan(pkg2)}`).join(`
|
|
262
|
+
`},async run({result:{value},dryRun,mainConfigPath}){logger15.info("\u2705 Setting 'docs.autodocs' to true in main.js"),dryRun||await updateMainConfig({mainConfigPath,dryRun},async main=>{main.removeField(["docs","docsPage"]),main.setFieldValue(["docs","autodocs"],value??!0);});}};var addReact={id:"addReact",async check({packageManager}){let packageJson=await packageManager.retrievePackageJson(),installedDependencies=new Set(Object.keys({...packageJson.dependencies,...packageJson.devDependencies})),dependents=["@storybook/addon-essentials","@storybook/addon-docs"].filter(pkg2=>installedDependencies.has(pkg2)),additionalDependencies=[];return dependents.length>0&&(installedDependencies.has("react")||additionalDependencies.push("react"),installedDependencies.has("react-dom")||additionalDependencies.push("react-dom")),additionalDependencies.length>0?{dependents,additionalDependencies}:null},prompt({dependents,additionalDependencies}){let dependentsFormatted=dependents.map(pkg2=>chalk12.cyan(pkg2)).join(" & "),additionalDependenciesFormatted=additionalDependencies.map(pkg2=>`- ${chalk12.cyan(pkg2)}`).join(`
|
|
263
263
|
`);return dedent`
|
|
264
264
|
We've detected that you're using ${dependentsFormatted}.
|
|
265
265
|
|
|
@@ -270,14 +270,14 @@ var detectWebpack=packageManager=>{try{let out="";if(packageManager.type==="npm"
|
|
|
270
270
|
We can add these for you automatically as dev dependencies.
|
|
271
271
|
|
|
272
272
|
More info: ${chalk12.yellow("https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#react-peer-dependencies-required")}
|
|
273
|
-
`},async run({packageManager,result:{additionalDependencies},dryRun}){dryRun||packageManager.addDependencies({installAsDevDependencies:!0},additionalDependencies);}};var nodeJsRequirement={id:"nodejs-requirement",promptOnly:!0,async check({packageManager,configDir}){let{storybookVersion}=await getStorybookData({packageManager,configDir});if(!semver.gte(storybookVersion,"7.0.0"))return null;let nodeVersion=process.version;return semver.lt(nodeVersion,"16.0.0")?{nodeVersion}:null},prompt({nodeVersion}){return dedent16`
|
|
273
|
+
`},async run({packageManager,result:{additionalDependencies},dryRun}){dryRun||await packageManager.addDependencies({installAsDevDependencies:!0},additionalDependencies);}};var nodeJsRequirement={id:"nodejs-requirement",promptOnly:!0,async check({packageManager,configDir}){let{storybookVersion}=await getStorybookData({packageManager,configDir});if(!semver.gte(storybookVersion,"7.0.0"))return null;let nodeVersion=process.version;return semver.lt(nodeVersion,"16.0.0")?{nodeVersion}:null},prompt({nodeVersion}){return dedent16`
|
|
274
274
|
${chalk12.bold(chalk12.red("Attention"))}: We could not automatically make this change. You'll need to do it manually.
|
|
275
275
|
|
|
276
276
|
We've detected that you're using Node ${chalk12.bold(nodeVersion)} but Storybook 7 only supports Node ${chalk12.bold("v16.0.0")} and higher. You will either need to upgrade your Node version or keep using an older version of Storybook.
|
|
277
277
|
|
|
278
278
|
Please see the migration guide for more information:
|
|
279
279
|
${chalk12.yellow("https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#dropped-support-for-node-15-and-below")}
|
|
280
|
-
`}};var logger16=console,frameworksThatNeedBabelConfig=["@storybook/react-webpack5","@storybook/vue-webpack5","@storybook/vue3-webpack5","@storybook/html-webpack5","@storybook/web-components-webpack5"],missingBabelRc={id:"missing-babelrc",async check({configDir,packageManager}){let packageJson=packageManager.retrievePackageJson(),{mainConfig,storybookVersion}=await getStorybookData({configDir,packageManager});if(!semver.gte(storybookVersion,"7.0.0"))return null;let{framework,addons}=mainConfig,frameworkPackage=typeof framework=="string"?framework:framework.name,hasCraPreset=addons&&addons.find(addon=>addon==="@storybook/preset-create-react-app");if(frameworkPackage&&frameworksThatNeedBabelConfig.includes(frameworkPackage)&&!hasCraPreset){let config=await loadPartialConfigAsync({babelrc:!0,filename:"__fake__.js"});if(!config.config&&!config.babelrc&&!packageJson.babel)return {needsBabelRc:!0}}return null},prompt(){return dedent16`
|
|
280
|
+
`}};var logger16=console,frameworksThatNeedBabelConfig=["@storybook/react-webpack5","@storybook/vue-webpack5","@storybook/vue3-webpack5","@storybook/html-webpack5","@storybook/web-components-webpack5"],missingBabelRc={id:"missing-babelrc",async check({configDir,packageManager}){let packageJson=await packageManager.retrievePackageJson(),{mainConfig,storybookVersion}=await getStorybookData({configDir,packageManager});if(!semver.gte(storybookVersion,"7.0.0"))return null;let{framework,addons}=mainConfig,frameworkPackage=typeof framework=="string"?framework:framework.name,hasCraPreset=addons&&addons.find(addon=>addon==="@storybook/preset-create-react-app");if(frameworkPackage&&frameworksThatNeedBabelConfig.includes(frameworkPackage)&&!hasCraPreset){let config=await loadPartialConfigAsync({babelrc:!0,filename:"__fake__.js"});if(!config.config&&!config.babelrc&&!packageJson.babel)return {needsBabelRc:!0}}return null},prompt(){return dedent16`
|
|
281
281
|
We detected that your project does not have a babel configuration (.babelrc, babel.config.js, etc.).
|
|
282
282
|
|
|
283
283
|
In version 6.x, Storybook provided its own babel settings out of the box. Now, Storybook re-uses ${chalk12.bold("your project's babel configuration")}, with small, incremental updates from Storybook addons.
|
|
@@ -292,7 +292,7 @@ var detectWebpack=packageManager=>{try{let out="";if(packageManager.type==="npm"
|
|
|
292
292
|
Please see the migration guide for more information:
|
|
293
293
|
${chalk12.yellow("https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#babel-mode-v7-exclusively")}
|
|
294
294
|
|
|
295
|
-
`},async run(){logger16.info(),await generateStorybookBabelConfigInCWD();}};var angularBuilders={id:"angular-builders",async check({packageManager,configDir}){let packageJSON=packageManager.retrievePackageJson();if(isNxProject(packageJSON))return null;let angularVersion=packageManager.getAllDependencies()["@angular/core"],angularCoerced=semver.coerce(angularVersion)?.version;if(!angularCoerced)return null;if(semver.lt(angularCoerced,"14.0.0"))throw new Error(dedent`
|
|
295
|
+
`},async run(){logger16.info(),await generateStorybookBabelConfigInCWD();}};var angularBuilders={id:"angular-builders",async check({packageManager,configDir}){let packageJSON=await packageManager.retrievePackageJson();if(isNxProject(packageJSON))return null;let angularVersion=(await packageManager.getAllDependencies())["@angular/core"],angularCoerced=semver.coerce(angularVersion)?.version;if(!angularCoerced)return null;if(semver.lt(angularCoerced,"14.0.0"))throw new Error(dedent`
|
|
296
296
|
❌ Your project uses Angular < 14.0.0. Storybook 7.0 for Angular requires Angular 14.0.0 or higher.
|
|
297
297
|
Please upgrade your Angular version to at least version 14.0.0 to use Storybook 7.0 in your project.
|
|
298
298
|
`);let angularJSON=new AngularJSON,{hasStorybookBuilder}=angularJSON;if(hasStorybookBuilder||!angularJSON.rootProject&&Object.keys(angularJSON.projects).length>1)return null;let{mainConfig}=await getStorybookData({configDir,packageManager});return {mainConfig,packageManager}},prompt(){return dedent`
|
|
@@ -303,7 +303,7 @@ var detectWebpack=packageManager=>{try{let out="";if(packageManager.type==="npm"
|
|
|
303
303
|
Also feel free to remove the Compodoc script from your package.json file if you don't use it apart from Storybook anymore. Storybook uses Compodoc internally and you don't have to call in separately anymore.
|
|
304
304
|
|
|
305
305
|
Read more about the Angular builder here: ${chalk12.yellow("https://storybook.js.org/docs/angular/configure/storybook-builders")}
|
|
306
|
-
`},async run({result}){let angularJSON=new AngularJSON,{packageManager}=result,{useCompoDoc}=await prompts({type:"confirm",name:"useCompoDoc",message:"Have you set up compodoc in Storybook previously?"}),angularProjectName=await angularJSON.getProjectName();angularJSON.addStorybookEntries({angularProjectName,storybookFolder:".storybook",useCompodoc:useCompoDoc,root:"."}),angularJSON.write(),packageManager.addScripts({storybook:`ng run ${angularProjectName}:storybook`,"build-storybook":`ng run ${angularProjectName}:build-storybook`});}};var getActualPackageVersions=async packages=>Promise.all(packages.map(getActualPackageVersion)),getActualPackageVersion=async packageName=>{try{let packageJson=await getActualPackageJson(packageName);return {name:packageName,version:packageJson.version}}catch{return {name:packageName,version:null}}},getActualPackageJson=async packageName=>{let resolvedPackageJson=__require.resolve(path9.join(packageName,"package.json"),{paths:[process.cwd()]});return await fse.readJson(resolvedPackageJson)};var getIncompatibleAddons=async mainConfig=>{let incompatibleList={"@storybook/addon-knobs":"6.4.0","@storybook/addon-postcss":"2.0.0","storybook-addon-next-router":"4.0.2","storybook-addon-outline":"1.4.2","@storybook/addon-info":"5.3.21","storybook-addon-designs":"6.3.1","storybook-addon-next":"1.7.0","storybook-docs-toc":"1.7.0","@storybook/addon-google-analytics":"6.2.9","storybook-addon-pseudo-states":"1.15.5","storybook-dark-mode":"2.1.1","storybook-addon-gatsby":"0.0.5","@etchteam/storybook-addon-css-variables-theme":"1.4.0","@storybook/addon-cssresources":"6.2.9","storybook-addon-grid":"0.3.1","storybook-multilevel-sort":"1.2.0","storybook-addon-i18next":"1.3.0","storybook-source-link":"2.0.8","babel-plugin-storybook-csf-title":"2.1.0","@urql/storybook-addon":"2.0.1","storybook-addon-intl":"2.4.1","storybook-addon-mock":"3.2.0","@chakra-ui/storybook-addon":"4.0.16","storybook-mobile-addon":"1.0.2","@storybook/addon-queryparams":"6.2.9"},addons=getAddonNames(mainConfig).filter(addon=>addon in incompatibleList);if(addons.length===0)return [];let addonVersions=await getActualPackageVersions(addons),incompatibleAddons2=[];return addonVersions.forEach(({name,version:installedVersion})=>{if(installedVersion===null)return;let addonVersion=incompatibleList[name];try{semver.lte(semver.coerce(installedVersion),semver.coerce(addonVersion))&&incompatibleAddons2.push({name,version:installedVersion});}catch{}}),incompatibleAddons2};var incompatibleAddons={id:"incompatible-addons",promptOnly:!0,async check({packageManager,configDir}){let{mainConfig}=await getStorybookData({packageManager,configDir}),incompatibleAddonList=await getIncompatibleAddons(mainConfig);return incompatibleAddonList.length>0?{incompatibleAddonList}:null},prompt({incompatibleAddonList}){return dedent16`
|
|
306
|
+
`},async run({result}){let angularJSON=new AngularJSON,{packageManager}=result,{useCompoDoc}=await prompts({type:"confirm",name:"useCompoDoc",message:"Have you set up compodoc in Storybook previously?"}),angularProjectName=await angularJSON.getProjectName();angularJSON.addStorybookEntries({angularProjectName,storybookFolder:".storybook",useCompodoc:useCompoDoc,root:"."}),angularJSON.write(),await packageManager.addScripts({storybook:`ng run ${angularProjectName}:storybook`,"build-storybook":`ng run ${angularProjectName}:build-storybook`});}};var getActualPackageVersions=async packages=>Promise.all(packages.map(getActualPackageVersion)),getActualPackageVersion=async packageName=>{try{let packageJson=await getActualPackageJson(packageName);return {name:packageName,version:packageJson.version}}catch{return {name:packageName,version:null}}},getActualPackageJson=async packageName=>{let resolvedPackageJson=__require.resolve(path9.join(packageName,"package.json"),{paths:[process.cwd()]});return await fse.readJson(resolvedPackageJson)};var getIncompatibleAddons=async mainConfig=>{let incompatibleList={"@storybook/addon-knobs":"6.4.0","@storybook/addon-postcss":"2.0.0","storybook-addon-next-router":"4.0.2","storybook-addon-outline":"1.4.2","@storybook/addon-info":"5.3.21","storybook-addon-designs":"6.3.1","storybook-addon-next":"1.7.0","storybook-docs-toc":"1.7.0","@storybook/addon-google-analytics":"6.2.9","storybook-addon-pseudo-states":"1.15.5","storybook-dark-mode":"2.1.1","storybook-addon-gatsby":"0.0.5","@etchteam/storybook-addon-css-variables-theme":"1.4.0","@storybook/addon-cssresources":"6.2.9","storybook-addon-grid":"0.3.1","storybook-multilevel-sort":"1.2.0","storybook-addon-i18next":"1.3.0","storybook-source-link":"2.0.8","babel-plugin-storybook-csf-title":"2.1.0","@urql/storybook-addon":"2.0.1","storybook-addon-intl":"2.4.1","storybook-addon-mock":"3.2.0","@chakra-ui/storybook-addon":"4.0.16","storybook-mobile-addon":"1.0.2","@storybook/addon-queryparams":"6.2.9"},addons=getAddonNames(mainConfig).filter(addon=>addon in incompatibleList);if(addons.length===0)return [];let addonVersions=await getActualPackageVersions(addons),incompatibleAddons2=[];return addonVersions.forEach(({name,version:installedVersion})=>{if(installedVersion===null)return;let addonVersion=incompatibleList[name];try{semver.lte(semver.coerce(installedVersion),semver.coerce(addonVersion))&&incompatibleAddons2.push({name,version:installedVersion});}catch{}}),incompatibleAddons2};var incompatibleAddons={id:"incompatible-addons",promptOnly:!0,async check({packageManager,configDir}){let{mainConfig}=await getStorybookData({packageManager,configDir}),incompatibleAddonList=await getIncompatibleAddons(mainConfig);return incompatibleAddonList.length>0?{incompatibleAddonList}:null},prompt({incompatibleAddonList}){return dedent16`
|
|
307
307
|
${chalk12.bold(chalk12.red("Attention"))}: We've detected that you're using the following addons in versions which are known to be incompatible with Storybook 7:
|
|
308
308
|
|
|
309
309
|
${incompatibleAddonList.map(({name,version})=>`- ${chalk12.cyan(`${name}@${version}`)}`).join(`
|
|
@@ -311,7 +311,7 @@ var detectWebpack=packageManager=>{try{let out="";if(packageManager.type==="npm"
|
|
|
311
311
|
|
|
312
312
|
Please be aware they might not work in Storybook 7. Reach out to their maintainers for updates and check the following Github issue for more information:
|
|
313
313
|
${chalk12.yellow("https://github.com/storybookjs/storybook/issues/20529")}
|
|
314
|
-
`}};var angularBuildersMultiproject={id:"angular-builders-multiproject",promptOnly:!0,async check({packageManager
|
|
314
|
+
`}};var angularBuildersMultiproject={id:"angular-builders-multiproject",promptOnly:!0,async check({packageManager}){let packageJSON=await packageManager.retrievePackageJson();if(isNxProject(packageJSON))return null;let angularVersion=(await packageManager.getAllDependencies())["@angular/core"],angularCoerced=semver.coerce(angularVersion)?.version;if(!angularCoerced||semver.lt(angularCoerced,"14.0.0"))return null;let angularJSON=new AngularJSON,{hasStorybookBuilder}=angularJSON;return hasStorybookBuilder||angularJSON.rootProject||Object.keys(angularJSON.projects).length===1?null:{}},prompt(){return dedent`
|
|
315
315
|
In Storybook 6.4 we have deprecated calling Storybook directly (npm run storybook) for Angular. In Storybook 7.0, we've removed it entirely. Instead you have to set up the Storybook builder in your ${chalk12.yellow("angular.json")} and execute ${chalk12.yellow("ng run <your-project>:storybook")} to start Storybook.
|
|
316
316
|
|
|
317
317
|
❌ Your Angular workspace uses multiple projects defined in the ${chalk12.yellow("angular.json")} file and we were not able to detect a root project. Therefore we are not able to automigrate to use Angular Storybook builder. Instead, please visit ${chalk12.yellow("https://github.com/storybookjs/storybook/tree/next/code/frameworks/angular")} to do the migration manually.
|
|
@@ -335,12 +335,12 @@ ${error}`).join(`
|
|
|
335
335
|
`),installationMetadata?.duplicatedDependencies&&Object.keys(installationMetadata.duplicatedDependencies).length>0&&messages.push(getWarnings(installationMetadata).join(messageDivider));let hasNoFixes=Object.values(fixResults).every(r=>r==="unnecessary"),hasFailures=Object.values(fixResults).some(r=>r==="failed"||r==="check_failed"),title=hasNoFixes?"No migrations were applicable to your project":hasFailures?"Migration check ran with failures":"Migration check ran successfully";return boxen3(messages.filter(Boolean).join(segmentDivider),{borderStyle:"round",padding:1,title,borderColor:hasFailures?"red":"green"})}var allowList=["@storybook/csf","@storybook/addons","@storybook/channel-postmessage","@storybook/channel-websocket","@storybook/channels","@storybook/client-api","@storybook/client-logger","@storybook/core-client","@storybook/core-events","@storybook/preview-web","@storybook/preview-api","@storybook/store","@storybook/components","@storybook/router","@storybook/theming","@storybook/api","@storybook/manager-api"],disallowList=[Object.keys(rendererPackages),Object.keys(frameworkPackages),"@storybook/instrumenter"];function getWarnings(installationMetadata){let messages=[],{critical,trivial}=Object.entries(installationMetadata?.duplicatedDependencies).reduce((acc,[dep,versions])=>{if(allowList.includes(dep))return acc;let hasMultipleMajorVersions=hasMultipleVersions(versions);return disallowList.includes(dep)&&hasMultipleMajorVersions?acc.critical.push(`${chalk12.redBright(dep)}:
|
|
336
336
|
${versions.join(", ")}`):acc.trivial.push(`${chalk12.hex("#ff9800")(dep)}:
|
|
337
337
|
${versions.join(", ")}`),acc},{critical:[],trivial:[]});return critical.length>0&&(messages.push(`${chalk12.bold("Critical:")} The following dependencies are duplicated and WILL cause unexpected behavior:`),messages.push(critical.join(messageDivider))),trivial.length>0&&(messages.push(`${chalk12.bold("Attention:")} The following dependencies are duplicated which might cause unexpected behavior:`),messages.push(trivial.join(messageDivider))),messages.push(`You can find more information for a given dependency by running ${chalk12.cyan(`${installationMetadata.infoCommand} <package-name>`)}`),messages}var logger17=console,LOG_FILE_NAME="migration-storybook.log",LOG_FILE_PATH=join(process.cwd(),LOG_FILE_NAME),TEMP_LOG_FILE_PATH="",originalStdOutWrite=process.stdout.write.bind(process.stdout),originalStdErrWrite=process.stderr.write.bind(process.stdout),augmentLogsToFile=()=>{TEMP_LOG_FILE_PATH=tempy.file({name:LOG_FILE_NAME});let logStream=createWriteStream(TEMP_LOG_FILE_PATH);process.stdout.write=d=>(originalStdOutWrite(d),logStream.write(cleanLog(d))),process.stderr.write=d=>logStream.write(cleanLog(d));},cleanup=()=>{process.stdout.write=originalStdOutWrite,process.stderr.write=originalStdErrWrite;},logAvailableMigrations=()=>{let availableFixes=allFixes.map(f=>chalk12.yellow(f.id)).join(", ");logger17.info(`
|
|
338
|
-
The following migrations are available: ${availableFixes}`);},automigrate=async({fixId,fixes:inputFixes,dryRun,yes,useNpm,packageManager:pkgMgr,list,configDir:userSpecifiedConfigDir,renderer:rendererPackage,skipInstall}={})=>{if(list)return logAvailableMigrations(),null;let selectedFixes=inputFixes||allFixes,fixes=fixId?selectedFixes.filter(f=>f.id===fixId):selectedFixes;if(fixId&&fixes.length===0)return logger17.info(`\u{1F4ED} No migrations found for ${chalk12.magenta(fixId)}.`),logAvailableMigrations(),null;augmentLogsToFile(),logger17.info("\u{1F50E} checking possible migrations..");let{fixResults,fixSummary}=await runFixes({fixes,useNpm,pkgMgr,userSpecifiedConfigDir,rendererPackage,skipInstall,dryRun,yes});Object.values(fixResults).some(r=>r==="failed"||r==="check_failed")?await move(TEMP_LOG_FILE_PATH,join(process.cwd(),LOG_FILE_NAME),{overwrite:!0}):await remove(TEMP_LOG_FILE_PATH);let installationMetadata=await JsPackageManagerFactory.getPackageManager({force:pkgMgr}).findInstallations(["@storybook/*","storybook"]);return logger17.info(),logger17.info(getMigrationSummary({fixResults,fixSummary,logFile:LOG_FILE_PATH,installationMetadata})),logger17.info(),cleanup(),fixResults};async function runFixes({fixes,dryRun,yes,useNpm,pkgMgr,userSpecifiedConfigDir,rendererPackage,skipInstall}){useNpm&&(useNpmWarning(),pkgMgr="npm");let packageManager=JsPackageManagerFactory.getPackageManager({force:pkgMgr}),{configDir:inferredConfigDir,mainConfig:mainConfigPath,version:storybookVersion}=getStorybookInfo(packageManager.retrievePackageJson(),userSpecifiedConfigDir);if(!(storybookVersion&&semver.coerce(storybookVersion)?.version))return logger17.info(dedent16`
|
|
338
|
+
The following migrations are available: ${availableFixes}`);},automigrate=async({fixId,fixes:inputFixes,dryRun,yes,useNpm,packageManager:pkgMgr,list,configDir:userSpecifiedConfigDir,renderer:rendererPackage,skipInstall}={})=>{if(list)return logAvailableMigrations(),null;let selectedFixes=inputFixes||allFixes,fixes=fixId?selectedFixes.filter(f=>f.id===fixId):selectedFixes;if(fixId&&fixes.length===0)return logger17.info(`\u{1F4ED} No migrations found for ${chalk12.magenta(fixId)}.`),logAvailableMigrations(),null;augmentLogsToFile(),logger17.info("\u{1F50E} checking possible migrations..");let{fixResults,fixSummary}=await runFixes({fixes,useNpm,pkgMgr,userSpecifiedConfigDir,rendererPackage,skipInstall,dryRun,yes});Object.values(fixResults).some(r=>r==="failed"||r==="check_failed")?await move(TEMP_LOG_FILE_PATH,join(process.cwd(),LOG_FILE_NAME),{overwrite:!0}):await remove(TEMP_LOG_FILE_PATH);let installationMetadata=await JsPackageManagerFactory.getPackageManager({force:pkgMgr}).findInstallations(["@storybook/*","storybook"]);return logger17.info(),logger17.info(getMigrationSummary({fixResults,fixSummary,logFile:LOG_FILE_PATH,installationMetadata})),logger17.info(),cleanup(),fixResults};async function runFixes({fixes,dryRun,yes,useNpm,pkgMgr,userSpecifiedConfigDir,rendererPackage,skipInstall}){useNpm&&(useNpmWarning(),pkgMgr="npm");let packageManager=JsPackageManagerFactory.getPackageManager({force:pkgMgr}),{configDir:inferredConfigDir,mainConfig:mainConfigPath,version:storybookVersion}=getStorybookInfo(await packageManager.retrievePackageJson(),userSpecifiedConfigDir);if(!(storybookVersion&&semver.coerce(storybookVersion)?.version))return logger17.info(dedent16`
|
|
339
339
|
[Storybook automigrate] ❌ Unable to determine storybook version so the automigrations will be skipped.
|
|
340
340
|
🤔 Are you running automigrate from your project directory? Please specify your Storybook config directory with the --config-dir flag.
|
|
341
341
|
`),{preCheckFailure:"undetected_sb_version"};let configDir=userSpecifiedConfigDir||inferredConfigDir||".storybook";try{await loadMainConfig({configDir});}catch(err){return err.message.includes("No configuration files have been found")?(logger17.info(dedent16`[Storybook automigrate] Could not find or evaluate your Storybook main.js config directory at ${chalk12.blue(configDir)} so the automigrations will be skipped. You might be running this command in a monorepo or a non-standard project structure. If that is the case, please rerun this command by specifying the path to your Storybook config directory via the --config-dir option.`),{preCheckFailure:"mainjs_not_found"}):(logger17.info(dedent16`[Storybook automigrate] ❌ Failed trying to evaluate ${chalk12.blue(mainConfigPath)} with the following error: ${err.message}`),logger17.info("Please fix the error and try again."),{preCheckFailure:"mainjs_evaluation_error"})}let fixResults={},fixSummary={succeeded:[],failed:{},manual:[],skipped:[]};for(let i=0;i<fixes.length;i+=1){let f=fixes[i],result;try{result=await f.check({packageManager,configDir,rendererPackage});}catch(error){logger17.info(`\u26A0\uFE0F failed to check fix ${chalk12.bold(f.id)}`),logger17.error(`
|
|
342
342
|
${error.stack}`),fixSummary.failed[f.id]=error.message,fixResults[f.id]="check_failed";}if(result){logger17.info(`
|
|
343
|
-
\u{1F50E} found a '${chalk12.cyan(f.id)}' migration:`);let message=f.prompt(result);logger17.info(boxen3(message,{borderStyle:"round",padding:1,borderColor:"#F1618C",title:f.promptOnly?"Manual migration detected":"Automigration detected"}));let runAnswer;try{if(dryRun)runAnswer={fix:!1};else if(yes)runAnswer={fix:!0},f.promptOnly&&(fixResults[f.id]="manual_succeeded",fixSummary.manual.push(f.id));else if(f.promptOnly){fixResults[f.id]="manual_succeeded",fixSummary.manual.push(f.id),logger17.info();let{shouldContinue}=await prompts({type:"toggle",name:"shouldContinue",message:"Select continue once you have made the required changes, or quit to exit the migration process",initial:!0,active:"continue",inactive:"quit"},{onCancel:()=>{throw new Error}});if(!shouldContinue){fixResults[f.id]="manual_skipped";break}}else runAnswer=await prompts({type:"confirm",name:"fix",message:`Do you want to run the '${chalk12.cyan(f.id)}' migration on your project?`,initial:!0},{onCancel:()=>{throw new Error}});}catch{break}if(!f.promptOnly)if(runAnswer.fix)try{await f.run({result,packageManager,dryRun,mainConfigPath,skipInstall}),logger17.info(`\u2705 ran ${chalk12.cyan(f.id)} migration`),fixResults[f.id]="succeeded",fixSummary.succeeded.push(f.id);}catch(error){fixResults[f.id]="failed",fixSummary.failed[f.id]=error.message,logger17.info(`\u274C error when running ${chalk12.cyan(f.id)} migration`),logger17.info(error),logger17.info();}else fixResults[f.id]="skipped",fixSummary.skipped.push(f.id);}else fixResults[f.id]=fixResults[f.id]||"unnecessary";}return {fixResults,fixSummary}}var logger18=console,installStorybook=(projectType,packageManager,options)=>{let npmOptions={installAsDevDependencies:!0,skipInstall:options.skipInstall},packageJson;try{packageJson=packageManager.readPackageJson();}catch{}let language=detectLanguage(packageJson),pnp=detectPnp(),generatorOptions={language,builder:options.builder||detectBuilder(packageManager,projectType),linkable:!!options.linkable,pnp:pnp||options.usePnp},runGenerator=async()=>{switch(projectType){case"REACT_SCRIPTS":return REACT_SCRIPTS_default(packageManager,npmOptions,generatorOptions).then(commandLog('Adding Storybook support to your "Create React App" based project'));case"REACT":return REACT_default(packageManager,npmOptions,generatorOptions).then(commandLog(`Adding Storybook support to your "React" app
|
|
343
|
+
\u{1F50E} found a '${chalk12.cyan(f.id)}' migration:`);let message=f.prompt(result);logger17.info(boxen3(message,{borderStyle:"round",padding:1,borderColor:"#F1618C",title:f.promptOnly?"Manual migration detected":"Automigration detected"}));let runAnswer;try{if(dryRun)runAnswer={fix:!1};else if(yes)runAnswer={fix:!0},f.promptOnly&&(fixResults[f.id]="manual_succeeded",fixSummary.manual.push(f.id));else if(f.promptOnly){fixResults[f.id]="manual_succeeded",fixSummary.manual.push(f.id),logger17.info();let{shouldContinue}=await prompts({type:"toggle",name:"shouldContinue",message:"Select continue once you have made the required changes, or quit to exit the migration process",initial:!0,active:"continue",inactive:"quit"},{onCancel:()=>{throw new Error}});if(!shouldContinue){fixResults[f.id]="manual_skipped";break}}else runAnswer=await prompts({type:"confirm",name:"fix",message:`Do you want to run the '${chalk12.cyan(f.id)}' migration on your project?`,initial:!0},{onCancel:()=>{throw new Error}});}catch{break}if(!f.promptOnly)if(runAnswer.fix)try{await f.run({result,packageManager,dryRun,mainConfigPath,skipInstall}),logger17.info(`\u2705 ran ${chalk12.cyan(f.id)} migration`),fixResults[f.id]="succeeded",fixSummary.succeeded.push(f.id);}catch(error){fixResults[f.id]="failed",fixSummary.failed[f.id]=error.message,logger17.info(`\u274C error when running ${chalk12.cyan(f.id)} migration`),logger17.info(error),logger17.info();}else fixResults[f.id]="skipped",fixSummary.skipped.push(f.id);}else fixResults[f.id]=fixResults[f.id]||"unnecessary";}return {fixResults,fixSummary}}var logger18=console,installStorybook=async(projectType,packageManager,options)=>{let npmOptions={installAsDevDependencies:!0,skipInstall:options.skipInstall},packageJson;try{packageJson=await packageManager.readPackageJson();}catch{}let language=detectLanguage(packageJson),pnp=detectPnp(),generatorOptions={language,builder:options.builder||detectBuilder(packageManager,projectType),linkable:!!options.linkable,pnp:pnp||options.usePnp},runGenerator=async()=>{switch(projectType){case"REACT_SCRIPTS":return REACT_SCRIPTS_default(packageManager,npmOptions,generatorOptions).then(commandLog('Adding Storybook support to your "Create React App" based project'));case"REACT":return REACT_default(packageManager,npmOptions,generatorOptions).then(commandLog(`Adding Storybook support to your "React" app
|
|
344
344
|
`));case"REACT_NATIVE":return REACT_NATIVE_default(packageManager,npmOptions).then(commandLog(`Adding Storybook support to your "React Native" app
|
|
345
345
|
`));case"QWIK":return QWIK_default(packageManager,npmOptions,generatorOptions).then(commandLog(`Adding Storybook support to your "Qwik" app
|
|
346
346
|
`));case"WEBPACK_REACT":return WEBPACK_REACT_default(packageManager,npmOptions,generatorOptions).then(commandLog(`Adding Storybook support to your "Webpack React" app
|
|
@@ -364,13 +364,13 @@ ${error.stack}`),fixSummary.failed[f.id]=error.message,fixResults[f.id]="check_f
|
|
|
364
364
|
`));case"AURELIA":return AURELIA_default(packageManager,npmOptions,generatorOptions).then(commandLog(`Adding Storybook support to your "Aurelia" app
|
|
365
365
|
`));case"SERVER":return SERVER_default(packageManager,npmOptions,generatorOptions).then(commandLog(`Adding Storybook support to your "Server" app
|
|
366
366
|
`));case"NX":return paddedLog("We have detected Nx in your project. Please use `nx g @nrwl/storybook:configuration` to add Storybook to your project."),paddedLog("For more information, please see https://nx.dev/packages/storybook"),Promise.reject();case"SOLID":return SOLID_default(packageManager,npmOptions,generatorOptions).then(commandLog(`Adding Storybook support to your "SolidJS" app
|
|
367
|
-
`));case"UNSUPPORTED":return paddedLog("We detected a project type that we don't support yet."),paddedLog("If you'd like your framework to be supported, please let use know about it at https://github.com/storybookjs/storybook/issues"),logger18.log(),Promise.resolve();default:return paddedLog(`We couldn't detect your project type. (code: ${projectType})`),paddedLog("You can specify a project type explicitly via `sb init --type <type>`, see our docs on how to configure Storybook for your framework: https://storybook.js.org/docs/react/get-started/install"),logger18.log(),projectTypeInquirer(options,packageManager)}};try{return runGenerator()}catch(err){throw logger18.error(`
|
|
367
|
+
`));case"UNSUPPORTED":return paddedLog("We detected a project type that we don't support yet."),paddedLog("If you'd like your framework to be supported, please let use know about it at https://github.com/storybookjs/storybook/issues"),logger18.log(),Promise.resolve();default:return paddedLog(`We couldn't detect your project type. (code: ${projectType})`),paddedLog("You can specify a project type explicitly via `sb init --type <type>`, see our docs on how to configure Storybook for your framework: https://storybook.js.org/docs/react/get-started/install"),logger18.log(),projectTypeInquirer(options,packageManager)}};try{return await runGenerator()}catch(err){throw logger18.error(`
|
|
368
368
|
${chalk12.red(err.stack)}`),new HandledError(err)}},projectTypeInquirer=async(options,packageManager)=>{let manualAnswer=options.yes?!0:await prompts([{type:"confirm",name:"manual",message:"Do you want to manually choose a Storybook project type to install?"}]);if(manualAnswer!==!0&&manualAnswer.manual){let frameworkAnswer=await prompts([{type:"select",name:"manualFramework",message:"Please choose a project type from the following list:",choices:installableProjectTypes.map(type=>({title:type,value:type.toUpperCase()}))}]);return installStorybook(frameworkAnswer.manualFramework,packageManager,options)}return Promise.resolve()};async function doInitiate(options,pkg2){let{packageManager:pkgMgr}=options;options.useNpm&&(useNpmWarning(),pkgMgr="npm");let packageManager=JsPackageManagerFactory.getPackageManager({force:pkgMgr}),welcomeMessage="storybook init - the simplest way to add a Storybook to your project.";logger18.log(chalk12.inverse(`
|
|
369
369
|
${welcomeMessage}
|
|
370
|
-
`));let{default:updateNotifier}=await import('simple-update-notifier');await updateNotifier({pkg:pkg2,updateCheckInterval:1e3*60*60});let projectType,projectTypeProvided=options.type,infoText=projectTypeProvided?`Installing Storybook for user specified project type: ${projectTypeProvided}`:"Detecting project type",done=commandLog(infoText),packageJson=packageManager.retrievePackageJson();if(projectTypeProvided)if(installableProjectTypes.includes(projectTypeProvided))projectType=projectTypeProvided.toUpperCase();else throw done(`The provided project type was not recognized by Storybook: ${projectTypeProvided}`),logger18.log(`
|
|
370
|
+
`));let{default:updateNotifier}=await import('simple-update-notifier');await updateNotifier({pkg:pkg2,updateCheckInterval:1e3*60*60});let projectType,projectTypeProvided=options.type,infoText=projectTypeProvided?`Installing Storybook for user specified project type: ${projectTypeProvided}`:"Detecting project type",done=commandLog(infoText),packageJson=await packageManager.retrievePackageJson();if(projectTypeProvided)if(installableProjectTypes.includes(projectTypeProvided))projectType=projectTypeProvided.toUpperCase();else throw done(`The provided project type was not recognized by Storybook: ${projectTypeProvided}`),logger18.log(`
|
|
371
371
|
The project types currently supported by Storybook are:
|
|
372
372
|
`),installableProjectTypes.sort().forEach(framework=>paddedLog(`- ${framework}`)),logger18.log(),new HandledError(`Unknown project type supplied: ${projectTypeProvided}`);else try{projectType=detect(packageJson,options);}catch(err){throw done(err.message),new HandledError(err)}done();let storybookInstalled=isStorybookInstalled(packageJson,options.force);if(storybookInstalled&&projectType!=="ANGULAR")throw logger18.log(),paddedLog("There seems to be a Storybook already available in this project."),paddedLog(`Apply following command to force:
|
|
373
|
-
`),codeLog(["sb init [options] -f"]),logger18.log(),new HandledError("Angular project already installed");let installResult=await installStorybook(projectType,packageManager,options);!options.skipInstall&&!storybookInstalled&&packageManager.installDependencies(),options.disableTelemetry||telemetry("init",{projectType}),projectType!=="REACT_NATIVE"&&await automigrate({yes:options.yes||process.env.CI==="true",packageManager:pkgMgr,fixes:initFixes,configDir:installResult?.configDir}),logger18.log(`
|
|
373
|
+
`),codeLog(["sb init [options] -f"]),logger18.log(),new HandledError("Angular project already installed");let installResult=await installStorybook(projectType,packageManager,options);!options.skipInstall&&!storybookInstalled&&await packageManager.installDependencies(),options.disableTelemetry||telemetry("init",{projectType}),projectType!=="REACT_NATIVE"&&await automigrate({yes:options.yes||process.env.CI==="true",packageManager:pkgMgr,fixes:initFixes,configDir:installResult?.configDir}),logger18.log(`
|
|
374
374
|
For more information visit:`,chalk12.cyan("https://storybook.js.org")),projectType==="ANGULAR"?(logger18.log(`
|
|
375
375
|
To run your Storybook, type:
|
|
376
376
|
`),codeLog([`ng run ${installResult.projectName}:storybook`])):projectType==="REACT_NATIVE"?(logger18.log(),logger18.log(chalk12.yellow(`NOTE: installation is not 100% automated.
|
|
@@ -381,7 +381,7 @@ To run your Storybook, type:
|
|
|
381
381
|
For more in information, see the github readme:
|
|
382
382
|
`),logger18.log(chalk12.cyan("https://github.com/storybookjs/react-native")),logger18.log()):(logger18.log(`
|
|
383
383
|
To run your Storybook, type:
|
|
384
|
-
`),codeLog([packageManager.getRunStorybookCommand()])),logger18.log();}async function initiate(options,pkg2){await withTelemetry("init",{cliOptions:options,printError:err=>!err.handled&&logger18.error(err)},()=>doInitiate(options,pkg2));}var logger19=console,LEGACY_CONFIGS=["addons","config","presets"],postinstallAddon=async(addonName,isOfficialAddon)=>{let skipMsg=null;isOfficialAddon?fs5.existsSync(".storybook")?(skipMsg="no codmods found",LEGACY_CONFIGS.forEach(config=>{try{let codemod=__require.resolve(`${getPackageName(addonName,isOfficialAddon)}/postinstall/${config}.js`);commandLog(`Running postinstall script for ${addonName}`)();let configFile=path9.join(".storybook",`${config}.ts`);fs5.existsSync(configFile)||(configFile=path9.join(".storybook",`${config}.js`),fs5.existsSync(configFile)||fs5.writeFileSync(configFile,"","utf8")),sync$1("npx",["jscodeshift","-t",codemod,configFile],{stdio:"inherit",shell:!0}),skipMsg=null;}catch{}})):skipMsg="no .storybook config":skipMsg="unofficial addon",skipMsg&&commandLog(`Skipping postinstall for ${addonName}, ${skipMsg}`)();},getVersionSpecifier=addon=>{let groups=/^(...*)@(.*)$/.exec(addon);return groups?[groups[1],groups[2]]:[addon,void 0]};async function add(addon,options){let{packageManager:pkgMgr}=options;options.useNpm&&(useNpmWarning(),pkgMgr="npm");let packageManager=JsPackageManagerFactory.getPackageManager({force:pkgMgr}),packageJson=packageManager.retrievePackageJson(),[addonName,versionSpecifier]=getVersionSpecifier(addon),{mainConfig,version:storybookVersion}=getStorybookInfo(packageJson);if(!mainConfig){logger19.error("Unable to find storybook main.js config");return}let main=await readConfig(mainConfig);logger19.log(`Verifying ${addonName}`);let latestVersion=packageManager.latestVersion(addonName);latestVersion||logger19.error(`Unknown addon ${addonName}`);let isStorybookAddon=addonName.startsWith("@storybook/"),addonWithVersion=`${addonName}@${versionSpecifier||(isStorybookAddon?storybookVersion:latestVersion)}`;logger19.log(`Installing ${addonWithVersion}`),packageManager.addDependencies({installAsDevDependencies:!0},[addonWithVersion]),logger19.log(`Adding '${addon}' to main.js addons field.`),main.appendValueToArray(["addons"],addonName),await writeConfig(main),options.skipPostinstall||await postinstallAddon(addon,isStorybookAddon);}var logger20=console,getNextGlob=glob2=>{let extGlobsRegex=new RegExp(/(.*\.)(stories\.@.*)(\|mdx|mdx\|)(.*)$/i);if(glob2.match(extGlobsRegex))return glob2.replace(extGlobsRegex,"$1@(mdx|$2$4)");let allStoriesExtensionsRegex=new RegExp(/(.*\.)(stories\.\*)$/i);return glob2.match(allStoriesExtensionsRegex)?glob2.replace(allStoriesExtensionsRegex,"$1@(mdx|$2)"):glob2.replaceAll(".stories.mdx",".mdx")},bareMdxStoriesGlob={id:"bare-mdx-stories-glob",async check({packageManager,configDir}){let{storybookVersion,mainConfig}=await getStorybookData({configDir,packageManager});if(!semver.gte(storybookVersion,"7.0.0"))return null;let existingStoriesEntries=mainConfig.stories;if(!existingStoriesEntries)throw new Error(dedent16`
|
|
384
|
+
`),codeLog([packageManager.getRunStorybookCommand()])),logger18.log();}async function initiate(options,pkg2){await withTelemetry("init",{cliOptions:options,printError:err=>!err.handled&&logger18.error(err)},()=>doInitiate(options,pkg2));}var logger19=console,LEGACY_CONFIGS=["addons","config","presets"],postinstallAddon=async(addonName,isOfficialAddon)=>{let skipMsg=null;isOfficialAddon?fs5.existsSync(".storybook")?(skipMsg="no codmods found",LEGACY_CONFIGS.forEach(config=>{try{let codemod=__require.resolve(`${getPackageName(addonName,isOfficialAddon)}/postinstall/${config}.js`);commandLog(`Running postinstall script for ${addonName}`)();let configFile=path9.join(".storybook",`${config}.ts`);fs5.existsSync(configFile)||(configFile=path9.join(".storybook",`${config}.js`),fs5.existsSync(configFile)||fs5.writeFileSync(configFile,"","utf8")),sync$1("npx",["jscodeshift","-t",codemod,configFile],{stdio:"inherit",shell:!0}),skipMsg=null;}catch{}})):skipMsg="no .storybook config":skipMsg="unofficial addon",skipMsg&&commandLog(`Skipping postinstall for ${addonName}, ${skipMsg}`)();},getVersionSpecifier=addon=>{let groups=/^(...*)@(.*)$/.exec(addon);return groups?[groups[1],groups[2]]:[addon,void 0]};async function add(addon,options){let{packageManager:pkgMgr}=options;options.useNpm&&(useNpmWarning(),pkgMgr="npm");let packageManager=JsPackageManagerFactory.getPackageManager({force:pkgMgr}),packageJson=await packageManager.retrievePackageJson(),[addonName,versionSpecifier]=getVersionSpecifier(addon),{mainConfig,version:storybookVersion}=getStorybookInfo(packageJson);if(!mainConfig){logger19.error("Unable to find storybook main.js config");return}let main=await readConfig(mainConfig);logger19.log(`Verifying ${addonName}`);let latestVersion=await packageManager.latestVersion(addonName);latestVersion||logger19.error(`Unknown addon ${addonName}`);let isStorybookAddon=addonName.startsWith("@storybook/"),addonWithVersion=`${addonName}@${versionSpecifier||(isStorybookAddon?storybookVersion:latestVersion)}`;logger19.log(`Installing ${addonWithVersion}`),await packageManager.addDependencies({installAsDevDependencies:!0},[addonWithVersion]),logger19.log(`Adding '${addon}' to main.js addons field.`),main.appendValueToArray(["addons"],addonName),await writeConfig(main),options.skipPostinstall||await postinstallAddon(addon,isStorybookAddon);}var logger20=console,getNextGlob=glob2=>{let extGlobsRegex=new RegExp(/(.*\.)(stories\.@.*)(\|mdx|mdx\|)(.*)$/i);if(glob2.match(extGlobsRegex))return glob2.replace(extGlobsRegex,"$1@(mdx|$2$4)");let allStoriesExtensionsRegex=new RegExp(/(.*\.)(stories\.\*)$/i);return glob2.match(allStoriesExtensionsRegex)?glob2.replace(allStoriesExtensionsRegex,"$1@(mdx|$2)"):glob2.replaceAll(".stories.mdx",".mdx")},bareMdxStoriesGlob={id:"bare-mdx-stories-glob",async check({packageManager,configDir}){let{storybookVersion,mainConfig}=await getStorybookData({configDir,packageManager});if(!semver.gte(storybookVersion,"7.0.0"))return null;let existingStoriesEntries=mainConfig.stories;if(!existingStoriesEntries)throw new Error(dedent16`
|
|
385
385
|
❌ Unable to determine Storybook stories globs in ${chalk12.blue(mainConfig)}, skipping ${chalk12.cyan(this.id)} fix.
|
|
386
386
|
|
|
387
387
|
In Storybook 7, we have deprecated defining stories in MDX files, and consequently have changed the suffix to simply .mdx.
|
|
@@ -404,11 +404,11 @@ To run your Storybook, type:
|
|
|
404
404
|
|
|
405
405
|
To learn more about this change, see: ${chalk12.yellow("https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#mdx-docs-files")}
|
|
406
406
|
`},async run({dryRun,mainConfigPath,result:{nextStoriesEntries}}){logger20.info(dedent16`✅ Setting 'stories' config:
|
|
407
|
-
${JSON.stringify(nextStoriesEntries,null,2)}`),dryRun||await updateMainConfig({mainConfigPath,dryRun},async main=>{main.setFieldValue(["stories"],nextStoriesEntries);});}};var logger21=console;async function migrate(migration,{glob:glob2,dryRun,list,rename,parser}){if(list)listCodemods().forEach(key=>logger21.log(key));else if(migration)migration==="mdx-to-csf"&&!dryRun&&(await runFixes({fixes:[bareMdxStoriesGlob]}),await addStorybookBlocksPackage()),await runCodemod(migration,{glob:glob2,dryRun,logger:logger21,rename,parser});else throw new Error("Migrate: please specify a migration name or --list")}async function addStorybookBlocksPackage(){let packageManager=JsPackageManagerFactory.getPackageManager(),packageJson=packageManager.retrievePackageJson(),versionToInstall=getStorybookVersionSpecifier(packageManager.retrievePackageJson());logger21.info('\u2705 Adding "@storybook/blocks" package'),await packageManager.addDependencies({installAsDevDependencies:!0,packageJson},[`@storybook/blocks@${versionToInstall}`]);}var read=async url=>{let browser=await usePuppeteerBrowser(),page=await browser.newPage();await page.goto(url),await page.waitForFunction(`
|
|
407
|
+
${JSON.stringify(nextStoriesEntries,null,2)}`),dryRun||await updateMainConfig({mainConfigPath,dryRun},async main=>{main.setFieldValue(["stories"],nextStoriesEntries);});}};var logger21=console;async function migrate(migration,{glob:glob2,dryRun,list,rename,parser}){if(list)listCodemods().forEach(key=>logger21.log(key));else if(migration)migration==="mdx-to-csf"&&!dryRun&&(await runFixes({fixes:[bareMdxStoriesGlob]}),await addStorybookBlocksPackage()),await runCodemod(migration,{glob:glob2,dryRun,logger:logger21,rename,parser});else throw new Error("Migrate: please specify a migration name or --list")}async function addStorybookBlocksPackage(){let packageManager=JsPackageManagerFactory.getPackageManager(),packageJson=await packageManager.retrievePackageJson(),versionToInstall=getStorybookVersionSpecifier(await packageManager.retrievePackageJson());logger21.info('\u2705 Adding "@storybook/blocks" package'),await packageManager.addDependencies({installAsDevDependencies:!0,packageJson},[`@storybook/blocks@${versionToInstall}`]);}var read=async url=>{let browser=await usePuppeteerBrowser(),page=await browser.newPage();await page.goto(url),await page.waitForFunction(`
|
|
408
408
|
(window.__STORYBOOK_PREVIEW__ && window.__STORYBOOK_PREVIEW__.extract && window.__STORYBOOK_PREVIEW__.extract()) ||
|
|
409
409
|
(window.__STORYBOOK_STORY_STORE__ && window.__STORYBOOK_STORY_STORE__.extract && window.__STORYBOOK_STORY_STORE__.extract())
|
|
410
410
|
`);let data=JSON.parse(await page.evaluate(async()=>JSON.stringify(window.__STORYBOOK_STORY_STORE__.getStoriesJsonData(),null,2)));return setImmediate(()=>{browser.close();}),data},useLocation=async input=>{if(await stat(path9.resolve(input)),input.match(/^http/))return [input,async()=>{}];let app=express();app.use(express.static(input));let port=await getPort();return new Promise(resolve=>{let server=app.listen(port,()=>{let result=`http://localhost:${port}/iframe.html`;logger.info(`connecting to: ${result}`),resolve([result,server.close.bind(server)]);});})},usePuppeteerBrowser=async()=>{let args=["--no-sandbox ","--disable-setuid-sandbox"];try{return await puppeteerCore.launch({args,executablePath:process.env.SB_CHROMIUM_PATH})}catch{return logger.info("installing puppeteer..."),new Promise((resolve,reject)=>{__require("child_process").exec(`node ${__require.resolve(path9.join("puppeteer-core","install.js"))}`,error=>error?reject(error):resolve(puppeteerCore.launch({args})));})}};async function extract(input,targetPath){if(input&&targetPath){let[location,exit]=await useLocation(input),data=await read(location);await writeFile(targetPath,JSON.stringify(data,null,2)),await exit();}else throw new Error("Extract: please specify a path where your built-storybook is (can be a public url) and a target directory")}var versionRegex=/(@storybook\/[^@]+)@(\S+)/,getStorybookVersion=line=>{if(line.startsWith("npm "))return null;let match=versionRegex.exec(line);return !match||!semver.clean(match[2])?null:{package:match[1],version:match[2]}},excludeList=["@storybook/addon-bench","@storybook/addon-console","@storybook/addon-postcss","@storybook/babel-plugin-require-context-hook","@storybook/bench","@storybook/builder-vite","@storybook/csf","@storybook/design-system","@storybook/ember-cli-storybook","@storybook/eslint-config-storybook","@storybook/expect","@storybook/jest","@storybook/linter-config","@storybook/mdx1-csf","@storybook/mdx2-csf","@storybook/react-docgen-typescript-plugin","@storybook/storybook-deployer","@storybook/test-runner","@storybook/testing-library","@storybook/testing-react"],isCorePackage=pkg2=>pkg2.startsWith("@storybook/")&&!pkg2.startsWith("@storybook/preset-")&&!excludeList.includes(pkg2),deprecatedPackages=[{minVersion:"6.0.0-alpha.0",url:"https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#60-deprecations",deprecations:["@storybook/addon-notes","@storybook/addon-info","@storybook/addon-contexts","@storybook/addon-options","@storybook/addon-centered"]}],formatPackage=pkg2=>`${pkg2.package}@${pkg2.version}`,warnPackages=pkgs=>pkgs.forEach(pkg2=>logger.warn(`- ${formatPackage(pkg2)}`)),checkVersionConsistency=()=>{let storybookPackages=sync$1("npm",["ls"],{stdio:"pipe",shell:!0}).output.toString().split(`
|
|
411
|
-
`).map(getStorybookVersion).filter(Boolean).filter(pkg2=>isCorePackage(pkg2.package));if(!storybookPackages.length){logger.warn("No storybook core packages found."),logger.warn("'npm ls | grep storybook' can show if multiple versions are installed.");return}storybookPackages.sort((a,b)=>semver.rcompare(a.version,b.version));let latestVersion=storybookPackages[0].version,outdated=storybookPackages.filter(pkg2=>pkg2.version!==latestVersion);outdated.length>0&&(logger.warn(`Found ${outdated.length} outdated packages (relative to '${formatPackage(storybookPackages[0])}')`),logger.warn("Please make sure your packages are updated to ensure a consistent experience."),warnPackages(outdated)),deprecatedPackages.forEach(({minVersion,url,deprecations})=>{if(semver.gte(latestVersion,minVersion)){let deprecated=storybookPackages.filter(pkg2=>deprecations.includes(pkg2.package));deprecated.length>0&&(logger.warn(`Found ${deprecated.length} deprecated packages since ${minVersion}`),logger.warn(`See ${url}`),warnPackages(deprecated));}});},EXTRA_FLAGS={"react-scripts@<5":["--reject","/preset-create-react-app/"]},addExtraFlags=(extraFlags,flags,{dependencies,devDependencies})=>Object.entries(extraFlags).reduce((acc,entry)=>{let[pattern,extra]=entry,[pkg2,specifier]=getPackageDetails(pattern),pkgVersion=dependencies[pkg2]||devDependencies[pkg2];return pkgVersion&&semver.satisfies(semver.coerce(pkgVersion),specifier)?[...acc,...extra]:acc},[...flags]),doUpgrade=async({tag,prerelease,skipCheck,useNpm,packageManager:pkgMgr,dryRun,configDir,yes,...options})=>{useNpm&&(useNpmWarning(),pkgMgr="npm");let packageManager=JsPackageManagerFactory.getPackageManager({force:pkgMgr}),beforeVersion=await getStorybookCoreVersion();if(commandLog("Checking for latest versions of '@storybook/*' packages"),tag&&prerelease)throw new Error("Cannot set both --tag and --prerelease. Use --tag next to get the latest prereleae");let target="latest";prerelease?target="@next":tag&&(target=`@${tag}`);let flags=[];dryRun||flags.push("--upgrade"),flags.push("--target"),flags.push(target),flags=addExtraFlags(EXTRA_FLAGS,flags,packageManager.retrievePackageJson());let check=sync$1("npx",["npm-check-updates@latest","/storybook/",...flags],{stdio:"pipe",shell:!0}).output.toString();logger.info(check);let checkSb=sync$1("npx",["npm-check-updates@latest","sb",...flags],{stdio:"pipe",shell:!0}).output.toString();logger.info(checkSb),dryRun||(commandLog("Installing upgrades"),packageManager.installDependencies());let automigrationResults;if(skipCheck||(checkVersionConsistency(),automigrationResults=await automigrate({dryRun,yes,packageManager:pkgMgr,configDir})),!options.disableTelemetry){let afterVersion=await getStorybookCoreVersion(),{preCheckFailure,...results}=automigrationResults||{};telemetry("upgrade",{prerelease,tag,beforeVersion,afterVersion,...{automigrationResults:preCheckFailure?null:results,automigrationPreCheckFailure:preCheckFailure||null}});}};async function upgrade(options){await withTelemetry("upgrade",{cliOptions:options},()=>doUpgrade(options));}var baseTemplates={"cra/default-js":{name:"Create React App (Javascript)",script:"npx create-react-app .",expected:{framework:"@storybook/react-webpack5",renderer:"@storybook/react",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"cra/default-ts":{name:"Create React App (Typescript)",script:"npx create-react-app . --template typescript",skipTasks:["smoke-test"],expected:{framework:"@storybook/react-webpack5",renderer:"@storybook/react",builder:"@storybook/builder-webpack5"}},"nextjs/12-js":{name:"Next.js v12 (JavaScript)",script:'yarn create next-app {{beforeDir}} -e https://github.com/vercel/next.js/tree/next-12-3-2/examples/hello-world && cd {{beforeDir}} && npm pkg set "dependencies.next"="^12.2.0" && yarn && git add . && git commit --amend --no-edit && cd ..',expected:{framework:"@storybook/nextjs",renderer:"@storybook/react",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"nextjs/default-js":{name:"Next.js (JavaScript)",script:"yarn create next-app {{beforeDir}} --javascript --eslint",expected:{framework:"@storybook/nextjs",renderer:"@storybook/react",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"nextjs/default-ts":{name:"Next.js (TypeScript)",script:"yarn create next-app {{beforeDir}} --typescript --eslint",expected:{framework:"@storybook/nextjs",renderer:"@storybook/react",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"react-vite/default-js":{name:"React Vite (JS)",script:"npm create vite@latest --yes . -- --template react",expected:{framework:"@storybook/react-vite",renderer:"@storybook/react",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"react-vite/default-ts":{name:"React Vite (TS)",script:"npm create vite@latest --yes . -- --template react-ts",expected:{framework:"@storybook/react-vite",renderer:"@storybook/react",builder:"@storybook/builder-vite"}},"react-webpack/18-ts":{name:"React 18 Webpack5 (TS)",script:"yarn create webpack5-react .",expected:{framework:"@storybook/react-webpack5",renderer:"@storybook/react",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"react-webpack/17-ts":{name:"React 17 Webpack5 (TS)",script:'yarn create webpack5-react . --version-react="17" --version-react-dom="17"',expected:{framework:"@storybook/react-webpack5",renderer:"@storybook/react",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"solid-vite/default-js":{name:"SolidJS Vite (JS)",script:"npx degit solidjs/templates/js .",expected:{framework:"storybook-solidjs-vite",renderer:"storybook-solidjs",builder:"@storybook/builder-vite"},inDevelopment:!0,skipTasks:["e2e-tests-dev"]},"solid-vite/default-ts":{name:"SolidJS Vite (TS)",script:"npx degit solidjs/templates/ts .",expected:{framework:"storybook-solidjs-vite",renderer:"storybook-solidjs",builder:"@storybook/builder-vite"},inDevelopment:!0,skipTasks:["e2e-tests-dev"]},"vue3-vite/default-js":{name:"Vue3 Vite (JS)",script:"npm create vite@latest --yes . -- --template vue",expected:{framework:"@storybook/vue3-vite",renderer:"@storybook/vue3",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"vue3-vite/default-ts":{name:"Vue3 Vite (TS)",script:"npm create vite@latest --yes . -- --template vue-ts",expected:{framework:"@storybook/vue3-vite",renderer:"@storybook/vue3",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"vue2-vite/2.7-js":{name:"Vue2 Vite (vue 2.7 JS)",script:"npx create-vue@2 {{beforeDir}} --default",expected:{framework:"@storybook/vue-vite",renderer:"@storybook/vue",builder:"@storybook/builder-vite"},skipTasks:["smoke-test","e2e-tests-dev"]},"html-webpack/default":{name:"HTML Webpack5",script:"yarn create webpack5-html .",expected:{framework:"@storybook/html-webpack5",renderer:"@storybook/html",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"html-vite/default-js":{name:"HTML Vite JS",script:'npm create vite@latest --yes . -- --template vanilla && echo "export default {}" > vite.config.js',expected:{framework:"@storybook/html-vite",renderer:"@storybook/html",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"html-vite/default-ts":{name:"HTML Vite TS",script:'npm create vite@latest --yes . -- --template vanilla-ts && echo "export default {}" > vite.config.js',expected:{framework:"@storybook/html-vite",renderer:"@storybook/html",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"svelte-vite/default-js":{name:"Svelte Vite (JS)",script:"npm create vite@latest --yes . -- --template svelte",expected:{framework:"@storybook/svelte-vite",renderer:"@storybook/svelte",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"svelte-vite/default-ts":{name:"Svelte Vite (TS)",script:"npm create vite@latest --yes . -- --template svelte-ts",expected:{framework:"@storybook/svelte-vite",renderer:"@storybook/svelte",builder:"@storybook/builder-vite"},skipTasks:["smoke-test","e2e-tests-dev"]},"angular-cli/prerelease":{name:"Angular CLI (Prerelease)",script:"npx -p @angular/cli@next ng new angular-v16 --directory . --routing=true --minimal=true --style=scss --strict --skip-git --skip-install --package-manager=yarn",expected:{framework:"@storybook/angular",renderer:"@storybook/angular",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"angular-cli/default-ts":{name:"Angular CLI (latest)",script:"npx -p @angular/cli ng new angular-latest --directory . --routing=true --minimal=true --style=scss --strict --skip-git --skip-install --package-manager=yarn",expected:{framework:"@storybook/angular",renderer:"@storybook/angular",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"angular-cli/14-ts":{name:"Angular CLI (Version 14)",script:"npx -p @angular/cli@14 ng new angular-v14 --directory . --routing=true --minimal=true --style=scss --strict --skip-git --skip-install --package-manager=yarn",expected:{framework:"@storybook/angular",renderer:"@storybook/angular",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"svelte-kit/skeleton-js":{name:"Svelte Kit (JS)",script:"yarn create svelte-with-args --name=svelte-kit/skeleton-js --directory=. --template=skeleton --types=null --no-prettier --no-eslint --no-playwright --no-vitest",expected:{framework:"@storybook/sveltekit",renderer:"@storybook/svelte",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"svelte-kit/skeleton-ts":{name:"Svelte Kit (TS)",script:"yarn create svelte-with-args --name=svelte-kit/skeleton-ts --directory=. --template=skeleton --types=typescript --no-prettier --no-eslint --no-playwright --no-vitest",expected:{framework:"@storybook/sveltekit",renderer:"@storybook/svelte",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"lit-vite/default-js":{name:"Lit Vite (JS)",script:'npm create vite@latest --yes . -- --template lit && echo "export default {}" > vite.config.js',expected:{framework:"@storybook/web-components-vite",renderer:"@storybook/web-components",builder:"@storybook/builder-vite"},skipTasks:["smoke-test","e2e-tests-dev"]},"lit-vite/default-ts":{name:"Lit Vite (TS)",script:'npm create vite@latest --yes . -- --template lit-ts && echo "export default {}" > vite.config.js',expected:{framework:"@storybook/web-components-vite",renderer:"@storybook/web-components",builder:"@storybook/builder-vite"},skipTasks:["smoke-test","e2e-tests-dev"]},"vue-cli/default-js":{name:"Vue-CLI (Default JS)",script:"npx -p @vue/cli vue create . --default --packageManager=yarn --force --merge",expected:{framework:"@storybook/vue3-webpack5",renderer:"@storybook/vue3",builder:"@storybook/builder-webpack5"},skipTasks:["smoke-test","e2e-tests-dev"]},"vue-cli/vue2-default-js":{name:"Vue-CLI (Vue2 JS)",script:'npx -p @vue/cli vue create . --default --packageManager=yarn --force --merge --preset="Default (Vue 2)"',expected:{framework:"@storybook/vue-webpack5",renderer:"@storybook/vue",builder:"@storybook/builder-webpack5"},skipTasks:["smoke-test","e2e-tests-dev"]},"preact-webpack5/default-js":{name:"Preact CLI (Default JS)",script:"npx preact-cli create default {{beforeDir}} --name preact-app --yarn --no-install",expected:{framework:"@storybook/preact-webpack5",renderer:"@storybook/preact",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"preact-webpack5/default-ts":{name:"Preact CLI (Default TS)",script:"npx preact-cli create typescript {{beforeDir}} --name preact-app --yarn --no-install",expected:{framework:"@storybook/preact-webpack5",renderer:"@storybook/preact",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"preact-vite/default-js":{name:"Preact Vite (JS)",script:"npm create vite@latest --yes . -- --template preact",expected:{framework:"@storybook/preact-vite",renderer:"@storybook/preact",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"preact-vite/default-ts":{name:"Preact Vite (TS)",script:"npm create vite@latest --yes . -- --template preact-ts",expected:{framework:"@storybook/preact-vite",renderer:"@storybook/preact",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"qwik-vite/default-ts":{name:"Qwik CLI (Default TS)",script:"yarn create qwik basic {{beforeDir}} --no-install",inDevelopment:!0,expected:{framework:"storybook-framework-qwik",renderer:"storybook-framework-qwik",builder:"storybook-framework-qwik"},skipTasks:["e2e-tests","e2e-tests-dev"]}},internalTemplates={"internal/ssv6-vite":{...baseTemplates["react-vite/default-ts"],name:"StoryStore v6 (react-vite/default-ts)",isInternal:!0,modifications:{mainConfig:{features:{storyStoreV7:!1,storyStoreV7MdxErrors:!1}}}},"internal/ssv6-webpack":{...baseTemplates["cra/default-ts"],name:"StoryStore v6 (cra/default-ts)",isInternal:!0,modifications:{mainConfig:{features:{storyStoreV7:!1,storyStoreV7MdxErrors:!1}}}}},allTemplates={...baseTemplates,...internalTemplates};var logger24=console,toChoices=c=>({title:allTemplates[c].name,value:c}),sandbox=async({output:outputDirectory,filterValue,branch,init})=>{let selectedConfig=allTemplates[filterValue],selectedTemplate=selectedConfig?filterValue:null;if(!selectedConfig){let filterRegex=new RegExp(`^${filterValue||""}`,"i"),keys=Object.keys(allTemplates),choices=keys.reduce((acc,group)=>{let current=allTemplates[group];return (!filterValue||current.name.match(filterRegex)||group.match(filterRegex)||current.expected.builder.match(filterRegex)||current.expected.framework.match(filterRegex)||current.expected.renderer.match(filterRegex))&&acc.push(group),acc},[]);if(choices.length===0&&(logger24.info(boxen3(dedent`
|
|
411
|
+
`).map(getStorybookVersion).filter(Boolean).filter(pkg2=>isCorePackage(pkg2.package));if(!storybookPackages.length){logger.warn("No storybook core packages found."),logger.warn("'npm ls | grep storybook' can show if multiple versions are installed.");return}storybookPackages.sort((a,b)=>semver.rcompare(a.version,b.version));let latestVersion=storybookPackages[0].version,outdated=storybookPackages.filter(pkg2=>pkg2.version!==latestVersion);outdated.length>0&&(logger.warn(`Found ${outdated.length} outdated packages (relative to '${formatPackage(storybookPackages[0])}')`),logger.warn("Please make sure your packages are updated to ensure a consistent experience."),warnPackages(outdated)),deprecatedPackages.forEach(({minVersion,url,deprecations})=>{if(semver.gte(latestVersion,minVersion)){let deprecated=storybookPackages.filter(pkg2=>deprecations.includes(pkg2.package));deprecated.length>0&&(logger.warn(`Found ${deprecated.length} deprecated packages since ${minVersion}`),logger.warn(`See ${url}`),warnPackages(deprecated));}});},EXTRA_FLAGS={"react-scripts@<5":["--reject","/preset-create-react-app/"]},addExtraFlags=(extraFlags,flags,{dependencies,devDependencies})=>Object.entries(extraFlags).reduce((acc,entry)=>{let[pattern,extra]=entry,[pkg2,specifier]=getPackageDetails(pattern),pkgVersion=dependencies[pkg2]||devDependencies[pkg2];return pkgVersion&&semver.satisfies(semver.coerce(pkgVersion),specifier)?[...acc,...extra]:acc},[...flags]),doUpgrade=async({tag,prerelease,skipCheck,useNpm,packageManager:pkgMgr,dryRun,configDir,yes,...options})=>{useNpm&&(useNpmWarning(),pkgMgr="npm");let packageManager=JsPackageManagerFactory.getPackageManager({force:pkgMgr}),beforeVersion=await getStorybookCoreVersion();if(commandLog("Checking for latest versions of '@storybook/*' packages"),tag&&prerelease)throw new Error("Cannot set both --tag and --prerelease. Use --tag next to get the latest prereleae");let target="latest";prerelease?target="@next":tag&&(target=`@${tag}`);let flags=[];dryRun||flags.push("--upgrade"),flags.push("--target"),flags.push(target),flags=addExtraFlags(EXTRA_FLAGS,flags,await packageManager.retrievePackageJson());let check=sync$1("npx",["npm-check-updates@latest","/storybook/",...flags],{stdio:"pipe",shell:!0}).output.toString();logger.info(check);let checkSb=sync$1("npx",["npm-check-updates@latest","sb",...flags],{stdio:"pipe",shell:!0}).output.toString();logger.info(checkSb),dryRun||(commandLog("Installing upgrades"),await packageManager.installDependencies());let automigrationResults;if(skipCheck||(checkVersionConsistency(),automigrationResults=await automigrate({dryRun,yes,packageManager:pkgMgr,configDir})),!options.disableTelemetry){let afterVersion=await getStorybookCoreVersion(),{preCheckFailure,...results}=automigrationResults||{};telemetry("upgrade",{prerelease,tag,beforeVersion,afterVersion,...{automigrationResults:preCheckFailure?null:results,automigrationPreCheckFailure:preCheckFailure||null}});}};async function upgrade(options){await withTelemetry("upgrade",{cliOptions:options},()=>doUpgrade(options));}var baseTemplates={"cra/default-js":{name:"Create React App (Javascript)",script:"npx create-react-app .",expected:{framework:"@storybook/react-webpack5",renderer:"@storybook/react",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"cra/default-ts":{name:"Create React App (Typescript)",script:"npx create-react-app . --template typescript",skipTasks:["smoke-test"],expected:{framework:"@storybook/react-webpack5",renderer:"@storybook/react",builder:"@storybook/builder-webpack5"}},"nextjs/12-js":{name:"Next.js v12 (JavaScript)",script:'yarn create next-app {{beforeDir}} -e https://github.com/vercel/next.js/tree/next-12-3-2/examples/hello-world && cd {{beforeDir}} && npm pkg set "dependencies.next"="^12.2.0" && yarn && git add . && git commit --amend --no-edit && cd ..',expected:{framework:"@storybook/nextjs",renderer:"@storybook/react",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"nextjs/default-js":{name:"Next.js (JavaScript)",script:"yarn create next-app {{beforeDir}} --javascript --eslint",expected:{framework:"@storybook/nextjs",renderer:"@storybook/react",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"nextjs/default-ts":{name:"Next.js (TypeScript)",script:"yarn create next-app {{beforeDir}} --typescript --eslint",expected:{framework:"@storybook/nextjs",renderer:"@storybook/react",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"react-vite/default-js":{name:"React Vite (JS)",script:"npm create vite@latest --yes . -- --template react",expected:{framework:"@storybook/react-vite",renderer:"@storybook/react",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"react-vite/default-ts":{name:"React Vite (TS)",script:"npm create vite@latest --yes . -- --template react-ts",expected:{framework:"@storybook/react-vite",renderer:"@storybook/react",builder:"@storybook/builder-vite"}},"react-webpack/18-ts":{name:"React 18 Webpack5 (TS)",script:"yarn create webpack5-react .",expected:{framework:"@storybook/react-webpack5",renderer:"@storybook/react",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"react-webpack/17-ts":{name:"React 17 Webpack5 (TS)",script:'yarn create webpack5-react . --version-react="17" --version-react-dom="17"',expected:{framework:"@storybook/react-webpack5",renderer:"@storybook/react",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"solid-vite/default-js":{name:"SolidJS Vite (JS)",script:"npx degit solidjs/templates/js .",expected:{framework:"storybook-solidjs-vite",renderer:"storybook-solidjs",builder:"@storybook/builder-vite"},inDevelopment:!0,skipTasks:["e2e-tests-dev"]},"solid-vite/default-ts":{name:"SolidJS Vite (TS)",script:"npx degit solidjs/templates/ts .",expected:{framework:"storybook-solidjs-vite",renderer:"storybook-solidjs",builder:"@storybook/builder-vite"},inDevelopment:!0,skipTasks:["e2e-tests-dev"]},"vue3-vite/default-js":{name:"Vue3 Vite (JS)",script:"npm create vite@latest --yes . -- --template vue",expected:{framework:"@storybook/vue3-vite",renderer:"@storybook/vue3",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"vue3-vite/default-ts":{name:"Vue3 Vite (TS)",script:"npm create vite@latest --yes . -- --template vue-ts",expected:{framework:"@storybook/vue3-vite",renderer:"@storybook/vue3",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"vue2-vite/2.7-js":{name:"Vue2 Vite (vue 2.7 JS)",script:"npx create-vue@2 {{beforeDir}} --default",expected:{framework:"@storybook/vue-vite",renderer:"@storybook/vue",builder:"@storybook/builder-vite"},skipTasks:["smoke-test","e2e-tests-dev"]},"html-webpack/default":{name:"HTML Webpack5",script:"yarn create webpack5-html .",expected:{framework:"@storybook/html-webpack5",renderer:"@storybook/html",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"html-vite/default-js":{name:"HTML Vite JS",script:'npm create vite@latest --yes . -- --template vanilla && echo "export default {}" > vite.config.js',expected:{framework:"@storybook/html-vite",renderer:"@storybook/html",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"html-vite/default-ts":{name:"HTML Vite TS",script:'npm create vite@latest --yes . -- --template vanilla-ts && echo "export default {}" > vite.config.js',expected:{framework:"@storybook/html-vite",renderer:"@storybook/html",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"svelte-vite/default-js":{name:"Svelte Vite (JS)",script:"npm create vite@latest --yes . -- --template svelte",expected:{framework:"@storybook/svelte-vite",renderer:"@storybook/svelte",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"svelte-vite/default-ts":{name:"Svelte Vite (TS)",script:"npm create vite@latest --yes . -- --template svelte-ts",expected:{framework:"@storybook/svelte-vite",renderer:"@storybook/svelte",builder:"@storybook/builder-vite"},skipTasks:["smoke-test","e2e-tests-dev"]},"angular-cli/prerelease":{name:"Angular CLI (Prerelease)",script:"npx -p @angular/cli@next ng new angular-v16 --directory . --routing=true --minimal=true --style=scss --strict --skip-git --skip-install --package-manager=yarn",expected:{framework:"@storybook/angular",renderer:"@storybook/angular",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"angular-cli/default-ts":{name:"Angular CLI (latest)",script:"npx -p @angular/cli ng new angular-latest --directory . --routing=true --minimal=true --style=scss --strict --skip-git --skip-install --package-manager=yarn",expected:{framework:"@storybook/angular",renderer:"@storybook/angular",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"angular-cli/14-ts":{name:"Angular CLI (Version 14)",script:"npx -p @angular/cli@14 ng new angular-v14 --directory . --routing=true --minimal=true --style=scss --strict --skip-git --skip-install --package-manager=yarn",expected:{framework:"@storybook/angular",renderer:"@storybook/angular",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"svelte-kit/skeleton-js":{name:"Svelte Kit (JS)",script:"yarn create svelte-with-args --name=svelte-kit/skeleton-js --directory=. --template=skeleton --types=null --no-prettier --no-eslint --no-playwright --no-vitest",expected:{framework:"@storybook/sveltekit",renderer:"@storybook/svelte",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"svelte-kit/skeleton-ts":{name:"Svelte Kit (TS)",script:"yarn create svelte-with-args --name=svelte-kit/skeleton-ts --directory=. --template=skeleton --types=typescript --no-prettier --no-eslint --no-playwright --no-vitest",expected:{framework:"@storybook/sveltekit",renderer:"@storybook/svelte",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"lit-vite/default-js":{name:"Lit Vite (JS)",script:'npm create vite@latest --yes . -- --template lit && echo "export default {}" > vite.config.js',expected:{framework:"@storybook/web-components-vite",renderer:"@storybook/web-components",builder:"@storybook/builder-vite"},skipTasks:["smoke-test","e2e-tests-dev"]},"lit-vite/default-ts":{name:"Lit Vite (TS)",script:'npm create vite@latest --yes . -- --template lit-ts && echo "export default {}" > vite.config.js',expected:{framework:"@storybook/web-components-vite",renderer:"@storybook/web-components",builder:"@storybook/builder-vite"},skipTasks:["smoke-test","e2e-tests-dev"]},"vue-cli/default-js":{name:"Vue-CLI (Default JS)",script:"npx -p @vue/cli vue create . --default --packageManager=yarn --force --merge",expected:{framework:"@storybook/vue3-webpack5",renderer:"@storybook/vue3",builder:"@storybook/builder-webpack5"},skipTasks:["smoke-test","e2e-tests-dev"]},"vue-cli/vue2-default-js":{name:"Vue-CLI (Vue2 JS)",script:'npx -p @vue/cli vue create . --default --packageManager=yarn --force --merge --preset="Default (Vue 2)"',expected:{framework:"@storybook/vue-webpack5",renderer:"@storybook/vue",builder:"@storybook/builder-webpack5"},skipTasks:["smoke-test","e2e-tests-dev"]},"preact-webpack5/default-js":{name:"Preact CLI (Default JS)",script:"npx preact-cli create default {{beforeDir}} --name preact-app --yarn --no-install",expected:{framework:"@storybook/preact-webpack5",renderer:"@storybook/preact",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"preact-webpack5/default-ts":{name:"Preact CLI (Default TS)",script:"npx preact-cli create typescript {{beforeDir}} --name preact-app --yarn --no-install",expected:{framework:"@storybook/preact-webpack5",renderer:"@storybook/preact",builder:"@storybook/builder-webpack5"},skipTasks:["e2e-tests-dev"]},"preact-vite/default-js":{name:"Preact Vite (JS)",script:"npm create vite@latest --yes . -- --template preact",expected:{framework:"@storybook/preact-vite",renderer:"@storybook/preact",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"preact-vite/default-ts":{name:"Preact Vite (TS)",script:"npm create vite@latest --yes . -- --template preact-ts",expected:{framework:"@storybook/preact-vite",renderer:"@storybook/preact",builder:"@storybook/builder-vite"},skipTasks:["e2e-tests-dev"]},"qwik-vite/default-ts":{name:"Qwik CLI (Default TS)",script:"yarn create qwik basic {{beforeDir}} --no-install",inDevelopment:!0,expected:{framework:"storybook-framework-qwik",renderer:"storybook-framework-qwik",builder:"storybook-framework-qwik"},skipTasks:["e2e-tests","e2e-tests-dev"]}},internalTemplates={"internal/ssv6-vite":{...baseTemplates["react-vite/default-ts"],name:"StoryStore v6 (react-vite/default-ts)",isInternal:!0,modifications:{mainConfig:{features:{storyStoreV7:!1,storyStoreV7MdxErrors:!1}}}},"internal/ssv6-webpack":{...baseTemplates["cra/default-ts"],name:"StoryStore v6 (cra/default-ts)",isInternal:!0,modifications:{mainConfig:{features:{storyStoreV7:!1,storyStoreV7MdxErrors:!1}}}},"internal/server-webpack5":{name:"Server Webpack5",script:"yarn init -y",expected:{framework:"@storybook/server-webpack5",renderer:"@storybook/server",builder:"@storybook/builder-webpack5"},isInternal:!0,inDevelopment:!0}},allTemplates={...baseTemplates,...internalTemplates};var logger24=console,toChoices=c=>({title:allTemplates[c].name,value:c}),sandbox=async({output:outputDirectory,filterValue,branch,init})=>{let selectedConfig=allTemplates[filterValue],selectedTemplate=selectedConfig?filterValue:null;if(!selectedConfig){let filterRegex=new RegExp(`^${filterValue||""}`,"i"),keys=Object.keys(allTemplates),choices=keys.reduce((acc,group)=>{let current=allTemplates[group];return (!filterValue||current.name.match(filterRegex)||group.match(filterRegex)||current.expected.builder.match(filterRegex)||current.expected.framework.match(filterRegex)||current.expected.renderer.match(filterRegex))&&acc.push(group),acc},[]);if(choices.length===0&&(logger24.info(boxen3(dedent`
|
|
412
412
|
🔎 You filtered out all templates. 🔍
|
|
413
413
|
|
|
414
414
|
After filtering all the templates with "${chalk12.yellow(filterValue)}", we found no results. Please try again with a different filter.
|