Skip to content

Commit 491a582

Browse files
authoredNov 2, 2020
feat: suggest the closest match based on the Levenshtein distance algorithm (#2010)
* feat: suggest the closest match for an unknown flag * tests: add test case for flag suggestion * tests: assert for exit code
1 parent 07d18b0 commit 491a582

File tree

3 files changed

+15
-1
lines changed

3 files changed

+15
-1
lines changed
 

‎packages/webpack-cli/lib/bootstrap.js

+6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const { core } = require('./utils/cli-flags');
33
const logger = require('./utils/logger');
44
const { isCommandUsed } = require('./utils/arg-utils');
55
const argParser = require('./utils/arg-parser');
6+
const leven = require('leven');
67

78
process.title = 'webpack-cli';
89

@@ -39,6 +40,11 @@ const runCLI = async (cliArgs) => {
3940
if (parsedArgs.unknownArgs.length > 0) {
4041
parsedArgs.unknownArgs.forEach(async (unknown) => {
4142
logger.error(`Unknown argument: ${unknown}`);
43+
const strippedFlag = unknown.substr(2);
44+
const { name: suggestion } = core.find((flag) => leven(strippedFlag, flag.name) < 3);
45+
if (suggestion) {
46+
logger.raw(`Did you mean --${suggestion}?`);
47+
}
4248
});
4349

4450
process.exit(2);

‎packages/webpack-cli/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"execa": "^4.1.0",
3838
"import-local": "^3.0.2",
3939
"interpret": "^2.2.0",
40+
"leven": "^3.1.0",
4041
"rechoir": "^0.7.0",
4142
"v8-compile-cache": "^2.2.0",
4243
"webpack-merge": "^4.2.2"

‎test/unknown/unknown.test.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,15 @@ const { run } = require('../utils/test-utils');
22

33
describe('unknown behaviour', () => {
44
it('warns the user if an unknown flag is passed in', () => {
5-
const { stderr } = run(__dirname, ['--unknown']);
5+
const { stderr, exitCode } = run(__dirname, ['--unknown']);
66
expect(stderr).toBeTruthy();
77
expect(stderr).toContain('Unknown argument: --unknown');
8+
expect(exitCode).toBe(2);
9+
});
10+
it('suggests the closest match to an unknown flag', () => {
11+
const { stderr, stdout, exitCode } = run(__dirname, ['--entyr', './a.js']);
12+
expect(stderr).toContain('Unknown argument: --entyr');
13+
expect(stdout).toContain('Did you mean --entry?');
14+
expect(exitCode).toBe(2);
815
});
916
});

0 commit comments

Comments
 (0)