From 2b90c21ef551bf42c151fd574c0bd88ad1ee673b Mon Sep 17 00:00:00 2001 From: Mike Donnalley Date: Fri, 26 Jul 2024 12:44:19 -0600 Subject: [PATCH] fix: ignore escaped delimiters --- src/parser/parse.ts | 12 +++++++++++- test/parser/parse.test.ts | 8 ++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/parser/parse.ts b/src/parser/parse.ts index ff8489e1..adb3d950 100644 --- a/src/parser/parse.ts +++ b/src/parser/parse.ts @@ -412,17 +412,27 @@ export class Parser< // multiple with custom delimiter if (fws.inputFlag.flag.type === 'option' && fws.inputFlag.flag.delimiter && fws.inputFlag.flag.multiple) { + // regex that will identify unescaped delimiters + const makeDelimiter = (delimiter: string) => new RegExp(`(? ( await Promise.all( (i.tokens ?? []) - .flatMap((token) => token.input.split((i.inputFlag.flag as OptionFlag).delimiter ?? ',')) + .flatMap((token) => + token.input.split(makeDelimiter((i.inputFlag.flag as OptionFlag).delimiter ?? ',')), + ) // trim, and remove surrounding doubleQuotes (which would hav been needed if the elements contain spaces) .map((v) => v .trim() + // remove escaped characters from delimiter + // example: --opt="a\,b,c" -> ["a,b", "c"] + .replaceAll( + new RegExp(`\\\\${(i.inputFlag.flag as OptionFlag).delimiter}`, 'g'), + (i.inputFlag.flag as OptionFlag).delimiter ?? ',', + ) .replace(/^"(.*)"$/, '$1') .replace(/^'(.*)'$/, '$1'), ) diff --git a/test/parser/parse.test.ts b/test/parser/parse.test.ts index bb1c4cbf..1616fa78 100644 --- a/test/parser/parse.test.ts +++ b/test/parser/parse.test.ts @@ -646,6 +646,14 @@ See more help with --help`) expect(error.message).to.include('Expected --foo=b c to be one of: a a, b b') } }) + it('does not split on escaped delimiter', async () => { + const out = await parse(['--foo', 'a\\,b,c'], { + flags: { + foo: Flags.string({multiple: true, delimiter: ','}), + }, + }) + expect(out.flags).to.deep.include({foo: ['a,b', 'c']}) + }) }) })