From 24271009f39adea82528e5c2571c91eb937a06c2 Mon Sep 17 00:00:00 2001 From: Hiroki Osame Date: Sun, 23 Oct 2022 17:13:14 +0900 Subject: [PATCH 1/3] feat!: unknown flag values to be passed in explicitly --- src/type-flag.ts | 28 ++++++++-------------------- tests/index.ts | 43 ++++++++++--------------------------------- 2 files changed, 18 insertions(+), 53 deletions(-) diff --git a/src/type-flag.ts b/src/type-flag.ts index f9ed561..2a6e61d 100644 --- a/src/type-flag.ts +++ b/src/type-flag.ts @@ -40,9 +40,6 @@ const parsed = typeFlag({ export function typeFlag( schemas: Schemas, argv: string[] = process.argv.slice(2), - options: { - ignoreUnknown?: boolean; - } = {}, ) { const aliasesMap = mapAliases(schemas); const parsed: TypeFlag = { @@ -91,14 +88,11 @@ export function typeFlag( parsed.unknownFlags[flagName] = []; } - if (flagValue !== undefined) { - parsed.unknownFlags[flagName].push(flagValue); - } else { - expectingValue = (value = true) => { - parsed.unknownFlags[flagName].push(value); - expectingValue = undefined; - }; + if (flagValue === undefined) { + flagValue = true; } + + parsed.unknownFlags[flagName].push(flagValue); }; for (let i = 0; i < argv.length; i += 1) { @@ -127,18 +121,16 @@ export function typeFlag( for (let j = 0; j < flagName.length; j += 1) { const alias = flagName[j]; const hasAlias = aliasesMap.get(alias); - const isLast = j === flagName.length - 1; + const isLastAlias = j === flagName.length - 1; if (hasAlias) { setKnown( hasAlias.name, hasAlias.schema, - isLast ? flagValue : true, + isLastAlias ? flagValue : true, ); - } else if (options?.ignoreUnknown) { - parsed._.push(argvElement); } else { - setUnknown(alias, isLast ? flagValue : true); + setUnknown(alias, isLastAlias ? flagValue : true); } } continue; @@ -156,11 +148,7 @@ export function typeFlag( } if (!flagSchema) { - if (options?.ignoreUnknown) { - parsed._.push(argvElement); - } else { - setUnknown(flagName, flagValue); - } + setUnknown(flagName, flagValue); continue; } diff --git a/tests/index.ts b/tests/index.ts index 68d53d9..1ee9485 100644 --- a/tests/index.ts +++ b/tests/index.ts @@ -295,19 +295,17 @@ describe('Parsing', ({ test }) => { const parsed = typeFlag( {}, [ + '--unknownFlag', + 'arg1', '--unknownFlag=false', '--unknownFlag=', - 'a', - '--unknownFlag', + 'arg2', '-u', - '4', - '-u=a', - '--unknownString', - 'hello', - '--unknownString', + 'arg3', + '-u=value', '-3', '-sdf', - '4', + 'arg4', '-ff=a', '--kebab-case', ], @@ -322,43 +320,22 @@ describe('Parsing', ({ test }) => { }; expect(parsed.unknownFlags).toStrictEqual({ - unknownFlag: ['false', '', true], - u: ['4', 'a'], + unknownFlag: [true, 'false', ''], + u: [true, 'value'], 3: [true], s: [true], d: [true], - f: ['4', true, 'a'], - unknownString: ['hello', true], + f: [true, true, 'a'], 'kebab-case': [true], }); expect(parsed._).toStrictEqual( Object.assign( - ['a'], + ['arg1', 'arg2', 'arg3', 'arg4'], { '--': [] }, ), ); }); - test('ignore unknown flags', () => { - const parsed = typeFlag( - { - string: [String], - }, - ['--string', 'a', '--string=b', '--unknown', 'c', '--unknown=d', '-u'], - { ignoreUnknown: true }, - ); - - expect(parsed).toStrictEqual({ - flags: { - string: ['a', 'b'], - }, - unknownFlags: {}, - _: Object.assign(['--unknown', 'c', '--unknown=d', '-u'], { - '--': [], - }), - }); - }); - test('custom type', () => { const ParseDate = (dateString: string) => new Date(dateString); From 59734af36971146d0fb86ea0674a3487498f07b3 Mon Sep 17 00:00:00 2001 From: Hiroki Osame Date: Wed, 26 Oct 2022 17:10:13 +0900 Subject: [PATCH 2/3] revert: ignoreUnknown removal --- src/type-flag.ts | 11 ++++++++++- tests/index.ts | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/type-flag.ts b/src/type-flag.ts index 2a6e61d..d74244b 100644 --- a/src/type-flag.ts +++ b/src/type-flag.ts @@ -40,6 +40,9 @@ const parsed = typeFlag({ export function typeFlag( schemas: Schemas, argv: string[] = process.argv.slice(2), + options: { + ignoreUnknown?: boolean; + } = {}, ) { const aliasesMap = mapAliases(schemas); const parsed: TypeFlag = { @@ -129,6 +132,8 @@ export function typeFlag( hasAlias.schema, isLastAlias ? flagValue : true, ); + } else if (options.ignoreUnknown) { + parsed._.push(argvElement); } else { setUnknown(alias, isLastAlias ? flagValue : true); } @@ -148,7 +153,11 @@ export function typeFlag( } if (!flagSchema) { - setUnknown(flagName, flagValue); + if (options.ignoreUnknown) { + parsed._.push(argvElement); + } else { + setUnknown(flagName, flagValue); + } continue; } diff --git a/tests/index.ts b/tests/index.ts index 1ee9485..13951a2 100644 --- a/tests/index.ts +++ b/tests/index.ts @@ -336,6 +336,26 @@ describe('Parsing', ({ test }) => { ); }); + test('ignore unknown flags', () => { + const parsed = typeFlag( + { + string: [String], + }, + ['--string', 'a', '--string=b', '--unknown', 'c', '--unknown=d', '-u'], + { ignoreUnknown: true }, + ); + + expect(parsed).toStrictEqual({ + flags: { + string: ['a', 'b'], + }, + unknownFlags: {}, + _: Object.assign(['--unknown', 'c', '--unknown=d', '-u'], { + '--': [], + }), + }); + }); + test('custom type', () => { const ParseDate = (dateString: string) => new Date(dateString); From bd9eeed010219aab099dc9cf1bfef2cb02c6092b Mon Sep 17 00:00:00 2001 From: Hiroki Osame Date: Thu, 27 Oct 2022 16:24:02 +0900 Subject: [PATCH 3/3] docs: explicit unknown flag --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ac53cbc..4c95694 100644 --- a/README.md +++ b/README.md @@ -178,10 +178,10 @@ $ node ./cli --someString hello --some-string world ``` ### Unknown flags -When unrecognized flags are passed in, they are either interpreted as a string or boolean depending on usage. Unknown flags are not converted to camelCase to allow for accurate error handling. +When unrecognized flags are passed in, they are interpreted as a boolean, or a string if explicitly passed in. Unknown flags are not converted to camelCase to allow for accurate error handling. ```sh -$ node ./cli --unknown-flag --unknown-flag 2 +$ node ./cli --unknown-flag --unknown-flag=2 ``` This outputs the following: