nuqs-svelte
Version:
Svelte adaptation of the `nuqs` library for managing URL query strings as state.
51 lines (50 loc) • 2.04 kB
JavaScript
import { renderQueryString } from "./url-encoding";
export function createSerializer(parsers, { clearOnDefault = true, urlKeys = {}, } = {}) {
function serialize(arg1BaseOrValues, arg2values = {}) {
const [base, search] = isBase(arg1BaseOrValues)
? splitBase(arg1BaseOrValues)
: ["", new URLSearchParams()];
const values = isBase(arg1BaseOrValues) ? arg2values : arg1BaseOrValues;
if (values === null) {
for (const key in parsers) {
const urlKey = urlKeys[key] ?? key;
search.delete(urlKey);
}
return base + renderQueryString(search);
}
for (const key in parsers) {
const parser = parsers[key];
const value = values[key];
if (!parser || value === undefined) {
continue;
}
const urlKey = urlKeys[key] ?? key;
const isMatchingDefault = parser.defaultValue !== undefined &&
(parser.eq ?? ((a, b) => a === b))(value, parser.defaultValue);
if (value === null ||
((parser.clearOnDefault ?? clearOnDefault ?? true) && isMatchingDefault)) {
search.delete(urlKey);
}
else {
search.set(urlKey, parser.serialize(value));
}
}
return base + renderQueryString(search);
}
return serialize;
}
function isBase(base) {
return typeof base === "string" || base instanceof URLSearchParams || base instanceof URL;
}
function splitBase(base) {
if (typeof base === "string") {
const [path = "", ...search] = base.split("?");
return [path, new URLSearchParams(search.join("?"))];
}
else if (base instanceof URLSearchParams) {
return ["", new URLSearchParams(base)]; // Operate on a copy of URLSearchParams, as derived classes may restrict its allowed methods
}
else {
return [base.origin + base.pathname, new URLSearchParams(base.searchParams)];
}
}