diff --git a/packages/webpack-cli/lib/bootstrap.js b/packages/webpack-cli/lib/bootstrap.js index f148b43a9f6..3291885ee46 100644 --- a/packages/webpack-cli/lib/bootstrap.js +++ b/packages/webpack-cli/lib/bootstrap.js @@ -11,7 +11,13 @@ process.title = 'webpack-cli'; const runCLI = async (cliArgs) => { const parsedArgs = argParser(flags, cliArgs, true, process.title); + // Enable/Disable colors + if (typeof parsedArgs.opts.color !== 'undefined') { + coloretteOptions.enabled = Boolean(parsedArgs.opts.color); + } + const commandIsUsed = isCommandUsed(cliArgs); + if (commandIsUsed) { return; } @@ -24,11 +30,6 @@ const runCLI = async (cliArgs) => { // If the unknown arg starts with a '-', it will be considered an unknown flag rather than an entry let entry; - // enable/disable colors - if (typeof parsedArgs.opts.color !== 'undefined') { - coloretteOptions.enabled = Boolean(parsedArgs.opts.color); - } - if (parsedArgs.unknownArgs.length > 0) { entry = []; @@ -44,10 +45,12 @@ const runCLI = async (cliArgs) => { } if (parsedArgs.unknownArgs.length > 0) { - parsedArgs.unknownArgs.forEach(async (unknown) => { + parsedArgs.unknownArgs.forEach((unknown) => { logger.error(`Unknown argument: ${unknown}`); + const strippedFlag = unknown.substr(2); const { name: suggestion } = flags.find((flag) => leven(strippedFlag, flag.name) < 3); + if (suggestion) { logger.raw(`Did you mean --${suggestion}?`); } diff --git a/packages/webpack-cli/lib/groups/runHelp.js b/packages/webpack-cli/lib/groups/runHelp.js index a13bcc4d6da..fddbc79e38a 100644 --- a/packages/webpack-cli/lib/groups/runHelp.js +++ b/packages/webpack-cli/lib/groups/runHelp.js @@ -1,10 +1,16 @@ -const { green, bold, underline } = require('colorette'); +const { options, green, bold, underline } = require('colorette'); const commandLineUsage = require('command-line-usage'); const { commands, flags } = require('../utils/cli-flags'); const logger = require('../utils/logger'); const outputHelp = (args) => { + if (args.includes('--color')) { + options.enabled = true; + } else if (args.includes('--no-color')) { + options.enabled = false; + } + const hasUnknownVersionArgs = (args, commands, flags) => { return args.filter((arg) => { if (arg === 'version' || arg === 'help' || arg === '--help' || arg === '-h' || arg === '--no-color') { diff --git a/packages/webpack-cli/lib/groups/runVersion.js b/packages/webpack-cli/lib/groups/runVersion.js index 242a77a291b..757131c5743 100644 --- a/packages/webpack-cli/lib/groups/runVersion.js +++ b/packages/webpack-cli/lib/groups/runVersion.js @@ -1,7 +1,14 @@ const logger = require('../utils/logger'); const { commands, flags } = require('../utils/cli-flags'); +const { options } = require('colorette'); const outputVersion = (args) => { + if (args.includes('--color')) { + options.enabled = true; + } else if (args.includes('--no-color')) { + options.enabled = false; + } + const hasUnknownVersionArgs = (args, commands, flags) => { return args.filter((arg) => { if (arg === 'version' || arg === '--version' || arg === '-v' || arg === '--color' || arg === '--no-color') { @@ -23,7 +30,7 @@ const outputVersion = (args) => { if (invalidArgs.length > 0) { const argType = invalidArgs[0].startsWith('-') ? 'option' : 'command'; - logger.error(`Error: Invalid ${argType} '${invalidArgs[0]}'.`); + logger.error(`Invalid ${argType} '${invalidArgs[0]}'.`); logger.error('Run webpack --help to see available commands and arguments.'); process.exit(2); } diff --git a/packages/webpack-cli/lib/utils/arg-parser.js b/packages/webpack-cli/lib/utils/arg-parser.js index 5754ec47cdd..7cbab371fa3 100644 --- a/packages/webpack-cli/lib/utils/arg-parser.js +++ b/packages/webpack-cli/lib/utils/arg-parser.js @@ -28,6 +28,7 @@ const argParser = (options, args, argsOnly = false, name = '') => { } const parser = new commander.Command(); + // Set parser name parser.name(name); parser.storeOptionsAsProperties(false); diff --git a/packages/webpack-cli/lib/webpack-cli.js b/packages/webpack-cli/lib/webpack-cli.js index 87c6316c9b5..6e75e5d0da7 100644 --- a/packages/webpack-cli/lib/webpack-cli.js +++ b/packages/webpack-cli/lib/webpack-cli.js @@ -41,6 +41,7 @@ class WebpackCLI { .filter((arg) => coreFlagMap.has(toKebabCase(arg))) .reduce((acc, cur) => { acc[toKebabCase(cur)] = parsedArgs[cur]; + return acc; }, {}); const coreCliArgs = coreCliHelper.getArguments(); @@ -70,9 +71,11 @@ class WebpackCLI { .filter((coreFlag) => coreFlag.group === groups.BASIC_GROUP) .reduce((result, flagObject) => { result.push(flagObject.name); + if (flagObject.alias) { result.push(flagObject.alias); } + return result; }, []); @@ -387,7 +390,7 @@ class WebpackCLI { } let colors; - + // From flags if (typeof args.color !== 'undefined') { colors = args.color; diff --git a/test/version/version-external-packages.test.js b/test/version/version-external-packages.test.js index 2e18c04cf16..198da2e6782 100644 --- a/test/version/version-external-packages.test.js +++ b/test/version/version-external-packages.test.js @@ -86,8 +86,8 @@ describe('version flag with external packages', () => { const { stderr, stdout, exitCode } = run(__dirname, ['init', 'abc', '--version'], false); expect(exitCode).toBe(2); - expect(stderr).toContain(`Error: Invalid command 'abc'`); - expect(stderr).toContain('Run webpack --help to see available commands and arguments'); + expect(stderr).toContain(`[webpack-cli] Invalid command 'abc'`); + expect(stderr).toContain('[webpack-cli] Run webpack --help to see available commands and arguments'); expect(stdout).toBe(''); }); @@ -95,8 +95,8 @@ describe('version flag with external packages', () => { const { stderr, stdout, exitCode } = run(__dirname, ['init', 'abc', 'version'], false); expect(exitCode).toBe(2); - expect(stderr).toContain(`Error: Invalid command 'abc'`); - expect(stderr).toContain('Run webpack --help to see available commands and arguments'); + expect(stderr).toContain(`[webpack-cli] Invalid command 'abc'`); + expect(stderr).toContain('[webpack-cli] Run webpack --help to see available commands and arguments'); expect(stdout).toBe(''); }); @@ -104,8 +104,8 @@ describe('version flag with external packages', () => { const { stderr, stdout, exitCode } = run(__dirname, ['init', 'abc', '-v'], false); expect(exitCode).toBe(2); - expect(stderr).toContain(`Error: Invalid command 'abc'`); - expect(stderr).toContain('Run webpack --help to see available commands and arguments'); + expect(stderr).toContain(`[webpack-cli] Invalid command 'abc'`); + expect(stderr).toContain('[webpack-cli] Run webpack --help to see available commands and arguments'); expect(stdout).toBe(''); }); }); diff --git a/test/version/version-multi-args.test.js b/test/version/version-multi-args.test.js index 15e0e08b5d9..60c4ea21d8e 100644 --- a/test/version/version-multi-args.test.js +++ b/test/version/version-multi-args.test.js @@ -27,8 +27,8 @@ describe('version flag with multiple arguments', () => { expect(exitCode).toBe(2); expect(stdout).not.toContain(pkgJSON.version); - expect(stderr).toContain(`Error: Invalid command 'abc'`); - expect(stderr).toContain('Run webpack --help to see available commands and arguments'); + expect(stderr).toContain(`[webpack-cli] Invalid command 'abc'`); + expect(stderr).toContain('[webpack-cli] Run webpack --help to see available commands and arguments'); }); it('throws error if invalid option is passed with version command', () => { @@ -36,8 +36,8 @@ describe('version flag with multiple arguments', () => { expect(exitCode).toBe(2); expect(stdout).not.toContain(pkgJSON.version); - expect(stderr).toContain(`Error: Invalid option '--abc'`); - expect(stderr).toContain('Run webpack --help to see available commands and arguments'); + expect(stderr).toContain(`[webpack-cli] Invalid option '--abc'`); + expect(stderr).toContain('[webpack-cli] Run webpack --help to see available commands and arguments'); }); it('throws error if invalid command is passed with --version flag', () => { @@ -45,8 +45,8 @@ describe('version flag with multiple arguments', () => { expect(exitCode).toBe(2); expect(stdout).not.toContain(pkgJSON.version); - expect(stderr).toContain(`Error: Invalid command 'abc'`); - expect(stderr).toContain('Run webpack --help to see available commands and arguments'); + expect(stderr).toContain(`[webpack-cli] Invalid command 'abc'`); + expect(stderr).toContain('[webpack-cli] Run webpack --help to see available commands and arguments'); }); it('throws error if invalid option is passed with --version flag', () => { @@ -54,8 +54,8 @@ describe('version flag with multiple arguments', () => { expect(exitCode).toBe(2); expect(stdout).not.toContain(pkgJSON.version); - expect(stderr).toContain(`Error: Invalid option '--abc'`); - expect(stderr).toContain('Run webpack --help to see available commands and arguments'); + expect(stderr).toContain(`[webpack-cli] Invalid option '--abc'`); + expect(stderr).toContain('[webpack-cli] Run webpack --help to see available commands and arguments'); }); it('throws error if invalid command is passed with -v alias', () => { @@ -63,8 +63,8 @@ describe('version flag with multiple arguments', () => { expect(exitCode).toBe(2); expect(stdout).not.toContain(pkgJSON.version); - expect(stderr).toContain(`Error: Invalid command 'abc'`); - expect(stderr).toContain('Run webpack --help to see available commands and arguments'); + expect(stderr).toContain(`[webpack-cli] Invalid command 'abc'`); + expect(stderr).toContain('[webpack-cli] Run webpack --help to see available commands and arguments'); }); it('throws error if invalid option is passed with -v alias', () => { @@ -72,7 +72,7 @@ describe('version flag with multiple arguments', () => { expect(exitCode).toBe(2); expect(stdout).not.toContain(pkgJSON.version); - expect(stderr).toContain(`Error: Invalid option '--abc'`); - expect(stderr).toContain('Run webpack --help to see available commands and arguments'); + expect(stderr).toContain(`[webpack-cli] Invalid option '--abc'`); + expect(stderr).toContain('[webpack-cli] Run webpack --help to see available commands and arguments'); }); });