diff --git a/code/core/src/common/versions.ts b/code/core/src/common/versions.ts index 25c0b42a4667..8525a83e5320 100644 --- a/code/core/src/common/versions.ts +++ b/code/core/src/common/versions.ts @@ -67,6 +67,7 @@ export default { '@storybook/react-dom-shim': '8.2.0-beta.0', '@storybook/source-loader': '8.2.0-beta.0', '@storybook/test': '8.2.0-beta.0', + '@storybook/toolbox': '8.2.0-beta.0', '@storybook/preset-create-react-app': '8.2.0-beta.0', '@storybook/preset-html-webpack': '8.2.0-beta.0', '@storybook/preset-preact-webpack': '8.2.0-beta.0', diff --git a/code/core/src/core-server/utils/warnOnIncompatibleAddons.ts b/code/core/src/core-server/utils/warnOnIncompatibleAddons.ts index df43ed0d7738..4f35fe5d1546 100644 --- a/code/core/src/core-server/utils/warnOnIncompatibleAddons.ts +++ b/code/core/src/core-server/utils/warnOnIncompatibleAddons.ts @@ -2,7 +2,7 @@ import { logger } from '@storybook/core/node-logger'; import { getIncompatibleStorybookPackages, getIncompatiblePackagesSummary, -} from '../../../../lib/cli/src/doctor/getIncompatibleStorybookPackages'; +} from '../../../../lib/toolbox/src/doctor/getIncompatibleStorybookPackages'; export const warnOnIncompatibleAddons = async (currentStorybookVersion: string) => { const incompatiblePackagesList = await getIncompatibleStorybookPackages({ diff --git a/code/lib/cli/docs/getstorybook.png b/code/lib/cli/docs/getstorybook.png deleted file mode 100644 index 90dd790ee92d..000000000000 Binary files a/code/lib/cli/docs/getstorybook.png and /dev/null differ diff --git a/code/lib/cli/package.json b/code/lib/cli/package.json index 70a62fe9d9fe..30f138c157cb 100644 --- a/code/lib/cli/package.json +++ b/code/lib/cli/package.json @@ -286,34 +286,13 @@ "sb": "node ./bin/index.js" }, "dependencies": { - "@babel/core": "^7.24.4", - "@babel/types": "^7.24.0", - "@ndelangen/get-tarball": "^3.0.7", - "@storybook/codemod": "workspace:*", "@storybook/core": "workspace:*", - "@types/semver": "^7.3.4", - "@yarnpkg/fslib": "2.10.3", - "@yarnpkg/libzip": "2.3.0", "chalk": "^4.1.0", "commander": "^6.2.1", - "cross-spawn": "^7.0.3", "detect-indent": "^6.1.0", "envinfo": "^7.7.3", - "execa": "^5.0.0", "fd-package-json": "^1.2.0", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "get-npm-tarball-url": "^2.0.3", - "giget": "^1.0.0", - "globby": "^14.0.1", - "jscodeshift": "^0.15.1", "leven": "^3.1.0", - "ora": "^5.4.1", - "prettier": "^3.1.1", - "prompts": "^2.4.0", - "semver": "^7.3.7", - "strip-json-comments": "^3.0.1", - "tempy": "^3.1.0", "tiny-invariant": "^1.3.1", "ts-dedent": "^2.0.0" }, @@ -322,6 +301,8 @@ "@types/prompts": "^2.0.9", "@types/util-deprecate": "^1.0.0", "boxen": "^7.1.1", + "cross-spawn": "^7.0.3", + "fs-extra": "^11.1.0", "slash": "^5.0.0", "strip-ansi": "^7.1.0", "strip-json-comments": "^3.1.1", diff --git a/code/lib/cli/src/generate.ts b/code/lib/cli/src/generate.ts index a73f1889a35c..e284e34e7ff1 100644 --- a/code/lib/cli/src/generate.ts +++ b/code/lib/cli/src/generate.ts @@ -1,327 +1,158 @@ import program from 'commander'; +import { spawn } from 'child_process'; import chalk from 'chalk'; -import envinfo from 'envinfo'; import leven from 'leven'; import { findPackageSync } from 'fd-package-json'; import invariant from 'tiny-invariant'; - import { logger } from '@storybook/core/node-logger'; -import { addToGlobalContext, telemetry } from '@storybook/core/telemetry'; -import { - parseList, - getEnvConfig, - JsPackageManagerFactory, - versions, - removeAddon as remove, -} from '@storybook/core/common'; -import { withTelemetry } from '@storybook/core/core-server'; - -import type { CommandOptions } from './generators/types'; -import { initiate } from './initiate'; -import { add } from './add'; -import { migrate } from './migrate'; -import { upgrade, type UpgradeOptions } from './upgrade'; -import { sandbox } from './sandbox'; -import { link } from './link'; -import { doAutomigrate } from './automigrate'; +import { addToGlobalContext } from '@storybook/core/telemetry'; +import { getEnvConfig, parseList, versions } from '@storybook/core/common'; import { dev } from './dev'; import { build } from './build'; -import { doctor } from './doctor'; -addToGlobalContext('cliVersion', versions.storybook); +const args = process.argv.slice(2); -const pkg = findPackageSync(__dirname); -invariant(pkg, 'Failed to find the closest package.json file.'); -const consoleLogger = console; +// Forward some commands to @storybook/toolbox +if (!['dev', 'build'].includes(args[0])) { + const command = ['npx', '--yes', `@storybook/toolbox@${versions.storybook}`, ...args]; + console.log(command.join(' ')); + const child = spawn(command[0], command.slice(1), { stdio: 'inherit' }); + child.on('exit', (code) => { + if (code != null) { + process.exit(code); + } + process.exit(1); + }); +} else { + addToGlobalContext('cliVersion', versions.storybook); + + const pkg = findPackageSync(__dirname); + invariant(pkg, 'Failed to find the closest package.json file.'); + const consoleLogger = console; + + const command = (name: string) => + program + .command(name) + .option( + '--disable-telemetry', + 'Disable sending telemetry data', + // default value is false, but if the user sets STORYBOOK_DISABLE_TELEMETRY, it can be true + process.env.STORYBOOK_DISABLE_TELEMETRY && + process.env.STORYBOOK_DISABLE_TELEMETRY !== 'false' + ) + .option('--debug', 'Get more logs in debug mode', false) + .option('--enable-crash-reports', 'Enable sending crash reports to telemetry data'); -const command = (name: string) => - program - .command(name) + command('dev') + .option('-p, --port ', 'Port to run Storybook', (str) => parseInt(str, 10)) + .option('-h, --host ', 'Host to run Storybook') + .option('-c, --config-dir ', 'Directory where to load Storybook configurations from') .option( - '--disable-telemetry', - 'Disable sending telemetry data', - // default value is false, but if the user sets STORYBOOK_DISABLE_TELEMETRY, it can be true - process.env.STORYBOOK_DISABLE_TELEMETRY && process.env.STORYBOOK_DISABLE_TELEMETRY !== 'false' + '--https', + 'Serve Storybook over HTTPS. Note: You must provide your own certificate information.' ) - .option('--debug', 'Get more logs in debug mode', false) - .option('--enable-crash-reports', 'Enable sending crash reports to telemetry data'); - -command('init') - .description('Initialize Storybook into your project.') - .option('-f --force', 'Force add Storybook') - .option('-s --skip-install', 'Skip installing deps') - .option('--package-manager ', 'Force package manager for installing deps') - .option('--use-pnp', 'Enable pnp mode for Yarn 2+') - .option('-p --parser ', 'jscodeshift parser') - .option('-t --type ', 'Add Storybook for a specific project type') - .option('-y --yes', 'Answer yes to all prompts') - .option('-b --builder ', 'Builder library') - .option('-l --linkable', 'Prepare installation for link (contributor helper)') - // due to how Commander handles default values and negated options, we have to elevate the default into Commander, and we have to specify `--dev` - // alongside `--no-dev` even if we are unlikely to directly use `--dev`. https://github.com/tj/commander.js/issues/2068#issuecomment-1804524585 - .option( - '--dev', - 'Launch the development server after completing initialization. Enabled by default', - process.env.CI !== 'true' && process.env.IN_STORYBOOK_SANDBOX !== 'true' - ) - .option( - '--no-dev', - 'Complete the initialization of Storybook without launching the Storybook development server' - ) - .action((options: CommandOptions) => { - initiate(options).catch(() => process.exit(1)); - }); - -command('add ') - .description('Add an addon to your Storybook') - .option( - '--package-manager ', - 'Force package manager for installing dependencies' - ) - .option('-c, --config-dir ', 'Directory where to load Storybook configurations from') - .option('-s --skip-postinstall', 'Skip package specific postinstall config modifications') - .action((addonName: string, options: any) => add(addonName, options)); - -command('remove ') - .description('Remove an addon from your Storybook') - .option( - '--package-manager ', - 'Force package manager for installing dependencies' - ) - .action((addonName: string, options: any) => - withTelemetry('remove', { cliOptions: options }, async () => { - await remove(addonName, options); - if (!options.disableTelemetry) { - await telemetry('remove', { addon: addonName, source: 'cli' }); + .option( + '--ssl-ca ', + 'Provide an SSL certificate authority. (Optional with --https, required if using a self-signed certificate)', + parseList + ) + .option('--ssl-cert ', 'Provide an SSL certificate. (Required with --https)') + .option('--ssl-key ', 'Provide an SSL key. (Required with --https)') + .option('--smoke-test', 'Exit after successful start') + .option('--ci', "CI mode (skip interactive prompts, don't open browser)") + .option('--no-open', 'Do not open Storybook automatically in the browser') + .option('--loglevel ', 'Control level of logging during build') + .option('--quiet', 'Suppress verbose build output') + .option('--no-version-updates', 'Suppress update check', true) + .option('--debug-webpack', 'Display final webpack configurations for debugging purposes') + .option( + '--webpack-stats-json [directory]', + 'Write Webpack stats JSON to disk (synonym for `--stats-json`)' + ) + .option('--stats-json [directory]', 'Write stats JSON to disk') + .option( + '--preview-url ', + 'Disables the default storybook preview and lets your use your own' + ) + .option('--force-build-preview', 'Build the preview iframe even if you are using --preview-url') + .option('--docs', 'Build a documentation-only site using addon-docs') + .option('--exact-port', 'Exit early if the desired port is not available') + .option( + '--initial-path [path]', + 'URL path to be appended when visiting Storybook for the first time' + ) + .action(async (options) => { + logger.setLevel(program.loglevel); + consoleLogger.log(chalk.bold(`${pkg.name} v${pkg.version}`) + chalk.reset('\n')); + + // The key is the field created in `options` variable for + // each command line argument. Value is the env variable. + getEnvConfig(options, { + port: 'SBCONFIG_PORT', + host: 'SBCONFIG_HOSTNAME', + staticDir: 'SBCONFIG_STATIC_DIR', + configDir: 'SBCONFIG_CONFIG_DIR', + ci: 'CI', + }); + + if (parseInt(`${options.port}`, 10)) { + options.port = parseInt(`${options.port}`, 10); } - }) - ); - -command('upgrade') - .description(`Upgrade your Storybook packages to v${versions.storybook}`) - .option( - '--package-manager ', - 'Force package manager for installing dependencies' - ) - .option('-y --yes', 'Skip prompting the user') - .option('-f --force', 'force the upgrade, skipping autoblockers') - .option('-n --dry-run', 'Only check for upgrades, do not install') - .option('-s --skip-check', 'Skip postinstall version and automigration checks') - .option('-c, --config-dir ', 'Directory where to load Storybook configurations from') - .action(async (options: UpgradeOptions) => upgrade(options).catch(() => process.exit(1))); -command('info') - .description('Prints debugging information about the local environment') - .action(async () => { - consoleLogger.log(chalk.bold('\nStorybook Environment Info:')); - const pkgManager = await JsPackageManagerFactory.getPackageManager(); - const activePackageManager = pkgManager.type.replace(/\d/, ''); // 'yarn1' -> 'yarn' - const output = await envinfo.run({ - System: ['OS', 'CPU', 'Shell'], - Binaries: ['Node', 'Yarn', 'npm', 'pnpm'], - Browsers: ['Chrome', 'Edge', 'Firefox', 'Safari'], - npmPackages: '{@storybook/*,*storybook*,sb,chromatic}', - npmGlobalPackages: '{@storybook/*,*storybook*,sb,chromatic}', + await dev({ ...options, packageJson: pkg }).catch(() => process.exit(1)); }); - const activePackageManagerLine = output.match(new RegExp(`${activePackageManager}:.*`, 'i')); - consoleLogger.log( - output.replace( - activePackageManagerLine, - chalk.bold(`${activePackageManagerLine} <----- active`) - ) - ); - }); -command('migrate [migration]') - .description('Run a Storybook codemod migration on your source files') - .option('-l --list', 'List available migrations') - .option('-g --glob ', 'Glob for files upon which to apply the migration', '**/*.js') - .option('-p --parser ', 'jscodeshift parser') - .option('-c, --config-dir ', 'Directory where to load Storybook configurations from') - .option( - '-n --dry-run', - 'Dry run: verify the migration exists and show the files to which it will be applied' - ) - .option( - '-r --rename ', - 'Rename suffix of matching files after codemod has been applied, e.g. ".js:.ts"' - ) - .action((migration, { configDir, glob, dryRun, list, rename, parser }) => { - migrate(migration, { - configDir, - glob, - dryRun, - list, - rename, - parser, - }).catch((err) => { - logger.error(err); - process.exit(1); - }); - }); - -command('sandbox [filterValue]') - .alias('repro') // for backwards compatibility - .description('Create a sandbox from a set of possible templates') - .option('-o --output ', 'Define an output directory') - .option('--no-init', 'Whether to download a template without an initialized Storybook', false) - .action((filterValue, options) => - sandbox({ filterValue, ...options }).catch((e) => { - logger.error(e); - process.exit(1); - }) - ); - -command('link ') - .description('Pull down a repro from a URL (or a local directory), link it, and run storybook') - .option('--local', 'Link a local directory already in your file system') - .option('--no-start', 'Start the storybook', true) - .action((target, { local, start }) => - link({ target, local, start }).catch((e) => { - logger.error(e); - process.exit(1); - }) - ); - -command('automigrate [fixId]') - .description('Check storybook for incompatibilities or migrations and apply fixes') - .option('-y --yes', 'Skip prompting the user') - .option('-n --dry-run', 'Only check for fixes, do not actually run them') - .option('--package-manager ', 'Force package manager') - .option('-l --list', 'List available migrations') - .option('-c, --config-dir ', 'Directory of Storybook configurations to migrate') - .option('-s --skip-install', 'Skip installing deps') - .option( - '--renderer ', - 'The renderer package for the framework Storybook is using.' - ) - .action(async (fixId, options) => { - await doAutomigrate({ fixId, ...options }).catch((e) => { - logger.error(e); - process.exit(1); - }); - }); - -command('doctor') - .description('Check Storybook for known problems and provide suggestions or fixes') - .option('--package-manager ', 'Force package manager') - .option('-c, --config-dir ', 'Directory of Storybook configuration') - .action(async (options) => { - await doctor(options).catch((e) => { - logger.error(e); - process.exit(1); - }); - }); - -command('dev') - .option('-p, --port ', 'Port to run Storybook', (str) => parseInt(str, 10)) - .option('-h, --host ', 'Host to run Storybook') - .option('-c, --config-dir ', 'Directory where to load Storybook configurations from') - .option( - '--https', - 'Serve Storybook over HTTPS. Note: You must provide your own certificate information.' - ) - .option( - '--ssl-ca ', - 'Provide an SSL certificate authority. (Optional with --https, required if using a self-signed certificate)', - parseList - ) - .option('--ssl-cert ', 'Provide an SSL certificate. (Required with --https)') - .option('--ssl-key ', 'Provide an SSL key. (Required with --https)') - .option('--smoke-test', 'Exit after successful start') - .option('--ci', "CI mode (skip interactive prompts, don't open browser)") - .option('--no-open', 'Do not open Storybook automatically in the browser') - .option('--loglevel ', 'Control level of logging during build') - .option('--quiet', 'Suppress verbose build output') - .option('--no-version-updates', 'Suppress update check', true) - .option('--debug-webpack', 'Display final webpack configurations for debugging purposes') - .option( - '--webpack-stats-json [directory]', - 'Write Webpack stats JSON to disk (synonym for `--stats-json`)' - ) - .option('--stats-json [directory]', 'Write stats JSON to disk') - .option( - '--preview-url ', - 'Disables the default storybook preview and lets your use your own' - ) - .option('--force-build-preview', 'Build the preview iframe even if you are using --preview-url') - .option('--docs', 'Build a documentation-only site using addon-docs') - .option('--exact-port', 'Exit early if the desired port is not available') - .option( - '--initial-path [path]', - 'URL path to be appended when visiting Storybook for the first time' - ) - .action(async (options) => { - logger.setLevel(program.loglevel); - consoleLogger.log(chalk.bold(`${pkg.name} v${pkg.version}`) + chalk.reset('\n')); - - // The key is the field created in `options` variable for - // each command line argument. Value is the env variable. - getEnvConfig(options, { - port: 'SBCONFIG_PORT', - host: 'SBCONFIG_HOSTNAME', - staticDir: 'SBCONFIG_STATIC_DIR', - configDir: 'SBCONFIG_CONFIG_DIR', - ci: 'CI', + command('build') + .option('-o, --output-dir ', 'Directory where to store built files') + .option('-c, --config-dir ', 'Directory where to load Storybook configurations from') + .option('--quiet', 'Suppress verbose build output') + .option('--loglevel ', 'Control level of logging during build') + .option('--debug-webpack', 'Display final webpack configurations for debugging purposes') + .option( + '--webpack-stats-json [directory]', + 'Write Webpack stats JSON to disk (synonym for `--stats-json`)' + ) + .option('--stats-json [directory]', 'Write stats JSON to disk') + .option( + '--preview-url ', + 'Disables the default storybook preview and lets your use your own' + ) + .option('--force-build-preview', 'Build the preview iframe even if you are using --preview-url') + .option('--docs', 'Build a documentation-only site using addon-docs') + .option('--test', 'Build stories optimized for testing purposes.') + .action(async (options) => { + process.env.NODE_ENV = process.env.NODE_ENV || 'production'; + logger.setLevel(program.loglevel); + consoleLogger.log(chalk.bold(`${pkg.name} v${pkg.version}\n`)); + + // The key is the field created in `options` variable for + // each command line argument. Value is the env variable. + getEnvConfig(options, { + staticDir: 'SBCONFIG_STATIC_DIR', + outputDir: 'SBCONFIG_OUTPUT_DIR', + configDir: 'SBCONFIG_CONFIG_DIR', + }); + + await build({ + ...options, + packageJson: pkg, + test: !!options.test || process.env.SB_TESTBUILD === 'true', + }).catch(() => process.exit(1)); }); - if (parseInt(`${options.port}`, 10)) { - options.port = parseInt(`${options.port}`, 10); + program.on('command:*', ([invalidCmd]) => { + consoleLogger.error( + ' Invalid command: %s.\n See --help for a list of available commands.', + invalidCmd + ); + // eslint-disable-next-line no-underscore-dangle + const availableCommands = program.commands.map((cmd) => cmd._name); + const suggestion = availableCommands.find((cmd) => leven(cmd, invalidCmd) < 3); + if (suggestion) { + consoleLogger.info(`\n Did you mean ${suggestion}?`); } - - await dev({ ...options, packageJson: pkg }).catch(() => process.exit(1)); + process.exit(1); }); -command('build') - .option('-o, --output-dir ', 'Directory where to store built files') - .option('-c, --config-dir ', 'Directory where to load Storybook configurations from') - .option('--quiet', 'Suppress verbose build output') - .option('--loglevel ', 'Control level of logging during build') - .option('--debug-webpack', 'Display final webpack configurations for debugging purposes') - .option( - '--webpack-stats-json [directory]', - 'Write Webpack stats JSON to disk (synonym for `--stats-json`)' - ) - .option('--stats-json [directory]', 'Write stats JSON to disk') - .option( - '--preview-url ', - 'Disables the default storybook preview and lets your use your own' - ) - .option('--force-build-preview', 'Build the preview iframe even if you are using --preview-url') - .option('--docs', 'Build a documentation-only site using addon-docs') - .option('--test', 'Build stories optimized for testing purposes.') - .action(async (options) => { - process.env.NODE_ENV = process.env.NODE_ENV || 'production'; - logger.setLevel(program.loglevel); - consoleLogger.log(chalk.bold(`${pkg.name} v${pkg.version}\n`)); - - // The key is the field created in `options` variable for - // each command line argument. Value is the env variable. - getEnvConfig(options, { - staticDir: 'SBCONFIG_STATIC_DIR', - outputDir: 'SBCONFIG_OUTPUT_DIR', - configDir: 'SBCONFIG_CONFIG_DIR', - }); - - await build({ - ...options, - packageJson: pkg, - test: !!options.test || process.env.SB_TESTBUILD === 'true', - }).catch(() => process.exit(1)); - }); - -program.on('command:*', ([invalidCmd]) => { - consoleLogger.error( - ' Invalid command: %s.\n See --help for a list of available commands.', - invalidCmd - ); - // eslint-disable-next-line no-underscore-dangle - const availableCommands = program.commands.map((cmd) => cmd._name); - const suggestion = availableCommands.find((cmd) => leven(cmd, invalidCmd) < 3); - if (suggestion) { - consoleLogger.info(`\n Did you mean ${suggestion}?`); - } - process.exit(1); -}); - -program.usage(' [options]').version(String(pkg.version)).parse(process.argv); + program.usage(' [options]').version(String(pkg.version)).parse(process.argv); +} diff --git a/code/lib/toolbox/.eslintrc.cjs b/code/lib/toolbox/.eslintrc.cjs new file mode 100644 index 000000000000..a2dae9fc88d3 --- /dev/null +++ b/code/lib/toolbox/.eslintrc.cjs @@ -0,0 +1,36 @@ +const ignore = 0; + +module.exports = { + overrides: [ + { + files: 'templates/**/*', + env: { + browser: true, + }, + rules: { + 'react/no-this-in-sfc': ignore, + 'import/no-unresolved': ignore, + 'react/react-in-jsx-scope': ignore, + 'import/no-extraneous-dependencies': ignore, + 'global-require': ignore, + 'no-redeclare': ignore, + 'react/prop-types': ignore, + }, + }, + { + files: 'rendererAssets/**/*', + env: { + browser: true, + }, + rules: { + 'jsx-a11y/anchor-is-valid': ignore, + 'import/no-unresolved': ignore, + 'react/prop-types': ignore, + 'react/react-in-jsx-scope': ignore, + 'import/no-extraneous-dependencies': ignore, + 'import/extensions': ignore, + 'import/named': ignore, + }, + }, + ], +}; diff --git a/code/lib/toolbox/README.md b/code/lib/toolbox/README.md new file mode 100644 index 000000000000..3caee7023530 --- /dev/null +++ b/code/lib/toolbox/README.md @@ -0,0 +1,3 @@ +# Storybook + +## Toolbox diff --git a/code/lib/toolbox/bin/index.cjs b/code/lib/toolbox/bin/index.cjs new file mode 100755 index 000000000000..f7164c48f330 --- /dev/null +++ b/code/lib/toolbox/bin/index.cjs @@ -0,0 +1,26 @@ +#!/usr/bin/env node + +const majorNodeVersion = parseInt(process.versions.node, 10); +if (majorNodeVersion < 18) { + console.error('To run Storybook you need to have Node.js 18 or higher'); + process.exit(1); +} + +// The Storybook CLI has a catch block for all of its commands, but if an error +// occurs before the command even runs, for instance, if an import fails, then +// such error will fall under the uncaughtException handler. +// This is the earliest moment we can catch such errors. +process.once('uncaughtException', (error) => { + if (error.message.includes('string-width')) { + console.error( + [ + '🔴 Error: It looks like you are having a known issue with package hoisting.', + 'Please check the following issue for details and solutions: https://github.com/storybookjs/storybook/issues/22431#issuecomment-1630086092\n\n', + ].join('\n') + ); + } + + throw error; +}); + +require('../dist/generate.cjs'); diff --git a/code/lib/toolbox/package.json b/code/lib/toolbox/package.json new file mode 100644 index 000000000000..e7b2f087b871 --- /dev/null +++ b/code/lib/toolbox/package.json @@ -0,0 +1,93 @@ +{ + "name": "@storybook/toolbox", + "version": "8.2.0-beta.0", + "description": "Storybook's Toolbox", + "homepage": "https://github.com/storybookjs/storybook/tree/next/code/lib/toolbox", + "bugs": { + "url": "https://github.com/storybookjs/storybook/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/storybookjs/storybook.git", + "directory": "code/lib/toolbox" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "license": "MIT", + "author": "Storybook Team", + "type": "module", + "exports": { + "./bin/index.cjs": { + "node": "./bin/index.cjs", + "require": "./bin/index.cjs" + }, + "./package.json": "./package.json" + }, + "bin": "./bin/index.cjs", + "files": [ + "bin/**/*", + "dist/**/*", + "rendererAssets/**/*", + "templates/**/*", + "README.md", + "!src/**/*" + ], + "scripts": { + "check": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/check.ts", + "prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/bundle.ts" + }, + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/types": "^7.24.0", + "@ndelangen/get-tarball": "^3.0.7", + "@storybook/codemod": "workspace:*", + "@storybook/core": "workspace:*", + "@types/semver": "^7.3.4", + "@yarnpkg/fslib": "2.10.3", + "@yarnpkg/libzip": "2.3.0", + "chalk": "^4.1.0", + "commander": "^6.2.1", + "cross-spawn": "^7.0.3", + "detect-indent": "^6.1.0", + "envinfo": "^7.7.3", + "execa": "^5.0.0", + "fd-package-json": "^1.2.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "get-npm-tarball-url": "^2.0.3", + "giget": "^1.0.0", + "globby": "^14.0.1", + "jscodeshift": "^0.15.1", + "leven": "^3.1.0", + "ora": "^5.4.1", + "prettier": "^3.1.1", + "prompts": "^2.4.0", + "semver": "^7.3.7", + "strip-json-comments": "^3.0.1", + "tempy": "^3.1.0", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0" + }, + "devDependencies": { + "@types/cross-spawn": "^6.0.2", + "@types/prompts": "^2.0.9", + "@types/util-deprecate": "^1.0.0", + "boxen": "^7.1.1", + "slash": "^5.0.0", + "strip-ansi": "^7.1.0", + "strip-json-comments": "^3.1.1", + "typescript": "^5.3.2" + }, + "publishConfig": { + "access": "public" + }, + "bundler": { + "entries": [ + "./src/generate.ts" + ], + "platform": "node" + }, + "gitHead": "e6a7fd8a655c69780bc20b9749c2699e44beae16" +} diff --git a/code/lib/toolbox/project.json b/code/lib/toolbox/project.json new file mode 100644 index 000000000000..f40771fc4588 --- /dev/null +++ b/code/lib/toolbox/project.json @@ -0,0 +1,8 @@ +{ + "name": "toolbox", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "library", + "targets": { + "build": {} + } +} diff --git a/code/lib/cli/rendererAssets/.eslintrc.json b/code/lib/toolbox/rendererAssets/.eslintrc.json similarity index 100% rename from code/lib/cli/rendererAssets/.eslintrc.json rename to code/lib/toolbox/rendererAssets/.eslintrc.json diff --git a/code/lib/cli/rendererAssets/common/Configure.mdx b/code/lib/toolbox/rendererAssets/common/Configure.mdx similarity index 100% rename from code/lib/cli/rendererAssets/common/Configure.mdx rename to code/lib/toolbox/rendererAssets/common/Configure.mdx diff --git a/code/lib/cli/rendererAssets/common/assets/accessibility.png b/code/lib/toolbox/rendererAssets/common/assets/accessibility.png similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/accessibility.png rename to code/lib/toolbox/rendererAssets/common/assets/accessibility.png diff --git a/code/lib/cli/rendererAssets/common/assets/accessibility.svg b/code/lib/toolbox/rendererAssets/common/assets/accessibility.svg similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/accessibility.svg rename to code/lib/toolbox/rendererAssets/common/assets/accessibility.svg diff --git a/code/lib/cli/rendererAssets/common/assets/addon-library.png b/code/lib/toolbox/rendererAssets/common/assets/addon-library.png similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/addon-library.png rename to code/lib/toolbox/rendererAssets/common/assets/addon-library.png diff --git a/code/lib/cli/rendererAssets/common/assets/assets.png b/code/lib/toolbox/rendererAssets/common/assets/assets.png similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/assets.png rename to code/lib/toolbox/rendererAssets/common/assets/assets.png diff --git a/code/lib/cli/rendererAssets/common/assets/avif-test-image.avif b/code/lib/toolbox/rendererAssets/common/assets/avif-test-image.avif similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/avif-test-image.avif rename to code/lib/toolbox/rendererAssets/common/assets/avif-test-image.avif diff --git a/code/lib/cli/rendererAssets/common/assets/context.png b/code/lib/toolbox/rendererAssets/common/assets/context.png similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/context.png rename to code/lib/toolbox/rendererAssets/common/assets/context.png diff --git a/code/lib/cli/rendererAssets/common/assets/discord.svg b/code/lib/toolbox/rendererAssets/common/assets/discord.svg similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/discord.svg rename to code/lib/toolbox/rendererAssets/common/assets/discord.svg diff --git a/code/lib/cli/rendererAssets/common/assets/docs.png b/code/lib/toolbox/rendererAssets/common/assets/docs.png similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/docs.png rename to code/lib/toolbox/rendererAssets/common/assets/docs.png diff --git a/code/lib/cli/rendererAssets/common/assets/figma-plugin.png b/code/lib/toolbox/rendererAssets/common/assets/figma-plugin.png similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/figma-plugin.png rename to code/lib/toolbox/rendererAssets/common/assets/figma-plugin.png diff --git a/code/lib/cli/rendererAssets/common/assets/github.svg b/code/lib/toolbox/rendererAssets/common/assets/github.svg similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/github.svg rename to code/lib/toolbox/rendererAssets/common/assets/github.svg diff --git a/code/lib/cli/rendererAssets/common/assets/share.png b/code/lib/toolbox/rendererAssets/common/assets/share.png similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/share.png rename to code/lib/toolbox/rendererAssets/common/assets/share.png diff --git a/code/lib/cli/rendererAssets/common/assets/styling.png b/code/lib/toolbox/rendererAssets/common/assets/styling.png similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/styling.png rename to code/lib/toolbox/rendererAssets/common/assets/styling.png diff --git a/code/lib/cli/rendererAssets/common/assets/testing.png b/code/lib/toolbox/rendererAssets/common/assets/testing.png similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/testing.png rename to code/lib/toolbox/rendererAssets/common/assets/testing.png diff --git a/code/lib/cli/rendererAssets/common/assets/theming.png b/code/lib/toolbox/rendererAssets/common/assets/theming.png similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/theming.png rename to code/lib/toolbox/rendererAssets/common/assets/theming.png diff --git a/code/lib/cli/rendererAssets/common/assets/tutorials.svg b/code/lib/toolbox/rendererAssets/common/assets/tutorials.svg similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/tutorials.svg rename to code/lib/toolbox/rendererAssets/common/assets/tutorials.svg diff --git a/code/lib/cli/rendererAssets/common/assets/youtube.svg b/code/lib/toolbox/rendererAssets/common/assets/youtube.svg similarity index 100% rename from code/lib/cli/rendererAssets/common/assets/youtube.svg rename to code/lib/toolbox/rendererAssets/common/assets/youtube.svg diff --git a/code/lib/cli/rendererAssets/common/button.css b/code/lib/toolbox/rendererAssets/common/button.css similarity index 100% rename from code/lib/cli/rendererAssets/common/button.css rename to code/lib/toolbox/rendererAssets/common/button.css diff --git a/code/lib/cli/rendererAssets/common/header.css b/code/lib/toolbox/rendererAssets/common/header.css similarity index 100% rename from code/lib/cli/rendererAssets/common/header.css rename to code/lib/toolbox/rendererAssets/common/header.css diff --git a/code/lib/cli/rendererAssets/common/page.css b/code/lib/toolbox/rendererAssets/common/page.css similarity index 100% rename from code/lib/cli/rendererAssets/common/page.css rename to code/lib/toolbox/rendererAssets/common/page.css diff --git a/code/lib/cli/src/NpmOptions.ts b/code/lib/toolbox/src/NpmOptions.ts similarity index 100% rename from code/lib/cli/src/NpmOptions.ts rename to code/lib/toolbox/src/NpmOptions.ts diff --git a/code/lib/cli/src/add.test.ts b/code/lib/toolbox/src/add.test.ts similarity index 100% rename from code/lib/cli/src/add.test.ts rename to code/lib/toolbox/src/add.test.ts diff --git a/code/lib/cli/src/add.ts b/code/lib/toolbox/src/add.ts similarity index 100% rename from code/lib/cli/src/add.ts rename to code/lib/toolbox/src/add.ts diff --git a/code/lib/cli/src/autoblock/block-dependencies-versions.ts b/code/lib/toolbox/src/autoblock/block-dependencies-versions.ts similarity index 100% rename from code/lib/cli/src/autoblock/block-dependencies-versions.ts rename to code/lib/toolbox/src/autoblock/block-dependencies-versions.ts diff --git a/code/lib/cli/src/autoblock/block-node-version.ts b/code/lib/toolbox/src/autoblock/block-node-version.ts similarity index 100% rename from code/lib/cli/src/autoblock/block-node-version.ts rename to code/lib/toolbox/src/autoblock/block-node-version.ts diff --git a/code/lib/cli/src/autoblock/block-storystorev6.ts b/code/lib/toolbox/src/autoblock/block-storystorev6.ts similarity index 100% rename from code/lib/cli/src/autoblock/block-storystorev6.ts rename to code/lib/toolbox/src/autoblock/block-storystorev6.ts diff --git a/code/lib/cli/src/autoblock/index.test.ts b/code/lib/toolbox/src/autoblock/index.test.ts similarity index 100% rename from code/lib/cli/src/autoblock/index.test.ts rename to code/lib/toolbox/src/autoblock/index.test.ts diff --git a/code/lib/cli/src/autoblock/index.ts b/code/lib/toolbox/src/autoblock/index.ts similarity index 100% rename from code/lib/cli/src/autoblock/index.ts rename to code/lib/toolbox/src/autoblock/index.ts diff --git a/code/lib/cli/src/autoblock/types.ts b/code/lib/toolbox/src/autoblock/types.ts similarity index 100% rename from code/lib/cli/src/autoblock/types.ts rename to code/lib/toolbox/src/autoblock/types.ts diff --git a/code/lib/cli/src/automigrate/fixes/__test__/main-config-with-wrappers.js b/code/lib/toolbox/src/automigrate/fixes/__test__/main-config-with-wrappers.js similarity index 100% rename from code/lib/cli/src/automigrate/fixes/__test__/main-config-with-wrappers.js rename to code/lib/toolbox/src/automigrate/fixes/__test__/main-config-with-wrappers.js diff --git a/code/lib/cli/src/automigrate/fixes/__test__/main-config-without-wrappers.js b/code/lib/toolbox/src/automigrate/fixes/__test__/main-config-without-wrappers.js similarity index 100% rename from code/lib/cli/src/automigrate/fixes/__test__/main-config-without-wrappers.js rename to code/lib/toolbox/src/automigrate/fixes/__test__/main-config-without-wrappers.js diff --git a/code/lib/cli/src/automigrate/fixes/addon-postcss.test.ts b/code/lib/toolbox/src/automigrate/fixes/addon-postcss.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/addon-postcss.test.ts rename to code/lib/toolbox/src/automigrate/fixes/addon-postcss.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/addon-postcss.ts b/code/lib/toolbox/src/automigrate/fixes/addon-postcss.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/addon-postcss.ts rename to code/lib/toolbox/src/automigrate/fixes/addon-postcss.ts diff --git a/code/lib/cli/src/automigrate/fixes/addons-api.test.ts b/code/lib/toolbox/src/automigrate/fixes/addons-api.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/addons-api.test.ts rename to code/lib/toolbox/src/automigrate/fixes/addons-api.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/addons-api.ts b/code/lib/toolbox/src/automigrate/fixes/addons-api.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/addons-api.ts rename to code/lib/toolbox/src/automigrate/fixes/addons-api.ts diff --git a/code/lib/cli/src/automigrate/fixes/angular-builders-multiproject.test.ts b/code/lib/toolbox/src/automigrate/fixes/angular-builders-multiproject.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/angular-builders-multiproject.test.ts rename to code/lib/toolbox/src/automigrate/fixes/angular-builders-multiproject.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/angular-builders-multiproject.ts b/code/lib/toolbox/src/automigrate/fixes/angular-builders-multiproject.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/angular-builders-multiproject.ts rename to code/lib/toolbox/src/automigrate/fixes/angular-builders-multiproject.ts diff --git a/code/lib/cli/src/automigrate/fixes/angular-builders.test.ts b/code/lib/toolbox/src/automigrate/fixes/angular-builders.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/angular-builders.test.ts rename to code/lib/toolbox/src/automigrate/fixes/angular-builders.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/angular-builders.ts b/code/lib/toolbox/src/automigrate/fixes/angular-builders.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/angular-builders.ts rename to code/lib/toolbox/src/automigrate/fixes/angular-builders.ts diff --git a/code/lib/cli/src/automigrate/fixes/autodocs-tags.test.ts b/code/lib/toolbox/src/automigrate/fixes/autodocs-tags.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/autodocs-tags.test.ts rename to code/lib/toolbox/src/automigrate/fixes/autodocs-tags.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/autodocs-tags.ts b/code/lib/toolbox/src/automigrate/fixes/autodocs-tags.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/autodocs-tags.ts rename to code/lib/toolbox/src/automigrate/fixes/autodocs-tags.ts diff --git a/code/lib/cli/src/automigrate/fixes/autodocs-true.test.ts b/code/lib/toolbox/src/automigrate/fixes/autodocs-true.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/autodocs-true.test.ts rename to code/lib/toolbox/src/automigrate/fixes/autodocs-true.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/autodocs-true.ts b/code/lib/toolbox/src/automigrate/fixes/autodocs-true.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/autodocs-true.ts rename to code/lib/toolbox/src/automigrate/fixes/autodocs-true.ts diff --git a/code/lib/cli/src/automigrate/fixes/builder-vite.test.ts b/code/lib/toolbox/src/automigrate/fixes/builder-vite.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/builder-vite.test.ts rename to code/lib/toolbox/src/automigrate/fixes/builder-vite.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/builder-vite.ts b/code/lib/toolbox/src/automigrate/fixes/builder-vite.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/builder-vite.ts rename to code/lib/toolbox/src/automigrate/fixes/builder-vite.ts diff --git a/code/lib/cli/src/automigrate/fixes/cra5.test.ts b/code/lib/toolbox/src/automigrate/fixes/cra5.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/cra5.test.ts rename to code/lib/toolbox/src/automigrate/fixes/cra5.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/cra5.ts b/code/lib/toolbox/src/automigrate/fixes/cra5.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/cra5.ts rename to code/lib/toolbox/src/automigrate/fixes/cra5.ts diff --git a/code/lib/cli/src/automigrate/fixes/eslint-plugin.test.ts b/code/lib/toolbox/src/automigrate/fixes/eslint-plugin.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/eslint-plugin.test.ts rename to code/lib/toolbox/src/automigrate/fixes/eslint-plugin.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/eslint-plugin.ts b/code/lib/toolbox/src/automigrate/fixes/eslint-plugin.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/eslint-plugin.ts rename to code/lib/toolbox/src/automigrate/fixes/eslint-plugin.ts diff --git a/code/lib/cli/src/automigrate/fixes/index.ts b/code/lib/toolbox/src/automigrate/fixes/index.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/index.ts rename to code/lib/toolbox/src/automigrate/fixes/index.ts diff --git a/code/lib/cli/src/automigrate/fixes/initial-globals.test.ts b/code/lib/toolbox/src/automigrate/fixes/initial-globals.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/initial-globals.test.ts rename to code/lib/toolbox/src/automigrate/fixes/initial-globals.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/initial-globals.ts b/code/lib/toolbox/src/automigrate/fixes/initial-globals.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/initial-globals.ts rename to code/lib/toolbox/src/automigrate/fixes/initial-globals.ts diff --git a/code/lib/cli/src/automigrate/fixes/mdx-1-to-3.test.ts b/code/lib/toolbox/src/automigrate/fixes/mdx-1-to-3.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/mdx-1-to-3.test.ts rename to code/lib/toolbox/src/automigrate/fixes/mdx-1-to-3.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/mdx-1-to-3.ts b/code/lib/toolbox/src/automigrate/fixes/mdx-1-to-3.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/mdx-1-to-3.ts rename to code/lib/toolbox/src/automigrate/fixes/mdx-1-to-3.ts diff --git a/code/lib/cli/src/automigrate/fixes/mdx-gfm.test.ts b/code/lib/toolbox/src/automigrate/fixes/mdx-gfm.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/mdx-gfm.test.ts rename to code/lib/toolbox/src/automigrate/fixes/mdx-gfm.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/mdx-gfm.ts b/code/lib/toolbox/src/automigrate/fixes/mdx-gfm.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/mdx-gfm.ts rename to code/lib/toolbox/src/automigrate/fixes/mdx-gfm.ts diff --git a/code/lib/cli/src/automigrate/fixes/mdx-to-csf.test.ts b/code/lib/toolbox/src/automigrate/fixes/mdx-to-csf.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/mdx-to-csf.test.ts rename to code/lib/toolbox/src/automigrate/fixes/mdx-to-csf.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/mdx-to-csf.ts b/code/lib/toolbox/src/automigrate/fixes/mdx-to-csf.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/mdx-to-csf.ts rename to code/lib/toolbox/src/automigrate/fixes/mdx-to-csf.ts diff --git a/code/lib/cli/src/automigrate/fixes/new-frameworks.test.ts b/code/lib/toolbox/src/automigrate/fixes/new-frameworks.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/new-frameworks.test.ts rename to code/lib/toolbox/src/automigrate/fixes/new-frameworks.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/new-frameworks.ts b/code/lib/toolbox/src/automigrate/fixes/new-frameworks.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/new-frameworks.ts rename to code/lib/toolbox/src/automigrate/fixes/new-frameworks.ts diff --git a/code/lib/cli/src/automigrate/fixes/prompt-remove-react.test.ts b/code/lib/toolbox/src/automigrate/fixes/prompt-remove-react.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/prompt-remove-react.test.ts rename to code/lib/toolbox/src/automigrate/fixes/prompt-remove-react.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/prompt-remove-react.ts b/code/lib/toolbox/src/automigrate/fixes/prompt-remove-react.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/prompt-remove-react.ts rename to code/lib/toolbox/src/automigrate/fixes/prompt-remove-react.ts diff --git a/code/lib/cli/src/automigrate/fixes/react-docgen.test.ts b/code/lib/toolbox/src/automigrate/fixes/react-docgen.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/react-docgen.test.ts rename to code/lib/toolbox/src/automigrate/fixes/react-docgen.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/react-docgen.ts b/code/lib/toolbox/src/automigrate/fixes/react-docgen.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/react-docgen.ts rename to code/lib/toolbox/src/automigrate/fixes/react-docgen.ts diff --git a/code/lib/cli/src/automigrate/fixes/remove-argtypes-regex.ts b/code/lib/toolbox/src/automigrate/fixes/remove-argtypes-regex.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/remove-argtypes-regex.ts rename to code/lib/toolbox/src/automigrate/fixes/remove-argtypes-regex.ts diff --git a/code/lib/cli/src/automigrate/fixes/remove-global-client-apis.test.ts b/code/lib/toolbox/src/automigrate/fixes/remove-global-client-apis.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/remove-global-client-apis.test.ts rename to code/lib/toolbox/src/automigrate/fixes/remove-global-client-apis.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/remove-global-client-apis.ts b/code/lib/toolbox/src/automigrate/fixes/remove-global-client-apis.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/remove-global-client-apis.ts rename to code/lib/toolbox/src/automigrate/fixes/remove-global-client-apis.ts diff --git a/code/lib/cli/src/automigrate/fixes/remove-jest-testing-library.test.ts b/code/lib/toolbox/src/automigrate/fixes/remove-jest-testing-library.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/remove-jest-testing-library.test.ts rename to code/lib/toolbox/src/automigrate/fixes/remove-jest-testing-library.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/remove-jest-testing-library.ts b/code/lib/toolbox/src/automigrate/fixes/remove-jest-testing-library.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/remove-jest-testing-library.ts rename to code/lib/toolbox/src/automigrate/fixes/remove-jest-testing-library.ts diff --git a/code/lib/cli/src/automigrate/fixes/remove-legacymdx1.ts b/code/lib/toolbox/src/automigrate/fixes/remove-legacymdx1.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/remove-legacymdx1.ts rename to code/lib/toolbox/src/automigrate/fixes/remove-legacymdx1.ts diff --git a/code/lib/cli/src/automigrate/fixes/sb-binary.test.ts b/code/lib/toolbox/src/automigrate/fixes/sb-binary.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/sb-binary.test.ts rename to code/lib/toolbox/src/automigrate/fixes/sb-binary.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/sb-binary.ts b/code/lib/toolbox/src/automigrate/fixes/sb-binary.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/sb-binary.ts rename to code/lib/toolbox/src/automigrate/fixes/sb-binary.ts diff --git a/code/lib/cli/src/automigrate/fixes/sb-scripts.test.ts b/code/lib/toolbox/src/automigrate/fixes/sb-scripts.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/sb-scripts.test.ts rename to code/lib/toolbox/src/automigrate/fixes/sb-scripts.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/sb-scripts.ts b/code/lib/toolbox/src/automigrate/fixes/sb-scripts.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/sb-scripts.ts rename to code/lib/toolbox/src/automigrate/fixes/sb-scripts.ts diff --git a/code/lib/cli/src/automigrate/fixes/storyshots-migration.test.ts b/code/lib/toolbox/src/automigrate/fixes/storyshots-migration.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/storyshots-migration.test.ts rename to code/lib/toolbox/src/automigrate/fixes/storyshots-migration.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/storyshots-migration.ts b/code/lib/toolbox/src/automigrate/fixes/storyshots-migration.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/storyshots-migration.ts rename to code/lib/toolbox/src/automigrate/fixes/storyshots-migration.ts diff --git a/code/lib/cli/src/automigrate/fixes/upgrade-storybook-related-dependencies.test.ts b/code/lib/toolbox/src/automigrate/fixes/upgrade-storybook-related-dependencies.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/upgrade-storybook-related-dependencies.test.ts rename to code/lib/toolbox/src/automigrate/fixes/upgrade-storybook-related-dependencies.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/upgrade-storybook-related-dependencies.ts b/code/lib/toolbox/src/automigrate/fixes/upgrade-storybook-related-dependencies.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/upgrade-storybook-related-dependencies.ts rename to code/lib/toolbox/src/automigrate/fixes/upgrade-storybook-related-dependencies.ts diff --git a/code/lib/cli/src/automigrate/fixes/vite-config-file.ts b/code/lib/toolbox/src/automigrate/fixes/vite-config-file.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/vite-config-file.ts rename to code/lib/toolbox/src/automigrate/fixes/vite-config-file.ts diff --git a/code/lib/cli/src/automigrate/fixes/vta.test.ts b/code/lib/toolbox/src/automigrate/fixes/vta.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/vta.test.ts rename to code/lib/toolbox/src/automigrate/fixes/vta.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/vta.ts b/code/lib/toolbox/src/automigrate/fixes/vta.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/vta.ts rename to code/lib/toolbox/src/automigrate/fixes/vta.ts diff --git a/code/lib/cli/src/automigrate/fixes/vue3.test.ts b/code/lib/toolbox/src/automigrate/fixes/vue3.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/vue3.test.ts rename to code/lib/toolbox/src/automigrate/fixes/vue3.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/vue3.ts b/code/lib/toolbox/src/automigrate/fixes/vue3.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/vue3.ts rename to code/lib/toolbox/src/automigrate/fixes/vue3.ts diff --git a/code/lib/cli/src/automigrate/fixes/webpack5-compiler-setup.test.ts b/code/lib/toolbox/src/automigrate/fixes/webpack5-compiler-setup.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/webpack5-compiler-setup.test.ts rename to code/lib/toolbox/src/automigrate/fixes/webpack5-compiler-setup.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/webpack5-compiler-setup.ts b/code/lib/toolbox/src/automigrate/fixes/webpack5-compiler-setup.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/webpack5-compiler-setup.ts rename to code/lib/toolbox/src/automigrate/fixes/webpack5-compiler-setup.ts diff --git a/code/lib/cli/src/automigrate/fixes/webpack5.test.ts b/code/lib/toolbox/src/automigrate/fixes/webpack5.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/webpack5.test.ts rename to code/lib/toolbox/src/automigrate/fixes/webpack5.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/webpack5.ts b/code/lib/toolbox/src/automigrate/fixes/webpack5.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/webpack5.ts rename to code/lib/toolbox/src/automigrate/fixes/webpack5.ts diff --git a/code/lib/cli/src/automigrate/fixes/wrap-require-utils.ts b/code/lib/toolbox/src/automigrate/fixes/wrap-require-utils.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/wrap-require-utils.ts rename to code/lib/toolbox/src/automigrate/fixes/wrap-require-utils.ts diff --git a/code/lib/cli/src/automigrate/fixes/wrap-require.test.ts b/code/lib/toolbox/src/automigrate/fixes/wrap-require.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/wrap-require.test.ts rename to code/lib/toolbox/src/automigrate/fixes/wrap-require.test.ts diff --git a/code/lib/cli/src/automigrate/fixes/wrap-require.ts b/code/lib/toolbox/src/automigrate/fixes/wrap-require.ts similarity index 100% rename from code/lib/cli/src/automigrate/fixes/wrap-require.ts rename to code/lib/toolbox/src/automigrate/fixes/wrap-require.ts diff --git a/code/lib/cli/src/automigrate/helpers/checkWebpack5Builder.test.ts b/code/lib/toolbox/src/automigrate/helpers/checkWebpack5Builder.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/helpers/checkWebpack5Builder.test.ts rename to code/lib/toolbox/src/automigrate/helpers/checkWebpack5Builder.test.ts diff --git a/code/lib/cli/src/automigrate/helpers/checkWebpack5Builder.ts b/code/lib/toolbox/src/automigrate/helpers/checkWebpack5Builder.ts similarity index 100% rename from code/lib/cli/src/automigrate/helpers/checkWebpack5Builder.ts rename to code/lib/toolbox/src/automigrate/helpers/checkWebpack5Builder.ts diff --git a/code/lib/cli/src/automigrate/helpers/cleanLog.ts b/code/lib/toolbox/src/automigrate/helpers/cleanLog.ts similarity index 100% rename from code/lib/cli/src/automigrate/helpers/cleanLog.ts rename to code/lib/toolbox/src/automigrate/helpers/cleanLog.ts diff --git a/code/lib/cli/src/automigrate/helpers/detectRenderer.ts b/code/lib/toolbox/src/automigrate/helpers/detectRenderer.ts similarity index 100% rename from code/lib/cli/src/automigrate/helpers/detectRenderer.ts rename to code/lib/toolbox/src/automigrate/helpers/detectRenderer.ts diff --git a/code/lib/cli/src/automigrate/helpers/eslintPlugin.test.ts b/code/lib/toolbox/src/automigrate/helpers/eslintPlugin.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/helpers/eslintPlugin.test.ts rename to code/lib/toolbox/src/automigrate/helpers/eslintPlugin.test.ts diff --git a/code/lib/cli/src/automigrate/helpers/eslintPlugin.ts b/code/lib/toolbox/src/automigrate/helpers/eslintPlugin.ts similarity index 100% rename from code/lib/cli/src/automigrate/helpers/eslintPlugin.ts rename to code/lib/toolbox/src/automigrate/helpers/eslintPlugin.ts diff --git a/code/lib/cli/src/automigrate/helpers/getMigrationSummary.test.ts b/code/lib/toolbox/src/automigrate/helpers/getMigrationSummary.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/helpers/getMigrationSummary.test.ts rename to code/lib/toolbox/src/automigrate/helpers/getMigrationSummary.test.ts diff --git a/code/lib/cli/src/automigrate/helpers/getMigrationSummary.ts b/code/lib/toolbox/src/automigrate/helpers/getMigrationSummary.ts similarity index 100% rename from code/lib/cli/src/automigrate/helpers/getMigrationSummary.ts rename to code/lib/toolbox/src/automigrate/helpers/getMigrationSummary.ts diff --git a/code/lib/cli/src/automigrate/helpers/mainConfigFile.test.ts b/code/lib/toolbox/src/automigrate/helpers/mainConfigFile.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/helpers/mainConfigFile.test.ts rename to code/lib/toolbox/src/automigrate/helpers/mainConfigFile.test.ts diff --git a/code/lib/cli/src/automigrate/helpers/mainConfigFile.ts b/code/lib/toolbox/src/automigrate/helpers/mainConfigFile.ts similarity index 100% rename from code/lib/cli/src/automigrate/helpers/mainConfigFile.ts rename to code/lib/toolbox/src/automigrate/helpers/mainConfigFile.ts diff --git a/code/lib/cli/src/automigrate/helpers/new-frameworks-utils.test.ts b/code/lib/toolbox/src/automigrate/helpers/new-frameworks-utils.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/helpers/new-frameworks-utils.test.ts rename to code/lib/toolbox/src/automigrate/helpers/new-frameworks-utils.test.ts diff --git a/code/lib/cli/src/automigrate/helpers/new-frameworks-utils.ts b/code/lib/toolbox/src/automigrate/helpers/new-frameworks-utils.ts similarity index 100% rename from code/lib/cli/src/automigrate/helpers/new-frameworks-utils.ts rename to code/lib/toolbox/src/automigrate/helpers/new-frameworks-utils.ts diff --git a/code/lib/cli/src/automigrate/helpers/testing-helpers.ts b/code/lib/toolbox/src/automigrate/helpers/testing-helpers.ts similarity index 100% rename from code/lib/cli/src/automigrate/helpers/testing-helpers.ts rename to code/lib/toolbox/src/automigrate/helpers/testing-helpers.ts diff --git a/code/lib/cli/src/automigrate/index.test.ts b/code/lib/toolbox/src/automigrate/index.test.ts similarity index 100% rename from code/lib/cli/src/automigrate/index.test.ts rename to code/lib/toolbox/src/automigrate/index.test.ts diff --git a/code/lib/cli/src/automigrate/index.ts b/code/lib/toolbox/src/automigrate/index.ts similarity index 100% rename from code/lib/cli/src/automigrate/index.ts rename to code/lib/toolbox/src/automigrate/index.ts diff --git a/code/lib/cli/src/automigrate/types.ts b/code/lib/toolbox/src/automigrate/types.ts similarity index 100% rename from code/lib/cli/src/automigrate/types.ts rename to code/lib/toolbox/src/automigrate/types.ts diff --git a/code/lib/cli/src/detect.test.ts b/code/lib/toolbox/src/detect.test.ts similarity index 100% rename from code/lib/cli/src/detect.test.ts rename to code/lib/toolbox/src/detect.test.ts diff --git a/code/lib/cli/src/detect.ts b/code/lib/toolbox/src/detect.ts similarity index 100% rename from code/lib/cli/src/detect.ts rename to code/lib/toolbox/src/detect.ts diff --git a/code/lib/cli/src/dirs.ts b/code/lib/toolbox/src/dirs.ts similarity index 96% rename from code/lib/cli/src/dirs.ts rename to code/lib/toolbox/src/dirs.ts index 32f31f6ecadb..047712220b54 100644 --- a/code/lib/cli/src/dirs.ts +++ b/code/lib/toolbox/src/dirs.ts @@ -11,7 +11,7 @@ import { versions } from '@storybook/core/common'; import type { SupportedFrameworks } from '@storybook/core/types'; export function getCliDir() { - return dirname(require.resolve('storybook/package.json')); + return dirname(require.resolve('@storybook/toolbox/package.json')); } const resolveUsingBranchInstall = async (packageManager: JsPackageManager, request: string) => { diff --git a/code/lib/cli/src/doctor/getDuplicatedDepsWarnings.ts b/code/lib/toolbox/src/doctor/getDuplicatedDepsWarnings.ts similarity index 100% rename from code/lib/cli/src/doctor/getDuplicatedDepsWarnings.ts rename to code/lib/toolbox/src/doctor/getDuplicatedDepsWarnings.ts diff --git a/code/lib/cli/src/doctor/getIncompatibleStorybookPackages.test.ts b/code/lib/toolbox/src/doctor/getIncompatibleStorybookPackages.test.ts similarity index 100% rename from code/lib/cli/src/doctor/getIncompatibleStorybookPackages.test.ts rename to code/lib/toolbox/src/doctor/getIncompatibleStorybookPackages.test.ts diff --git a/code/lib/cli/src/doctor/getIncompatibleStorybookPackages.ts b/code/lib/toolbox/src/doctor/getIncompatibleStorybookPackages.ts similarity index 100% rename from code/lib/cli/src/doctor/getIncompatibleStorybookPackages.ts rename to code/lib/toolbox/src/doctor/getIncompatibleStorybookPackages.ts diff --git a/code/lib/cli/src/doctor/getMismatchingVersionsWarning.ts b/code/lib/toolbox/src/doctor/getMismatchingVersionsWarning.ts similarity index 100% rename from code/lib/cli/src/doctor/getMismatchingVersionsWarning.ts rename to code/lib/toolbox/src/doctor/getMismatchingVersionsWarning.ts diff --git a/code/lib/cli/src/doctor/hasMultipleVersions.ts b/code/lib/toolbox/src/doctor/hasMultipleVersions.ts similarity index 100% rename from code/lib/cli/src/doctor/hasMultipleVersions.ts rename to code/lib/toolbox/src/doctor/hasMultipleVersions.ts diff --git a/code/lib/cli/src/doctor/index.ts b/code/lib/toolbox/src/doctor/index.ts similarity index 100% rename from code/lib/cli/src/doctor/index.ts rename to code/lib/toolbox/src/doctor/index.ts diff --git a/code/lib/cli/src/doctor/utils.ts b/code/lib/toolbox/src/doctor/utils.ts similarity index 100% rename from code/lib/cli/src/doctor/utils.ts rename to code/lib/toolbox/src/doctor/utils.ts diff --git a/code/lib/toolbox/src/generate.ts b/code/lib/toolbox/src/generate.ts new file mode 100644 index 000000000000..f9d6881684c4 --- /dev/null +++ b/code/lib/toolbox/src/generate.ts @@ -0,0 +1,222 @@ +import program from 'commander'; +import chalk from 'chalk'; +import envinfo from 'envinfo'; +import leven from 'leven'; +import { findPackageSync } from 'fd-package-json'; +import invariant from 'tiny-invariant'; + +import { logger } from '@storybook/core/node-logger'; +import { addToGlobalContext, telemetry } from '@storybook/core/telemetry'; +import { JsPackageManagerFactory, removeAddon as remove, versions } from '@storybook/core/common'; +import { withTelemetry } from '@storybook/core/core-server'; + +import type { CommandOptions } from './generators/types'; +import { initiate } from './initiate'; +import { add } from './add'; +import { migrate } from './migrate'; +import { upgrade, type UpgradeOptions } from './upgrade'; +import { sandbox } from './sandbox'; +import { link } from './link'; +import { doAutomigrate } from './automigrate'; +import { doctor } from './doctor'; + +addToGlobalContext('cliVersion', versions.storybook); + +const pkg = findPackageSync(__dirname); +invariant(pkg, 'Failed to find the closest package.json file.'); +const consoleLogger = console; + +const command = (name: string) => + program + .command(name) + .option( + '--disable-telemetry', + 'Disable sending telemetry data', + // default value is false, but if the user sets STORYBOOK_DISABLE_TELEMETRY, it can be true + process.env.STORYBOOK_DISABLE_TELEMETRY && process.env.STORYBOOK_DISABLE_TELEMETRY !== 'false' + ) + .option('--debug', 'Get more logs in debug mode', false) + .option('--enable-crash-reports', 'Enable sending crash reports to telemetry data'); + +command('init') + .description('Initialize Storybook into your project.') + .option('-f --force', 'Force add Storybook') + .option('-s --skip-install', 'Skip installing deps') + .option('--package-manager ', 'Force package manager for installing deps') + .option('--use-pnp', 'Enable pnp mode for Yarn 2+') + .option('-p --parser ', 'jscodeshift parser') + .option('-t --type ', 'Add Storybook for a specific project type') + .option('-y --yes', 'Answer yes to all prompts') + .option('-b --builder ', 'Builder library') + .option('-l --linkable', 'Prepare installation for link (contributor helper)') + // due to how Commander handles default values and negated options, we have to elevate the default into Commander, and we have to specify `--dev` + // alongside `--no-dev` even if we are unlikely to directly use `--dev`. https://github.com/tj/commander.js/issues/2068#issuecomment-1804524585 + .option( + '--dev', + 'Launch the development server after completing initialization. Enabled by default', + process.env.CI !== 'true' && process.env.IN_STORYBOOK_SANDBOX !== 'true' + ) + .option( + '--no-dev', + 'Complete the initialization of Storybook without launching the Storybook development server' + ) + .action((options: CommandOptions) => { + initiate(options).catch(() => process.exit(1)); + }); + +command('add ') + .description('Add an addon to your Storybook') + .option( + '--package-manager ', + 'Force package manager for installing dependencies' + ) + .option('-c, --config-dir ', 'Directory where to load Storybook configurations from') + .option('-s --skip-postinstall', 'Skip package specific postinstall config modifications') + .action((addonName: string, options: any) => add(addonName, options)); + +command('remove ') + .description('Remove an addon from your Storybook') + .option( + '--package-manager ', + 'Force package manager for installing dependencies' + ) + .action((addonName: string, options: any) => + withTelemetry('remove', { cliOptions: options }, async () => { + await remove(addonName, options); + if (!options.disableTelemetry) { + await telemetry('remove', { addon: addonName, source: 'cli' }); + } + }) + ); + +command('upgrade') + .description(`Upgrade your Storybook packages to v${versions.storybook}`) + .option( + '--package-manager ', + 'Force package manager for installing dependencies' + ) + .option('-y --yes', 'Skip prompting the user') + .option('-f --force', 'force the upgrade, skipping autoblockers') + .option('-n --dry-run', 'Only check for upgrades, do not install') + .option('-s --skip-check', 'Skip postinstall version and automigration checks') + .option('-c, --config-dir ', 'Directory where to load Storybook configurations from') + .action(async (options: UpgradeOptions) => upgrade(options).catch(() => process.exit(1))); + +command('info') + .description('Prints debugging information about the local environment') + .action(async () => { + consoleLogger.log(chalk.bold('\nStorybook Environment Info:')); + const pkgManager = await JsPackageManagerFactory.getPackageManager(); + const activePackageManager = pkgManager.type.replace(/\d/, ''); // 'yarn1' -> 'yarn' + const output = await envinfo.run({ + System: ['OS', 'CPU', 'Shell'], + Binaries: ['Node', 'Yarn', 'npm', 'pnpm'], + Browsers: ['Chrome', 'Edge', 'Firefox', 'Safari'], + npmPackages: '{@storybook/*,*storybook*,sb,chromatic}', + npmGlobalPackages: '{@storybook/*,*storybook*,sb,chromatic}', + }); + const activePackageManagerLine = output.match(new RegExp(`${activePackageManager}:.*`, 'i')); + consoleLogger.log( + output.replace( + activePackageManagerLine, + chalk.bold(`${activePackageManagerLine} <----- active`) + ) + ); + }); + +command('migrate [migration]') + .description('Run a Storybook codemod migration on your source files') + .option('-l --list', 'List available migrations') + .option('-g --glob ', 'Glob for files upon which to apply the migration', '**/*.js') + .option('-p --parser ', 'jscodeshift parser') + .option('-c, --config-dir ', 'Directory where to load Storybook configurations from') + .option( + '-n --dry-run', + 'Dry run: verify the migration exists and show the files to which it will be applied' + ) + .option( + '-r --rename ', + 'Rename suffix of matching files after codemod has been applied, e.g. ".js:.ts"' + ) + .action((migration, { configDir, glob, dryRun, list, rename, parser }) => { + migrate(migration, { + configDir, + glob, + dryRun, + list, + rename, + parser, + }).catch((err) => { + logger.error(err); + process.exit(1); + }); + }); + +command('sandbox [filterValue]') + .alias('repro') // for backwards compatibility + .description('Create a sandbox from a set of possible templates') + .option('-o --output ', 'Define an output directory') + .option('--no-init', 'Whether to download a template without an initialized Storybook', false) + .action((filterValue, options) => + sandbox({ filterValue, ...options }).catch((e) => { + logger.error(e); + process.exit(1); + }) + ); + +command('link ') + .description('Pull down a repro from a URL (or a local directory), link it, and run storybook') + .option('--local', 'Link a local directory already in your file system') + .option('--no-start', 'Start the storybook', true) + .action((target, { local, start }) => + link({ target, local, start }).catch((e) => { + logger.error(e); + process.exit(1); + }) + ); + +command('automigrate [fixId]') + .description('Check storybook for incompatibilities or migrations and apply fixes') + .option('-y --yes', 'Skip prompting the user') + .option('-n --dry-run', 'Only check for fixes, do not actually run them') + .option('--package-manager ', 'Force package manager') + .option('-l --list', 'List available migrations') + .option('-c, --config-dir ', 'Directory of Storybook configurations to migrate') + .option('-s --skip-install', 'Skip installing deps') + .option( + '--renderer ', + 'The renderer package for the framework Storybook is using.' + ) + .action(async (fixId, options) => { + await doAutomigrate({ fixId, ...options }).catch((e) => { + logger.error(e); + process.exit(1); + }); + }); + +command('doctor') + .description('Check Storybook for known problems and provide suggestions or fixes') + .option('--package-manager ', 'Force package manager') + .option('-c, --config-dir ', 'Directory of Storybook configuration') + .action(async (options) => { + await doctor(options).catch((e) => { + logger.error(e); + process.exit(1); + }); + }); + +program.on('command:*', ([invalidCmd]) => { + consoleLogger.error( + ' Invalid command: %s.\n See --help for a list of available commands.', + invalidCmd + ); + // eslint-disable-next-line no-underscore-dangle + const availableCommands = program.commands.map((cmd) => cmd._name); + const suggestion = availableCommands.find((cmd) => leven(cmd, invalidCmd) < 3); + if (suggestion) { + consoleLogger.info(`\n Did you mean ${suggestion}?`); + } + process.exit(1); +}); + +program.usage(' [options]').version(String(pkg.version)).parse(process.argv); diff --git a/code/lib/cli/src/generators/ANGULAR/helpers.ts b/code/lib/toolbox/src/generators/ANGULAR/helpers.ts similarity index 100% rename from code/lib/cli/src/generators/ANGULAR/helpers.ts rename to code/lib/toolbox/src/generators/ANGULAR/helpers.ts diff --git a/code/lib/cli/src/generators/ANGULAR/index.ts b/code/lib/toolbox/src/generators/ANGULAR/index.ts similarity index 100% rename from code/lib/cli/src/generators/ANGULAR/index.ts rename to code/lib/toolbox/src/generators/ANGULAR/index.ts diff --git a/code/lib/cli/src/generators/EMBER/index.ts b/code/lib/toolbox/src/generators/EMBER/index.ts similarity index 100% rename from code/lib/cli/src/generators/EMBER/index.ts rename to code/lib/toolbox/src/generators/EMBER/index.ts diff --git a/code/lib/cli/src/generators/HTML/index.ts b/code/lib/toolbox/src/generators/HTML/index.ts similarity index 100% rename from code/lib/cli/src/generators/HTML/index.ts rename to code/lib/toolbox/src/generators/HTML/index.ts diff --git a/code/lib/cli/src/generators/NEXTJS/index.ts b/code/lib/toolbox/src/generators/NEXTJS/index.ts similarity index 100% rename from code/lib/cli/src/generators/NEXTJS/index.ts rename to code/lib/toolbox/src/generators/NEXTJS/index.ts diff --git a/code/lib/cli/src/generators/NUXT/index.ts b/code/lib/toolbox/src/generators/NUXT/index.ts similarity index 100% rename from code/lib/cli/src/generators/NUXT/index.ts rename to code/lib/toolbox/src/generators/NUXT/index.ts diff --git a/code/lib/cli/src/generators/PREACT/index.ts b/code/lib/toolbox/src/generators/PREACT/index.ts similarity index 100% rename from code/lib/cli/src/generators/PREACT/index.ts rename to code/lib/toolbox/src/generators/PREACT/index.ts diff --git a/code/lib/cli/src/generators/QWIK/index.ts b/code/lib/toolbox/src/generators/QWIK/index.ts similarity index 100% rename from code/lib/cli/src/generators/QWIK/index.ts rename to code/lib/toolbox/src/generators/QWIK/index.ts diff --git a/code/lib/cli/src/generators/REACT/index.ts b/code/lib/toolbox/src/generators/REACT/index.ts similarity index 100% rename from code/lib/cli/src/generators/REACT/index.ts rename to code/lib/toolbox/src/generators/REACT/index.ts diff --git a/code/lib/cli/src/generators/REACT_NATIVE/index.ts b/code/lib/toolbox/src/generators/REACT_NATIVE/index.ts similarity index 100% rename from code/lib/cli/src/generators/REACT_NATIVE/index.ts rename to code/lib/toolbox/src/generators/REACT_NATIVE/index.ts diff --git a/code/lib/cli/src/generators/REACT_SCRIPTS/index.ts b/code/lib/toolbox/src/generators/REACT_SCRIPTS/index.ts similarity index 100% rename from code/lib/cli/src/generators/REACT_SCRIPTS/index.ts rename to code/lib/toolbox/src/generators/REACT_SCRIPTS/index.ts diff --git a/code/lib/cli/src/generators/SERVER/index.ts b/code/lib/toolbox/src/generators/SERVER/index.ts similarity index 100% rename from code/lib/cli/src/generators/SERVER/index.ts rename to code/lib/toolbox/src/generators/SERVER/index.ts diff --git a/code/lib/cli/src/generators/SOLID/index.ts b/code/lib/toolbox/src/generators/SOLID/index.ts similarity index 100% rename from code/lib/cli/src/generators/SOLID/index.ts rename to code/lib/toolbox/src/generators/SOLID/index.ts diff --git a/code/lib/cli/src/generators/SVELTE/index.ts b/code/lib/toolbox/src/generators/SVELTE/index.ts similarity index 100% rename from code/lib/cli/src/generators/SVELTE/index.ts rename to code/lib/toolbox/src/generators/SVELTE/index.ts diff --git a/code/lib/cli/src/generators/SVELTEKIT/index.ts b/code/lib/toolbox/src/generators/SVELTEKIT/index.ts similarity index 100% rename from code/lib/cli/src/generators/SVELTEKIT/index.ts rename to code/lib/toolbox/src/generators/SVELTEKIT/index.ts diff --git a/code/lib/cli/src/generators/VUE3/index.ts b/code/lib/toolbox/src/generators/VUE3/index.ts similarity index 100% rename from code/lib/cli/src/generators/VUE3/index.ts rename to code/lib/toolbox/src/generators/VUE3/index.ts diff --git a/code/lib/cli/src/generators/WEB-COMPONENTS/index.ts b/code/lib/toolbox/src/generators/WEB-COMPONENTS/index.ts similarity index 100% rename from code/lib/cli/src/generators/WEB-COMPONENTS/index.ts rename to code/lib/toolbox/src/generators/WEB-COMPONENTS/index.ts diff --git a/code/lib/cli/src/generators/WEBPACK_REACT/index.ts b/code/lib/toolbox/src/generators/WEBPACK_REACT/index.ts similarity index 100% rename from code/lib/cli/src/generators/WEBPACK_REACT/index.ts rename to code/lib/toolbox/src/generators/WEBPACK_REACT/index.ts diff --git a/code/lib/cli/src/generators/baseGenerator.ts b/code/lib/toolbox/src/generators/baseGenerator.ts similarity index 100% rename from code/lib/cli/src/generators/baseGenerator.ts rename to code/lib/toolbox/src/generators/baseGenerator.ts diff --git a/code/lib/cli/src/generators/configure.test.ts b/code/lib/toolbox/src/generators/configure.test.ts similarity index 100% rename from code/lib/cli/src/generators/configure.test.ts rename to code/lib/toolbox/src/generators/configure.test.ts diff --git a/code/lib/cli/src/generators/configure.ts b/code/lib/toolbox/src/generators/configure.ts similarity index 100% rename from code/lib/cli/src/generators/configure.ts rename to code/lib/toolbox/src/generators/configure.ts diff --git a/code/lib/cli/src/generators/types.ts b/code/lib/toolbox/src/generators/types.ts similarity index 100% rename from code/lib/cli/src/generators/types.ts rename to code/lib/toolbox/src/generators/types.ts diff --git a/code/lib/cli/src/helpers.test.ts b/code/lib/toolbox/src/helpers.test.ts similarity index 100% rename from code/lib/cli/src/helpers.test.ts rename to code/lib/toolbox/src/helpers.test.ts diff --git a/code/lib/cli/src/helpers.ts b/code/lib/toolbox/src/helpers.ts similarity index 100% rename from code/lib/cli/src/helpers.ts rename to code/lib/toolbox/src/helpers.ts diff --git a/code/lib/cli/src/initiate.ts b/code/lib/toolbox/src/initiate.ts similarity index 100% rename from code/lib/cli/src/initiate.ts rename to code/lib/toolbox/src/initiate.ts diff --git a/code/lib/cli/src/link.ts b/code/lib/toolbox/src/link.ts similarity index 100% rename from code/lib/cli/src/link.ts rename to code/lib/toolbox/src/link.ts diff --git a/code/lib/cli/src/migrate.ts b/code/lib/toolbox/src/migrate.ts similarity index 100% rename from code/lib/cli/src/migrate.ts rename to code/lib/toolbox/src/migrate.ts diff --git a/code/lib/cli/src/postinstallAddon.ts b/code/lib/toolbox/src/postinstallAddon.ts similarity index 100% rename from code/lib/cli/src/postinstallAddon.ts rename to code/lib/toolbox/src/postinstallAddon.ts diff --git a/code/lib/cli/src/project_types.test.ts b/code/lib/toolbox/src/project_types.test.ts similarity index 100% rename from code/lib/cli/src/project_types.test.ts rename to code/lib/toolbox/src/project_types.test.ts diff --git a/code/lib/cli/src/project_types.ts b/code/lib/toolbox/src/project_types.ts similarity index 100% rename from code/lib/cli/src/project_types.ts rename to code/lib/toolbox/src/project_types.ts diff --git a/code/lib/cli/src/sandbox-templates.ts b/code/lib/toolbox/src/sandbox-templates.ts similarity index 100% rename from code/lib/cli/src/sandbox-templates.ts rename to code/lib/toolbox/src/sandbox-templates.ts diff --git a/code/lib/cli/src/sandbox.ts b/code/lib/toolbox/src/sandbox.ts similarity index 100% rename from code/lib/cli/src/sandbox.ts rename to code/lib/toolbox/src/sandbox.ts diff --git a/code/lib/cli/src/scaffold-new-project.ts b/code/lib/toolbox/src/scaffold-new-project.ts similarity index 100% rename from code/lib/cli/src/scaffold-new-project.ts rename to code/lib/toolbox/src/scaffold-new-project.ts diff --git a/code/lib/cli/src/typings.d.ts b/code/lib/toolbox/src/typings.d.ts similarity index 100% rename from code/lib/cli/src/typings.d.ts rename to code/lib/toolbox/src/typings.d.ts diff --git a/code/lib/cli/src/upgrade.test.ts b/code/lib/toolbox/src/upgrade.test.ts similarity index 100% rename from code/lib/cli/src/upgrade.test.ts rename to code/lib/toolbox/src/upgrade.test.ts diff --git a/code/lib/cli/src/upgrade.ts b/code/lib/toolbox/src/upgrade.ts similarity index 100% rename from code/lib/cli/src/upgrade.ts rename to code/lib/toolbox/src/upgrade.ts diff --git a/code/lib/cli/src/warn.test.ts b/code/lib/toolbox/src/warn.test.ts similarity index 100% rename from code/lib/cli/src/warn.test.ts rename to code/lib/toolbox/src/warn.test.ts diff --git a/code/lib/cli/src/warn.ts b/code/lib/toolbox/src/warn.ts similarity index 100% rename from code/lib/cli/src/warn.ts rename to code/lib/toolbox/src/warn.ts diff --git a/code/lib/cli/src/window.d.ts b/code/lib/toolbox/src/window.d.ts similarity index 100% rename from code/lib/cli/src/window.d.ts rename to code/lib/toolbox/src/window.d.ts diff --git a/code/lib/cli/templates/angular/application/template-csf/.storybook/tsconfig.doc.json b/code/lib/toolbox/templates/angular/application/template-csf/.storybook/tsconfig.doc.json similarity index 100% rename from code/lib/cli/templates/angular/application/template-csf/.storybook/tsconfig.doc.json rename to code/lib/toolbox/templates/angular/application/template-csf/.storybook/tsconfig.doc.json diff --git a/code/lib/cli/templates/angular/application/template-csf/.storybook/tsconfig.json b/code/lib/toolbox/templates/angular/application/template-csf/.storybook/tsconfig.json similarity index 100% rename from code/lib/cli/templates/angular/application/template-csf/.storybook/tsconfig.json rename to code/lib/toolbox/templates/angular/application/template-csf/.storybook/tsconfig.json diff --git a/code/lib/cli/templates/angular/application/template-csf/.storybook/typings.d.ts b/code/lib/toolbox/templates/angular/application/template-csf/.storybook/typings.d.ts similarity index 100% rename from code/lib/cli/templates/angular/application/template-csf/.storybook/typings.d.ts rename to code/lib/toolbox/templates/angular/application/template-csf/.storybook/typings.d.ts diff --git a/code/lib/cli/templates/angular/library/template-csf/.storybook/tsconfig.json b/code/lib/toolbox/templates/angular/library/template-csf/.storybook/tsconfig.json similarity index 100% rename from code/lib/cli/templates/angular/library/template-csf/.storybook/tsconfig.json rename to code/lib/toolbox/templates/angular/library/template-csf/.storybook/tsconfig.json diff --git a/code/lib/cli/templates/angular/library/template-csf/.storybook/typings.d.ts b/code/lib/toolbox/templates/angular/library/template-csf/.storybook/typings.d.ts similarity index 100% rename from code/lib/cli/templates/angular/library/template-csf/.storybook/typings.d.ts rename to code/lib/toolbox/templates/angular/library/template-csf/.storybook/typings.d.ts diff --git a/code/lib/cli/templates/aurelia/template-csf/.storybook/tsconfig.json b/code/lib/toolbox/templates/aurelia/template-csf/.storybook/tsconfig.json similarity index 100% rename from code/lib/cli/templates/aurelia/template-csf/.storybook/tsconfig.json rename to code/lib/toolbox/templates/aurelia/template-csf/.storybook/tsconfig.json diff --git a/code/lib/cli/templates/aurelia/template-csf/.storybook/typings.d.ts b/code/lib/toolbox/templates/aurelia/template-csf/.storybook/typings.d.ts similarity index 100% rename from code/lib/cli/templates/aurelia/template-csf/.storybook/typings.d.ts rename to code/lib/toolbox/templates/aurelia/template-csf/.storybook/typings.d.ts diff --git a/code/lib/toolbox/tsconfig.json b/code/lib/toolbox/tsconfig.json new file mode 100644 index 000000000000..9c5db279ca2d --- /dev/null +++ b/code/lib/toolbox/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "types": ["node"], + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "noEmit": true + }, + "include": ["src/**/*"] +} diff --git a/code/lib/toolbox/vitest.config.ts b/code/lib/toolbox/vitest.config.ts new file mode 100644 index 000000000000..03172200442f --- /dev/null +++ b/code/lib/toolbox/vitest.config.ts @@ -0,0 +1,9 @@ +import { defineConfig, mergeConfig } from 'vitest/config'; +import { vitestCommonConfig } from '../../vitest.workspace'; + +export default mergeConfig( + vitestCommonConfig, + defineConfig({ + // Add custom config here + }) +); diff --git a/code/yarn.lock b/code/yarn.lock index f22ee0dc024f..14946d41a388 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -6762,6 +6762,52 @@ __metadata: languageName: unknown linkType: soft +"@storybook/toolbox@workspace:lib/toolbox": + version: 0.0.0-use.local + resolution: "@storybook/toolbox@workspace:lib/toolbox" + dependencies: + "@babel/core": "npm:^7.24.4" + "@babel/types": "npm:^7.24.0" + "@ndelangen/get-tarball": "npm:^3.0.7" + "@storybook/codemod": "workspace:*" + "@storybook/core": "workspace:*" + "@types/cross-spawn": "npm:^6.0.2" + "@types/prompts": "npm:^2.0.9" + "@types/semver": "npm:^7.3.4" + "@types/util-deprecate": "npm:^1.0.0" + "@yarnpkg/fslib": "npm:2.10.3" + "@yarnpkg/libzip": "npm:2.3.0" + boxen: "npm:^7.1.1" + chalk: "npm:^4.1.0" + commander: "npm:^6.2.1" + cross-spawn: "npm:^7.0.3" + detect-indent: "npm:^6.1.0" + envinfo: "npm:^7.7.3" + execa: "npm:^5.0.0" + fd-package-json: "npm:^1.2.0" + find-up: "npm:^5.0.0" + fs-extra: "npm:^11.1.0" + get-npm-tarball-url: "npm:^2.0.3" + giget: "npm:^1.0.0" + globby: "npm:^14.0.1" + jscodeshift: "npm:^0.15.1" + leven: "npm:^3.1.0" + ora: "npm:^5.4.1" + prettier: "npm:^3.1.1" + prompts: "npm:^2.4.0" + semver: "npm:^7.3.7" + slash: "npm:^5.0.0" + strip-ansi: "npm:^7.1.0" + strip-json-comments: "npm:^3.1.1" + tempy: "npm:^3.1.0" + tiny-invariant: "npm:^1.3.1" + ts-dedent: "npm:^2.0.0" + typescript: "npm:^5.3.2" + bin: + toolbox: ./bin/index.cjs + languageName: unknown + linkType: soft + "@storybook/types@workspace:*, @storybook/types@workspace:deprecated/types": version: 0.0.0-use.local resolution: "@storybook/types@workspace:deprecated/types" @@ -25622,40 +25668,22 @@ __metadata: version: 0.0.0-use.local resolution: "storybook@workspace:lib/cli" dependencies: - "@babel/core": "npm:^7.24.4" - "@babel/types": "npm:^7.24.0" - "@ndelangen/get-tarball": "npm:^3.0.7" - "@storybook/codemod": "workspace:*" "@storybook/core": "workspace:*" "@types/cross-spawn": "npm:^6.0.2" "@types/prompts": "npm:^2.0.9" - "@types/semver": "npm:^7.3.4" "@types/util-deprecate": "npm:^1.0.0" - "@yarnpkg/fslib": "npm:2.10.3" - "@yarnpkg/libzip": "npm:2.3.0" boxen: "npm:^7.1.1" chalk: "npm:^4.1.0" commander: "npm:^6.2.1" cross-spawn: "npm:^7.0.3" detect-indent: "npm:^6.1.0" envinfo: "npm:^7.7.3" - execa: "npm:^5.0.0" fd-package-json: "npm:^1.2.0" - find-up: "npm:^5.0.0" fs-extra: "npm:^11.1.0" - get-npm-tarball-url: "npm:^2.0.3" - giget: "npm:^1.0.0" - globby: "npm:^14.0.1" - jscodeshift: "npm:^0.15.1" leven: "npm:^3.1.0" - ora: "npm:^5.4.1" - prettier: "npm:^3.1.1" - prompts: "npm:^2.4.0" - semver: "npm:^7.3.7" slash: "npm:^5.0.0" strip-ansi: "npm:^7.1.0" strip-json-comments: "npm:^3.1.1" - tempy: "npm:^3.1.0" tiny-invariant: "npm:^1.3.1" ts-dedent: "npm:^2.0.0" typescript: "npm:^5.3.2" diff --git a/scripts/create-nx-sandbox-projects.ts b/scripts/create-nx-sandbox-projects.ts index 52f7894b5078..8c451ca31caa 100644 --- a/scripts/create-nx-sandbox-projects.ts +++ b/scripts/create-nx-sandbox-projects.ts @@ -1,4 +1,4 @@ -import * as templates from '../code/lib/cli/src/sandbox-templates'; +import * as templates from '../code/lib/toolbox/src/sandbox-templates'; import * as fs from 'fs'; import * as path from 'path'; diff --git a/scripts/event-log-checker.ts b/scripts/event-log-checker.ts index bbcc1aeaf12f..1132283d8120 100644 --- a/scripts/event-log-checker.ts +++ b/scripts/event-log-checker.ts @@ -1,7 +1,7 @@ import chalk from 'chalk'; import assert from 'assert'; import { esMain } from './utils/esmain'; -import { allTemplates } from '../code/lib/cli/src/sandbox-templates'; +import { allTemplates } from '../code/lib/toolbox/src/sandbox-templates'; import versions from '../code/core/src/common/versions'; import { oneWayHash } from '../code/core/src/telemetry/one-way-hash'; diff --git a/scripts/get-template.ts b/scripts/get-template.ts index a04924c4c473..0b67cd0abd88 100644 --- a/scripts/get-template.ts +++ b/scripts/get-template.ts @@ -11,7 +11,7 @@ import { type Cadence, type Template as TTemplate, type SkippableTask, -} from '../code/lib/cli/src/sandbox-templates'; +} from '../code/lib/toolbox/src/sandbox-templates'; import { SANDBOX_DIRECTORY } from './utils/constants'; const sandboxDir = process.env.SANDBOX_ROOT || SANDBOX_DIRECTORY; diff --git a/scripts/sandbox/generate.ts b/scripts/sandbox/generate.ts index 22c50716cc81..729d12c856ce 100755 --- a/scripts/sandbox/generate.ts +++ b/scripts/sandbox/generate.ts @@ -9,7 +9,7 @@ import { esMain } from '../utils/esmain'; import type { OptionValues } from '../utils/options'; import { createOptions } from '../utils/options'; -import { allTemplates as sandboxTemplates } from '../../code/lib/cli/src/sandbox-templates'; +import { allTemplates as sandboxTemplates } from '../../code/lib/toolbox/src/sandbox-templates'; import storybookVersions from '../../code/core/src/common/versions'; import { JsPackageManagerFactory } from '../../code/core/src/common/js-package-manager/JsPackageManagerFactory'; @@ -38,7 +38,7 @@ const sbInit = async ( flags?: string[], debug?: boolean ) => { - const sbCliBinaryPath = join(__dirname, `../../code/lib/cli/bin/index.cjs`); + const sbCliBinaryPath = join(__dirname, `../../code/lib/toolbox/bin/index.cjs`); console.log(`🎁 Installing storybook`); const env = { STORYBOOK_DISABLE_TELEMETRY: 'true', ...envVars }; const fullFlags = ['--yes', ...(flags || [])]; diff --git a/scripts/sandbox/utils/template.ts b/scripts/sandbox/utils/template.ts index 3694259d66cb..24453b9f4f1b 100644 --- a/scripts/sandbox/utils/template.ts +++ b/scripts/sandbox/utils/template.ts @@ -2,7 +2,7 @@ import { render } from 'ejs'; import { readFile } from 'fs-extra'; import prettier from 'prettier'; import type { GeneratorConfig } from './types'; -import { allTemplates as sandboxTemplates } from '../../../code/lib/cli/src/sandbox-templates'; +import { allTemplates as sandboxTemplates } from '../../../code/lib/toolbox/src/sandbox-templates'; export async function renderTemplate(templatePath: string, templateData: Record) { const template = await readFile(templatePath, 'utf8'); diff --git a/scripts/task.ts b/scripts/task.ts index 80fa759036b4..2d62a71a2ee2 100644 --- a/scripts/task.ts +++ b/scripts/task.ts @@ -32,7 +32,7 @@ import { allTemplates as TEMPLATES, type TemplateKey, type Template, -} from '../code/lib/cli/src/sandbox-templates'; +} from '../code/lib/toolbox/src/sandbox-templates'; import { version } from '../code/package.json'; diff --git a/scripts/tasks/sandbox-parts.ts b/scripts/tasks/sandbox-parts.ts index 90cdd9c43e45..f83c2a7590df 100644 --- a/scripts/tasks/sandbox-parts.ts +++ b/scripts/tasks/sandbox-parts.ts @@ -29,8 +29,8 @@ import type { ConfigFile } from '../../code/core/src/csf-tools'; import { writeConfig } from '../../code/core/src/csf-tools'; import { filterExistsInCodeDir } from '../utils/filterExistsInCodeDir'; import { findFirstPath } from '../utils/paths'; -import { detectLanguage } from '../../code/lib/cli/src/detect'; -import { SupportedLanguage } from '../../code/lib/cli/src/project_types'; +import { detectLanguage } from '../../code/lib/toolbox/src/detect'; +import { SupportedLanguage } from '../../code/lib/toolbox/src/project_types'; import { updatePackageScripts } from '../utils/package-json'; import { addPreviewAnnotations, readMainConfig } from '../utils/main-js'; import { @@ -41,7 +41,7 @@ import { import { workspacePath } from '../utils/workspace'; import { babelParse } from '../../code/core/src/csf-tools/babelParse'; import { CODE_DIRECTORY, REPROS_DIRECTORY } from '../utils/constants'; -import type { TemplateKey } from '../../code/lib/cli/src/sandbox-templates'; +import type { TemplateKey } from '../../code/lib/toolbox/src/sandbox-templates'; import { isFunction } from 'lodash'; const logger = console; diff --git a/scripts/utils/cli-step.ts b/scripts/utils/cli-step.ts index 76e6f4f0498a..47abd5c46d2a 100644 --- a/scripts/utils/cli-step.ts +++ b/scripts/utils/cli-step.ts @@ -5,6 +5,7 @@ import { exec } from './exec'; const require = createRequire(import.meta.url); const cliExecutable = require.resolve('../../code/lib/cli/bin/index.cjs'); +const toolboxExecutable = require.resolve('../../code/lib/toolbox/bin/index.cjs'); export type CLIStep = { command: string; @@ -83,7 +84,11 @@ export async function executeCLIStep( if (cliStep.hasArgument && !options.argument) throw new Error(`Argument required for ${cliStep.command} command.`); - const prefix = `node ${cliExecutable} ${cliStep.command}`; + const cliCommand = cliStep.command; + + const prefix = ['dev', 'build'].includes(cliCommand) + ? `node ${cliExecutable} ${cliCommand}` + : `node ${toolboxExecutable} ${cliCommand}`; const command = getCommand( cliStep.hasArgument ? `${prefix} ${options.argument}` : prefix, cliStep.options,