From 70621d4b8cf35f6cbbde89447477b9f4286427e1 Mon Sep 17 00:00:00 2001 From: Dominic Nguyen Date: Mon, 20 Jul 2026 22:13:27 -0700 Subject: [PATCH] Fix short flag value detection - Reject unquoted short flags when a value-taking flag is missing its value. - Preserve negative numeric strings and quoted flag-like values. - Add focused parser regression coverage. --- .../dispatcher/src/command/parameters.ts | 4 +-- .../dispatcher/dispatcher/test/flags.spec.ts | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/ts/packages/dispatcher/dispatcher/src/command/parameters.ts b/ts/packages/dispatcher/dispatcher/src/command/parameters.ts index 8b96acab90..261d52b49b 100644 --- a/ts/packages/dispatcher/dispatcher/src/command/parameters.ts +++ b/ts/packages/dispatcher/dispatcher/src/command/parameters.ts @@ -85,8 +85,8 @@ function invalidValueToken(valueToken: string) { if ( valueToken.length === 2 && valueToken[0] === "-" && - valueToken.charCodeAt(1) < 48 /* "0" */ && - valueToken.charCodeAt(1) > 57 /* "9" */ + (valueToken.charCodeAt(1) < 48 /* "0" */ || + valueToken.charCodeAt(1) > 57) /* "9" */ ) { return true; } diff --git a/ts/packages/dispatcher/dispatcher/test/flags.spec.ts b/ts/packages/dispatcher/dispatcher/test/flags.spec.ts index 509536b1cf..cf92be231e 100644 --- a/ts/packages/dispatcher/dispatcher/test/flags.spec.ts +++ b/ts/packages/dispatcher/dispatcher/test/flags.spec.ts @@ -13,6 +13,20 @@ describe("Flag parsing", () => { obj: { description: "testing", type: "json" }, }, } as const; + const shortFlags = { + flags: { + output: { + description: "output", + type: "string", + char: "o", + }, + verbose: { + description: "verbose", + type: "boolean", + char: "v", + }, + }, + } as const; const o1 = { hello: "str", num: 11, bool: true }; const o2 = { ...o1, obj: o1, arr: [o1, o1] }; it("type", () => { @@ -257,6 +271,20 @@ describe("Flag parsing", () => { } }); + it("does not consume a following short flag as a string value", () => { + expect(() => parseParams("-o -v", shortFlags)).toThrow( + "Missing value for flag '-o'", + ); + }); + + it("accepts a negative numeric-looking string as a short flag value", () => { + expect(parseParams("-o -1", shortFlags).flags.output).toBe("-1"); + }); + + it("accepts a quoted short-flag-looking string as a short flag value", () => { + expect(parseParams("-o '-v'", shortFlags).flags.output).toBe("-v"); + }); + it("Duplicate flags", () => { try { parseParams("--num 10 --num 11", typeFlags);