clear-react-router 2.0.6 → 2.0.7

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.
@@ -1,2 +1 @@
1
- import { LoaderState } from '../types';
2
- export declare const useLoaderState: <T>() => LoaderState<T>;
1
+ export declare const useLoaderState: <T>() => import("../types").LoaderState<T>;
package/dist/index.js CHANGED
@@ -226,7 +226,7 @@ var createNavigate = (routerState, revalidateCache) => {
226
226
  let navigationSeq = 0;
227
227
  let interval = 0;
228
228
  let abortController = null;
229
- const { loaderStateRef, scrollMapState, pendingState, contextState, loaderMap, routeItemDataState, isOptimisticLoading } = routerState;
229
+ const { loaderState, scrollMapState, pendingState, contextState, loaderMap, routeItemDataState, isOptimisticLoading } = routerState;
230
230
  const navigationExecutor = createCommitState(routerState);
231
231
  const isCacheItemFresh = createIsCacheItemFresh(loaderMap);
232
232
  const createSignal = () => {
@@ -240,7 +240,7 @@ var createNavigate = (routerState, revalidateCache) => {
240
240
  setContext: contextState.setState
241
241
  });
242
242
  const routeResolve = (location) => {
243
- loaderStateRef.set(emptyLoaderState);
243
+ loaderState.setState(emptyLoaderState);
244
244
  const nextItem = findRoute(location.pathname, true);
245
245
  return {
246
246
  nextItem,
@@ -257,12 +257,12 @@ var createNavigate = (routerState, revalidateCache) => {
257
257
  redirect,
258
258
  params
259
259
  });
260
- loaderStateRef.set((prev) => ({
260
+ loaderState.setState((prev) => ({
261
261
  ...prev,
262
262
  beforeLoadError: null
263
263
  }));
264
264
  } catch (error) {
265
- loaderStateRef.set((prev) => ({
265
+ loaderState.setState((prev) => ({
266
266
  ...prev,
267
267
  beforeLoadError: error
268
268
  }));
@@ -289,7 +289,7 @@ var createNavigate = (routerState, revalidateCache) => {
289
289
  });
290
290
  isOptimisticLoading.setState(true);
291
291
  const currentLoaderState = loaderMap.get(path)?.state;
292
- if (currentLoaderState) loaderStateRef.set(currentLoaderState);
292
+ if (currentLoaderState) loaderState.setState(currentLoaderState);
293
293
  } else if (routeItem?.loader && !isCacheItemFresh(path)) commitNavigation(() => pendingState.setState({
294
294
  routeItem,
295
295
  location
@@ -314,12 +314,16 @@ var createNavigate = (routerState, revalidateCache) => {
314
314
  if (!routeItem?.loader) return;
315
315
  window.clearInterval(interval);
316
316
  const signal = createSignal();
317
- await Promise.all([revalidateCache({
317
+ const [result] = await Promise.all([revalidateCache({
318
318
  routeItem,
319
319
  pathname: nextLocation.pathname,
320
320
  search: nextLocation.search,
321
321
  signal
322
322
  }), getLoaderDurationPromise(routeItem, nextLocation)]);
323
+ if (result) loaderState.setState((prev) => ({
324
+ ...prev,
325
+ ...result
326
+ }));
323
327
  if (seq !== navigationSeq) return;
324
328
  polling(routeItem, nextLocation);
325
329
  };
@@ -351,7 +355,7 @@ var createNavigate = (routerState, revalidateCache) => {
351
355
  //#endregion
352
356
  //#region runtime/invalidate.ts
353
357
  var redirect = Promise.resolve;
354
- var createInvalidate = ({ routeItemDataState, loaderStateRef, loaderMap, currentLoaderState, contextState }, revalidateCache) => {
358
+ var createInvalidate = ({ routeItemDataState, loaderState, loaderMap, contextState }, revalidateCache) => {
355
359
  const invalidatePath = async (routeItem, pathname, options) => {
356
360
  const routePathname = routeItemDataState.getState().location.pathname;
357
361
  loaderMap.delete(pathname);
@@ -367,12 +371,12 @@ var createInvalidate = ({ routeItemDataState, loaderStateRef, loaderMap, current
367
371
  setContext
368
372
  });
369
373
  }
370
- loaderStateRef.set((prev) => ({
374
+ loaderState.setState((prev) => ({
371
375
  ...prev,
372
376
  beforeLoadError: null
373
377
  }));
374
378
  } catch (error) {
375
- loaderStateRef.set((prev) => ({
379
+ loaderState.setState((prev) => ({
376
380
  ...prev,
377
381
  beforeLoadError: error
378
382
  }));
@@ -381,7 +385,11 @@ var createInvalidate = ({ routeItemDataState, loaderStateRef, loaderMap, current
381
385
  routeItem,
382
386
  pathname
383
387
  });
384
- if (pathname === routePathname) currentLoaderState.setState(loaderStateRef.value);
388
+ if (result && pathname === routePathname) loaderState.setState({
389
+ data: result.data,
390
+ loaderError: result.error,
391
+ beforeLoadError: null
392
+ });
385
393
  return {
386
394
  path: pathname,
387
395
  ...result
@@ -436,7 +444,7 @@ var getRetry = (routeItem) => {
436
444
  };
437
445
  };
438
446
  var createRevalidateCache = (routerState) => {
439
- const { loaderStateRef, contextState, loaderMap, loadingPromises } = routerState;
447
+ const { contextState, loaderMap, loadingPromises } = routerState;
440
448
  const evict = () => {
441
449
  if (loaderMap.size <= routerConfig.maxCacheSize) return;
442
450
  const oldestKey = loaderMap.keys().next().value;
@@ -460,8 +468,14 @@ var createRevalidateCache = (routerState) => {
460
468
  }
461
469
  if (isCacheItemFresh(path)) {
462
470
  const item = moveItemToLastPosition(path);
463
- if (item?.state) loaderStateRef.set(item.state);
464
- return;
471
+ if (!item?.state) return void 0;
472
+ return item.state.loaderError ? {
473
+ data: null,
474
+ error: item.state.loaderError
475
+ } : {
476
+ data: item.state.data,
477
+ error: null
478
+ };
465
479
  }
466
480
  const promise = (async () => {
467
481
  if (!routeItem?.loader) return;
@@ -478,13 +492,12 @@ var createRevalidateCache = (routerState) => {
478
492
  searchParams,
479
493
  signal: effectiveSignal
480
494
  });
481
- loaderStateRef.set((prev) => ({
482
- ...prev,
483
- data: result,
484
- loaderError: null
485
- }));
486
495
  loaderMap.set(path, {
487
- state: loaderStateRef.value,
496
+ state: {
497
+ data: result,
498
+ beforeLoadError: null,
499
+ loaderError: null
500
+ },
488
501
  timestamp: Date.now(),
489
502
  staleTime: routeItem.staleTime
490
503
  });
@@ -502,27 +515,16 @@ var createRevalidateCache = (routerState) => {
502
515
  if (retry && retry.count > retried) {
503
516
  loadingPromises.delete(path);
504
517
  if (retry.delay) await sleep(retry.delay);
505
- await revalidateCache({
518
+ return revalidateCache({
506
519
  routeItem,
507
520
  pathname,
508
521
  search,
509
522
  signal
510
523
  }, retried + 1);
511
- return {
512
- data: null,
513
- error
514
- };
515
- } else {
516
- loaderStateRef.set((prev) => ({
517
- ...prev,
518
- data: null,
519
- loaderError: error
520
- }));
521
- return {
522
- data: null,
523
- error
524
- };
525
- }
524
+ } else return {
525
+ data: null,
526
+ error
527
+ };
526
528
  } finally {
527
529
  loadingPromises.delete(path);
528
530
  }
@@ -533,20 +535,6 @@ var createRevalidateCache = (routerState) => {
533
535
  return revalidateCache;
534
536
  };
535
537
  //#endregion
536
- //#region cell.ts
537
- var Cell = class {
538
- constructor(_value) {
539
- _defineProperty(this, "_value", void 0);
540
- this._value = _value;
541
- }
542
- get value() {
543
- return this._value;
544
- }
545
- set(action) {
546
- this._value = typeof action === "function" ? action(this._value) : action;
547
- }
548
- };
549
- //#endregion
550
538
  //#region utils/createRouterInstance.ts
551
539
  var createRouterInstance = () => {
552
540
  const routerState = {
@@ -555,7 +543,6 @@ var createRouterInstance = () => {
555
543
  location: {}
556
544
  }),
557
545
  pendingState: create(void 0),
558
- currentLoaderState: create(emptyLoaderState),
559
546
  scrollMapState: create({}),
560
547
  contextState: create({}),
561
548
  blockedRouteState: create({
@@ -563,7 +550,7 @@ var createRouterInstance = () => {
563
550
  to: ""
564
551
  }),
565
552
  isOptimisticLoading: create(false),
566
- loaderStateRef: new Cell(emptyLoaderState),
553
+ loaderState: create(emptyLoaderState),
567
554
  loaderMap: /* @__PURE__ */ new Map(),
568
555
  loadingPromises: /* @__PURE__ */ new Map()
569
556
  };
@@ -604,6 +591,7 @@ var createRouterInstance = () => {
604
591
  usePendingState: () => useGlobalState(routerState.pendingState),
605
592
  useContextState: () => useGlobalState(routerState.contextState),
606
593
  useOptimisticLoading: () => useGlobalState(routerState.isOptimisticLoading),
594
+ useLoaderState: () => useGlobalState(routerState.loaderState)[0],
607
595
  useParams: () => getParamsObject(),
608
596
  useNavigate: () => {
609
597
  const { blockedRouteState } = routerState;
@@ -679,6 +667,9 @@ var useNavigation = () => {
679
667
  }, [navigate]);
680
668
  };
681
669
  //#endregion
670
+ //#region hooks/useLoaderState.ts
671
+ var useLoaderState = router.hooks.useLoaderState;
672
+ //#endregion
682
673
  //#region hooks/useApplyCustomAnimation.ts
683
674
  var useApplyCustomAnimation = (animationDuration) => {
684
675
  useEffect(() => {
@@ -761,7 +752,7 @@ var Router = ({ routes, defaultBeforeLoad, defaultAfterLoad, animationDuration,
761
752
  const [routeItemData] = useRouteItemData();
762
753
  const [pendingRouteData] = usePendingState();
763
754
  const [isOptimisticLoading] = useOptimisticLoading();
764
- const loaderState = router.state.loaderStateRef.value;
755
+ const loaderState = useLoaderState();
765
756
  const isLoading = Boolean(pendingRouteData);
766
757
  useNavigation();
767
758
  useSetRouterConfig({
@@ -929,9 +920,6 @@ var Form = ({ children, action, onSuccess, onError, autoReset = true }) => {
929
920
  //#region hooks/useParams.ts
930
921
  var useParams = router.hooks.useParams;
931
922
  //#endregion
932
- //#region hooks/useLoaderState.ts
933
- var useLoaderState = () => router.state.loaderStateRef.value;
934
- //#endregion
935
923
  //#region hooks/useInvalidate.ts
936
924
  var useInvalidate = () => router.runtime.invalidate;
937
925
  //#endregion
@@ -1,2 +1,2 @@
1
1
  import { type InvalidateOptions, InvalidateResult, RevalidateCache, RouterState } from '../types';
2
- export declare const createInvalidate: ({ routeItemDataState, loaderStateRef, loaderMap, currentLoaderState, contextState }: RouterState, revalidateCache: RevalidateCache) => (pathList?: string | string[], options?: InvalidateOptions) => Promise<InvalidateResult[]>;
2
+ export declare const createInvalidate: ({ routeItemDataState, loaderState, loaderMap, contextState }: RouterState, revalidateCache: RevalidateCache) => (pathList?: string | string[], options?: InvalidateOptions) => Promise<InvalidateResult[]>;
package/dist/types.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { ComponentType, type CSSProperties, Dispatch, MouseEvent, ReactElement, ReactNode, Ref, SetStateAction } from 'react';
2
2
  import { Store, useGlobalState } from './create';
3
- import { Cell } from './cell';
4
3
  export declare const LAZY_MARKER: unique symbol;
5
4
  export type LazyComponent = {
6
5
  readonly [LAZY_MARKER]: true;
@@ -118,7 +117,6 @@ export type LoadingPromise = Promise<{
118
117
  export type RouterState = {
119
118
  routeItemDataState: Store<RouteItemData>;
120
119
  pendingState: Store<RouteItemData | undefined>;
121
- currentLoaderState: Store<LoaderState>;
122
120
  scrollMapState: Store<Record<string, number>>;
123
121
  contextState: Store<Record<string, unknown>>;
124
122
  blockedRouteState: Store<{
@@ -126,7 +124,7 @@ export type RouterState = {
126
124
  to: string;
127
125
  }>;
128
126
  isOptimisticLoading: Store<boolean>;
129
- loaderStateRef: Cell<LoaderState>;
127
+ loaderState: Store<LoaderState>;
130
128
  loaderMap: Map<string, LoaderStateItem>;
131
129
  loadingPromises: Map<string, LoadingPromise>;
132
130
  };
@@ -147,6 +145,7 @@ export type RouterType = {
147
145
  usePendingState: () => ReturnType<typeof useGlobalState<RouteItemData | undefined>>;
148
146
  useContextState: () => ReturnType<typeof useGlobalState<Record<string, unknown>>>;
149
147
  useOptimisticLoading: () => ReturnType<typeof useGlobalState<boolean>>;
148
+ useLoaderState: <T>() => LoaderState<T>;
150
149
  useParams: <T>() => T;
151
150
  useNavigate: () => (arg: Location | string | -1) => Promise<void>;
152
151
  useGetAction: (actionKey: string) => {
@@ -1,8 +1,2 @@
1
- import { RevalidateCacheArgs, RouterState } from '../types';
2
- export declare const createRevalidateCache: (routerState: RouterState) => ({ routeItem, pathname, search, signal }: RevalidateCacheArgs, retried?: number) => Promise<{
3
- data: unknown;
4
- error: null;
5
- } | {
6
- data: null;
7
- error: unknown;
8
- } | undefined>;
1
+ import { LoadingPromise, RevalidateCacheArgs, RouterState } from '../types';
2
+ export declare const createRevalidateCache: (routerState: RouterState) => ({ routeItem, pathname, search, signal }: RevalidateCacheArgs, retried?: number) => LoadingPromise;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clear-react-router",
3
- "version": "2.0.6",
3
+ "version": "2.0.7",
4
4
  "description": "A lightweight, type-safe routing library for React applications",
5
5
  "author": "Andrew Bubnov",
6
6
  "scripts": {
package/dist/cell.d.ts DELETED
@@ -1,6 +0,0 @@
1
- export declare class Cell<T> {
2
- private _value;
3
- constructor(_value: T);
4
- get value(): T;
5
- set(action: T | ((prev: T) => T)): void;
6
- }