From 4de138cbf2df07807027225c6f49e0213a6e6aa1 Mon Sep 17 00:00:00 2001 From: evilebottnawi Date: Mon, 28 Dec 2020 19:13:17 +0300 Subject: [PATCH] refactor: code --- packages/generators/src/index.ts | 4 +- packages/info/src/index.ts | 4 +- packages/init/src/index.ts | 4 +- packages/migrate/src/index.ts | 4 +- packages/serve/src/index.ts | 5 +- .../lib/utils/prompt-installation.js | 10 +-- packages/webpack-cli/lib/webpack-cli.js | 72 +++++++++++-------- test/optimization/optimization.test.js | 18 ----- test/optimization/src/index.js | 1 - test/optimization/webpack.config.js | 8 --- test/utils/test-utils.js | 16 ++++- 11 files changed, 73 insertions(+), 73 deletions(-) delete mode 100644 test/optimization/optimization.test.js delete mode 100644 test/optimization/src/index.js delete mode 100644 test/optimization/webpack.config.js diff --git a/packages/generators/src/index.ts b/packages/generators/src/index.ts index d423d9caee6..d4f0a93d18a 100644 --- a/packages/generators/src/index.ts +++ b/packages/generators/src/index.ts @@ -5,10 +5,10 @@ import addonGenerator from './addon-generator'; import initGenerator from './init-generator'; class GeneratorsCommand { - apply(cli): void { + async apply(cli): Promise { const { logger } = cli; - cli.makeCommand( + await cli.makeCommand( { name: 'loader [output-path]', alias: 'l', diff --git a/packages/info/src/index.ts b/packages/info/src/index.ts index d61d2b67303..83b3884d7c1 100644 --- a/packages/info/src/index.ts +++ b/packages/info/src/index.ts @@ -30,8 +30,8 @@ const DEFAULT_DETAILS: Information = { }; class InfoCommand { - apply(cli): void { - cli.makeCommand( + async apply(cli): Promise { + await cli.makeCommand( { name: 'info', alias: 'i', diff --git a/packages/init/src/index.ts b/packages/init/src/index.ts index 1de1b7e0331..e0ddd3b209b 100644 --- a/packages/init/src/index.ts +++ b/packages/init/src/index.ts @@ -2,8 +2,8 @@ import { initGenerator } from '@webpack-cli/generators'; import { modifyHelperUtil, npmPackagesExists } from '@webpack-cli/utils'; class InitCommand { - apply(cli): void { - cli.makeCommand( + async apply(cli): Promise { + await cli.makeCommand( { name: 'init [scaffold...]', alias: 'c', diff --git a/packages/migrate/src/index.ts b/packages/migrate/src/index.ts index c9f458a0877..3e7789a5e6c 100644 --- a/packages/migrate/src/index.ts +++ b/packages/migrate/src/index.ts @@ -149,10 +149,10 @@ function runMigration(currentConfigPath: string, outputConfigPath: string, logge } class MigrationCommand { - apply(cli): void { + async apply(cli): Promise { const { logger } = cli; - cli.makeCommand( + await cli.makeCommand( { name: 'migrate [new-config-path]', alias: 'm', diff --git a/packages/serve/src/index.ts b/packages/serve/src/index.ts index d994035e321..240031b69dc 100644 --- a/packages/serve/src/index.ts +++ b/packages/serve/src/index.ts @@ -4,7 +4,7 @@ class ServeCommand { async apply(cli): Promise { const { logger } = cli; - cli.makeCommand( + await cli.makeCommand( { name: 'serve', alias: 's', @@ -20,7 +20,8 @@ class ServeCommand { // eslint-disable-next-line devServerFlags = require('webpack-dev-server/bin/cli-flags').devServer; } catch (error) { - return []; + logger.error(`You need to install 'webpack-dev-server' for running 'webpack serve'.\n${error}`); + process.exit(2); } const builtInOptions = cli.getBuiltInOptions(); diff --git a/packages/webpack-cli/lib/utils/prompt-installation.js b/packages/webpack-cli/lib/utils/prompt-installation.js index 9877a52bd65..28173e70bd5 100644 --- a/packages/webpack-cli/lib/utils/prompt-installation.js +++ b/packages/webpack-cli/lib/utils/prompt-installation.js @@ -18,15 +18,15 @@ async function promptInstallation(packageName, preMessage) { process.exit(2); } - // yarn uses 'add' command, rest npm and pnpm both use 'install' - const options = [packageManager === 'yarn' ? 'add' : 'install', '-D', packageName]; - - const commandToBeRun = `${packageManager} ${options.join(' ')}`; - if (preMessage) { preMessage(); } + // yarn uses 'add' command, rest npm and pnpm both use 'install' + const commandToBeRun = `${packageManager} ${[packageManager === 'yarn' ? 'add' : 'install', '-D', packageName].join( + ' ', + )} --ignore-workspace-root-check`; + let installConfirm; try { diff --git a/packages/webpack-cli/lib/webpack-cli.js b/packages/webpack-cli/lib/webpack-cli.js index 764966e49cb..3a7f744ee81 100644 --- a/packages/webpack-cli/lib/webpack-cli.js +++ b/packages/webpack-cli/lib/webpack-cli.js @@ -29,8 +29,8 @@ class WebpackCLI { this.utils = { toKebabCase, getPkg, promptInstallation }; } - makeCommand(commandOptions, options, action) { - const command = program.command(commandOptions.name, { + async makeCommand(commandOptions, options, action) { + const command = this.program.command(commandOptions.name, { noHelp: commandOptions.noHelp, hidden: commandOptions.hidden, isDefault: commandOptions.isDefault, @@ -56,9 +56,47 @@ class WebpackCLI { command.pkg = 'webpack-cli'; } + const { forHelp } = this.program; + + let allDependenciesInstalled = true; + + if (commandOptions.dependencies && commandOptions.dependencies.length > 0) { + for (const dependency of commandOptions.dependencies) { + const isPkgExist = getPkg(dependency); + + if (isPkgExist) { + continue; + } else if (!isPkgExist && forHelp) { + allDependenciesInstalled = false; + continue; + } + + try { + await promptInstallation(dependency, () => { + logger.error( + `For using '${green(commandOptions.name)}' command you need to install: '${green(dependency)}' package`, + ); + }); + } catch (error) { + logger.error("Action Interrupted, use 'webpack-cli help' to see possible commands."); + logger.error(error); + process.exit(2); + } + } + } + if (options) { if (typeof options === 'function') { - options = options(); + if (forHelp && !allDependenciesInstalled) { + command.description( + `${commandOptions.description} To see all available options you need to install ${commandOptions.dependencies + .map((dependency) => `'${dependency}'`) + .join(',')}.`, + ); + options = []; + } else { + options = options(); + } } options.forEach((optionForCommand) => { @@ -66,31 +104,7 @@ class WebpackCLI { }); } - command.action(async (...args) => { - if (commandOptions.dependencies && commandOptions.dependencies.length > 0) { - for (const dependency of commandOptions.dependencies) { - const isPkgExist = getPkg(dependency); - - if (isPkgExist) { - continue; - } - - try { - await promptInstallation(dependency, () => { - logger.error( - `For using '${green(commandOptions.name)}' command you need to install: '${green(dependency)}' package`, - ); - }); - } catch (error) { - logger.error("Action Interrupted, use 'webpack-cli help' to see possible commands."); - logger.error(error); - process.exit(2); - } - } - } - - await action(...args); - }); + command.action(action); return command; } @@ -654,6 +668,8 @@ class WebpackCLI { } } + this.program.forHelp = true; + const optionsForHelp = [].concat(opts.help && !isDefault ? [commandName] : []).concat(options); await outputHelp(optionsForHelp, isVerbose, program); diff --git a/test/optimization/optimization.test.js b/test/optimization/optimization.test.js deleted file mode 100644 index ea28769da3a..00000000000 --- a/test/optimization/optimization.test.js +++ /dev/null @@ -1,18 +0,0 @@ -const { run, isWebpack5 } = require('../utils/test-utils'); - -describe('optimization option in config', () => { - it('should work with mangleExports disabled', () => { - const { exitCode, stderr, stdout } = run(__dirname, [], false); - - // Should throw when webpack is less than 5 - if (isWebpack5) { - expect(exitCode).toBe(0); - expect(stderr).toBeFalsy(); - expect(stdout).toContain('mangleExports: false'); - } else { - expect(exitCode).toBe(2); - expect(stderr).toContain("configuration.optimization has an unknown property 'mangleExports'"); - expect(stdout).toBeFalsy(); - } - }); -}); diff --git a/test/optimization/src/index.js b/test/optimization/src/index.js deleted file mode 100644 index c56f17c89e9..00000000000 --- a/test/optimization/src/index.js +++ /dev/null @@ -1 +0,0 @@ -console.log("Bokuto") diff --git a/test/optimization/webpack.config.js b/test/optimization/webpack.config.js deleted file mode 100644 index c5ddd675368..00000000000 --- a/test/optimization/webpack.config.js +++ /dev/null @@ -1,8 +0,0 @@ -const WebpackCLITestPlugin = require('../utils/webpack-cli-test-plugin'); - -module.exports = { - plugins: [new WebpackCLITestPlugin()], - optimization: { - mangleExports: false, - }, -}; diff --git a/test/utils/test-utils.js b/test/utils/test-utils.js index 52d4af7bf56..8515dbced2b 100644 --- a/test/utils/test-utils.js +++ b/test/utils/test-utils.js @@ -8,12 +8,22 @@ const { Writable } = require('readable-stream'); const concat = require('concat-stream'); const { version } = require('webpack'); const stripAnsi = require('strip-ansi'); -const { version: devServerVersion } = require('webpack-dev-server/package.json'); + +const isWebpack5 = version.startsWith('5'); + +let devServerVersion; + +try { + // eslint-disable-next-line + devServerVersion = require('webpack-dev-server/package.json').version; +} catch (error) { + // Nothing +} + +const isDevServer4 = devServerVersion && devServerVersion.startsWith('4'); const WEBPACK_PATH = path.resolve(__dirname, '../../packages/webpack-cli/bin/cli.js'); const ENABLE_LOG_COMPILATION = process.env.ENABLE_PIPE || false; -const isWebpack5 = version.startsWith('5'); -const isDevServer4 = devServerVersion.startsWith('4'); const isWindows = process.platform === 'win32'; const hyphenToUpperCase = (name) => {