{"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"}