@tanstack/react-router 1.72.0 → 1.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -523,7 +523,10 @@ export declare class Router<in out TRouteTree extends AnyRoute, in out TTrailing
523
523
  filter?: (d: MakeRouteMatch<TRouteTree>) => boolean;
524
524
  }) => Promise<void>;
525
525
  resolveRedirect: (err: AnyRedirect) => ResolvedRedirect;
526
- cleanCache: () => void;
526
+ clearCache: (opts?: {
527
+ filter?: (d: MakeRouteMatch<TRouteTree>) => boolean;
528
+ }) => void;
529
+ clearExpiredCache: () => void;
527
530
  preloadRoute: <TFrom extends RoutePaths<TRouteTree> | string = string, TTo extends string | undefined = undefined, TMaskFrom extends RoutePaths<TRouteTree> | string = TFrom, TMaskTo extends string = "">(opts: NavigateOptions<Router<TRouteTree, TTrailingSlashOption, TDehydrated, TSerializedError>, TFrom, TTo, TMaskFrom, TMaskTo>) => Promise<Array<AnyRouteMatch> | undefined>;
528
531
  matchRoute: <TFrom extends RoutePaths<TRouteTree> = "/", TTo extends string | undefined = undefined, TResolved = ResolveRelativePath<TFrom, NoInfer<TTo>>>(location: ToOptions<Router<TRouteTree, TTrailingSlashOption, TDehydrated, TSerializedError>, TFrom, TTo>, opts?: MatchRouteOptions) => false | RouteById<TRouteTree, TResolved>["types"]["allParams"];
529
532
  dehydrate: () => DehydratedRouter;
@@ -1 +1 @@
1
- {"version":3,"file":"searchMiddleware.cjs","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\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 // add missing keys from search to result\n keys.forEach((key) => {\n if (!(key in result)) {\n result[key] = search[key]\n }\n })\n return result\n }\n}\n\nexport function stripSearchParams<\n TSearchSchema,\n const TValues =\n | Partial<NoInfer<TSearchSchema>>\n | Array<keyof PickOptional<TSearchSchema>>,\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"],"names":["deepEqual"],"mappings":";;;AAKO,SAAS,mBACd,MACiC;AACjC,SAAO,CAAC,EAAE,QAAQ,WAAW;AACrB,UAAA,SAAS,KAAK,MAAM;AAC1B,QAAI,SAAS,MAAM;AACjB,aAAO,EAAE,GAAG,QAAQ,GAAG;IACzB;AAEK,SAAA,QAAQ,CAAC,QAAQ;AAChB,UAAA,EAAE,OAAO,SAAS;AACb,eAAA,GAAG,IAAI,OAAO,GAAG;AAAA,MAC1B;AAAA,IAAA,CACD;AACM,WAAA;AAAA,EAAA;AAEX;AAEO,SAAS,kBAQd,OAAyD;AACzD,SAAO,CAAC,EAAE,QAAQ,WAAW;AAC3B,QAAI,UAAU,MAAM;AAClB,aAAO;IACT;AACM,UAAA,SAAS,KAAK,MAAM;AACtB,QAAA,MAAM,QAAQ,KAAK,GAAG;AAClB,YAAA,QAAQ,CAAC,QAAQ;AACrB,eAAO,OAAO,GAAG;AAAA,MAAA,CAClB;AAAA,IAAA,OACI;AACE,aAAA,QAAQ,KAAgC,EAAE;AAAA,QAC/C,CAAC,CAAC,KAAK,KAAK,MAAM;AAChB,cAAIA,MAAU,UAAA,OAAO,GAAG,GAAG,KAAK,GAAG;AACjC,mBAAO,OAAO,GAAG;AAAA,UACnB;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ;AACO,WAAA;AAAA,EAAA;AAEX;;;"}
1
+ {"version":3,"file":"searchMiddleware.cjs","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\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 // add missing keys from search to result\n keys.forEach((key) => {\n if (!(key in result)) {\n result[key] = search[key]\n }\n })\n return result\n }\n}\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"],"names":["deepEqual"],"mappings":";;;AAKO,SAAS,mBACd,MACiC;AACjC,SAAO,CAAC,EAAE,QAAQ,WAAW;AACrB,UAAA,SAAS,KAAK,MAAM;AAC1B,QAAI,SAAS,MAAM;AACjB,aAAO,EAAE,GAAG,QAAQ,GAAG;IACzB;AAEK,SAAA,QAAQ,CAAC,QAAQ;AAChB,UAAA,EAAE,OAAO,SAAS;AACb,eAAA,GAAG,IAAI,OAAO,GAAG;AAAA,MAC1B;AAAA,IAAA,CACD;AACM,WAAA;AAAA,EAAA;AAEX;AAEO,SAAS,kBASd,OAAyD;AACzD,SAAO,CAAC,EAAE,QAAQ,WAAW;AAC3B,QAAI,UAAU,MAAM;AAClB,aAAO;IACT;AACM,UAAA,SAAS,KAAK,MAAM;AACtB,QAAA,MAAM,QAAQ,KAAK,GAAG;AAClB,YAAA,QAAQ,CAAC,QAAQ;AACrB,eAAO,OAAO,GAAG;AAAA,MAAA,CAClB;AAAA,IAAA,OACI;AACE,aAAA,QAAQ,KAAgC,EAAE;AAAA,QAC/C,CAAC,CAAC,KAAK,KAAK,MAAM;AAChB,cAAIA,MAAU,UAAA,OAAO,GAAG,GAAG,KAAK,GAAG;AACjC,mBAAO,OAAO,GAAG;AAAA,UACnB;AAAA,QACF;AAAA,MAAA;AAAA,IAEJ;AACO,WAAA;AAAA,EAAA;AAEX;;;"}
@@ -2,4 +2,4 @@ import { NoInfer, PickOptional } from './utils.cjs';
2
2
  import { SearchMiddleware } from './route.cjs';
