UNPKG

@tanstack/router-core

Version:

Modern and scalable routing for React applications

62 lines (61 loc) 2.35 kB
import { decode, encode } from "./qss.js"; //#region src/searchParams.ts /** Default `parseSearch` that strips leading '?' and JSON-parses values. */ var defaultParseSearch = parseSearchWith(JSON.parse); /** Default `stringifySearch` using JSON.stringify for complex values. */ var defaultStringifySearch = stringifySearchWith(JSON.stringify, JSON.parse); /** * Build a `parseSearch` function using a provided JSON-like parser. * * The returned function strips a leading `?`, decodes values, and attempts to * JSON-parse string values using the given `parser`. * * @param parser Function to parse a string value (e.g. `JSON.parse`). * @returns A `parseSearch` function compatible with `Router` options. * @link https://tanstack.com/router/latest/docs/framework/react/guide/custom-search-param-serialization */ function parseSearchWith(parser) { return (searchStr) => { if (searchStr[0] === "?") searchStr = searchStr.substring(1); const query = decode(searchStr); for (const key in query) { const value = query[key]; if (typeof value === "string") try { query[key] = parser(value); } catch (_err) {} } return query; }; } /** * Build a `stringifySearch` function using a provided serializer. * * Non-primitive values are serialized with `stringify`. If a `parser` is * supplied, string values that are parseable are re-serialized to ensure * symmetry with `parseSearch`. * * @param stringify Function to serialize a value (e.g. `JSON.stringify`). * @param parser Optional parser to detect parseable strings. * @returns A `stringifySearch` function compatible with `Router` options. * @link https://tanstack.com/router/latest/docs/framework/react/guide/custom-search-param-serialization */ function stringifySearchWith(stringify, parser) { const hasParser = typeof parser === "function"; function stringifyValue(val) { if (typeof val === "object" && val !== null) try { return stringify(val); } catch (_err) {} else if (hasParser && typeof val === "string") try { parser(val); return stringify(val); } catch (_err) {} return val; } return (search) => { const searchStr = encode(search, stringifyValue); return searchStr ? `?${searchStr}` : ""; }; } //#endregion export { defaultParseSearch, defaultStringifySearch, parseSearchWith, stringifySearchWith }; //# sourceMappingURL=searchParams.js.map