UNPKG

@tanstack/router-core

Version:

Modern and scalable routing for React applications

1 lines 3.85 kB
{"version":3,"file":"searchParams.cjs","names":[],"sources":["../../src/searchParams.ts"],"sourcesContent":["import { decode, encode } from './qss'\nimport type { AnySchema } from './validators'\n\n/** Default `parseSearch` that strips leading '?' and JSON-parses values. */\nexport const defaultParseSearch = parseSearchWith(JSON.parse)\n/** Default `stringifySearch` using JSON.stringify for complex values. */\nexport const defaultStringifySearch = stringifySearchWith(\n JSON.stringify,\n JSON.parse,\n)\n\n/**\n * Build a `parseSearch` function using a provided JSON-like parser.\n *\n * The returned function strips a leading `?`, decodes values, and attempts to\n * JSON-parse string values using the given `parser`.\n *\n * @param parser Function to parse a string value (e.g. `JSON.parse`).\n * @returns A `parseSearch` function compatible with `Router` options.\n * @link https://tanstack.com/router/latest/docs/framework/react/guide/custom-search-param-serialization\n */\nexport function parseSearchWith(parser: (str: string) => any) {\n return (searchStr: string): AnySchema => {\n if (searchStr[0] === '?') {\n searchStr = searchStr.substring(1)\n }\n\n const query: Record<string, unknown> = decode(searchStr)\n\n // Try to parse any query params that might be json\n for (const key in query) {\n const value = query[key]\n if (typeof value === 'string') {\n try {\n query[key] = parser(value)\n } catch (_err) {\n // silent\n }\n }\n }\n\n return query\n }\n}\n\n/**\n * Build a `stringifySearch` function using a provided serializer.\n *\n * Non-primitive values are serialized with `stringify`. If a `parser` is\n * supplied, string values that are parseable are re-serialized to ensure\n * symmetry with `parseSearch`.\n *\n * @param stringify Function to serialize a value (e.g. `JSON.stringify`).\n * @param parser Optional parser to detect parseable strings.\n * @returns A `stringifySearch` function compatible with `Router` options.\n * @link https://tanstack.com/router/latest/docs/framework/react/guide/custom-search-param-serialization\n */\nexport function stringifySearchWith(\n stringify: (search: any) => string,\n parser?: (str: string) => any,\n) {\n const hasParser = typeof parser === 'function'\n function stringifyValue(val: any) {\n if (typeof val === 'object' && val !== null) {\n try {\n return stringify(val)\n } catch (_err) {\n // silent\n }\n } else if (hasParser && typeof val === 'string') {\n try {\n // Check if it's a valid parseable string.\n // If it is, then stringify it again.\n parser(val)\n return stringify(val)\n } catch (_err) {\n // silent\n }\n }\n return val\n }\n\n return (search: Record<string, any>) => {\n const searchStr = encode(search, stringifyValue)\n return searchStr ? `?${searchStr}` : ''\n }\n}\n\nexport type SearchSerializer = (searchObj: Record<string, any>) => string\nexport type SearchParser = (searchStr: string) => Record<string, any>\n"],"mappings":";;;AAIA,MAAa,qBAAqB,gBAAgB,KAAK,KAAK;;AAE5D,MAAa,yBAAyB,oBACpC,KAAK,WACL,KAAK,KACP;;;;;;;;;;;AAYA,SAAgB,gBAAgB,QAA8B;CAC5D,QAAQ,cAAiC;EACvC,IAAI,UAAU,OAAO,KACnB,YAAY,UAAU,UAAU,CAAC;EAGnC,MAAM,QAAiC,YAAA,OAAO,SAAS;EAGvD,KAAK,MAAM,OAAO,OAAO;GACvB,MAAM,QAAQ,MAAM;GACpB,IAAI,OAAO,UAAU,UACnB,IAAI;IACF,MAAM,OAAO,OAAO,KAAK;GAC3B,SAAS,MAAM,CAEf;EAEJ;EAEA,OAAO;CACT;AACF;;;;;;;;;;;;;AAcA,SAAgB,oBACd,WACA,QACA;CACA,MAAM,YAAY,OAAO,WAAW;CACpC,SAAS,eAAe,KAAU;EAChC,IAAI,OAAO,QAAQ,YAAY,QAAQ,MACrC,IAAI;GACF,OAAO,UAAU,GAAG;EACtB,SAAS,MAAM,CAEf;OACK,IAAI,aAAa,OAAO,QAAQ,UACrC,IAAI;GAGF,OAAO,GAAG;GACV,OAAO,UAAU,GAAG;EACtB,SAAS,MAAM,CAEf;EAEF,OAAO;CACT;CAEA,QAAQ,WAAgC;EACtC,MAAM,YAAY,YAAA,OAAO,QAAQ,cAAc;EAC/C,OAAO,YAAY,IAAI,cAAc;CACvC;AACF"}