From 172775b6f36a7c789c2659158cdfc6696d174d42 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Sat, 22 Oct 2022 07:08:20 +0530 Subject: [PATCH 1/4] feat: update commander to v9 --- packages/webpack-cli/package.json | 2 +- packages/webpack-cli/src/types.ts | 4 ++-- packages/webpack-cli/src/webpack-cli.ts | 7 +++++-- yarn.lock | 9 ++------- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/packages/webpack-cli/package.json b/packages/webpack-cli/package.json index ef6261b256c..4e53352a9b2 100644 --- a/packages/webpack-cli/package.json +++ b/packages/webpack-cli/package.json @@ -39,7 +39,7 @@ "@webpack-cli/info": "^1.5.0", "@webpack-cli/serve": "^1.7.0", "colorette": "^2.0.14", - "commander": "^7.0.0", + "commander": "^9.4.1", "cross-spawn": "^7.0.3", "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", diff --git a/packages/webpack-cli/src/types.ts b/packages/webpack-cli/src/types.ts index 2afbaa471e5..b51d7e0485d 100644 --- a/packages/webpack-cli/src/types.ts +++ b/packages/webpack-cli/src/types.ts @@ -19,7 +19,7 @@ import webpack, { import { ClientConfiguration, Configuration as DevServerConfig } from "webpack-dev-server"; import { Colorette } from "colorette"; -import { Command, CommandOptions, OptionConstructor, ParseOptions } from "commander"; +import { Command, CommandOptions, Option, ParseOptions } from "commander"; import { prepare } from "rechoir"; import { stringifyStream } from "@discoveryjs/json-ext"; @@ -278,7 +278,7 @@ interface ImportLoaderError extends Error { /** * External libraries types */ - +type OptionConstructor = new (flags: string, description?: string) => Option; type CommanderOption = InstanceType; interface Rechoir { diff --git a/packages/webpack-cli/src/webpack-cli.ts b/packages/webpack-cli/src/webpack-cli.ts index e116c888ccc..09ed76a30e3 100644 --- a/packages/webpack-cli/src/webpack-cli.ts +++ b/packages/webpack-cli/src/webpack-cli.ts @@ -479,7 +479,10 @@ class WebpackCLI implements IWebpackCLI { }) as WebpackCLICommand; if (commandOptions.description) { - command.description(commandOptions.description, commandOptions.argsDescription); + command.description( + commandOptions.description, + commandOptions.argsDescription as { [argName: string]: string }, + ); } if (commandOptions.usage) { @@ -1412,7 +1415,7 @@ class WebpackCLI implements IWebpackCLI { // Arguments const argumentList = helper .visibleArguments(command) - .map((argument) => formatItem(argument.term, argument.description)); + .map((argument) => formatItem(argument.name(), argument.description)); if (argumentList.length > 0) { output = output.concat([bold("Arguments:"), formatList(argumentList), ""]); diff --git a/yarn.lock b/yarn.lock index 27d7011bc29..33f5551da59 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4020,17 +4020,12 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^7.0.0, commander@^7.2.0: +commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -commander@^9.0.0, commander@^9.3.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" - integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== - -commander@^9.4.0: +commander@^9.0.0, commander@^9.3.0, commander@^9.4.0, commander@^9.4.1: version "9.4.1" resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== From 9f7e78bf3c5e44025b801b509535e6424d6b5022 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Sun, 23 Oct 2022 06:54:13 +0530 Subject: [PATCH 2/4] test: fix CLI tests --- test/api/CLI.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/api/CLI.test.js b/test/api/CLI.test.js index aaffdf26137..cdf53153fea 100644 --- a/test/api/CLI.test.js +++ b/test/api/CLI.test.js @@ -1340,7 +1340,7 @@ describe("CLI API", () => { ], (options) => { expect(options).toEqual({ - booleanAndNumberAndString: "default", + booleanAndNumberAndString: true, }); }, ); From c45aaddd240d7b263c89ec9abcb8d3cb6b16ab1f Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Sun, 23 Oct 2022 07:21:20 +0530 Subject: [PATCH 3/4] fix: improve help output and use default similar suggestion for options --- packages/webpack-cli/src/webpack-cli.ts | 10 +--------- .../__snapshots__/unknown.test.js.snap.webpack5 | 15 +++++++-------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/packages/webpack-cli/src/webpack-cli.ts b/packages/webpack-cli/src/webpack-cli.ts index 09ed76a30e3..5da0033bbcd 100644 --- a/packages/webpack-cli/src/webpack-cli.ts +++ b/packages/webpack-cli/src/webpack-cli.ts @@ -1248,14 +1248,6 @@ class WebpackCLI implements IWebpackCLI { this.logger.error("Run 'webpack --help' to see available commands and options"); process.exit(2); } - - const levenshtein = require("fastest-levenshtein"); - - (command as WebpackCLICommand).options.forEach((option) => { - if (!option.hidden && levenshtein.distance(name, option.long?.slice(2)) < 3) { - this.logger.error(`Did you mean '--${option.name()}'?`); - } - }); } } } @@ -1338,7 +1330,7 @@ class WebpackCLI implements IWebpackCLI { // Support multiple aliases subcommandTerm: (command: WebpackCLICommand) => { const humanReadableArgumentName = (argument: WebpackCLICommandOption) => { - const nameOutput = argument.name + (argument.variadic === true ? "..." : ""); + const nameOutput = argument.name() + (argument.variadic === true ? "..." : ""); return argument.required ? "<" + nameOutput + ">" : "[" + nameOutput + "]"; }; diff --git a/test/build/unknown/__snapshots__/unknown.test.js.snap.webpack5 b/test/build/unknown/__snapshots__/unknown.test.js.snap.webpack5 index cb0588f4684..9e8b9ebb38d 100644 --- a/test/build/unknown/__snapshots__/unknown.test.js.snap.webpack5 +++ b/test/build/unknown/__snapshots__/unknown.test.js.snap.webpack5 @@ -37,7 +37,7 @@ exports[`unknown behaviour should log an error if an unknown flag is passed and exports[`unknown behaviour should log an error if an unknown flag is passed and suggests the closest match to an unknown flag #2: stderr 1`] = ` "[webpack-cli] Error: Unknown option '--output-fileneme' -[webpack-cli] Did you mean '--output-filename'? +(Did you mean --output-filename?) [webpack-cli] Run 'webpack --help' to see available commands and options" `; @@ -45,8 +45,7 @@ exports[`unknown behaviour should log an error if an unknown flag is passed and exports[`unknown behaviour should log an error if an unknown flag is passed and suggests the closest match to an unknown flag #3: stderr 1`] = ` "[webpack-cli] Error: Unknown option '--output-library-auxiliary-comment-commnjs' -[webpack-cli] Did you mean '--output-library-auxiliary-comment-commonjs'? -[webpack-cli] Did you mean '--output-library-auxiliary-comment-commonjs2'? +(Did you mean --output-library-auxiliary-comment-commonjs?) [webpack-cli] Run 'webpack --help' to see available commands and options" `; @@ -54,7 +53,7 @@ exports[`unknown behaviour should log an error if an unknown flag is passed and exports[`unknown behaviour should log an error if an unknown flag is passed and suggests the closest match to an unknown flag using "b" command: stderr 1`] = ` "[webpack-cli] Error: Unknown option '--entyr' -[webpack-cli] Did you mean '--entry'? +(Did you mean --entry?) [webpack-cli] Run 'webpack --help' to see available commands and options" `; @@ -62,7 +61,7 @@ exports[`unknown behaviour should log an error if an unknown flag is passed and exports[`unknown behaviour should log an error if an unknown flag is passed and suggests the closest match to an unknown flag using "bundle" command: stderr 1`] = ` "[webpack-cli] Error: Unknown option '--entyr' -[webpack-cli] Did you mean '--entry'? +(Did you mean --entry?) [webpack-cli] Run 'webpack --help' to see available commands and options" `; @@ -70,7 +69,7 @@ exports[`unknown behaviour should log an error if an unknown flag is passed and exports[`unknown behaviour should log an error if an unknown flag is passed and suggests the closest match to an unknown flag using "i" command: stderr 1`] = ` "[webpack-cli] Error: Unknown option '--outpyt' -[webpack-cli] Did you mean '--output'? +(Did you mean --output?) [webpack-cli] Run 'webpack --help' to see available commands and options" `; @@ -78,7 +77,7 @@ exports[`unknown behaviour should log an error if an unknown flag is passed and exports[`unknown behaviour should log an error if an unknown flag is passed and suggests the closest match to an unknown flag using "info" command: stderr 1`] = ` "[webpack-cli] Error: Unknown option '--outpyt' -[webpack-cli] Did you mean '--output'? +(Did you mean --output?) [webpack-cli] Run 'webpack --help' to see available commands and options" `; @@ -86,7 +85,7 @@ exports[`unknown behaviour should log an error if an unknown flag is passed and exports[`unknown behaviour should log an error if an unknown flag is passed and suggests the closest match to an unknown flag: stderr 1`] = ` "[webpack-cli] Error: Unknown option '--entyr' -[webpack-cli] Did you mean '--entry'? +(Did you mean --entry?) [webpack-cli] Run 'webpack --help' to see available commands and options" `; From 7f28546f4a7b19fc8a10ccc9adea51e3b554da56 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Wed, 26 Oct 2022 07:54:53 +0530 Subject: [PATCH 4/4] refactor: improve suggestions --- packages/webpack-cli/src/webpack-cli.ts | 11 +++++++++++ .../__snapshots__/unknown.test.js.snap.webpack5 | 15 ++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/webpack-cli/src/webpack-cli.ts b/packages/webpack-cli/src/webpack-cli.ts index 5da0033bbcd..40c364814c6 100644 --- a/packages/webpack-cli/src/webpack-cli.ts +++ b/packages/webpack-cli/src/webpack-cli.ts @@ -1248,6 +1248,14 @@ class WebpackCLI implements IWebpackCLI { this.logger.error("Run 'webpack --help' to see available commands and options"); process.exit(2); } + + const levenshtein = require("fastest-levenshtein"); + + (command as WebpackCLICommand).options.forEach((option) => { + if (!option.hidden && levenshtein.distance(name, option.long?.slice(2)) < 3) { + this.logger.error(`Did you mean '--${option.name()}'?`); + } + }); } } } @@ -1287,6 +1295,9 @@ class WebpackCLI implements IWebpackCLI { "Output the version number of 'webpack', 'webpack-cli' and 'webpack-dev-server' and commands.", ); + // webpack-cli has it's own logic for showing suggestions + this.program.showSuggestionAfterError(false); + const outputHelp = async ( options: string[], isVerbose: boolean, diff --git a/test/build/unknown/__snapshots__/unknown.test.js.snap.webpack5 b/test/build/unknown/__snapshots__/unknown.test.js.snap.webpack5 index 9e8b9ebb38d..cb0588f4684 100644 --- a/test/build/unknown/__snapshots__/unknown.test.js.snap.webpack5 +++ b/test/build/unknown/__snapshots__/unknown.test.js.snap.webpack5 @@ -37,7 +37,7 @@ exports[`unknown behaviour should log an error if an unknown flag is passed and exports[`unknown behaviour should log an error if an unknown flag is passed and suggests the closest match to an unknown flag #2: stderr 1`] = ` "[webpack-cli] Error: Unknown option '--output-fileneme' -(Did you mean --output-filename?) +[webpack-cli] Did you mean '--output-filename'? [webpack-cli] Run 'webpack --help' to see available commands and options" `; @@ -45,7 +45,8 @@ exports[`unknown behaviour should log an error if an unknown flag is passed and exports[`unknown behaviour should log an error if an unknown flag is passed and suggests the closest match to an unknown flag #3: stderr 1`] = ` "[webpack-cli] Error: Unknown option '--output-library-auxiliary-comment-commnjs' -(Did you mean --output-library-auxiliary-comment-commonjs?) +[webpack-cli] Did you mean '--output-library-auxiliary-comment-commonjs'? +[webpack-cli] Did you mean '--output-library-auxiliary-comment-commonjs2'? [webpack-cli] Run 'webpack --help' to see available commands and options" `; @@ -53,7 +54,7 @@ exports[`unknown behaviour should log an error if an unknown flag is passed and exports[`unknown behaviour should log an error if an unknown flag is passed and suggests the closest match to an unknown flag using "b" command: stderr 1`] = ` "[webpack-cli] Error: Unknown option '--entyr' -(Did you mean --entry?) +[webpack-cli] Did you mean '--entry'? [webpack-cli] Run 'webpack --help' to see available commands and options" `; @@ -61,7 +62,7 @@ exports[`unknown behaviour should log an error if an unknown flag is passed and exports[`unknown behaviour should log an error if an unknown flag is passed and suggests the closest match to an unknown flag using "bundle" command: stderr 1`] = ` "[webpack-cli] Error: Unknown option '--entyr' -(Did you mean --entry?) +[webpack-cli] Did you mean '--entry'? [webpack-cli] Run 'webpack --help' to see available commands and options" `; @@ -69,7 +70,7 @@ exports[`unknown behaviour should log an error if an unknown flag is passed and exports[`unknown behaviour should log an error if an unknown flag is passed and suggests the closest match to an unknown flag using "i" command: stderr 1`] = ` "[webpack-cli] Error: Unknown option '--outpyt' -(Did you mean --output?) +[webpack-cli] Did you mean '--output'? [webpack-cli] Run 'webpack --help' to see available commands and options" `; @@ -77,7 +78,7 @@ exports[`unknown behaviour should log an error if an unknown flag is passed and exports[`unknown behaviour should log an error if an unknown flag is passed and suggests the closest match to an unknown flag using "info" command: stderr 1`] = ` "[webpack-cli] Error: Unknown option '--outpyt' -(Did you mean --output?) +[webpack-cli] Did you mean '--output'? [webpack-cli] Run 'webpack --help' to see available commands and options" `; @@ -85,7 +86,7 @@ exports[`unknown behaviour should log an error if an unknown flag is passed and exports[`unknown behaviour should log an error if an unknown flag is passed and suggests the closest match to an unknown flag: stderr 1`] = ` "[webpack-cli] Error: Unknown option '--entyr' -(Did you mean --entry?) +[webpack-cli] Did you mean '--entry'? [webpack-cli] Run 'webpack --help' to see available commands and options" `;