@tanstack/router-core
Version:
Modern and scalable routing for React applications
1 lines • 3.22 kB
Source Map (JSON)
{"version":3,"file":"searchMiddleware.cjs","names":[],"sources":["../../src/searchMiddleware.ts"],"sourcesContent":["import { deepEqual } from './utils'\nimport type { NoInfer, PickOptional } from './utils'\nimport type { SearchMiddleware } from './route'\nimport type { IsRequiredParams } from './link'\n\n/**\n * Retain specified search params across navigations.\n *\n * If `keys` is `true`, retain all current params. Otherwise, copy only the\n * listed keys from the current search into the next search.\n *\n * @param keys `true` to retain all, or a list of keys to retain.\n * @returns A search middleware suitable for route `search.middlewares`.\n * @link https://tanstack.com/router/latest/docs/framework/react/api/router/retainSearchParamsFunction\n */\nexport function retainSearchParams<TSearchSchema extends object>(\n keys: Array<keyof TSearchSchema> | true,\n): SearchMiddleware<TSearchSchema> {\n return ({ search, next }) => {\n const result = next(search)\n if (keys === true) {\n return { ...search, ...result }\n }\n const copy = { ...result }\n // add missing keys from search to copy\n keys.forEach((key) => {\n if (!(key in copy)) {\n copy[key] = search[key]\n }\n })\n return copy\n }\n}\n\n/**\n * Remove optional or default-valued search params from navigations.\n *\n * - Pass `true` (only if there are no required search params) to strip all.\n * - Pass an array to always remove those optional keys.\n * - Pass an object of default values; keys equal (deeply) to the defaults are removed.\n *\n * @returns A search middleware suitable for route `search.middlewares`.\n * @link https://tanstack.com/router/latest/docs/framework/react/api/router/stripSearchParamsFunction\n */\nexport function stripSearchParams<\n TSearchSchema,\n TOptionalProps = PickOptional<NoInfer<TSearchSchema>>,\n const TValues =\n | Partial<NoInfer<TOptionalProps>>\n | Array<keyof TOptionalProps>,\n const TInput = IsRequiredParams<TSearchSchema> extends never\n ? TValues | true\n : TValues,\n>(input: NoInfer<TInput>): SearchMiddleware<TSearchSchema> {\n return ({ search, next }) => {\n if (input === true) {\n return {}\n }\n const result = { ...next(search) } as Record<string, unknown>\n if (Array.isArray(input)) {\n input.forEach((key) => {\n delete result[key]\n })\n } else {\n Object.entries(input as Record<string, unknown>).forEach(\n ([key, value]) => {\n if (deepEqual(result[key], value)) {\n delete result[key]\n }\n },\n )\n }\n return result as any\n }\n}\n"],"mappings":";;;;;;;;;;;;AAeA,SAAgB,mBACd,MACiC;AACjC,SAAQ,EAAE,QAAQ,WAAW;EAC3B,MAAM,SAAS,KAAK,OAAO;AAC3B,MAAI,SAAS,KACX,QAAO;GAAE,GAAG;GAAQ,GAAG;GAAQ;EAEjC,MAAM,OAAO,EAAE,GAAG,QAAQ;AAE1B,OAAK,SAAS,QAAQ;AACpB,OAAI,EAAE,OAAO,MACX,MAAK,OAAO,OAAO;IAErB;AACF,SAAO;;;;;;;;;;;;;AAcX,SAAgB,kBASd,OAAyD;AACzD,SAAQ,EAAE,QAAQ,WAAW;AAC3B,MAAI,UAAU,KACZ,QAAO,EAAE;EAEX,MAAM,SAAS,EAAE,GAAG,KAAK,OAAO,EAAE;AAClC,MAAI,MAAM,QAAQ,MAAM,CACtB,OAAM,SAAS,QAAQ;AACrB,UAAO,OAAO;IACd;MAEF,QAAO,QAAQ,MAAiC,CAAC,SAC9C,CAAC,KAAK,WAAW;AAChB,OAAI,cAAA,UAAU,OAAO,MAAM,MAAM,CAC/B,QAAO,OAAO;IAGnB;AAEH,SAAO"}