Fix search params duplicate set updates

pull/18336/head
jiyujie2006 1 month ago
parent 05a3bce6bb
commit d26ddf42e3

@ -132,11 +132,12 @@ export class SvelteURLSearchParams extends URLSearchParams {
* @returns {void}
*/
set(name, value) {
var previous = super.getAll(name).join('');
var previous = super.getAll(name);
super.set(name, value);
// can't use has(name, value), because for something like https://svelte.dev?foo=1&bar=2&foo=3
// if you set `foo` to 1, then foo=3 gets deleted whilst `has("foo", "1")` returns true
if (previous !== super.getAll(name).join('')) {
var current = super.getAll(name);
if (previous.length !== current.length || previous.some((value, i) => value !== current[i])) {
this.#update_url();
increment(this.#version);
}

@ -55,6 +55,25 @@ test('URLSearchParams.set', () => {
cleanup();
});
test('URLSearchParams.set updates when duplicate values collapse to the same joined string', () => {
const params = new SvelteURLSearchParams('a=ab&a=c');
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
log.push(params.toString());
});
});
flushSync(() => {
params.set('a', 'abc');
});
assert.deepEqual(log, ['a=ab&a=c', 'a=abc']);
cleanup();
});
test('URLSearchParams.append', () => {
const params = new SvelteURLSearchParams();
const log: any = [];

@ -115,6 +115,25 @@ test('url.searchParams', () => {
cleanup();
});
test('url.searchParams.set updates url when duplicate values collapse to the same joined string', () => {
const url = new SvelteURL('https://svelte.dev?a=ab&a=c');
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
log.push(url.href);
});
});
flushSync(() => {
url.searchParams.set('a', 'abc');
});
assert.deepEqual(log, ['https://svelte.dev/?a=ab&a=c', 'https://svelte.dev/?a=abc']);
cleanup();
});
test('url.search normalizes value', () => {
const url = new SvelteURL('https://svelte.dev');
const log: any = [];

Loading…
Cancel
Save