diff options
Diffstat (limited to 'flags')
| -rw-r--r-- | flags/mod.ts | 92 | ||||
| -rwxr-xr-x | flags/tests/bool.ts | 3 | ||||
| -rwxr-xr-x | flags/tests/parse.ts | 4 | ||||
| -rwxr-xr-x | flags/tests/unknown.ts | 22 |
4 files changed, 60 insertions, 61 deletions
diff --git a/flags/mod.ts b/flags/mod.ts index 2b91c2775..0c0702e8b 100644 --- a/flags/mod.ts +++ b/flags/mod.ts @@ -1,12 +1,12 @@ // Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. export interface ArgParsingOptions { unknown?: Function; - boolean?: Boolean | string | string[]; + boolean?: boolean | string | string[]; alias?: { [key: string]: string | string[] }; string?: string | string[]; - default?: { [key: string]: any }; - "--"?: Boolean; - stopEarly?: Boolean; + default?: { [key: string]: any }; // eslint-disable-line @typescript-eslint/no-explicit-any + "--"?: boolean; + stopEarly?: boolean; } const DEFAULT_OPTIONS = { @@ -19,10 +19,27 @@ const DEFAULT_OPTIONS = { stopEarly: false }; +function isNumber(x: unknown): boolean { + if (typeof x === "number") return true; + if (/^0x[0-9a-f]+$/i.test(String(x))) return true; + return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(String(x)); +} + +function hasKey(obj, keys): boolean { + let o = obj; + keys.slice(0, -1).forEach(function(key) { + o = o[key] || {}; + }); + + const key = keys[keys.length - 1]; + return key in o; +} + export function parse( args, initialOptions?: ArgParsingOptions ): { [key: string]: any } { + // eslint-disable-line @typescript-eslint/no-explicit-any const options: ArgParsingOptions = { ...DEFAULT_OPTIONS, ...(initialOptions || {}) @@ -72,18 +89,8 @@ export function parse( const defaults = options.default!; const argv = { _: [] }; - Object.keys(flags.bools).forEach(function(key) { - setArg(key, defaults[key] === undefined ? false : defaults[key]); - }); - - let notFlags = []; - - if (args.indexOf("--") !== -1) { - notFlags = args.slice(args.indexOf("--") + 1); - args = args.slice(0, args.indexOf("--")); - } - function argDefined(key, arg) { + function argDefined(key, arg): boolean { return ( (flags.allBools && /^--[^=]+$/.test(arg)) || flags.strings[key] || @@ -92,19 +99,6 @@ export function parse( ); } - function setArg(key, val, arg = null): void { - if (arg && flags.unknownFn && !argDefined(key, arg)) { - if (flags.unknownFn(arg) === false) return; - } - - const value = !flags.strings[key] && isNumber(val) ? Number(val) : val; - setKey(argv, key.split("."), value); - - (aliases[key] || []).forEach(function(x) { - setKey(argv, x.split("."), value); - }); - } - function setKey(obj, keys, value): void { let o = obj; keys.slice(0, -1).forEach(function(key) { @@ -126,12 +120,36 @@ export function parse( } } + function setArg(key, val, arg = null): void { + if (arg && flags.unknownFn && !argDefined(key, arg)) { + if (flags.unknownFn(arg) === false) return; + } + + const value = !flags.strings[key] && isNumber(val) ? Number(val) : val; + setKey(argv, key.split("."), value); + + (aliases[key] || []).forEach(function(x) { + setKey(argv, x.split("."), value); + }); + } + function aliasIsBoolean(key): boolean { return aliases[key].some(function(x) { return flags.bools[x]; }); } + Object.keys(flags.bools).forEach(function(key) { + setArg(key, defaults[key] === undefined ? false : defaults[key]); + }); + + let notFlags = []; + + if (args.indexOf("--") !== -1) { + notFlags = args.slice(args.indexOf("--") + 1); + args = args.slice(0, args.indexOf("--")); + } + for (let i = 0; i < args.length; i++) { const arg = args[i]; @@ -242,7 +260,7 @@ export function parse( }); if (options["--"]) { - argv["--"] = new Array(); + argv["--"] = []; notFlags.forEach(function(key) { argv["--"].push(key); }); @@ -254,19 +272,3 @@ export function parse( return argv; } - -function hasKey(obj, keys) { - let o = obj; - keys.slice(0, -1).forEach(function(key) { - o = o[key] || {}; - }); - - const key = keys[keys.length - 1]; - return key in o; -} - -function isNumber(x: any): boolean { - if (typeof x === "number") return true; - if (/^0x[0-9a-f]+$/i.test(x)) return true; - return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x); -} diff --git a/flags/tests/bool.ts b/flags/tests/bool.ts index 321dbb1e9..bffb1fd34 100755 --- a/flags/tests/bool.ts +++ b/flags/tests/bool.ts @@ -39,9 +39,6 @@ test(function booleanGroups() { test(function booleanAndAliasWithChainableApi() { const aliased = ["-h", "derp"]; const regular = ["--herp", "derp"]; - const opts = { - herp: { alias: "h", boolean: true } - }; const aliasedArgv = parse(aliased, { boolean: "herp", alias: { h: "herp" } diff --git a/flags/tests/parse.ts b/flags/tests/parse.ts index 73bdb7c3b..a37cd4c63 100755 --- a/flags/tests/parse.ts +++ b/flags/tests/parse.ts @@ -178,7 +178,7 @@ test(function nestedDottedObjects() { "4", "--foo.quux.quibble", "5", - "--foo.quux.o_O", + "--foo.quux.oO", "--beep.boop" ]); @@ -187,7 +187,7 @@ test(function nestedDottedObjects() { baz: 4, quux: { quibble: 5, - o_O: true + oO: true } }); assertEquals(argv.beep, { boop: true }); diff --git a/flags/tests/unknown.ts b/flags/tests/unknown.ts index 986bc29d8..cd944746f 100755 --- a/flags/tests/unknown.ts +++ b/flags/tests/unknown.ts @@ -5,7 +5,7 @@ import { parse } from "../mod.ts"; test(function booleanAndAliasIsNotUnknown() { const unknown = []; - function unknownFn(arg) { + function unknownFn(arg): boolean { unknown.push(arg); return false; } @@ -16,15 +16,15 @@ test(function booleanAndAliasIsNotUnknown() { boolean: "h", unknown: unknownFn }; - const aliasedArgv = parse(aliased, opts); - const propertyArgv = parse(regular, opts); + parse(aliased, opts); + parse(regular, opts); assertEquals(unknown, ["--derp", "-d"]); }); test(function flagBooleanTrueAnyDoubleHyphenArgumentIsNotUnknown() { const unknown = []; - function unknownFn(arg) { + function unknownFn(arg): boolean { unknown.push(arg); return false; } @@ -41,7 +41,7 @@ test(function flagBooleanTrueAnyDoubleHyphenArgumentIsNotUnknown() { test(function stringAndAliasIsNotUnkown() { const unknown = []; - function unknownFn(arg) { + function unknownFn(arg): boolean { unknown.push(arg); return false; } @@ -52,15 +52,15 @@ test(function stringAndAliasIsNotUnkown() { string: "h", unknown: unknownFn }; - const aliasedArgv = parse(aliased, opts); - const propertyArgv = parse(regular, opts); + parse(aliased, opts); + parse(regular, opts); assertEquals(unknown, ["--derp", "-d"]); }); test(function defaultAndAliasIsNotUnknown() { const unknown = []; - function unknownFn(arg) { + function unknownFn(arg): boolean { unknown.push(arg); return false; } @@ -71,15 +71,15 @@ test(function defaultAndAliasIsNotUnknown() { alias: { h: "herp" }, unknown: unknownFn }; - const aliasedArgv = parse(aliased, opts); - const propertyArgv = parse(regular, opts); + parse(aliased, opts); + parse(regular, opts); assertEquals(unknown, []); }); test(function valueFollowingDoubleHyphenIsNotUnknown() { const unknown = []; - function unknownFn(arg) { + function unknownFn(arg): boolean { unknown.push(arg); return false; } |
