diff options
-rw-r--r-- | std/flags/mod.ts | 8 | ||||
-rwxr-xr-x | std/flags/unknown_test.ts | 40 |
2 files changed, 29 insertions, 19 deletions
diff --git a/std/flags/mod.ts b/std/flags/mod.ts index b334cb5b8..3afaf111f 100644 --- a/std/flags/mod.ts +++ b/std/flags/mod.ts @@ -51,13 +51,13 @@ export interface ArgParsingOptions { /** A function which is invoked with a command line parameter not defined in * the `options` configuration object. If the function returns `false`, the * unknown option is not added to `parsedArgs`. */ - unknown?: (i: unknown) => unknown; + unknown?: (arg: string, key?: string, value?: unknown) => unknown; } interface Flags { bools: Record<string, boolean>; strings: Record<string, boolean>; - unknownFn: (i: unknown) => unknown; + unknownFn: (arg: string, key?: string, value?: unknown) => unknown; allBools: boolean; } @@ -107,7 +107,7 @@ export function parse( default: defaults = {}, stopEarly = false, string = [], - unknown = (i: unknown): unknown => i, + unknown = (i: string): unknown => i, }: ArgParsingOptions = {} ): Args { const flags: Flags = { @@ -198,7 +198,7 @@ export function parse( arg: string | undefined = undefined ): void { if (arg && flags.unknownFn && !argDefined(key, arg)) { - if (flags.unknownFn(arg) === false) return; + if (flags.unknownFn(arg, key, val) === false) return; } const value = !get(flags.strings, key) && isNumber(val) ? Number(val) : val; diff --git a/std/flags/unknown_test.ts b/std/flags/unknown_test.ts index 90c638b67..0d822144d 100755 --- a/std/flags/unknown_test.ts +++ b/std/flags/unknown_test.ts @@ -4,12 +4,12 @@ import { parse } from "./mod.ts"; Deno.test(function booleanAndAliasIsNotUnknown(): void { const unknown: unknown[] = []; - function unknownFn(arg: unknown): boolean { - unknown.push(arg); + function unknownFn(arg: string, k?: string, v?: unknown): boolean { + unknown.push({ arg, k, v }); return false; } const aliased = ["-h", "true", "--derp", "true"]; - const regular = ["--herp", "true", "-d", "true"]; + const regular = ["--herp", "true", "-d", "false"]; const opts = { alias: { h: "herp" }, boolean: "h", @@ -18,20 +18,27 @@ Deno.test(function booleanAndAliasIsNotUnknown(): void { parse(aliased, opts); parse(regular, opts); - assertEquals(unknown, ["--derp", "-d"]); + assertEquals(unknown, [ + { arg: "--derp", k: "derp", v: "true" }, + { arg: "-d", k: "d", v: "false" }, + ]); }); Deno.test(function flagBooleanTrueAnyDoubleHyphenArgumentIsNotUnknown(): void { const unknown: unknown[] = []; - function unknownFn(arg: unknown): boolean { - unknown.push(arg); + function unknownFn(arg: string, k?: string, v?: unknown): boolean { + unknown.push({ arg, k, v }); return false; } const argv = parse(["--honk", "--tacos=good", "cow", "-p", "55"], { boolean: true, unknown: unknownFn, }); - assertEquals(unknown, ["--tacos=good", "cow", "-p"]); + assertEquals(unknown, [ + { arg: "--tacos=good", k: "tacos", v: "good" }, + { arg: "cow", k: undefined, v: undefined }, + { arg: "-p", k: "p", v: "55" }, + ]); assertEquals(argv, { honk: true, _: [], @@ -40,8 +47,8 @@ Deno.test(function flagBooleanTrueAnyDoubleHyphenArgumentIsNotUnknown(): void { Deno.test(function stringAndAliasIsNotUnkown(): void { const unknown: unknown[] = []; - function unknownFn(arg: unknown): boolean { - unknown.push(arg); + function unknownFn(arg: string, k?: string, v?: unknown): boolean { + unknown.push({ arg, k, v }); return false; } const aliased = ["-h", "hello", "--derp", "goodbye"]; @@ -54,13 +61,16 @@ Deno.test(function stringAndAliasIsNotUnkown(): void { parse(aliased, opts); parse(regular, opts); - assertEquals(unknown, ["--derp", "-d"]); + assertEquals(unknown, [ + { arg: "--derp", k: "derp", v: "goodbye" }, + { arg: "-d", k: "d", v: "moon" }, + ]); }); Deno.test(function defaultAndAliasIsNotUnknown(): void { const unknown: unknown[] = []; - function unknownFn(arg: unknown): boolean { - unknown.push(arg); + function unknownFn(arg: string, k?: string, v?: unknown): boolean { + unknown.push({ arg, k, v }); return false; } const aliased = ["-h", "hello"]; @@ -78,8 +88,8 @@ Deno.test(function defaultAndAliasIsNotUnknown(): void { Deno.test(function valueFollowingDoubleHyphenIsNotUnknown(): void { const unknown: unknown[] = []; - function unknownFn(arg: unknown): boolean { - unknown.push(arg); + function unknownFn(arg: string, k?: string, v?: unknown): boolean { + unknown.push({ arg, k, v }); return false; } const aliased = ["--bad", "--", "good", "arg"]; @@ -89,7 +99,7 @@ Deno.test(function valueFollowingDoubleHyphenIsNotUnknown(): void { }; const argv = parse(aliased, opts); - assertEquals(unknown, ["--bad"]); + assertEquals(unknown, [{ arg: "--bad", k: "bad", v: true }]); assertEquals(argv, { "--": ["good", "arg"], _: [], |