3
3
  import { IsRequiredParams } from './link.cjs';
4
4
  export declare function retainSearchParams<TSearchSchema extends object>(keys: Array<keyof TSearchSchema> | true): SearchMiddleware<TSearchSchema>;
5
- export declare function stripSearchParams<TSearchSchema, const TValues = Partial<NoInfer<TSearchSchema>> | Array<keyof PickOptional<TSearchSchema>>, const TInput = IsRequiredParams<TSearchSchema> extends never ? TValues | true : TValues>(input: NoInfer<TInput>): SearchMiddleware<TSearchSchema>;
5
+ export declare function stripSearchParams<TSearchSchema, TOptionalProps = PickOptional<NoInfer<TSearchSchema>>, const TValues = Partial<NoInfer<TOptionalProps>> | Array<keyof TOptionalProps>, const TInput = IsRequiredParams<TSearchSchema> extends never ? TValues | true : TValues>(input: NoInfer<TInput>): SearchMiddleware<TSearchSchema>;
@@ -523,7 +523,10 @@ export declare class Router<in out TRouteTree extends AnyRoute, in out TTrailing
523
523
  filter?: (d: MakeRouteMatch<TRouteTree>) => boolean;
524
524
  }) => Promise<void>;
525
525
  resolveRedirect: (err: AnyRedirect) => ResolvedRedirect;
526
- cleanCache: () => void;
526
+ clearCache: (opts?: {
527
+ filter?: (d: MakeRouteMatch<TRouteTree>) => boolean;
528
+ }) => void;
529
+ clearExpiredCache: () => void;
527
530
  preloadRoute: <TFrom extends RoutePaths<TRouteTree> | string = string, TTo extends string | undefined = undefined, TMaskFrom extends RoutePaths<TRouteTree> | string = TFrom, TMaskTo extends string = "">(opts: NavigateOptions<Router<TRouteTree, TTrailingSlashOption, TDehydrated, TSerializedError>, TFrom, TTo, TMaskFrom, TMaskTo>) => Promise<Array<AnyRouteMatch> | undefined>;
528
531
  matchRoute: <TFrom extends RoutePaths<TRouteTree> = "/", TTo extends string | undefined = undefined, TResolved = ResolveRelativePath<TFrom, NoInfer<TTo>>>(location: ToOptions<Router<TRouteTree, TTrailingSlashOption, TDehydrated, TSerializedError>, TFrom, TTo>, opts?: MatchRouteOptions) => false | RouteById<TRouteTree, TResolved>["types"]["allParams"];
529
532
  dehydrate: () => DehydratedRouter;
@@ -633,7 +633,7 @@ class Router {
633
633
  ]
634
634
  };
635
635
  });
636
- this.cleanCache();
636
+ this.clearExpiredCache();
637
637
  });
638
638
  [
639
639
  [exitingMatches, "onLeave"],
@@ -1125,20 +1125,34 @@ class Router {
1125
1125
  }
1126
1126
  return redirect;
1127
1127
  };
1128
- this.cleanCache = () => {
1129
- this.__store.setState((s) => {
1130
- return {
1131
- ...s,
1132
- cachedMatches: s.cachedMatches.filter((d) => {
1133
- const route = this.looseRoutesById[d.routeId];
1134
- if (!route.options.loader) {
1135
- return false;
1136
- }
1137
- const gcTime = (d.preload ? route.options.preloadGcTime ?? this.options.defaultPreloadGcTime : route.options.gcTime ?? this.options.defaultGcTime) ?? 5 * 60 * 1e3;
1138
- return d.status !== "error" && Date.now() - d.updatedAt < gcTime;
1139
- })
1140
- };
1141
- });
1128
+ this.clearCache = (opts) => {
1129
+ const filter = opts == null ? void 0 : opts.filter;
1130
+ if (filter !== void 0) {
1131
+ this.__store.setState((s) => {
1132
+ return {
1133
+ ...s,
1134
+ cachedMatches: s.cachedMatches.filter((m) => !filter(m))
1135
+ };
1136
+ });
1137
+ } else {
1138
+ this.__store.setState((s) => {
1139
+ return {
1140
+ ...s,
1141
+ cachedMatches: []
1142
+ };
1143
+ });
1144
+ }
1145
+ };
1146
+ this.clearExpiredCache = () => {
1147
+ const filter = (d) => {
1148
+ const route = this.looseRoutesById[d.routeId];
1149
+ if (!route.options.loader) {
1150
+ return true;
1151
+ }
1152
+ const gcTime = (d.preload ? route.options.preloadGcTime ?? this.options.defaultPreloadGcTime : route.options.gcTime ?? this.options.defaultGcTime) ?? 5 * 60 * 1e3;
1153
+ return !(d.status !== "error" && Date.now() - d.updatedAt < gcTime);
1154
+ };
1155
+ this.clearCache({ filter });
1142
1156
  };
1143
1157
  this.preloadRoute = async (opts) => {
1144
1158
  const next = this.buildLocation(opts);