Skip to content

Commit c0e36a0

Browse files
authored
Handle KV values with = signs (#230)
1 parent 3d4d6cd commit c0e36a0

File tree

2 files changed

+40
-8
lines changed

2 files changed

+40
-8
lines changed

src/util.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -208,18 +208,25 @@ export function parseKVString(str: string): KVPair {
208208
const pairs = str.split(/(?<!\\),/gi);
209209
for (let i = 0; i < pairs.length; i++) {
210210
const pair = pairs[i];
211-
let [k, v] = pair.split('=', 2);
212-
if (!k || !v) {
213-
throw new SyntaxError(`Failed to parse KEY=VALUE pair "${pair}"`);
211+
const firstEqual = pair.indexOf('=');
212+
if (!firstEqual || firstEqual === -1) {
213+
throw new SyntaxError(
214+
`Failed to parse KEY=VALUE pair "${pair}": missing "="`,
215+
);
214216
}
215217

216218
// Trim any key whitespace and un-escape any escaped commas.
217-
k = k.trim();
218-
k = k.replace(/\\,/gi, ',');
219+
const k = pair.slice(0, firstEqual).trim().replace(/\\,/gi, ',');
220+
const v = pair
221+
.slice(firstEqual + 1)
222+
.trim()
223+
.replace(/\\,/gi, ',');
219224

220-
// Trim any value whitespace and un-escape any escaped commas.
221-
v = v.trim();
222-
v = v.replace(/\\,/gi, ',');
225+
if (!k || !v) {
226+
throw new SyntaxError(
227+
`Failed to parse KEY=VALUE pair "${pair}": no value`,
228+
);
229+
}
223230

224231
result[k] = v;
225232
}

tests/util.test.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,31 @@ describe('Util', () => {
8585
input: 'FOO=bar,ZIP=zap',
8686
expected: { FOO: 'bar', ZIP: 'zap' },
8787
},
88+
{
89+
name: 'value with equals',
90+
input: 'FOO=bar=baz',
91+
expected: { FOO: 'bar=baz' },
92+
},
93+
{
94+
name: 'value with many equals',
95+
input: 'FOO=bar=baz;zip=zap;zinc=atom',
96+
expected: { FOO: 'bar=baz;zip=zap;zinc=atom' },
97+
},
98+
{
99+
name: 'comma-separated value with many equals',
100+
input: 'FOO=bar=baz,ZIP=zap=flap==,ZINC=atom',
101+
expected: { FOO: 'bar=baz', ZIP: 'zap=flap==', ZINC: 'atom' },
102+
},
103+
{
104+
name: 'value with consecutive equals',
105+
input: 'FOO=bar==baz;zip===zap;zinc====atom',
106+
expected: { FOO: 'bar==baz;zip===zap;zinc====atom' },
107+
},
108+
{
109+
name: 'value with trailing equals',
110+
input: 'FOO=aGVsbG8gd29ybGQhCg==',
111+
expected: { FOO: 'aGVsbG8gd29ybGQhCg==' },
112+
},
88113
{
89114
name: 'trims',
90115
input: ' FOO= bar, ZIP=zap ',

0 commit comments

Comments
 (0)