separated url-search params and url classes and added more tests

pull/12285/head
FoHoOV 2 years ago
parent e5d70c3b97
commit 1bfe90707d

@ -1,7 +1,8 @@
export { SvelteDate } from './date.js';
export { SvelteSet } from './set.js';
export { SvelteMap } from './map.js';
export { SvelteURL, SvelteURLSearchParams } from './url.js';
export { SvelteURL } from './url.js';
export { SvelteURLSearchParams } from './url-search-params.js';
/** @deprecated Use `SvelteDate` instead */
export function Date() {

@ -0,0 +1,126 @@
import { source } from '../internal/client/reactivity/sources.js';
import { get } from '../internal/client/runtime.js';
import { increment } from './utils.js';
export const REPLACE = Symbol();
export class SvelteURLSearchParams extends URLSearchParams {
#version = source(0);
/**
* @param {URLSearchParams} params
*/
[REPLACE](params) {
for (const key of [...super.keys()]) {
super.delete(key);
}
for (const [key, value] of params) {
super.append(key, value);
}
increment(this.#version);
}
/**
* @param {string} name
* @param {string} value
* @returns {void}
*/
append(name, value) {
increment(this.#version);
return super.append(name, value);
}
/**
* @param {string} name
* @param {string=} value
* @returns {void}
*/
delete(name, value) {
var has_value = super.has(name, value);
var res = super.delete(name, value);
if (has_value) {
increment(this.#version);
}
return res;
}
/**
* @param {string} name
* @returns {string|null}
*/
get(name) {
get(this.#version);
return super.get(name);
}
/**
* @param {string} name
* @returns {string[]}
*/
getAll(name) {
get(this.#version);
return super.getAll(name);
}
/**
* @param {string} name
* @param {string=} value
* @returns {boolean}
*/
has(name, value) {
get(this.#version);
return super.has(name, value);
}
keys() {
get(this.#version);
return super.keys();
}
/**
* @param {string} name
* @param {string} value
* @returns {void}
*/
set(name, value) {
var value_before_change = 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('')) {
increment(this.#version);
}
}
sort() {
var res = super.sort();
increment(this.#version);
return res;
}
toString() {
get(this.#version);
return super.toString();
}
values() {
get(this.#version);
return super.values();
}
entries() {
get(this.#version);
return super.entries();
}
[Symbol.iterator]() {
return this.entries();
}
get size() {
get(this.#version);
return super.size;
}
}

@ -0,0 +1,184 @@
import { render_effect, effect_root } from '../internal/client/reactivity/effects.js';
import { flushSync } from '../index-client.js';
import { assert, test } from 'vitest';
import { SvelteURLSearchParams } from './url-search-params';
test('URLSearchParams.set', () => {
const params = new SvelteURLSearchParams();
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
log.push(params.toString());
});
});
flushSync(() => {
params.set('a', 'b');
});
flushSync(() => {
params.set('a', 'c');
});
flushSync(() => {
// nothing should happen here
params.set('a', 'c');
});
assert.deepEqual(log, ['', 'a=b', 'a=c']);
cleanup();
});
test('URLSearchParams.append', () => {
const params = new SvelteURLSearchParams();
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
log.push(params.toString());
});
});
flushSync(() => {
params.append('a', 'b');
});
flushSync(() => {
// nothing should happen here
params.set('a', 'b');
});
flushSync(() => {
params.append('a', 'c');
});
assert.deepEqual(log, ['', 'a=b', 'a=b&a=c']);
cleanup();
});
test('URLSearchParams.delete', () => {
const params = new SvelteURLSearchParams('a=b&c=d');
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
log.push(params.toString());
});
});
flushSync(() => {
params.delete('a');
});
flushSync(() => {
// nothing should happen here
params.delete('a');
});
flushSync(() => {
params.set('a', 'b');
});
assert.deepEqual(log, ['a=b&c=d', 'c=d', 'c=d&a=b']);
cleanup();
});
test('URLSearchParams.get', () => {
const params = new SvelteURLSearchParams('a=b&c=d');
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
log.push(params.get('a'));
});
render_effect(() => {
log.push(params.get('c'));
});
render_effect(() => {
log.push(params.get('e'));
});
});
flushSync(() => {
params.set('a', 'b');
});
flushSync(() => {
params.set('a', 'new-b');
});
flushSync(() => {
params.delete('a');
});
assert.deepEqual(log, ['b', 'd', null, 'new-b', 'd', null, null, 'd', null]);
cleanup();
});
test('URLSearchParams.getAll', () => {
const params = new SvelteURLSearchParams('a=b&c=d');
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
log.push(params.getAll('a'));
});
render_effect(() => {
log.push(params.getAll('q'));
});
});
flushSync(() => {
params.append('a', 'b1');
});
flushSync(() => {
params.append('q', 'z');
});
assert.deepEqual(log, [
// initial
['b'],
[],
// first flush
['b', 'b1'],
[],
// second flush
['b', 'b1'],
['z']
]);
cleanup();
});
test('URLSearchParams.toString', () => {
const params = new SvelteURLSearchParams();
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
log.push(params.toString());
});
});
flushSync(() => {
params.set('a', 'b');
});
flushSync(() => {
params.append('a', 'c');
});
assert.deepEqual(log, ['', 'a=b', 'a=b&a=c']);
cleanup();
});
test('URLSearchParams.instanceOf', () => {
assert.equal(new SvelteURLSearchParams() instanceof URLSearchParams, true);
});

