Skip to content

Commit 1018c20

Browse files
committedJul 30, 2021
Fix merging searchParams
Fixes #1814
1 parent 25101f2 commit 1018c20

File tree

3 files changed

+39
-12
lines changed

3 files changed

+39
-12
lines changed
 

‎documentation/2-options.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ console.log(searchParams.toString());
177177
178178
#### **Note:**
179179
> - `null` values are not stringified, an empty string is used instead.
180-
> - `undefined` values are skipped.
180+
> - `undefined` values will clear the original keys.
181181
182182
#### **Merge behavior:**
183183
> - Overrides existing properties.

‎source/core/options.ts

+21-11
Original file line numberDiff line numberDiff line change
@@ -1325,6 +1325,10 @@ export default class Options {
13251325
return (this._internals.url as URL).searchParams;
13261326
}
13271327

1328+
if (this._internals.searchParams === undefined) {
1329+
this._internals.searchParams = new URLSearchParams();
1330+
}
1331+
13281332
return this._internals.searchParams;
13291333
}
13301334

@@ -1343,11 +1347,13 @@ export default class Options {
13431347
return;
13441348
}
13451349

1346-
let searchParameters = (this.searchParams ?? new URLSearchParams()) as URLSearchParams;
1350+
const searchParameters = this.searchParams as URLSearchParams;
13471351
let updated;
13481352

1349-
if (is.string(value) || (value instanceof URLSearchParams)) {
1353+
if (is.string(value)) {
13501354
updated = new URLSearchParams(value);
1355+
} else if (value instanceof URLSearchParams) {
1356+
updated = value;
13511357
} else {
13521358
validateSearchParameters(value);
13531359

@@ -1359,22 +1365,26 @@ export default class Options {
13591365

13601366
if (entry === null) {
13611367
updated.append(key, '');
1362-
} else if (entry !== undefined) {
1368+
} else if (entry === undefined) {
1369+
searchParameters.delete(key);
1370+
} else {
13631371
updated.append(key, entry as string);
13641372
}
13651373
}
13661374
}
13671375

13681376
if (this._merging) {
1369-
// eslint-disable-next-line unicorn/no-array-for-each
1370-
updated.forEach((value, key) => {
1371-
searchParameters.set(key, value);
1372-
});
1373-
} else {
1374-
searchParameters = updated;
1375-
}
1377+
// These keys will be replaced
1378+
for (const key of updated.keys()) {
1379+
searchParameters.delete(key);
1380+
}
13761381

1377-
if (!url) {
1382+
for (const [key, value] of updated) {
1383+
searchParameters.append(key, value);
1384+
}
1385+
} else if (url) {
1386+
url.search = searchParameters.toString();
1387+
} else {
13781388
this._internals.searchParams = searchParameters;
13791389
}
13801390
}

‎test/normalize-arguments.ts

+17
Original file line numberDiff line numberDiff line change
@@ -150,3 +150,20 @@ test('extending responseType', t => {
150150

151151
t.is(merged.defaults.options.responseType, 'json');
152152
});
153+
154+
test('searchParams - multiple values for one key', t => {
155+
const searchParams = new URLSearchParams();
156+
157+
searchParams.append('a', '100');
158+
searchParams.append('a', '200');
159+
searchParams.append('a', '300');
160+
161+
const options = new Options({
162+
searchParams
163+
});
164+
165+
t.deepEqual(
166+
(options.searchParams as URLSearchParams).getAll('a'),
167+
['100', '200', '300']
168+
);
169+
});

0 commit comments

Comments
 (0)
Please sign in to comment.