|
|
|
|
@ -1,21 +1,28 @@
|
|
|
|
|
import { source } from '../internal/client/reactivity/sources.js';
|
|
|
|
|
import { get } from '../internal/client/runtime.js';
|
|
|
|
|
import { get_current_url } from './url.js';
|
|
|
|
|
import { increment } from './utils.js';
|
|
|
|
|
|
|
|
|
|
export const REPLACE = Symbol();
|
|
|
|
|
export const onChange = Symbol();
|
|
|
|
|
|
|
|
|
|
export class SvelteURLSearchParams extends URLSearchParams {
|
|
|
|
|
#version = source(0);
|
|
|
|
|
/**
|
|
|
|
|
* @type {((command: "set" | "append" | "delete" | "sort", ...args: any[])=>void ) | null}
|
|
|
|
|
*/
|
|
|
|
|
[onChange] = null;
|
|
|
|
|
#url = get_current_url();
|
|
|
|
|
|
|
|
|
|
#updating = false;
|
|
|
|
|
|
|
|
|
|
#update_url() {
|
|
|
|
|
if (!this.#url || this.#updating) return;
|
|
|
|
|
const search = this.toString();
|
|
|
|
|
this.#url.search = search && `?${search}`;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {URLSearchParams} params
|
|
|
|
|
*/
|
|
|
|
|
[REPLACE](params) {
|
|
|
|
|
this.#updating = true;
|
|
|
|
|
|
|
|
|
|
for (const key of [...super.keys()]) {
|
|
|
|
|
super.delete(key);
|
|
|
|
|
}
|
|
|
|
|
@ -25,6 +32,8 @@ export class SvelteURLSearchParams extends URLSearchParams {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
increment(this.#version);
|
|
|
|
|
|
|
|
|
|
this.#updating = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -33,10 +42,9 @@ export class SvelteURLSearchParams extends URLSearchParams {
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
append(name, value) {
|
|
|
|
|
var res = super.append(name, value);
|
|
|
|
|
this[onChange]?.('append', name, value);
|
|
|
|
|
super.append(name, value);
|
|
|
|
|
this.#update_url();
|
|
|
|
|
increment(this.#version);
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -46,12 +54,11 @@ export class SvelteURLSearchParams extends URLSearchParams {
|
|
|
|
|
*/
|
|
|
|
|
delete(name, value) {
|
|
|
|
|
var has_value = super.has(name, value);
|
|
|
|
|
var res = super.delete(name, value);
|
|
|
|
|
super.delete(name, value);
|
|
|
|
|
if (has_value) {
|
|
|
|
|
this[onChange]?.('delete', name, value);
|
|
|
|
|
this.#update_url();
|
|
|
|
|
increment(this.#version);
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@ -93,21 +100,20 @@ export class SvelteURLSearchParams extends URLSearchParams {
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
set(name, value) {
|
|
|
|
|
var value_before_change = super.getAll(name).join('');
|
|
|
|
|
var previous = super.getAll(name).join('');
|
|
|
|
|
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 (value_before_change !== super.getAll(name).join('')) {
|
|
|
|
|
this[onChange]?.('set', name, value);
|
|
|
|
|
if (previous !== super.getAll(name).join('')) {
|
|
|
|
|
this.#update_url();
|
|
|
|
|
increment(this.#version);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sort() {
|
|
|
|
|
var res = super.sort();
|
|
|
|
|
this[onChange]?.('sort');
|
|
|
|
|
super.sort();
|
|
|
|
|
this.#update_url();
|
|
|
|
|
increment(this.#version);
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
toString() {
|
|
|
|
|
|