mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 09:31:22 -05:00
feat(std/flags): pass key and value to unknown (#4637)
This commit is contained in:
parent
0ea9562933
commit
703c0b7c17
2 changed files with 29 additions and 19 deletions
|
@ -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;
|
||||
|
|
|
@ -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"],
|
||||
_: [],
|
||||
|
|
Loading…
Add table
Reference in a new issue