diff --git a/.changeset/calm-tools-remember.md b/.changeset/calm-tools-remember.md new file mode 100644 index 00000000000..3fdf6410e03 --- /dev/null +++ b/.changeset/calm-tools-remember.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +Preserve equals signs in inline CLI option values after the first separator. diff --git a/packages/effect/src/unstable/cli/internal/lexer.ts b/packages/effect/src/unstable/cli/internal/lexer.ts index 3d09d117718..40e47641bbf 100644 --- a/packages/effect/src/unstable/cli/internal/lexer.ts +++ b/packages/effect/src/unstable/cli/internal/lexer.ts @@ -47,8 +47,14 @@ const lexTokens = (args: ReadonlyArray): ReadonlyArray => { if (!arg.startsWith("-")) { tokens.push({ _tag: "Value", value: arg }) } else if (arg.startsWith("--")) { - const [name, value] = arg.slice(2).split("=", 2) - tokens.push({ _tag: "LongOption", name, raw: arg, value }) + const equalIndex = arg.indexOf("=") + if (equalIndex !== -1) { + const name = arg.slice(2, equalIndex) + const value = arg.slice(equalIndex + 1) + tokens.push({ _tag: "LongOption", name, raw: arg, value }) + } else { + tokens.push({ _tag: "LongOption", name: arg.slice(2), raw: arg }) + } } else if (arg.length > 1) { const flags = arg.slice(1) const equalIndex = flags.indexOf("=") diff --git a/packages/effect/test/unstable/cli/Lexer.test.ts b/packages/effect/test/unstable/cli/Lexer.test.ts new file mode 100644 index 00000000000..7d55f26815e --- /dev/null +++ b/packages/effect/test/unstable/cli/Lexer.test.ts @@ -0,0 +1,15 @@ +import { assert, describe, it } from "@effect/vitest" +import * as Lexer from "effect/unstable/cli/internal/lexer" + +describe("Lexer", () => { + it("preserves every equals sign in a long option's inline value", () => { + const result = Lexer.lex(["--query=left=right"]) + + assert.deepStrictEqual(result.tokens, [{ + _tag: "LongOption", + name: "query", + raw: "--query=left=right", + value: "left=right" + }]) + }) +})