clear-react-router 1.9.8 → 2.0.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.
package/README.md CHANGED
@@ -572,6 +572,8 @@ const UserProfile = () => {
572
572
  staleTime: 60000, // 1 minute — cache is fresh for 60 seconds
573
573
  }
574
574
  ```
575
+ - Stale cache entries are cleaned up incrementally on every navigation, keeping the loader cache from growing unbounded over long sessions.
576
+
575
577
 
576
578
  ### `useInvalidate()`
577
579
 
package/dist/index.js CHANGED
@@ -113,13 +113,12 @@ var createCommitNavigation = (navigationExecutor, routeItemDataState) => (nextLo
113
113
  };
114
114
  //#endregion
115
115
  //#region utils/isCacheItemFresh.ts
116
- var createIsCacheItemFresh = (loaderMap) => ({ routeItem, pathname }) => {
117
- if (!routeItem) return true;
118
- const item = loaderMap.get(pathname);
116
+ var createIsCacheItemFresh = (loaderMap) => (pathname, search) => {
117
+ const item = loaderMap.get(`${pathname}${search}`);
119
118
  if (item === void 0) return false;
120
- const staleTime = routeItem.staleTime ?? routerConfig.defaultStaleTime;
121
- if (staleTime === void 0) return true;
122
- return Date.now() - item.timestamp <= staleTime;
119
+ const resolvedStaleTime = item.staleTime ?? routerConfig.defaultStaleTime;
120
+ if (resolvedStaleTime === void 0) return true;
121
+ return Date.now() - item.timestamp <= resolvedStaleTime;
123
122
  };
124
123
  //#endregion
125
124
  //#region ../../node_modules/react/cjs/react-jsx-runtime.production.js
@@ -281,10 +280,7 @@ var createNavigate = (routerState, revalidateCache) => {
281
280
  const currentLoaderState = loaderMap.get(location.pathname)?.state;
282
281
  if (currentLoaderState) loaderStateRef.set(currentLoaderState);
283
282
  } else {
284
- const pendingShouldExist = routeItem?.loader && !isCacheItemFresh({
285
- routeItem,
286
- pathname: location.pathname
287
- });
283
+ const pendingShouldExist = routeItem?.loader && !isCacheItemFresh(location.pathname, location.search);
288
284
  pendingState.setState(pendingShouldExist ? {
289
285
  routeItem,
290
286
  location
@@ -423,15 +419,20 @@ var getRetry = (routeItem) => {
423
419
  var sleep = async (ms) => new Promise((resolve) => setTimeout(resolve, ms));
424
420
  var createRevalidateCache = (routerState) => {
425
421
  const { loaderStateRef, contextState, loaderMap } = routerState;
422
+ const removeFirstStaleItem = () => {
423
+ const deletedItem = [...loaderMap.entries()].find(([, item]) => {
424
+ const staleTime = item.staleTime ?? routerConfig.defaultStaleTime;
425
+ return staleTime && staleTime + item.timestamp < Date.now();
426
+ });
427
+ if (deletedItem) loaderMap.delete(deletedItem[0]);
428
+ };
426
429
  const revalidateCache = async ({ routeItem, pathname, search = "" }, retried = 0) => {
427
430
  if (!routeItem?.loader) return;
428
431
  const isCacheItemFresh = createIsCacheItemFresh(loaderMap);
429
- if (loadingPromises.has(pathname)) return loadingPromises.get(pathname);
430
- if (isCacheItemFresh({
431
- routeItem,
432
- pathname
433
- })) {
434
- const item = loaderMap.get(pathname);
432
+ removeFirstStaleItem();
433
+ if (loadingPromises.has(pathname)) return loadingPromises.get(`${pathname}${search}`);
434
+ if (isCacheItemFresh(pathname, search)) {
435
+ const item = loaderMap.get(`${pathname}${search}`);
435
436
  if (item?.state) loaderStateRef.set(item.state);
436
437
  return;
437
438
  }
@@ -455,7 +456,8 @@ var createRevalidateCache = (routerState) => {
455
456
  }));
456
457
  loaderMap.set(`${pathname}${search}`, {
457
458
  state: loaderStateRef.value,
458
- timestamp: Date.now()
459
+ timestamp: Date.now(),
460
+ staleTime: routeItem.staleTime
459
461
  });
460
462
  return {
461
463
  data: result,
package/dist/types.d.ts CHANGED
@@ -102,6 +102,7 @@ export type RouterProps = {
102
102
  export type LoaderStateItem = {
103
103
  state: LoaderState;
104
104
  timestamp: number;
105
+ staleTime: number | undefined;
105
106
  };
106
107
  export type RouterState = {
107
108
  routeItemDataState: Store<RouteItemData>;
@@ -1,5 +1,2 @@
1
- import { LoaderStateItem, RouteItem } from '../types';
2
- export declare const createIsCacheItemFresh: (loaderMap: Map<string, LoaderStateItem>) => ({ routeItem, pathname }: {
3
- routeItem?: RouteItem;
4
- pathname: string;
5
- }) => boolean;
1
+ import { LoaderStateItem } from '../types';
2
+ export declare const createIsCacheItemFresh: (loaderMap: Map<string, LoaderStateItem>) => (pathname: string, search?: string) => boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clear-react-router",
3
- "version": "1.9.8",
3
+ "version": "2.0.0",
4
4
  "description": "A lightweight, type-safe routing library for React applications",
5
5
  "author": "Andrew Bubnov",
6
6
  "scripts": {