@storybook/cli 9.0.6 → 9.0.8
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/bin/index.cjs +5 -5
- package/package.json +4 -4
package/dist/bin/index.cjs
CHANGED
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
2. Upgrade to ${import_picocolors33.default.bold("Vitest 3")} to continue using the addon
|
|
104
104
|
|
|
105
105
|
After addressing this, you can try running the upgrade command again.
|
|
106
|
-
`}}}});var import_cli5=require("storybook/internal/cli"),import_common25=require("storybook/internal/common"),import_core_server2=require("storybook/internal/core-server"),import_node_logger4=require("storybook/internal/node-logger"),import_telemetry2=require("storybook/internal/telemetry"),import_commander=require("commander"),import_envinfo=__toESM(require("envinfo"),1),import_leven=__toESM(require("leven"),1),import_picocolors36=__toESM(require_picocolors(),1);var version="9.0.
|
|
106
|
+
`}}}});var import_cli5=require("storybook/internal/cli"),import_common25=require("storybook/internal/common"),import_core_server2=require("storybook/internal/core-server"),import_node_logger4=require("storybook/internal/node-logger"),import_telemetry2=require("storybook/internal/telemetry"),import_commander=require("commander"),import_envinfo=__toESM(require("envinfo"),1),import_leven=__toESM(require("leven"),1),import_picocolors36=__toESM(require_picocolors(),1);var version="9.0.8";var import_node_path2=require("path"),import_common3=require("storybook/internal/common"),import_csf_tools2=require("storybook/internal/csf-tools"),import_prompts=__toESM(require("prompts"),1),import_semver=__toESM(require("semver"),1),import_ts_dedent2=require("ts-dedent");var import_babel=require("storybook/internal/babel"),defaultRequireWrapperName="getAbsolutePath";function doesVariableOrFunctionDeclarationExist(node,name){return import_babel.types.isVariableDeclaration(node)&&node.declarations.length===1&&import_babel.types.isVariableDeclarator(node.declarations[0])&&import_babel.types.isIdentifier(node.declarations[0].id)&&node.declarations[0].id?.name===name||import_babel.types.isFunctionDeclaration(node)&&import_babel.types.isIdentifier(node.id)&&node.id.name===name}function getReferenceToRequireWrapper(config,value){return import_babel.types.callExpression(import_babel.types.identifier(getRequireWrapperName(config)??defaultRequireWrapperName),[import_babel.types.stringLiteral(value)])}function getRequireWrapperName(config){let declarationName=config.getBodyDeclarations().flatMap(node=>doesVariableOrFunctionDeclarationExist(node,"wrapForPnp")?["wrapForPnp"]:doesVariableOrFunctionDeclarationExist(node,defaultRequireWrapperName)?[defaultRequireWrapperName]:[]);return declarationName.length?declarationName[0]:null}function isRequireWrapperNecessary(node,cb=()=>{}){if(import_babel.types.isStringLiteral(node))return cb(node),!0;if(import_babel.types.isObjectExpression(node)){let nameProperty=node.properties.find(property=>import_babel.types.isObjectProperty(property)&&import_babel.types.isIdentifier(property.key)&&property.key.name==="name");if(nameProperty&&import_babel.types.isStringLiteral(nameProperty.value))return cb(nameProperty),!0}return import_babel.types.isArrayExpression(node)&&node.elements.some(element=>element&&isRequireWrapperNecessary(element))?(cb(node),!0):!1}function getFieldsForRequireWrapper(config){let frameworkNode=config.getFieldNode(["framework"]),builderNode=config.getFieldNode(["core","builder"]),rendererNode=config.getFieldNode(["core","renderer"]),addons=config.getFieldNode(["addons"]);return[...frameworkNode?[frameworkNode]:[],...builderNode?[builderNode]:[],...rendererNode?[rendererNode]:[],...addons&&import_babel.types.isArrayExpression(addons)?[addons]:[]]}function getRequireWrapperAsCallExpression(isConfigTypescript){let functionDeclaration={...import_babel.types.functionDeclaration(import_babel.types.identifier(defaultRequireWrapperName),[{...import_babel.types.identifier("value"),...isConfigTypescript?{typeAnnotation:import_babel.types.tsTypeAnnotation(import_babel.types.tSStringKeyword())}:{}}],import_babel.types.blockStatement([import_babel.types.returnStatement(import_babel.types.callExpression(import_babel.types.identifier("dirname"),[import_babel.types.callExpression(import_babel.types.memberExpression(import_babel.types.identifier("require"),import_babel.types.identifier("resolve")),[import_babel.types.callExpression(import_babel.types.identifier("join"),[import_babel.types.identifier("value"),import_babel.types.stringLiteral("package.json")])])]))])),...isConfigTypescript?{returnType:import_babel.types.tSTypeAnnotation(import_babel.types.tsAnyKeyword())}:{}};return import_babel.types.addComment(functionDeclaration,"leading",`*
|
|
107
107
|
* This function is used to resolve the absolute path of a package.
|
|
108
108
|
* It is needed in projects that use Yarn PnP or are set up within a monorepo.
|
|
109
109
|
`),functionDeclaration}function wrapValueWithRequireWrapper(config,node){isRequireWrapperNecessary(node,n=>{if(import_babel.types.isStringLiteral(n)){let wrapperNode=getReferenceToRequireWrapper(config,n.value);Object.keys(n).forEach(k=>{delete n[k]}),Object.keys(wrapperNode).forEach(k=>{n[k]=wrapperNode[k]})}import_babel.types.isObjectProperty(n)&&import_babel.types.isStringLiteral(n.value)&&(n.value=getReferenceToRequireWrapper(config,n.value.value)),import_babel.types.isArrayExpression(n)&&n.elements.forEach(element=>{element&&isRequireWrapperNecessary(element)&&wrapValueWithRequireWrapper(config,element)})})}var import_node_path=require("path"),import_common=require("storybook/internal/common"),import_common2=require("storybook/internal/common"),import_csf_tools=require("storybook/internal/csf-tools"),import_picocolors=__toESM(require_picocolors(),1),import_ts_dedent=require("ts-dedent"),logger=console,getFrameworkPackageName=mainConfig=>{let packageNameOrPath=typeof mainConfig?.framework=="string"?mainConfig.framework:mainConfig?.framework?.name;return packageNameOrPath?(0,import_common.extractProperFrameworkName)(packageNameOrPath):null};var getStorybookData=async({packageManager,configDir:userDefinedConfigDir})=>{let packageJson=await packageManager.retrievePackageJson(),{mainConfig:mainConfigPath,version:storybookVersionSpecifier,configDir:configDirFromScript,previewConfig:previewConfigPath}=(0,import_common.getStorybookInfo)(packageJson,userDefinedConfigDir),storybookVersion=await(0,import_common2.getCoercedStorybookVersion)(packageManager),configDir=userDefinedConfigDir||configDirFromScript||".storybook",mainConfig;try{mainConfig=await(0,import_common.loadMainConfig)({configDir,noCache:!0})}catch(err){throw new Error(import_ts_dedent.dedent`Unable to find or evaluate ${import_picocolors.default.blue(mainConfigPath)}: ${String(err)}`)}return{configDir,mainConfig,storybookVersionSpecifier,storybookVersion,mainConfigPath,previewConfigPath,packageJson}},updateMainConfig=async({mainConfigPath,dryRun},callback)=>{try{let main=await(0,import_csf_tools.readConfig)(mainConfigPath);await callback(main),dryRun||await(0,import_csf_tools.writeConfig)(main)}catch(e){logger.info(`\u274C The migration failed to update your ${import_picocolors.default.blue(mainConfigPath)} on your behalf because of the following error:
|
|
@@ -294,7 +294,7 @@ ${errors.map(({file,error})=>`- ${file}: ${error.message}`).join(`
|
|
|
294
294
|
We can set it up automatically for you.
|
|
295
295
|
|
|
296
296
|
More info: ${import_picocolors15.default.yellow("https://storybook.js.org/docs/9/configure/integration/eslint-plugin")}
|
|
297
|
-
`},async run({result:{eslintConfigFile,unsupportedExtension,isFlatConfig},packageManager,dryRun,skipInstall,storybookVersion}){let deps=[`eslint-plugin-storybook@${storybookVersion}`];if(logger8.info(`\u2705 Adding dependencies: ${deps}`),dryRun||await packageManager.addDependencies({installAsDevDependencies:!0,skipInstall},deps),!dryRun&&unsupportedExtension){logger8.info(import_ts_dedent11.dedent`
|
|
297
|
+
`},async run({result:{eslintConfigFile,unsupportedExtension,isFlatConfig},packageManager,dryRun,skipInstall,storybookVersion}){let deps=[`eslint-plugin-storybook@${storybookVersion}`];if(logger8.info(`\u2705 Adding dependencies: ${deps}`),dryRun||await packageManager.addDependencies({installAsDevDependencies:!0,skipInstall,packageJson:await packageManager.readPackageJson()},deps),!dryRun&&unsupportedExtension){logger8.info(import_ts_dedent11.dedent`
|
|
298
298
|
⚠️ The plugin was successfully installed but failed to be configured.
|
|
299
299
|
|
|
300
300
|
Found an eslint config file with an unsupported automigration format: .eslintrc.${unsupportedExtension}.
|
|
@@ -320,7 +320,7 @@ ${errors.map(({file,error})=>`- ${file}: ${error.message}`).join(`
|
|
|
320
320
|
We can make the necessary changes in your configuration automatically.
|
|
321
321
|
|
|
322
322
|
More info: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#mainjs-docsautodocs-is-deprecated
|
|
323
|
-
`,async run({result,dryRun,mainConfigPath,previewConfigPath}){let{autodocs}=result;logger9.log(`\u{1F504} Updating ${import_picocolors18.default.cyan("docs")} parameter in main config file...`),await updateMainConfig({mainConfigPath,dryRun:!!dryRun},async main=>{let docs=main.getFieldValue(["docs"])||{};dryRun||(delete docs.autodocs,Object.keys(docs).length===0?main.removeField(["docs"]):main.setFieldValue(["docs"],docs))}),autodocs===!0&&previewConfigPath&&(logger9.log(`\u{1F504} Updating ${import_picocolors18.default.cyan("tags")} parameter in preview config file...`),await updateMainConfig({mainConfigPath:previewConfigPath,dryRun:!!dryRun},async preview=>{let tags=preview.getFieldValue(["tags"])||[];!tags.includes("autodocs")&&!dryRun&&preview.setFieldValue(["tags"],[...tags,"autodocs"])}))}};var import_common17=require("storybook/internal/common"),import_picocolors19=__toESM(require_picocolors(),1),import_ts_dedent15=require("ts-dedent"),consolidatedAddons={"@storybook/addon-actions":"storybook/actions","@storybook/addon-controls":"storybook/internal/controls","@storybook/addon-toolbars":"storybook/internal/toolbars","@storybook/addon-highlight":"storybook/highlight","@storybook/addon-measure":"storybook/measure","@storybook/addon-outline":"storybook/outline","@storybook/addon-backgrounds":"storybook/backgrounds","@storybook/addon-viewport":"storybook/viewport"},removeEssentials={id:"remove-essentials",versionRange:["<9.0.0","^9.0.0-0 || ^9.0.0"],async check({mainConfigPath,mainConfig,packageManager}){if(!mainConfigPath)return null;try{let hasEssentialsAddon=!1,hasDocsAddon=!1,hasDocsDisabled=!1,additionalAddonsToRemove=[],CORE_ADDONS=["@storybook/addon-actions","@storybook/addon-backgrounds","@storybook/addon-controls","@storybook/addon-highlight","@storybook/addon-measure","@storybook/addon-outline","@storybook/addon-toolbars","@storybook/addon-viewport"],addonNames=(0,import_common17.getAddonNames)(mainConfig);hasEssentialsAddon=addonNames.includes("@storybook/addon-essentials"),hasDocsAddon=addonNames.includes("@storybook/addon-docs");let packageJson=await packageManager.retrievePackageJson(),allDeps={...packageJson.dependencies,...packageJson.devDependencies},installedAddons=Object.keys(allDeps);for(let addon of CORE_ADDONS)(addonNames.includes(addon)||installedAddons.includes(addon))&&additionalAddonsToRemove.push(addon);if(hasEssentialsAddon){let essentialsEntry=mainConfig.addons?.find(addon=>typeof addon=="string"?addon.includes("@storybook/addon-essentials"):addon.name.includes("@storybook/addon-essentials"));typeof essentialsEntry=="object"
|
|
323
|
+
`,async run({result,dryRun,mainConfigPath,previewConfigPath}){let{autodocs}=result;logger9.log(`\u{1F504} Updating ${import_picocolors18.default.cyan("docs")} parameter in main config file...`),await updateMainConfig({mainConfigPath,dryRun:!!dryRun},async main=>{let docs=main.getFieldValue(["docs"])||{};dryRun||(delete docs.autodocs,Object.keys(docs).length===0?main.removeField(["docs"]):main.setFieldValue(["docs"],docs))}),autodocs===!0&&previewConfigPath&&(logger9.log(`\u{1F504} Updating ${import_picocolors18.default.cyan("tags")} parameter in preview config file...`),await updateMainConfig({mainConfigPath:previewConfigPath,dryRun:!!dryRun},async preview=>{let tags=preview.getFieldValue(["tags"])||[];!tags.includes("autodocs")&&!dryRun&&preview.setFieldValue(["tags"],[...tags,"autodocs"])}))}};var import_common17=require("storybook/internal/common"),import_picocolors19=__toESM(require_picocolors(),1),import_ts_dedent15=require("ts-dedent");function moveEssentialOptions(dryRun,essentialsOptions){return async main=>{let features=main.getFieldValue(["features"])||{};dryRun||main.setFieldValue(["features"],{...features,...essentialsOptions})}}var consolidatedAddons={"@storybook/addon-actions":"storybook/actions","@storybook/addon-controls":"storybook/internal/controls","@storybook/addon-toolbars":"storybook/internal/toolbars","@storybook/addon-highlight":"storybook/highlight","@storybook/addon-measure":"storybook/measure","@storybook/addon-outline":"storybook/outline","@storybook/addon-backgrounds":"storybook/backgrounds","@storybook/addon-viewport":"storybook/viewport"},removeEssentials={id:"remove-essentials",versionRange:["<9.0.0","^9.0.0-0 || ^9.0.0"],async check({mainConfigPath,mainConfig,packageManager}){if(!mainConfigPath)return null;try{let hasEssentialsAddon=!1,hasDocsAddon=!1,hasDocsDisabled=!1,essentialsOptions,additionalAddonsToRemove=[],CORE_ADDONS=["@storybook/addon-actions","@storybook/addon-backgrounds","@storybook/addon-controls","@storybook/addon-highlight","@storybook/addon-measure","@storybook/addon-outline","@storybook/addon-toolbars","@storybook/addon-viewport"],addonNames=(0,import_common17.getAddonNames)(mainConfig);hasEssentialsAddon=addonNames.includes("@storybook/addon-essentials"),hasDocsAddon=addonNames.includes("@storybook/addon-docs");let packageJson=await packageManager.retrievePackageJson(),allDeps={...packageJson.dependencies,...packageJson.devDependencies},installedAddons=Object.keys(allDeps);for(let addon of CORE_ADDONS)(addonNames.includes(addon)||installedAddons.includes(addon))&&additionalAddonsToRemove.push(addon);if(hasEssentialsAddon){let essentialsEntry=mainConfig.addons?.find(addon=>typeof addon=="string"?addon.includes("@storybook/addon-essentials"):addon.name.includes("@storybook/addon-essentials"));if(typeof essentialsEntry=="object"){let options=essentialsEntry.options||{};hasDocsDisabled=options.docs===!1;let optionsExceptDocs=Object.fromEntries(Object.entries(options).filter(([key])=>key!=="docs"));Object.keys(optionsExceptDocs).length>0&&(essentialsOptions=optionsExceptDocs)}}if(!hasEssentialsAddon&&additionalAddonsToRemove.length===0)return null;let result={hasEssentials:hasEssentialsAddon,hasDocsDisabled,hasDocsAddon,additionalAddonsToRemove,allDeps,packageJson};return essentialsOptions&&(result.essentialsOptions=essentialsOptions),result}catch{return null}},prompt({hasDocsDisabled,additionalAddonsToRemove,hasEssentials}){let message="";hasEssentials&&(message=import_ts_dedent15.dedent`
|
|
324
324
|
We've detected that you have ${import_picocolors19.default.yellow("@storybook/addon-essentials")} installed.
|
|
325
325
|
|
|
326
326
|
In Storybook 9.0, all features from ${import_picocolors19.default.yellow("@storybook/addon-essentials")} (except docs)
|
|
@@ -339,9 +339,9 @@ ${errors.map(({file,error})=>`- ${file}: ${error.message}`).join(`
|
|
|
339
339
|
|
|
340
340
|
Since you were using the docs feature, we'll install ${import_picocolors19.default.yellow("@storybook/addon-docs")}
|
|
341
341
|
separately and add it to your configuration if it's not already present.
|
|
342
|
-
`:additionalAddonsMessage},async run({result,dryRun,packageManager,configDir,packageJson}){let{hasEssentials,hasDocsDisabled,hasDocsAddon,additionalAddonsToRemove}=result;if(!(!hasEssentials&&additionalAddonsToRemove.length===0)&&!dryRun){hasEssentials&&(console.log("Removing @storybook/addon-essentials..."),await packageManager.runPackageCommand("storybook",["remove","@storybook/addon-essentials","--config-dir",configDir]));for(let addon of additionalAddonsToRemove)await packageManager.runPackageCommand("storybook",["remove",addon,"--config-dir",configDir]);let errors=await(0,import_common17.scanAndTransformFiles)({dryRun:!!dryRun,transformFn:import_common17.transformImportFiles,transformOptions:consolidatedAddons});if(errors.length>0)throw new Error(`Failed to process ${errors.length} files:
|
|
342
|
+
`:additionalAddonsMessage},async run({result,dryRun,packageManager,configDir,packageJson,mainConfigPath}){let{hasEssentials,hasDocsDisabled,hasDocsAddon,additionalAddonsToRemove,essentialsOptions}=result;if(!(!hasEssentials&&additionalAddonsToRemove.length===0)&&!dryRun){hasEssentials&&(console.log("Removing @storybook/addon-essentials..."),await packageManager.runPackageCommand("storybook",["remove","@storybook/addon-essentials","--config-dir",configDir]));for(let addon of additionalAddonsToRemove)await packageManager.runPackageCommand("storybook",["remove",addon,"--config-dir",configDir]);let errors=await(0,import_common17.scanAndTransformFiles)({dryRun:!!dryRun,transformFn:import_common17.transformImportFiles,transformOptions:consolidatedAddons});if(errors.length>0)throw new Error(`Failed to process ${errors.length} files:
|
|
343
343
|
${errors.map(({file,error})=>`- ${file}: ${error.message}`).join(`
|
|
344
|
-
`)}`);if(
|
|
344
|
+
`)}`);if(essentialsOptions&&updateMainConfig({mainConfigPath,dryRun:!!dryRun},moveEssentialOptions(dryRun,essentialsOptions)),!hasDocsDisabled&&hasEssentials)if(!hasDocsAddon)console.log("Adding @storybook/addon-docs..."),await packageManager.runPackageCommand("storybook",["add","@storybook/addon-docs","--config-dir",configDir]);else{let allDeps=result.allDeps;if(!(allDeps["@storybook/addon-docs"]!==void 0)){let storybookVersion=allDeps.storybook,isStorybookDevDependency=packageJson.devDependencies?.storybook!==void 0;await packageManager.addDependencies({installAsDevDependencies:isStorybookDevDependency},["@storybook/addon-docs@"+storybookVersion])}}}}};var import_promises5=require("fs/promises"),import_common18=require("storybook/internal/common"),import_picocolors20=__toESM(require_picocolors(),1),import_prompts3=__toESM(require("prompts"),1),import_ts_dedent16=require("ts-dedent"),getAllDependencies=packageJson=>Object.keys({...packageJson.dependencies||{},...packageJson.devDependencies||{}}),detectFrameworks=dependencies=>Object.keys(import_common18.frameworkPackages).filter(pkg=>dependencies.includes(pkg)),detectRenderers=dependencies=>Object.keys(import_common18.rendererPackages).filter(pkg=>dependencies.includes(pkg)).filter(pkg=>!Object.keys(import_common18.frameworkPackages).includes(pkg)),replaceImports=(source,renderer,framework)=>{let regex2=new RegExp(`(['"])${renderer}(['"])`,"g");return regex2.test(source)?source.replace(regex2,`$1${framework}$2`):null},transformSourceFiles=async(files,renderer,framework,dryRun)=>{let errors=[],{default:pLimit}=await import("p-limit"),limit=pLimit(10);return await Promise.all(files.map(file=>limit(async()=>{try{let contents=await(0,import_promises5.readFile)(file,"utf-8"),transformed=replaceImports(contents,renderer,framework);!dryRun&&transformed&&await(0,import_promises5.writeFile)(file,transformed)}catch(error){errors.push({file,error})}}))),errors},removeRendererInPackageJson=async(packageJsonPath,renderer,dryRun)=>{try{let content=await(0,import_promises5.readFile)(packageJsonPath,"utf-8"),packageJson=JSON.parse(content),hasChanges=!1;return packageJson.dependencies?.[renderer]&&(delete packageJson.dependencies[renderer],hasChanges=!0),packageJson.devDependencies?.[renderer]&&(delete packageJson.devDependencies[renderer],hasChanges=!0),!dryRun&&hasChanges&&await(0,import_promises5.writeFile)(packageJsonPath,JSON.stringify(packageJson,null,2)),hasChanges}catch(error){throw new Error(`Failed to update package.json: ${error}`)}},checkPackageJson=async packageJsonPath=>{let content=await(0,import_promises5.readFile)(packageJsonPath,"utf-8"),packageJson=JSON.parse(content),dependencies=getAllDependencies(packageJson),frameworks=detectFrameworks(dependencies);if(frameworks.length===0)return null;let renderers=detectRenderers(dependencies);return renderers.length===0?null:{frameworks,renderers}},rendererToFramework={id:"renderer-to-framework",versionRange:["<9.0.0","^9.0.0-0"],promptType:"auto",async check(){let projectRoot=await(0,import_common18.getProjectRoot)(),{globby}=await import("globby"),packageJsonFiles=await globby(["**/package.json"],{...(0,import_common18.commonGlobOptions)(""),ignore:["**/node_modules/**"],cwd:projectRoot,gitignore:!0,absolute:!0}),validResults=(await Promise.all(packageJsonFiles.map(async file=>{try{return await checkPackageJson(file)}catch{return null}}))).filter(r=>r!==null&&r.renderers.length>0);return validResults.length===0?null:{frameworks:[...new Set(validResults.flatMap(r=>r.frameworks))],renderers:[...new Set(validResults.flatMap(r=>r.renderers))],packageJsonFiles:packageJsonFiles.filter((_,i)=>validResults[i]!==null)}},prompt(){return import_ts_dedent16.dedent`
|
|
345
345
|
As part of Storybook's evolution, we're moving from renderer-based to framework-based configuration.
|
|
346
346
|
|
|
347
347
|
This migration will:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@storybook/cli",
|
|
3
|
-
"version": "9.0.
|
|
3
|
+
"version": "9.0.8",
|
|
4
4
|
"description": "Storybook CLI",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"storybook"
|
|
@@ -42,10 +42,10 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@babel/types": "^7.24.0",
|
|
45
|
-
"@storybook/codemod": "9.0.
|
|
45
|
+
"@storybook/codemod": "9.0.8",
|
|
46
46
|
"@types/semver": "^7.3.4",
|
|
47
47
|
"commander": "^12.1.0",
|
|
48
|
-
"create-storybook": "9.0.
|
|
48
|
+
"create-storybook": "9.0.8",
|
|
49
49
|
"cross-spawn": "^7.0.6",
|
|
50
50
|
"envinfo": "^7.7.3",
|
|
51
51
|
"execa": "^9.5.2",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"p-limit": "^6.2.0",
|
|
57
57
|
"prompts": "^2.4.0",
|
|
58
58
|
"semver": "^7.3.7",
|
|
59
|
-
"storybook": "9.0.
|
|
59
|
+
"storybook": "9.0.8",
|
|
60
60
|
"tiny-invariant": "^1.3.1",
|
|
61
61
|
"ts-dedent": "^2.0.0"
|
|
62
62
|
},
|