UNPKG

nuqs-svelte

Version:

Svelte adaptation of the `nuqs` library for managing URL query strings as state.

51 lines (50 loc) 2.04 kB
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)]; } }