@ -1,8 +1,6 @@
import { source, set } from '../internal/client/reactivity/sources.js';
import { get } from '../internal/client/runtime.js';
import { increment } from './utils.js';
const REPLACE = Symbol();
import { REPLACE, SvelteURLSearchParams } from './url-search-params.js';
export class SvelteURL extends URL {
#protocol = source(super.protocol);
@ -152,114 +150,3 @@ export class SvelteURL extends URL {
return this.href;
}
}
export class SvelteURLSearchParams extends URLSearchParams {
#version = source(0);
/**
* @param {URLSearchParams} params
*/
[REPLACE](params) {
for (const key of [...super.keys()]) {
super.delete(key);
}
for (const [key, value] of params) {
super.append(key, value);
}
increment(this.#version);
}
/**
* @param {string} name
* @param {string} value
* @returns {void}
*/
append(name, value) {
increment(this.#version);
return super.append(name, value);
}
/**
* @param {string} name
* @param {string=} value
* @returns {void}
*/
delete(name, value) {
increment(this.#version);
return super.delete(name, value);
}
/**
* @param {string} name
* @returns {string|null}
*/
get(name) {
get(this.#version);
return super.get(name);
}
/**
* @param {string} name
* @returns {string[]}
*/
getAll(name) {
get(this.#version);
return super.getAll(name);
}
/**
* @param {string} name
* @param {string=} value
* @returns {boolean}
*/
has(name, value) {
get(this.#version);
return super.has(name, value);
}
keys() {
get(this.#version);
return super.keys();
}
/**
* @param {string} name
* @param {string} value
* @returns {void}
*/
set(name, value) {
increment(this.#version);
return super.set(name, value);
}
sort() {
increment(this.#version);
return super.sort();
}
toString() {
get(this.#version);
return super.toString();
}
values() {
get(this.#version);
return super.values();
}
entries() {
get(this.#version);
return super.entries();
}
[Symbol.iterator]() {
return this.entries();
}
get size() {
get(this.#version);
return super.size;
}
}

@ -1,6 +1,6 @@
import { render_effect, effect_root } from '../internal/client/reactivity/effects.js';
import { flushSync } from '../index-client.js';
import { SvelteURL, SvelteURLSearchParams } from './url.js';
import { SvelteURL } from './url.js';
import { assert, test } from 'vitest';
test('url.hash', () => {
@ -76,26 +76,3 @@ test('url.searchParams', () => {
cleanup();
});
test('URLSearchParams', () => {
const params = new SvelteURLSearchParams();
const log: any = [];
const cleanup = effect_root(() => {
render_effect(() => {
log.push(params.toString());
});
});
flushSync(() => {
params.set('a', 'b');
});
flushSync(() => {
params.append('a', 'c');
});
assert.deepEqual(log, ['', 'a=b', 'a=b&a=c']);
cleanup();
});

@ -30,9 +30,9 @@ export default defineConfig({
dir: '.',
reporters: ['dot'],
include: [
'packages/svelte/**/*.test.ts',
'packages/svelte/tests/*/test.ts',
'packages/svelte/tests/runtime-browser/test-ssr.ts'
'packages/svelte/**/*.test.ts'
// 'packages/svelte/tests/*/test.ts',
// 'packages/svelte/tests/runtime-browser/test-ssr.ts'
],
exclude: [...configDefaults.exclude, '**/samples/**'],
coverage: {

Loading…
Cancel
Save