Skip to content

Commit

Permalink
[FIX] when getting array values, the expected result is an empty arra…
Browse files Browse the repository at this point in the history
…y if a flag was not specified.
  • Loading branch information
aricart committed Aug 24, 2021
1 parent 91d8b53 commit 2946973
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 3 deletions.
3 changes: 2 additions & 1 deletion mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ export class FlagsImpl implements Flags {
if (!f) {
throw new Error(`unknown flag ${n}`);
}
let v = f.value ?? f.default ?? this.defaultValue(f);
let v = f.value ?? [];
if (!Array.isArray(v)) {
v = [v];
}
Expand Down Expand Up @@ -386,6 +386,7 @@ export class RootCommand extends Command implements Execute {
// deno-lint-ignore no-explicit-any
const parseOpts = { "--": true } as any;
flags.forEach((f) => {
f.value = null;
const key = f.short.length ? f.short : f.name;

if (f.short && f.name) {
Expand Down
40 changes: 38 additions & 2 deletions test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {
assert,
assertArrayIncludes,
assertEquals,
assertThrows,
} from "https://deno.land/std/testing/asserts.ts";
Expand Down Expand Up @@ -221,13 +222,13 @@ Deno.test("flags - array values returns array", async () => {
assertEquals(rv, 0);
});

Deno.test("flags - array values returns default", async () => {
Deno.test("flags - array values returns empty", async () => {
const root = cli({ use: "test" });
const t = root.addCommand({
use: "t",
run: (_cmd, _args, flags): Promise<number> => {
const v = flags.values<number>("x");
assertEquals(v, [0]);
assertEquals(v, []);
return Promise.resolve(0);
},
});
Expand Down Expand Up @@ -260,3 +261,38 @@ Deno.test("flags - unknown values throws", async () => {
const rv = await root.execute(["t"]);
assertEquals(rv, 0);
});

Deno.test("flags - values with no value set returns empty", async () => {
const root = cli({ use: "test" });
let values: string[] = [];
const t = root.addCommand({
use: "t",
run: (_cmd, _args, flags): Promise<number> => {
values = flags.values<string>("v");
return Promise.resolve(0);
},
});
t.addFlag({
name: "v",
type: "string",
});

let rv = await root.execute(["t"]);
assertEquals(rv, 0);
console.log(values);
assertEquals(values.length, 0);

rv = await root.execute(["t", "--v", "a"]);
assertEquals(rv, 0);
assertEquals(values.length, 1);
assertArrayIncludes(values, ["a"]);

rv = await root.execute(["t", "--v", "a", "--v", "b"]);
assertEquals(rv, 0);
assertEquals(values.length, 2);
assertArrayIncludes(values, ["a", "b"]);

rv = await root.execute(["t"]);
assertEquals(rv, 0);
assertEquals(values.length, 0);
});

0 comments on commit 2946973

Please sign in to comment.