@rpcbase/router 0.166.0 → 0.168.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
@@ -62,6 +62,7 @@ Why:
62
62
 
63
63
  - `() => import(...)` delays loading until route lazy resolution/prefetch.
64
64
  - The importer is memoized, so concurrent lazy/load/prefetch calls share the same promise.
65
+ - Browser network failures are retried once by the rpcbase service worker. A failed route import reloads the page once to pick up the current deployment.
65
66
 
66
67
  ## Optional prefetch data flag
67
68
 
package/dist/index.js CHANGED
@@ -59,178 +59,109 @@ var resolveDataPrefetchFlag = (route, explicitPrefetchData, dataPrefetchHandleKe
59
59
  if (typeof routeHandlePrefetchData === "boolean") return routeHandlePrefetchData;
60
60
  return false;
61
61
  };
62
- var RoutePrefetchProvider = (t0) => {
63
- const $ = c(20);
64
- const { children, defaultPrefetch: t1, dataPrefetchTtlMs: t2, dataPrefetchHandleKey: t3 } = t0;
65
- const defaultPrefetch = t1 === void 0 ? "intent" : t1;
66
- const dataPrefetchTtlMs = t2 === void 0 ? 3e4 : t2;
67
- const dataPrefetchHandleKey = t3 === void 0 ? ROUTE_PREFETCH_DATA_HANDLE : t3;
62
+ var RoutePrefetchProvider = ({ children, defaultPrefetch = "intent", dataPrefetchTtlMs = 3e4, dataPrefetchHandleKey = ROUTE_PREFETCH_DATA_HANDLE }) => {
68
63
  const dataRouterContext = useContext(UNSAFE_DataRouterContext);
69
- let t4;
70
- if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
71
- t4 = /* @__PURE__ */ new Map();
72
- $[0] = t4;
73
- } else t4 = $[0];
74
- const routeModuleCacheRef = useRef(t4);
75
- let t5;
76
- if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
77
- t5 = /* @__PURE__ */ new Map();
78
- $[1] = t5;
79
- } else t5 = $[1];
80
- const routeDataCacheRef = useRef(t5);
81
- let t6;
82
- if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
83
- t6 = async (route) => {
84
- const routeId = route.id;
85
- if (!routeId) return null;
86
- const cached = routeModuleCacheRef.current.get(routeId);
87
- if (cached) return cached;
88
- const lazyRouteLoader = typeof route.lazy === "function" ? route.lazy : null;
89
- const routeModuleImporter = getRouteModuleImporterFromHandle(route.handle);
90
- if (!lazyRouteLoader && !routeModuleImporter) return null;
91
- const prefetchPromise = Promise.resolve(lazyRouteLoader ? lazyRouteLoader() : routeModuleImporter()).then(_temp$2).catch((error) => {
92
- routeModuleCacheRef.current.delete(routeId);
93
- throw error;
94
- });
95
- routeModuleCacheRef.current.set(routeId, prefetchPromise);
96
- return prefetchPromise;
97
- };
98
- $[2] = t6;
99
- } else t6 = $[2];
100
- const prefetchRouteModule = t6;
101
- let t7;
102
- if ($[3] !== dataPrefetchTtlMs) {
103
- t7 = async (router, route_0, href) => {
104
- const routeId_0 = route_0.id;
105
- if (!routeId_0) return;
106
- const now = Date.now();
107
- pruneDataCache(routeDataCacheRef.current, now);
108
- const cacheKey = `${routeId_0}|${href}`;
109
- const cached_0 = routeDataCacheRef.current.get(cacheKey);
110
- if (cached_0 && cached_0.expiresAt > now) {
111
- await cached_0.promise;
64
+ const routeModuleCacheRef = useRef(/* @__PURE__ */ new Map());
65
+ const routeDataCacheRef = useRef(/* @__PURE__ */ new Map());
66
+ const prefetchRouteModule = async (route) => {
67
+ const routeId = route.id;
68
+ if (!routeId) return null;
69
+ const cached = routeModuleCacheRef.current.get(routeId);
70
+ if (cached) return cached;
71
+ const lazyRouteLoader = typeof route.lazy === "function" ? route.lazy : null;
72
+ const routeModuleImporter = getRouteModuleImporterFromHandle(route.handle);
73
+ if (!lazyRouteLoader && !routeModuleImporter) return null;
74
+ const prefetchPromise = Promise.resolve(lazyRouteLoader ? lazyRouteLoader() : routeModuleImporter()).then((module) => {
75
+ if (!module || typeof module !== "object") return null;
76
+ return module;
77
+ }).catch((error) => {
78
+ routeModuleCacheRef.current.delete(routeId);
79
+ throw error;
80
+ });
81
+ routeModuleCacheRef.current.set(routeId, prefetchPromise);
82
+ return prefetchPromise;
83
+ };
84
+ const prefetchRouteData = async (router, route_0, href) => {
85
+ const routeId_0 = route_0.id;
86
+ if (!routeId_0) return;
87
+ const now = Date.now();
88
+ pruneDataCache(routeDataCacheRef.current, now);
89
+ const cacheKey = `${routeId_0}|${href}`;
90
+ const cached_0 = routeDataCacheRef.current.get(cacheKey);
91
+ if (cached_0 && cached_0.expiresAt > now) {
92
+ await cached_0.promise;
93
+ return;
94
+ }
95
+ let hasLoader = typeof route_0.loader === "function";
96
+ if (!hasLoader) hasLoader = typeof (await prefetchRouteModule(route_0).catch(() => null))?.loader === "function";
97
+ if (!hasLoader) return;
98
+ const fetcherKey = `rb:prefetch:${routeId_0}:${href}`;
99
+ const prefetchPromise_0 = Promise.resolve(router.fetch(fetcherKey, routeId_0, href)).catch((error_0) => {
100
+ routeDataCacheRef.current.delete(cacheKey);
101
+ throw error_0;
102
+ }).finally(() => {
103
+ try {
104
+ router.deleteFetcher(fetcherKey);
105
+ } catch {
112
106
  return;
113
107
  }
114
- let hasLoader = typeof route_0.loader === "function";
115
- if (!hasLoader) hasLoader = typeof (await prefetchRouteModule(route_0).catch(_temp2$1))?.loader === "function";
116
- if (!hasLoader) return;
117
- const fetcherKey = `rb:prefetch:${routeId_0}:${href}`;
118
- const prefetchPromise_0 = Promise.resolve(router.fetch(fetcherKey, routeId_0, href)).catch((error_0) => {
119
- routeDataCacheRef.current.delete(cacheKey);
120
- throw error_0;
121
- }).finally(() => {
122
- try {
123
- router.deleteFetcher(fetcherKey);
124
- } catch {
125
- return;
126
- }
127
- });
128
- const ttl = Math.max(1, dataPrefetchTtlMs);
129
- routeDataCacheRef.current.set(cacheKey, {
130
- expiresAt: now + ttl,
131
- promise: prefetchPromise_0
132
- });
133
- await prefetchPromise_0;
134
- };
135
- $[3] = dataPrefetchTtlMs;
136
- $[4] = t7;
137
- } else t7 = $[4];
138
- const prefetchRouteData = t7;
139
- let t8;
140
- if ($[5] !== dataPrefetchHandleKey || $[6] !== dataRouterContext?.router || $[7] !== prefetchRouteData) {
141
- t8 = async (href_0, opts) => {
142
- const normalized = normalizeHref(href_0);
143
- if (!normalized) return;
144
- const currentPathWithSearch = typeof window === "undefined" ? "" : `${window.location.pathname}${window.location.search}`;
145
- if (normalized.pathWithSearch === currentPathWithSearch) return;
146
- const router_0 = dataRouterContext?.router;
147
- if (!router_0) return;
148
- const matches = matchRoutes(router_0.routes, {
149
- pathname: normalized.pathname,
150
- search: normalized.search,
151
- hash: normalized.hash
152
- }, router_0.basename);
153
- if (!matches || matches.length === 0) return;
154
- const matchedRoutes = matches.map(_temp3);
155
- if (opts?.prefetchCode !== false) await Promise.all(matchedRoutes.map(async (route_1) => {
156
- try {
157
- await prefetchRouteModule(route_1);
158
- } catch {
159
- return;
160
- }
161
- }));
162
- await Promise.all(matchedRoutes.map(async (route_2) => {
163
- if (!resolveDataPrefetchFlag(route_2, opts?.prefetchData, dataPrefetchHandleKey)) return;
164
- try {
165
- await prefetchRouteData(router_0, route_2, normalized.pathWithSearch);
166
- } catch {
167
- return;
168
- }
169
- }));
170
- };
171
- $[5] = dataPrefetchHandleKey;
172
- $[6] = dataRouterContext?.router;
173
- $[7] = prefetchRouteData;
174
- $[8] = t8;
175
- } else t8 = $[8];
176
- const prefetch = t8;
177
- let t10;
178
- let t9;
179
- if ($[9] !== prefetch) {
180
- t9 = async (href_1) => prefetch(href_1, {
181
- prefetchCode: true,
182
- prefetchData: false
183
108
  });
184
- t10 = async (href_2) => prefetch(href_2, {
185
- prefetchCode: false,
186
- prefetchData: true
109
+ const ttl = Math.max(1, dataPrefetchTtlMs);
110
+ routeDataCacheRef.current.set(cacheKey, {
111
+ expiresAt: now + ttl,
112
+ promise: prefetchPromise_0
187
113
  });
188
- $[9] = prefetch;
189
- $[10] = t10;
190
- $[11] = t9;
191
- } else {
192
- t10 = $[10];
193
- t9 = $[11];
194
- }
195
- let t11;
196
- if ($[12] !== defaultPrefetch || $[13] !== prefetch || $[14] !== t10 || $[15] !== t9) {
197
- t11 = {
114
+ await prefetchPromise_0;
115
+ };
116
+ const prefetch = async (href_0, opts) => {
117
+ const normalized = normalizeHref(href_0);
118
+ if (!normalized) return;
119
+ const currentPathWithSearch = typeof window === "undefined" ? "" : `${window.location.pathname}${window.location.search}`;
120
+ if (normalized.pathWithSearch === currentPathWithSearch) return;
121
+ const router_0 = dataRouterContext?.router;
122
+ if (!router_0) return;
123
+ const matches = matchRoutes(router_0.routes, {
124
+ pathname: normalized.pathname,
125
+ search: normalized.search,
126
+ hash: normalized.hash
127
+ }, router_0.basename);
128
+ if (!matches || matches.length === 0) return;
129
+ const matchedRoutes = matches.map((match) => match.route);
130
+ if (opts?.prefetchCode !== false) await Promise.all(matchedRoutes.map(async (route_1) => {
131
+ try {
132
+ await prefetchRouteModule(route_1);
133
+ } catch {
134
+ return;
135
+ }
136
+ }));
137
+ await Promise.all(matchedRoutes.map(async (route_2) => {
138
+ if (!resolveDataPrefetchFlag(route_2, opts?.prefetchData, dataPrefetchHandleKey)) return;
139
+ try {
140
+ await prefetchRouteData(router_0, route_2, normalized.pathWithSearch);
141
+ } catch {
142
+ return;
143
+ }
144
+ }));
145
+ };
146
+ return /* @__PURE__ */ jsx(RoutePrefetchContext.Provider, {
147
+ value: {
198
148
  defaultPrefetch,
199
149
  prefetch,
200
- prefetchCode: t9,
201
- prefetchData: t10
202
- };
203
- $[12] = defaultPrefetch;
204
- $[13] = prefetch;
205
- $[14] = t10;
206
- $[15] = t9;
207
- $[16] = t11;
208
- } else t11 = $[16];
209
- let t12;
210
- if ($[17] !== children || $[18] !== t11) {
211
- t12 = /* @__PURE__ */ jsx(RoutePrefetchContext.Provider, {
212
- value: t11,
213
- children
214
- });
215
- $[17] = children;
216
- $[18] = t11;
217
- $[19] = t12;
218
- } else t12 = $[19];
219
- return t12;
150
+ prefetchCode: async (href_1) => prefetch(href_1, {
151
+ prefetchCode: true,
152
+ prefetchData: false
153
+ }),
154
+ prefetchData: async (href_2) => prefetch(href_2, {
155
+ prefetchCode: false,
156
+ prefetchData: true
157
+ })
158
+ },
159
+ children
160
+ });
220
161
  };
221
162
  var useRoutePrefetch = () => {
222
163
  return useContext(RoutePrefetchContext);
223
164
  };
224
- function _temp$2(module) {
225
- if (!module || typeof module !== "object") return null;
226
- return module;
227
- }
228
- function _temp2$1() {
229
- return null;
230
- }
231
- function _temp3(match) {
232
- return match.route;
233
- }
234
165
  //#endregion
235
166
  //#region src/Link.tsx
236
167
  var ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
@@ -386,7 +317,7 @@ var Link = forwardRef((t0, forwardedRef) => {
386
317
  const element = getAnchorElement();
387
318
  if (!element || typeof IntersectionObserver === "undefined") return;
388
319
  const observer = new IntersectionObserver((entries) => {
389
- if (!entries.some(_temp$1) || viewportPrefetchedRef.current) return;
320
+ if (!entries.some(_temp) || viewportPrefetchedRef.current) return;
390
321
  viewportPrefetchedRef.current = true;
391
322
  prefetchHref();
392
323
  }, { threshold: .5 });
@@ -481,11 +412,68 @@ var Link = forwardRef((t0, forwardedRef) => {
481
412
  return t13;
482
413
  });
483
414
  Link.displayName = "Link";
484
- function _temp$1(entry) {
415
+ function _temp(entry) {
485
416
  return entry.isIntersecting;
486
417
  }
487
418
  //#endregion
488
419
  //#region src/lazyRoute.tsx
420
+ var DYNAMIC_IMPORT_RELOAD_GUARD_MS = 6e4;
421
+ var DYNAMIC_IMPORT_RELOAD_TIMEOUT_MS = 5e3;
422
+ var DYNAMIC_IMPORT_RELOAD_STORAGE_KEY = "rpcbase:dynamic-import-reload-at";
423
+ var DYNAMIC_IMPORT_ERROR_PATTERNS = [
424
+ /failed to fetch dynamically imported module/i,
425
+ /importing a module script failed/i,
426
+ /error loading dynamically imported module/i,
427
+ /networkerror when attempting to fetch resource/i,
428
+ /unable to preload css/i,
429
+ /loading (?:css )?chunk .+ failed/i
430
+ ];
431
+ var isDynamicImportError = (error) => {
432
+ const message = error instanceof Error ? error.message : typeof error === "string" ? error : "";
433
+ return DYNAMIC_IMPORT_ERROR_PATTERNS.some((pattern) => pattern.test(message));
434
+ };
435
+ var markPageReloadRequested = () => {
436
+ if (typeof window === "undefined") return false;
437
+ if (typeof navigator !== "undefined" && navigator.onLine === false) return false;
438
+ const now = Date.now();
439
+ try {
440
+ const previousReloadAt = Number(window.sessionStorage.getItem(DYNAMIC_IMPORT_RELOAD_STORAGE_KEY));
441
+ if (Number.isFinite(previousReloadAt) && now - previousReloadAt < DYNAMIC_IMPORT_RELOAD_GUARD_MS) return false;
442
+ window.sessionStorage.setItem(DYNAMIC_IMPORT_RELOAD_STORAGE_KEY, String(now));
443
+ } catch {
444
+ return false;
445
+ }
446
+ return true;
447
+ };
448
+ var clearPageReloadGuard = () => {
449
+ try {
450
+ window.sessionStorage.removeItem(DYNAMIC_IMPORT_RELOAD_STORAGE_KEY);
451
+ } catch {
452
+ return;
453
+ }
454
+ };
455
+ var reloadPage = (error) => new Promise((_, reject) => {
456
+ let pending = true;
457
+ const rejectIfPageRemains = () => {
458
+ if (!pending) return;
459
+ pending = false;
460
+ window.removeEventListener("pagehide", handlePageHide);
461
+ clearPageReloadGuard();
462
+ reject(error);
463
+ };
464
+ const timeout = window.setTimeout(rejectIfPageRemains, DYNAMIC_IMPORT_RELOAD_TIMEOUT_MS);
465
+ const handlePageHide = () => {
466
+ if (!pending) return;
467
+ pending = false;
468
+ window.clearTimeout(timeout);
469
+ };
470
+ window.addEventListener("pagehide", handlePageHide, { once: true });
471
+ try {
472
+ window.location.reload();
473
+ } catch {
474
+ rejectIfPageRemains();
475
+ }
476
+ });
489
477
  var memoizeImporter = (importer) => {
490
478
  let promise = null;
491
479
  return async () => {
@@ -500,7 +488,13 @@ var lazyRoute = (importer, opts) => {
500
488
  const loadModule = memoizeImporter(importer);
501
489
  return {
502
490
  lazy: async () => {
503
- const module = await loadModule();
491
+ let module;
492
+ try {
493
+ module = await loadModule();
494
+ } catch (error) {
495
+ if (isDynamicImportError(error) && markPageReloadRequested()) return reloadPage(error);
496
+ throw error;
497
+ }
504
498
  const lazyRouteModule = { Component: module.default };
505
499
  if (typeof module.loader === "function") lazyRouteModule.loader = module.loader;
506
500
  return lazyRouteModule;
@@ -514,85 +508,42 @@ var lazyRoute = (importer, opts) => {
514
508
  };
515
509
  //#endregion
516
510
  //#region src/useApplyMeta.tsx
517
- var useApplyMeta = (t0) => {
518
- const $ = c(12);
519
- let t1;
520
- if ($[0] !== t0) {
521
- t1 = t0 === void 0 ? {} : t0;
522
- $[0] = t0;
523
- $[1] = t1;
524
- } else t1 = $[1];
525
- const { defaultTitle: t2, defaultMeta: t3, pagesMeta: t4 } = t1;
526
- const defaultTitle = t2 === void 0 ? "" : t2;
527
- let t5;
528
- if ($[2] !== t3) {
529
- t5 = t3 === void 0 ? [] : t3;
530
- $[2] = t3;
531
- $[3] = t5;
532
- } else t5 = $[3];
533
- const defaultMeta = t5;
534
- let t6;
535
- if ($[4] !== t4) {
536
- t6 = t4 === void 0 ? {} : t4;
537
- $[4] = t4;
538
- $[5] = t6;
539
- } else t6 = $[5];
540
- const pagesMeta = t6;
511
+ var useApplyMeta = ({ defaultTitle = "", defaultMeta = [], pagesMeta = {} } = {}) => {
541
512
  const location = useLocation();
542
- let t7;
543
- let t8;
544
- if ($[6] !== defaultMeta || $[7] !== defaultTitle || $[8] !== location.pathname || $[9] !== pagesMeta) {
545
- t7 = () => {
546
- const loadMeta = async () => {
547
- let pageMeta = pagesMeta[location.pathname];
548
- if (!pageMeta) pageMeta = {
549
- title: defaultTitle,
550
- meta: defaultMeta
551
- };
552
- document.title = pageMeta.title;
553
- document.querySelectorAll("[data-react-meta]").forEach(_temp);
554
- pageMeta.meta.forEach(_temp2);
555
- const canonicalUrl = `${window.location.origin}${location.pathname}`;
556
- const existingCanonical = document.querySelector("link[rel=\"canonical\"]");
557
- if (existingCanonical) existingCanonical.remove();
558
- const canonicalLink = document.createElement("link");
559
- canonicalLink.setAttribute("rel", "canonical");
560
- canonicalLink.setAttribute("href", canonicalUrl);
561
- canonicalLink.setAttribute("data-react-meta", "true");
562
- document.head.appendChild(canonicalLink);
513
+ useEffect(() => {
514
+ const loadMeta = async () => {
515
+ let pageMeta = pagesMeta[location.pathname];
516
+ if (!pageMeta) pageMeta = {
517
+ title: defaultTitle,
518
+ meta: defaultMeta
563
519
  };
564
- loadMeta();
520
+ document.title = pageMeta.title;
521
+ document.querySelectorAll("[data-react-meta]").forEach((tag) => tag.remove());
522
+ pageMeta.meta.forEach((meta) => {
523
+ const metaElement = document.createElement("meta");
524
+ metaElement.setAttribute("data-react-meta", "true");
525
+ Object.entries(meta).forEach(([key, value]) => {
526
+ if (value) metaElement.setAttribute(key, value.toString());
527
+ });
528
+ document.head.appendChild(metaElement);
529
+ });
530
+ const canonicalUrl = `${window.location.origin}${location.pathname}`;
531
+ const existingCanonical = document.querySelector("link[rel=\"canonical\"]");
532
+ if (existingCanonical) existingCanonical.remove();
533
+ const canonicalLink = document.createElement("link");
534
+ canonicalLink.setAttribute("rel", "canonical");
535
+ canonicalLink.setAttribute("href", canonicalUrl);
536
+ canonicalLink.setAttribute("data-react-meta", "true");
537
+ document.head.appendChild(canonicalLink);
565
538
  };
566
- t8 = [
567
- location.pathname,
568
- defaultTitle,
569
- defaultMeta,
570
- pagesMeta
571
- ];
572
- $[6] = defaultMeta;
573
- $[7] = defaultTitle;
574
- $[8] = location.pathname;
575
- $[9] = pagesMeta;
576
- $[10] = t7;
577
- $[11] = t8;
578
- } else {
579
- t7 = $[10];
580
- t8 = $[11];
581
- }
582
- useEffect(t7, t8);
539
+ loadMeta();
540
+ }, [
541
+ location.pathname,
542
+ defaultTitle,
543
+ defaultMeta,
544
+ pagesMeta
545
+ ]);
583
546
  };
584
- function _temp(tag) {
585
- return tag.remove();
586
- }
587
- function _temp2(meta) {
588
- const metaElement = document.createElement("meta");
589
- metaElement.setAttribute("data-react-meta", "true");
590
- Object.entries(meta).forEach((t0) => {
591
- const [key, value] = t0;
592
- if (value) metaElement.setAttribute(key, value.toString());
593
- });
594
- document.head.appendChild(metaElement);
595
- }
596
547
  //#endregion
597
548
  //#region src/navigationGuards.ts
598
549
  var NAVIGATION_GUARDS_STORE_KEY = "__rpcbaseNavigationGuardsStore";
@@ -862,169 +813,76 @@ function useQuerySearch() {
862
813
  } else t0 = $[1];
863
814
  return useSyncExternalStore(subscribeToQueryOverlayUrl, getCurrentSearch, t0);
864
815
  }
865
- var useQueryOverlay = (t0) => {
866
- const $ = c(38);
867
- const { params, parse, write, clear, closeDelayMs: t1 } = t0;
868
- const closeDelayMs = t1 === void 0 ? 0 : t1;
816
+ var useQueryOverlay = ({ params, parse, write, clear, closeDelayMs = 0 }) => {
869
817
  const routerUrlSnapshot = useRouterUrlSnapshot();
870
818
  const search = useQuerySearch();
871
819
  const [isOptimisticallyClosed, setIsOptimisticallyClosed] = useState(false);
872
820
  const closeTimeoutRef = useRef(null);
873
- let t2;
874
- if ($[0] !== parse || $[1] !== search) {
875
- t2 = parse(new URLSearchParams(search));
876
- $[0] = parse;
877
- $[1] = search;
878
- $[2] = t2;
879
- } else t2 = $[2];
880
- const value = t2;
821
+ const value = parse(new URLSearchParams(search));
881
822
  const isUrlOpen = value !== null;
882
- let t3;
883
- if ($[3] !== params || $[4] !== search) {
884
- t3 = buildOverlayUrlStateKey(search, params);
885
- $[3] = params;
886
- $[4] = search;
887
- $[5] = t3;
888
- } else t3 = $[5];
889
- const overlayUrlStateKey = t3;
890
- let t4;
891
- if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
892
- t4 = () => {
893
- if (closeTimeoutRef.current === null) return;
894
- window.clearTimeout(closeTimeoutRef.current);
823
+ const overlayUrlStateKey = buildOverlayUrlStateKey(search, params);
824
+ const clearScheduledClose = () => {
825
+ if (closeTimeoutRef.current === null) return;
826
+ window.clearTimeout(closeTimeoutRef.current);
827
+ closeTimeoutRef.current = null;
828
+ };
829
+ const resetOptimisticClose = () => {
830
+ clearScheduledClose();
831
+ setIsOptimisticallyClosed(false);
832
+ };
833
+ const closeUrlOverlay = () => {
834
+ replaceQueryParams((searchParams) => {
835
+ clearOverlaySearchParams(searchParams, params, clear);
836
+ });
837
+ };
838
+ const buildHref = (nextValue) => {
839
+ const searchParams_0 = new URLSearchParams(getCurrentUrlSnapshot(routerUrlSnapshot).search);
840
+ clearOverlaySearchParams(searchParams_0, params, clear);
841
+ if (nextValue !== null) write(searchParams_0, nextValue);
842
+ return buildUrl(searchParams_0, routerUrlSnapshot);
843
+ };
844
+ const openOverlay = (nextValue_0) => {
845
+ resetOptimisticClose();
846
+ replaceQueryParams((searchParams_1) => {
847
+ clearOverlaySearchParams(searchParams_1, params, clear);
848
+ write(searchParams_1, nextValue_0);
849
+ });
850
+ };
851
+ const closeOverlay = () => {
852
+ if (!isUrlOpen) return;
853
+ setIsOptimisticallyClosed(true);
854
+ clearScheduledClose();
855
+ if (typeof window === "undefined" || closeDelayMs <= 0) {
856
+ closeUrlOverlay();
857
+ return;
858
+ }
859
+ closeTimeoutRef.current = window.setTimeout(() => {
895
860
  closeTimeoutRef.current = null;
896
- };
897
- $[6] = t4;
898
- } else t4 = $[6];
899
- const clearScheduledClose = t4;
900
- let t5;
901
- if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
902
- t5 = () => {
903
- clearScheduledClose();
904
- setIsOptimisticallyClosed(false);
905
- };
906
- $[7] = t5;
907
- } else t5 = $[7];
908
- const resetOptimisticClose = t5;
909
- let t6;
910
- if ($[8] !== clear || $[9] !== params) {
911
- t6 = () => {
912
- replaceQueryParams((searchParams) => {
913
- clearOverlaySearchParams(searchParams, params, clear);
914
- });
915
- };
916
- $[8] = clear;
917
- $[9] = params;
918
- $[10] = t6;
919
- } else t6 = $[10];
920
- const closeUrlOverlay = t6;
921
- let t7;
922
- if ($[11] !== clear || $[12] !== params || $[13] !== routerUrlSnapshot || $[14] !== write) {
923
- t7 = (nextValue) => {
924
- const searchParams_0 = new URLSearchParams(getCurrentUrlSnapshot(routerUrlSnapshot).search);
925
- clearOverlaySearchParams(searchParams_0, params, clear);
926
- if (nextValue !== null) write(searchParams_0, nextValue);
927
- return buildUrl(searchParams_0, routerUrlSnapshot);
928
- };
929
- $[11] = clear;
930
- $[12] = params;
931
- $[13] = routerUrlSnapshot;
932
- $[14] = write;
933
- $[15] = t7;
934
- } else t7 = $[15];
935
- const buildHref = t7;
936
- let t8;
937
- if ($[16] !== clear || $[17] !== params || $[18] !== write) {
938
- t8 = (nextValue_0) => {
939
- resetOptimisticClose();
940
- replaceQueryParams((searchParams_1) => {
941
- clearOverlaySearchParams(searchParams_1, params, clear);
942
- write(searchParams_1, nextValue_0);
943
- });
944
- };
945
- $[16] = clear;
946
- $[17] = params;
947
- $[18] = write;
948
- $[19] = t8;
949
- } else t8 = $[19];
950
- const openOverlay = t8;
951
- let t9;
952
- if ($[20] !== closeDelayMs || $[21] !== closeUrlOverlay || $[22] !== isUrlOpen) {
953
- t9 = () => {
954
- if (!isUrlOpen) return;
955
- setIsOptimisticallyClosed(true);
956
- clearScheduledClose();
957
- if (typeof window === "undefined" || closeDelayMs <= 0) {
958
- closeUrlOverlay();
959
- return;
960
- }
961
- closeTimeoutRef.current = window.setTimeout(() => {
962
- closeTimeoutRef.current = null;
963
- closeUrlOverlay();
964
- }, closeDelayMs);
965
- };
966
- $[20] = closeDelayMs;
967
- $[21] = closeUrlOverlay;
968
- $[22] = isUrlOpen;
969
- $[23] = t9;
970
- } else t9 = $[23];
971
- const closeOverlay = t9;
972
- let t10;
973
- if ($[24] !== isUrlOpen) {
974
- t10 = () => {
975
- if (isUrlOpen) {
976
- setIsOptimisticallyClosed(false);
977
- return;
978
- }
979
- clearScheduledClose();
861
+ closeUrlOverlay();
862
+ }, closeDelayMs);
863
+ };
864
+ useEffect(() => {
865
+ if (isUrlOpen) {
980
866
  setIsOptimisticallyClosed(false);
981
- };
982
- $[24] = isUrlOpen;
983
- $[25] = t10;
984
- } else t10 = $[25];
985
- let t11;
986
- if ($[26] !== isUrlOpen || $[27] !== overlayUrlStateKey) {
987
- t11 = [isUrlOpen, overlayUrlStateKey];
988
- $[26] = isUrlOpen;
989
- $[27] = overlayUrlStateKey;
990
- $[28] = t11;
991
- } else t11 = $[28];
992
- useEffect(t10, t11);
993
- let t12;
994
- let t13;
995
- if ($[29] === Symbol.for("react.memo_cache_sentinel")) {
996
- t12 = () => () => {
867
+ return;
868
+ }
869
+ clearScheduledClose();
870
+ setIsOptimisticallyClosed(false);
871
+ }, [isUrlOpen, overlayUrlStateKey]);
872
+ useEffect(() => {
873
+ return () => {
997
874
  clearScheduledClose();
998
875
  };
999
- t13 = [];
1000
- $[29] = t12;
1001
- $[30] = t13;
1002
- } else {
1003
- t12 = $[29];
1004
- t13 = $[30];
1005
- }
1006
- useEffect(t12, t13);
1007
- const t14 = isUrlOpen && !isOptimisticallyClosed;
1008
- let t15;
1009
- if ($[31] !== buildHref || $[32] !== closeOverlay || $[33] !== isUrlOpen || $[34] !== openOverlay || $[35] !== t14 || $[36] !== value) {
1010
- t15 = {
1011
- isOpen: t14,
1012
- shouldRender: isUrlOpen,
1013
- value,
1014
- buildHref,
1015
- openOverlay,
1016
- closeOverlay,
1017
- resetOptimisticClose
1018
- };
1019
- $[31] = buildHref;
1020
- $[32] = closeOverlay;
1021
- $[33] = isUrlOpen;
1022
- $[34] = openOverlay;
1023
- $[35] = t14;
1024
- $[36] = value;
1025
- $[37] = t15;
1026
- } else t15 = $[37];
1027
- return t15;
876
+ }, []);
877
+ return {
878
+ isOpen: isUrlOpen && !isOptimisticallyClosed,
879
+ shouldRender: isUrlOpen,
880
+ value,
881
+ buildHref,
882
+ openOverlay,
883
+ closeOverlay,
884
+ resetOptimisticClose
885
+ };
1028
886
  };
1029
887
  function QueryOverlay({ overlay, fallback, errorFallback, children }) {
1030
888
  if (!overlay.shouldRender || overlay.value === null) return null;
@@ -1045,8 +903,9 @@ function QueryOverlay({ overlay, fallback, errorFallback, children }) {
1045
903
  ...controls,
1046
904
  onOpenChange: setOpen
1047
905
  };
906
+ const resetKey = overlay.buildHref(overlay.value);
1048
907
  return createElement(QueryOverlayErrorBoundary, {
1049
- resetKey: overlay.buildHref(overlay.value),
908
+ resetKey,
1050
909
  fallback: (error) => renderQueryOverlayFallback(errorFallback, fallbackControls, error, true)
1051
910
  }, createElement(Suspense, { fallback: renderQueryOverlayFallback(fallback === void 0 ? QUERY_OVERLAY_LOADING_FALLBACK : fallback, fallbackControls) }, children(overlay.value, controls)));
1052
911
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["ROUTE_MODULE_IMPORTER_HANDLE","ROUTE_PREFETCH_DATA_HANDLE","RouteHandleObject","Record","RouteModuleImporter","Promise","isHandleObject","value","Boolean","Array","isArray","getRouteModuleImporterFromHandle","handle","importer","getRoutePrefetchDataFromHandle","key","undefined","mergeRouteHandle","prefetchData","prefetchDataKey","nextHandle","ReactNode","createContext","useContext","useRef","UNSAFE_DataRouterContext","matchRoutes","DataRouteObject","DataRouter","ROUTE_PREFETCH_DATA_HANDLE","getRouteModuleImporterFromHandle","getRoutePrefetchDataFromHandle","RoutePrefetchBehavior","RoutePrefetchCallOptions","prefetchCode","prefetchData","RoutePrefetchApi","defaultPrefetch","prefetch","href","opts","Promise","RoutePrefetchContextValue","PrefetchableRoute","handle","lazy","Record","RoutePrefetchProviderProps","children","dataPrefetchTtlMs","dataPrefetchHandleKey","DataCacheValue","expiresAt","promise","noop","DEFAULT_PREFETCH_API","RoutePrefetchContext","normalizeHref","pathWithSearch","pathname","search","hash","window","url","URL","location","origin","pruneDataCache","cache","Map","now","forEach","value","key","delete","resolveDataPrefetchFlag","route","explicitPrefetchData","routeHandlePrefetchData","RoutePrefetchProvider","t0","$","_c","t1","t2","t3","undefined","dataRouterContext","t4","Symbol","for","routeModuleCacheRef","t5","routeDataCacheRef","t6","routeId","id","cached","current","get","lazyRouteLoader","routeModuleImporter","prefetchPromise","resolve","then","_temp","catch","error","set","prefetchRouteModule","t7","router","route_0","routeId_0","Date","cacheKey","cached_0","hasLoader","loader","loadedRouteModule","_temp2","fetcherKey","prefetchPromise_0","fetch","error_0","finally","deleteFetcher","ttl","Math","max","prefetchRouteData","t8","href_0","normalized","currentPathWithSearch","router_0","matches","routes","basename","length","matchedRoutes","map","_temp3","all","route_1","route_2","t10","t9","href_1","href_2","t11","t12","useRoutePrefetch","module","match","forwardRef","useEffect","useRef","Ref","SyntheticEvent","Link","RouterLink","LinkProps","RouterLinkProps","RoutePrefetchBehavior","useRoutePrefetch","ABSOLUTE_URL_REGEX","Omit","prefetch","prefetchData","assignRef","ref","TValue","value","current","composeEventHandlers","theirHandler","event","TEvent","ourHandler","defaultPrevented","shouldPrefetchLink","reloadDocument","target","to","test","usePrefetchLink","$","_c","localRef","t0","t1","Symbol","for","node","t2","anchorRef","getAnchorElement","prefetchHref","href","getAttribute","HTMLAnchorElement","forwardedRef","onFocus","onMouseEnter","onTouchStart","prefetchProp","props","defaultPrefetch","prefetchBehavior","viewportPrefetchedRef","canPrefetch","t3","t4","t5","t6","t7","element","IntersectionObserver","observer","entries","isVisible","some","_temp","threshold","observe","disconnect","t8","handleIntentPrefetch","t9","t10","t11","t12","t13","displayName","entry","isIntersecting","LoaderFunction","mergeRouteHandle","RouteHandleObject","RouteModuleLoader","args","RouteModule","default","React","ComponentType","loader","RouteModuleImporter","Promise","RouteOptions","handle","prefetchData","prefetchDataKey","LazyRouteResult","lazy","Component","memoizeImporter","importer","promise","catch","error","lazyRoute","opts","loadModule","module","lazyRouteModule","useEffect","useLocation","MetaAttributeValue","MetaEntry","Record","PageMeta","title","meta","useApplyMeta","t0","$","_c","t1","undefined","defaultTitle","t2","defaultMeta","t3","pagesMeta","t4","t5","t6","location","t7","t8","pathname","loadMeta","pageMeta","document","querySelectorAll","forEach","_temp","_temp2","canonicalUrl","window","origin","existingCanonical","querySelector","remove","canonicalLink","createElement","setAttribute","head","appendChild","tag","metaElement","Object","entries","key","value","toString","useEffect","useRef","BlockerFunction","NavigationGuard","id","enabled","priority","message","blockOnSearch","shouldBlockNavigation","shouldBlockUnload","NavigationGuardsListener","NavigationGuardsStore","guards","Map","listeners","Set","NAVIGATION_GUARDS_STORE_KEY","getNavigationGuardsStore","globalAny","globalThis","existing","created","notify","forEach","listener","isSameGuard","a","b","upsertNavigationGuard","guard","prev","get","set","removeNavigationGuard","didDelete","delete","getNavigationGuards","Array","from","values","subscribeNavigationGuards","add","useRegisterNavigationGuard","latestGuardRef","current","lastIdRef","lastId","Component","Suspense","cloneElement","createElement","isValidElement","useContext","useEffect","useRef","useState","useSyncExternalStore","CSSProperties","ErrorInfo","ReactElement","ReactNode","createPortal","UNSAFE_LocationContext","UseQueryOverlayOptions","params","parse","URLSearchParams","TOverlay","write","state","clear","closeDelayMs","QueryOverlayApi","value","isOpen","shouldRender","buildHref","nextValue","openOverlay","closeOverlay","resetOptimisticClose","QueryOverlayRenderControls","open","setOpen","QueryOverlayFallbackControls","onOpenChange","QueryOverlayFallbackRender","controls","QueryOverlayErrorFallbackRender","error","QueryOverlayLoadingFallbackProps","label","QueryOverlayProps","overlay","fallback","errorFallback","children","QueryOverlayErrorBoundaryProps","resetKey","QueryOverlayErrorBoundary","getDerivedStateFromError","componentDidCatch","errorInfo","console","componentDidUpdate","previousProps","props","setState","render","QUERY_OVERLAY_URL_CHANGE_EVENT","UrlSnapshot","pathname","search","hash","getCurrentUrlSnapshot","window","location","getParamValueFromSearch","param","get","getSearchFromUrlSnapshot","useRouterUrlSnapshot","$","_c","context","t0","getCurrentParamValue","getCurrentSearch","subscribeToQueryOverlayUrl","listener","undefined","addEventListener","removeEventListener","buildUrl","searchParams","nextSearch","toString","clearOverlaySearchParams","delete","buildOverlayUrlStateKey","map","values","getAll","join","queryOverlayLoadingBackdropStyle","position","inset","zIndex","display","alignItems","justifyContent","background","color","opacity","pointerEvents","transition","queryOverlayLoadingStatusStyle","gap","fontSize","fontWeight","QueryOverlayLoadingFallback","backdrop","style","role","focusable","height","viewBox","width","cx","cy","fill","r","stroke","strokeOpacity","strokeWidth","d","strokeLinecap","attributeName","dur","from","repeatCount","to","type","document","body","QUERY_OVERLAY_LOADING_FALLBACK","renderQueryOverlayFallback","includeError","Record","replaceQueryParams","update","nextUrl","currentUrl","history","replaceState","dispatchEvent","Event","useQueryParam","routerUrlSnapshot","t1","useQuerySearch","useQueryOverlay","isOptimisticallyClosed","setIsOptimisticallyClosed","closeTimeoutRef","t2","isUrlOpen","t3","overlayUrlStateKey","t4","Symbol","for","current","clearTimeout","clearScheduledClose","t5","t6","closeUrlOverlay","t7","searchParams_0","t8","nextValue_0","searchParams_1","t9","setTimeout","t10","t11","t12","t13","t14","t15","QueryOverlay","fallbackControls","suspenseFallback","useEffect","useRef","useNavigate","KeyboardShortcut","key","mod","ctrl","meta","alt","shift","ShortcutTrigger","UseShortcutPrefetchNavigateOptions","shortcut","getHref","prefetch","href","Promise","navigate","trigger","enabled","preventDefault","ignoreTypingTarget","isTypingTarget","target","EventTarget","normalizeKey","toLowerCase","defaultIsTypingTarget","element","HTMLElement","tagName","isContentEditable","matchesShortcutKeyDown","event","KeyboardEvent","hasMod","metaKey","ctrlKey","altKey","shiftKey","callMaybeAsync","fn","resolve","useShortcutPrefetchNavigate","routerNavigate","shortcutRef","getHrefRef","prefetchRef","navigateRef","triggerRef","enabledRef","preventDefaultRef","ignoreTypingTargetRef","isTypingTargetRef","waitingForShortcutKeyUpRef","current","window","onKeyDown","repeat","onKeyUp","onBlur","addEventListener","removeEventListener"],"sources":["../src/routePrefetchHandles.ts","../src/routePrefetch.tsx","../src/Link.tsx","../src/lazyRoute.tsx","../src/useApplyMeta.tsx","../src/navigationGuards.ts","../src/queryOverlay.ts","../src/shortcutPrefetchNavigate.ts"],"sourcesContent":["export const ROUTE_MODULE_IMPORTER_HANDLE = \"__rpcbaseRouteModuleImporter\"\nexport const ROUTE_PREFETCH_DATA_HANDLE = \"prefetchData\"\n\nexport type RouteHandleObject = Record<string, unknown>\n\ntype RouteModuleImporter = () => Promise<unknown>\n\nconst isHandleObject = (value: unknown): value is RouteHandleObject =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value)\n\nexport const getRouteModuleImporterFromHandle = (handle: unknown): RouteModuleImporter | null => {\n if (!isHandleObject(handle)) return null\n\n const importer = handle[ROUTE_MODULE_IMPORTER_HANDLE]\n return typeof importer === \"function\" ? (importer as RouteModuleImporter) : null\n}\n\nexport const getRoutePrefetchDataFromHandle = (\n handle: unknown,\n key = ROUTE_PREFETCH_DATA_HANDLE,\n): boolean | undefined => {\n if (!isHandleObject(handle)) return undefined\n\n const value = handle[key]\n return typeof value === \"boolean\" ? value : undefined\n}\n\nexport const mergeRouteHandle = (\n handle: unknown,\n {\n importer,\n prefetchData,\n prefetchDataKey = ROUTE_PREFETCH_DATA_HANDLE,\n }: {\n importer?: RouteModuleImporter\n prefetchData?: boolean\n prefetchDataKey?: string\n },\n): RouteHandleObject => {\n const nextHandle: RouteHandleObject = isHandleObject(handle) ? { ...handle } : {}\n\n if (importer) {\n nextHandle[ROUTE_MODULE_IMPORTER_HANDLE] = importer\n }\n\n if (typeof prefetchData === \"boolean\") {\n nextHandle[prefetchDataKey] = prefetchData\n }\n\n return nextHandle\n}\n","import { ReactNode, createContext, useContext, useRef } from \"react\"\nimport {\n UNSAFE_DataRouterContext,\n matchRoutes,\n type DataRouteObject,\n type DataRouter,\n} from \"react-router\"\n\nimport {\n ROUTE_PREFETCH_DATA_HANDLE,\n getRouteModuleImporterFromHandle,\n getRoutePrefetchDataFromHandle,\n} from \"./routePrefetchHandles\"\n\n\nexport type RoutePrefetchBehavior = \"intent\" | \"render\" | \"none\" | \"viewport\"\n\nexport type RoutePrefetchCallOptions = {\n prefetchCode?: boolean\n prefetchData?: boolean\n}\n\nexport type RoutePrefetchApi = {\n defaultPrefetch: RoutePrefetchBehavior\n prefetch: (href: string, opts?: RoutePrefetchCallOptions) => Promise<void>\n prefetchCode: (href: string) => Promise<void>\n prefetchData: (href: string) => Promise<void>\n}\n\ntype RoutePrefetchContextValue = RoutePrefetchApi\n\ntype PrefetchableRoute = DataRouteObject & {\n handle?: unknown\n lazy?: () => Promise<Record<string, unknown>>\n}\n\ntype RoutePrefetchProviderProps = {\n children: ReactNode\n defaultPrefetch?: RoutePrefetchBehavior\n dataPrefetchTtlMs?: number\n dataPrefetchHandleKey?: string\n}\n\ntype DataCacheValue = {\n expiresAt: number\n promise: Promise<void>\n}\n\nconst noop = async () => {}\n\nconst DEFAULT_PREFETCH_API: RoutePrefetchContextValue = {\n defaultPrefetch: \"none\",\n prefetch: noop,\n prefetchCode: noop,\n prefetchData: noop,\n}\n\nconst RoutePrefetchContext = createContext<RoutePrefetchContextValue>(DEFAULT_PREFETCH_API)\n\nconst normalizeHref = (href: string): { pathWithSearch: string; pathname: string; search: string; hash: string } | null => {\n if (typeof window === \"undefined\") return null\n\n try {\n const url = new URL(href, window.location.origin)\n if (url.origin !== window.location.origin) return null\n return {\n pathWithSearch: `${url.pathname}${url.search}`,\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n }\n } catch {\n return null\n }\n}\n\nconst pruneDataCache = (cache: Map<string, DataCacheValue>, now: number): void => {\n cache.forEach((value, key) => {\n if (value.expiresAt <= now) {\n cache.delete(key)\n }\n })\n}\n\nconst resolveDataPrefetchFlag = (\n route: PrefetchableRoute,\n explicitPrefetchData: boolean | undefined,\n dataPrefetchHandleKey: string,\n): boolean => {\n if (typeof explicitPrefetchData === \"boolean\") {\n return explicitPrefetchData\n }\n\n const routeHandlePrefetchData = getRoutePrefetchDataFromHandle(route.handle, dataPrefetchHandleKey)\n if (typeof routeHandlePrefetchData === \"boolean\") {\n return routeHandlePrefetchData\n }\n\n return false\n}\n\nexport const RoutePrefetchProvider = ({\n children,\n defaultPrefetch = \"intent\",\n dataPrefetchTtlMs = 30000,\n dataPrefetchHandleKey = ROUTE_PREFETCH_DATA_HANDLE,\n}: RoutePrefetchProviderProps) => {\n const dataRouterContext = useContext(UNSAFE_DataRouterContext)\n const routeModuleCacheRef = useRef(new Map<string, Promise<Record<string, unknown> | null>>())\n const routeDataCacheRef = useRef(new Map<string, DataCacheValue>())\n\n const prefetchRouteModule = async (route: PrefetchableRoute): Promise<Record<string, unknown> | null> => {\n const routeId = route.id\n if (!routeId) return null\n\n const cached = routeModuleCacheRef.current.get(routeId)\n if (cached) {\n return cached\n }\n\n const lazyRouteLoader = typeof route.lazy === \"function\" ? route.lazy : null\n const routeModuleImporter = getRouteModuleImporterFromHandle(route.handle)\n if (!lazyRouteLoader && !routeModuleImporter) {\n return null\n }\n\n const prefetchPromise = Promise.resolve(lazyRouteLoader ? lazyRouteLoader() : routeModuleImporter!())\n .then((module) => {\n if (!module || typeof module !== \"object\") return null\n return module as Record<string, unknown>\n })\n .catch((error) => {\n routeModuleCacheRef.current.delete(routeId)\n throw error\n })\n\n routeModuleCacheRef.current.set(routeId, prefetchPromise)\n return prefetchPromise\n }\n\n const prefetchRouteData = async (router: DataRouter, route: PrefetchableRoute, href: string): Promise<void> => {\n const routeId = route.id\n if (!routeId) return\n\n const now = Date.now()\n pruneDataCache(routeDataCacheRef.current, now)\n\n const cacheKey = `${routeId}|${href}`\n const cached = routeDataCacheRef.current.get(cacheKey)\n if (cached && cached.expiresAt > now) {\n await cached.promise\n return\n }\n\n let hasLoader = typeof route.loader === \"function\"\n if (!hasLoader) {\n const loadedRouteModule = await prefetchRouteModule(route).catch(() => null)\n hasLoader = typeof loadedRouteModule?.loader === \"function\"\n }\n\n if (!hasLoader) return\n\n const fetcherKey = `rb:prefetch:${routeId}:${href}`\n\n const prefetchPromise = Promise.resolve(router.fetch(fetcherKey, routeId, href))\n .catch((error) => {\n routeDataCacheRef.current.delete(cacheKey)\n throw error\n })\n .finally(() => {\n try {\n router.deleteFetcher(fetcherKey)\n } catch {\n return\n }\n })\n\n const ttl = Math.max(1, dataPrefetchTtlMs)\n routeDataCacheRef.current.set(cacheKey, {\n expiresAt: now + ttl,\n promise: prefetchPromise,\n })\n\n await prefetchPromise\n }\n\n const prefetch = async (href: string, opts?: RoutePrefetchCallOptions): Promise<void> => {\n const normalized = normalizeHref(href)\n if (!normalized) return\n\n const currentPathWithSearch =\n typeof window === \"undefined\"\n ? \"\"\n : `${window.location.pathname}${window.location.search}`\n if (normalized.pathWithSearch === currentPathWithSearch) {\n return\n }\n\n const router = dataRouterContext?.router as DataRouter | undefined\n if (!router) return\n\n const matches = matchRoutes(\n router.routes,\n {\n pathname: normalized.pathname,\n search: normalized.search,\n hash: normalized.hash,\n },\n router.basename,\n )\n\n if (!matches || matches.length === 0) {\n return\n }\n\n const matchedRoutes = matches.map((match) => match.route as PrefetchableRoute)\n\n if (opts?.prefetchCode !== false) {\n await Promise.all(\n matchedRoutes.map(async (route) => {\n try {\n await prefetchRouteModule(route)\n } catch {\n return\n }\n }),\n )\n }\n\n await Promise.all(\n matchedRoutes.map(async (route) => {\n if (!resolveDataPrefetchFlag(route, opts?.prefetchData, dataPrefetchHandleKey)) {\n return\n }\n\n try {\n await prefetchRouteData(router, route, normalized.pathWithSearch)\n } catch {\n return\n }\n }),\n )\n }\n\n return (\n <RoutePrefetchContext.Provider\n value={{\n defaultPrefetch,\n prefetch,\n prefetchCode: async (href) => prefetch(href, { prefetchCode: true, prefetchData: false }),\n prefetchData: async (href) => prefetch(href, { prefetchCode: false, prefetchData: true }),\n }}\n >\n {children}\n </RoutePrefetchContext.Provider>\n )\n}\n\nexport const useRoutePrefetch = (): RoutePrefetchApi => useContext(RoutePrefetchContext)\n\nexport type { RoutePrefetchProviderProps }\n","import { forwardRef, useEffect, useRef, type Ref, type SyntheticEvent } from \"react\"\nimport { Link as RouterLink, type LinkProps as RouterLinkProps } from \"react-router\"\n\nimport { type RoutePrefetchBehavior, useRoutePrefetch } from \"./routePrefetch\"\n\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i\n\ntype LinkProps = Omit<RouterLinkProps, \"prefetch\"> & {\n prefetch?: RoutePrefetchBehavior\n prefetchData?: boolean\n}\n\nconst assignRef = <TValue,>(ref: Ref<TValue> | undefined, value: TValue) => {\n if (!ref) return\n if (typeof ref === \"function\") {\n ref(value)\n return\n }\n ref.current = value\n}\n\nconst composeEventHandlers = <TEvent extends SyntheticEvent>(\n theirHandler: ((event: TEvent) => void) | undefined,\n ourHandler: () => void,\n) => {\n return (event: TEvent) => {\n theirHandler?.(event)\n if (!event.defaultPrevented) {\n ourHandler()\n }\n }\n}\n\nconst shouldPrefetchLink = ({\n prefetch,\n reloadDocument,\n target,\n to,\n}: {\n prefetch: RoutePrefetchBehavior\n reloadDocument: boolean | undefined\n target: string | undefined\n to: RouterLinkProps[\"to\"]\n}): boolean => {\n if (prefetch === \"none\") return false\n if (reloadDocument) return false\n if (typeof target === \"string\" && target !== \"_self\") return false\n if (typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to)) return false\n return true\n}\n\nconst usePrefetchLink = (\n prefetchData: boolean | undefined,\n): {\n anchorRef: Ref<HTMLAnchorElement>\n prefetchHref: () => void\n getAnchorElement: () => HTMLAnchorElement | null\n} => {\n const localRef = useRef<HTMLAnchorElement | null>(null)\n const { prefetch } = useRoutePrefetch()\n\n return {\n anchorRef: (node) => {\n localRef.current = node\n },\n getAnchorElement: () => localRef.current,\n prefetchHref: () => {\n const href = localRef.current?.getAttribute(\"href\")\n if (!href) return\n void prefetch(href, { prefetchData })\n },\n }\n}\n\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>(\n (\n {\n prefetch: prefetchProp,\n prefetchData,\n onMouseEnter,\n onFocus,\n onTouchStart,\n reloadDocument,\n target,\n to,\n ...props\n },\n forwardedRef,\n ) => {\n const { defaultPrefetch } = useRoutePrefetch()\n const prefetchBehavior = prefetchProp ?? defaultPrefetch\n const viewportPrefetchedRef = useRef(false)\n const { anchorRef, prefetchHref, getAnchorElement } = usePrefetchLink(prefetchData)\n const canPrefetch = shouldPrefetchLink({\n prefetch: prefetchBehavior,\n reloadDocument,\n target,\n to,\n })\n\n useEffect(() => {\n viewportPrefetchedRef.current = false\n }, [to])\n\n useEffect(() => {\n if (!canPrefetch || prefetchBehavior !== \"render\") return\n prefetchHref()\n }, [canPrefetch, prefetchBehavior, prefetchHref])\n\n useEffect(() => {\n if (!canPrefetch || prefetchBehavior !== \"viewport\") return\n\n const element = getAnchorElement()\n if (!element || typeof IntersectionObserver === \"undefined\") return\n\n const observer = new IntersectionObserver(\n (entries) => {\n const isVisible = entries.some((entry) => entry.isIntersecting)\n if (!isVisible || viewportPrefetchedRef.current) return\n viewportPrefetchedRef.current = true\n prefetchHref()\n },\n { threshold: 0.5 },\n )\n\n observer.observe(element)\n return () => {\n observer.disconnect()\n }\n }, [canPrefetch, prefetchBehavior, prefetchHref, getAnchorElement])\n\n const handleIntentPrefetch = () => {\n if (!canPrefetch || prefetchBehavior !== \"intent\") return\n prefetchHref()\n }\n\n return (\n <RouterLink\n {...props}\n to={to}\n target={target}\n reloadDocument={reloadDocument}\n prefetch=\"none\"\n onMouseEnter={composeEventHandlers(onMouseEnter, handleIntentPrefetch)}\n onFocus={composeEventHandlers(onFocus, handleIntentPrefetch)}\n onTouchStart={composeEventHandlers(onTouchStart, handleIntentPrefetch)}\n ref={(node) => {\n assignRef(forwardedRef, node)\n assignRef(anchorRef, node)\n }}\n />\n )\n },\n)\n\nLink.displayName = \"Link\"\n\nexport type { LinkProps }\n","import { LoaderFunction } from \"react-router\"\n\nimport { mergeRouteHandle, RouteHandleObject } from \"./routePrefetchHandles\"\n\n\ntype RouteModuleLoader = (...args: any[]) => unknown\n\ntype RouteModule = {\n default: React.ComponentType<unknown>\n loader?: RouteModuleLoader\n}\n\ntype RouteModuleImporter = () => Promise<RouteModule>\n\ntype RouteOptions = {\n handle?: unknown\n prefetchData?: boolean\n prefetchDataKey?: string\n}\n\ntype LazyRouteResult = {\n lazy: () => Promise<{\n Component: React.ComponentType<unknown>\n loader?: LoaderFunction\n }>\n handle: RouteHandleObject\n}\n\nconst memoizeImporter = (importer: RouteModuleImporter): RouteModuleImporter => {\n let promise: Promise<RouteModule> | null = null\n\n return async () => {\n if (!promise) {\n promise = importer().catch((error) => {\n promise = null\n throw error\n })\n }\n\n return promise\n }\n}\n\nexport const lazyRoute = (importer: RouteModuleImporter, opts?: RouteOptions): LazyRouteResult => {\n const loadModule = memoizeImporter(importer)\n\n return {\n lazy: async () => {\n const module = await loadModule()\n const lazyRouteModule: {\n Component: React.ComponentType<unknown>\n loader?: LoaderFunction\n } = {\n Component: module.default,\n }\n\n if (typeof module.loader === \"function\") {\n lazyRouteModule.loader = module.loader as unknown as LoaderFunction\n }\n\n return lazyRouteModule\n },\n handle: mergeRouteHandle(opts?.handle, {\n importer: loadModule,\n prefetchData: opts?.prefetchData,\n prefetchDataKey: opts?.prefetchDataKey,\n }),\n }\n}\n","import { useEffect } from \"react\"\nimport { useLocation } from \"react-router\"\n\n\ntype MetaAttributeValue = string | number | boolean | undefined\ntype MetaEntry = Record<string, MetaAttributeValue>\n\ntype PageMeta = {\n title: string\n meta: MetaEntry[]\n}\n\n\nexport const useApplyMeta = ({\n defaultTitle = \"\",\n defaultMeta = [],\n pagesMeta = {}\n}: {\n defaultTitle?: string\n defaultMeta?: MetaEntry[]\n pagesMeta?: Record<string, PageMeta>\n} = {}) => {\n const location = useLocation()\n\n useEffect(() => {\n const loadMeta = async () => {\n\n let pageMeta = pagesMeta[location.pathname]\n\n if (!pageMeta) {\n pageMeta = { title: defaultTitle, meta: defaultMeta }\n }\n\n document.title = pageMeta.title\n\n // Remove previous dynamically inserted tags\n document.querySelectorAll(\"[data-react-meta]\").forEach((tag) => tag.remove())\n\n // Inject new tags\n pageMeta.meta.forEach((meta) => {\n const metaElement = document.createElement(\"meta\")\n metaElement.setAttribute(\"data-react-meta\", \"true\")\n\n // Set all attributes from the meta object\n Object.entries(meta).forEach(([key, value]) => {\n if (value) {\n metaElement.setAttribute(key, value.toString())\n }\n })\n\n document.head.appendChild(metaElement)\n })\n\n // Update canonical link\n const canonicalUrl = `${window.location.origin}${location.pathname}`\n\n const existingCanonical = document.querySelector(\"link[rel=\\\"canonical\\\"]\")\n if (existingCanonical) {\n existingCanonical.remove()\n }\n\n const canonicalLink = document.createElement(\"link\")\n canonicalLink.setAttribute(\"rel\", \"canonical\")\n canonicalLink.setAttribute(\"href\", canonicalUrl)\n canonicalLink.setAttribute(\"data-react-meta\", \"true\")\n document.head.appendChild(canonicalLink)\n }\n\n loadMeta()\n }, [location.pathname, defaultTitle, defaultMeta, pagesMeta])\n}\n","import { useEffect, useRef } from \"react\"\nimport type { BlockerFunction } from \"react-router\"\n\n\nexport type NavigationGuard = {\n id: string\n enabled: boolean\n priority?: number\n message: string\n blockOnSearch?: boolean\n shouldBlockNavigation: BlockerFunction\n shouldBlockUnload: boolean\n}\n\ntype NavigationGuardsListener = () => void\n\ntype NavigationGuardsStore = {\n guards: Map<string, NavigationGuard>\n listeners: Set<NavigationGuardsListener>\n}\n\nconst NAVIGATION_GUARDS_STORE_KEY = \"__rpcbaseNavigationGuardsStore\"\n\nconst getNavigationGuardsStore = (): NavigationGuardsStore => {\n const globalAny = globalThis as {\n [NAVIGATION_GUARDS_STORE_KEY]?: NavigationGuardsStore\n }\n\n const existing = globalAny[NAVIGATION_GUARDS_STORE_KEY]\n if (existing) {\n return existing\n }\n\n const created: NavigationGuardsStore = {\n guards: new Map<string, NavigationGuard>(),\n listeners: new Set<NavigationGuardsListener>(),\n }\n\n globalAny[NAVIGATION_GUARDS_STORE_KEY] = created\n return created\n}\n\nconst notify = (): void => {\n getNavigationGuardsStore().listeners.forEach((listener) => {\n listener()\n })\n}\n\nconst isSameGuard = (a: NavigationGuard, b: NavigationGuard): boolean =>\n a.id === b.id &&\n a.enabled === b.enabled &&\n a.priority === b.priority &&\n a.message === b.message &&\n a.blockOnSearch === b.blockOnSearch &&\n a.shouldBlockNavigation === b.shouldBlockNavigation &&\n a.shouldBlockUnload === b.shouldBlockUnload\n\nexport const upsertNavigationGuard = (guard: NavigationGuard): void => {\n const guards = getNavigationGuardsStore().guards\n const prev = guards.get(guard.id)\n if (prev && isSameGuard(prev, guard)) {\n return\n }\n\n guards.set(guard.id, guard)\n notify()\n}\n\nexport const removeNavigationGuard = (id: string): void => {\n const guards = getNavigationGuardsStore().guards\n const didDelete = guards.delete(id)\n if (didDelete) {\n notify()\n }\n}\n\nexport const getNavigationGuards = (): NavigationGuard[] =>\n Array.from(getNavigationGuardsStore().guards.values())\n\nexport const subscribeNavigationGuards = (\n listener: NavigationGuardsListener,\n): (() => void) => {\n const listeners = getNavigationGuardsStore().listeners\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nexport const useRegisterNavigationGuard = (guard: NavigationGuard): void => {\n const latestGuardRef = useRef(guard)\n latestGuardRef.current = guard\n\n const lastIdRef = useRef<string | null>(null)\n\n useEffect(() => {\n const lastId = lastIdRef.current\n if (lastId && lastId !== guard.id) {\n removeNavigationGuard(lastId)\n }\n lastIdRef.current = guard.id\n\n if (!guard.enabled) {\n removeNavigationGuard(guard.id)\n return\n }\n\n upsertNavigationGuard(latestGuardRef.current)\n return () => {\n removeNavigationGuard(guard.id)\n }\n }, [\n guard.id,\n guard.enabled,\n guard.message,\n guard.priority,\n guard.blockOnSearch,\n guard.shouldBlockNavigation,\n guard.shouldBlockUnload,\n ])\n}\n","import {\n Component,\n Suspense,\n cloneElement,\n createElement,\n isValidElement,\n useContext,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type ErrorInfo,\n type ReactElement,\n type ReactNode,\n} from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { UNSAFE_LocationContext } from \"react-router\"\n\n\nexport type UseQueryOverlayOptions<TOverlay> = {\n params: string[]\n parse: (params: URLSearchParams) => TOverlay | null\n write: (params: URLSearchParams, state: TOverlay) => void\n clear: (params: URLSearchParams) => void\n closeDelayMs?: number\n}\n\nexport type QueryOverlayApi<TOverlay> = {\n value: TOverlay | null\n isOpen: boolean\n shouldRender: boolean\n buildHref: (nextValue: TOverlay | null) => string\n openOverlay: (nextValue: TOverlay) => void\n closeOverlay: () => void\n resetOptimisticClose: () => void\n}\n\nexport type QueryOverlayRenderControls = {\n open: boolean\n setOpen: (open: boolean) => void\n closeOverlay: () => void\n resetOptimisticClose: () => void\n}\n\nexport type QueryOverlayFallbackControls = QueryOverlayRenderControls & {\n onOpenChange: (open: boolean) => void\n}\n\nexport type QueryOverlayFallbackRender = (controls: QueryOverlayFallbackControls) => ReactNode\n\nexport type QueryOverlayErrorFallbackRender = (\n controls: QueryOverlayFallbackControls & {\n error: unknown\n },\n) => ReactNode\n\nexport type QueryOverlayLoadingFallbackProps = {\n open?: boolean\n label?: ReactNode\n}\n\nexport type QueryOverlayProps<TOverlay> = {\n overlay: QueryOverlayApi<TOverlay>\n fallback?: ReactNode | QueryOverlayFallbackRender\n errorFallback?: ReactNode | QueryOverlayErrorFallbackRender\n children: (state: TOverlay, controls: QueryOverlayRenderControls) => ReactNode\n}\n\ntype QueryOverlayErrorBoundaryProps = {\n children?: ReactNode\n fallback: (error: unknown) => ReactNode\n resetKey: string\n}\n\nclass QueryOverlayErrorBoundary extends Component<QueryOverlayErrorBoundaryProps, { error: unknown | null }> {\n state = { error: null }\n\n static getDerivedStateFromError(error: unknown) {\n return { error }\n }\n\n componentDidCatch(error: unknown, errorInfo: ErrorInfo) {\n console.error(\"Query overlay rendering error\", error, errorInfo)\n }\n\n componentDidUpdate(previousProps: QueryOverlayErrorBoundaryProps) {\n if (this.state.error === null) return\n if (previousProps.resetKey === this.props.resetKey) return\n this.setState({ error: null })\n }\n\n render() {\n return this.state.error === null ? this.props.children : this.props.fallback(this.state.error)\n }\n}\n\nconst QUERY_OVERLAY_URL_CHANGE_EVENT = \"rpcbase-query-overlay-url-change\"\n\ntype UrlSnapshot = {\n pathname: string\n search: string\n hash: string\n}\n\nfunction getCurrentUrlSnapshot(fallback?: UrlSnapshot): UrlSnapshot {\n if (typeof window === \"undefined\") {\n return fallback ?? { pathname: \"\", search: \"\", hash: \"\" }\n }\n\n return {\n pathname: window.location.pathname,\n search: window.location.search,\n hash: window.location.hash,\n }\n}\n\nfunction getParamValueFromSearch(search: string, param: string) {\n return new URLSearchParams(search).get(param)\n}\n\nfunction getSearchFromUrlSnapshot(fallback?: UrlSnapshot) {\n return getCurrentUrlSnapshot(fallback).search\n}\n\nfunction useRouterUrlSnapshot(): UrlSnapshot | undefined {\n const context = useContext(UNSAFE_LocationContext)\n const location = context?.location\n if (!location) return undefined\n return {\n pathname: location.pathname,\n search: location.search,\n hash: location.hash,\n }\n}\n\nfunction getCurrentParamValue(param: string) {\n if (typeof window === \"undefined\") return null\n return getParamValueFromSearch(window.location.search, param)\n}\n\nfunction getCurrentSearch() {\n if (typeof window === \"undefined\") return \"\"\n return window.location.search\n}\n\nfunction subscribeToQueryOverlayUrl(listener: () => void) {\n if (typeof window === \"undefined\") return () => undefined\n\n window.addEventListener(QUERY_OVERLAY_URL_CHANGE_EVENT, listener)\n window.addEventListener(\"popstate\", listener)\n return () => {\n window.removeEventListener(QUERY_OVERLAY_URL_CHANGE_EVENT, listener)\n window.removeEventListener(\"popstate\", listener)\n }\n}\n\nfunction buildUrl(searchParams: URLSearchParams, fallback?: UrlSnapshot) {\n const { pathname, hash } = getCurrentUrlSnapshot(fallback)\n const nextSearch = searchParams.toString()\n return `${pathname}${nextSearch ? `?${nextSearch}` : \"\"}${hash}`\n}\n\nfunction clearOverlaySearchParams(\n searchParams: URLSearchParams,\n params: string[],\n clear: (params: URLSearchParams) => void,\n) {\n clear(searchParams)\n for (const param of params) {\n searchParams.delete(param)\n }\n}\n\nfunction buildOverlayUrlStateKey(search: string, params: string[]) {\n const searchParams = new URLSearchParams(search)\n return params\n .map((param) => {\n const values = searchParams.getAll(param)\n return `${param}:${values.join(\"\\u0000\")}`\n })\n .join(\"\\u0001\")\n}\n\nconst queryOverlayLoadingBackdropStyle = (open: boolean): CSSProperties => ({\n position: \"fixed\",\n inset: 0,\n zIndex: 50,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0, 0, 0, 0.5)\",\n color: \"white\",\n opacity: open ? 1 : 0,\n pointerEvents: open ? \"auto\" : \"none\",\n transition: \"opacity 150ms ease\",\n})\n\nconst queryOverlayLoadingStatusStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 10,\n fontSize: 14,\n fontWeight: 500,\n}\n\nexport function QueryOverlayLoadingFallback({\n open = true,\n label = \"Loading...\",\n}: QueryOverlayLoadingFallbackProps): ReactElement {\n const backdrop = createElement(\n \"div\",\n {\n \"data-rpcbase-query-overlay-loading\": \"\",\n \"data-state\": open ? \"open\" : \"closed\",\n style: queryOverlayLoadingBackdropStyle(open),\n },\n createElement(\n \"div\",\n {\n role: \"status\",\n \"aria-live\": \"polite\",\n style: queryOverlayLoadingStatusStyle,\n },\n createElement(\n \"svg\",\n {\n \"aria-hidden\": true,\n focusable: \"false\",\n height: 20,\n viewBox: \"0 0 24 24\",\n width: 20,\n },\n createElement(\"circle\", {\n cx: 12,\n cy: 12,\n fill: \"none\",\n r: 9,\n stroke: \"currentColor\",\n strokeOpacity: 0.35,\n strokeWidth: 3,\n }),\n createElement(\n \"path\",\n {\n d: \"M21 12a9 9 0 0 0-9-9\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeWidth: 3,\n },\n createElement(\"animateTransform\", {\n attributeName: \"transform\",\n dur: \"0.8s\",\n from: \"0 12 12\",\n repeatCount: \"indefinite\",\n to: \"360 12 12\",\n type: \"rotate\",\n }),\n ),\n ),\n createElement(\"span\", null, label),\n ),\n )\n\n return typeof document === \"undefined\" ? backdrop : createPortal(backdrop, document.body)\n}\n\nconst QUERY_OVERLAY_LOADING_FALLBACK = createElement(QueryOverlayLoadingFallback)\n\nfunction renderQueryOverlayFallback(\n fallback: ReactNode | QueryOverlayFallbackRender | QueryOverlayErrorFallbackRender | undefined,\n controls: QueryOverlayFallbackControls,\n error?: unknown,\n includeError = false,\n) {\n if (typeof fallback === \"function\") {\n if (!includeError) {\n return (fallback as QueryOverlayFallbackRender)(controls)\n }\n\n return (fallback as QueryOverlayErrorFallbackRender)({ ...controls, error })\n }\n\n if (isValidElement(fallback)) {\n return cloneElement(fallback as ReactElement<Record<string, unknown>>, {\n open: controls.open,\n isOpen: controls.open,\n setOpen: controls.setOpen,\n onOpenChange: controls.onOpenChange,\n closeOverlay: controls.closeOverlay,\n error,\n })\n }\n\n return fallback ?? null\n}\n\nexport function replaceQueryParams(update: (searchParams: URLSearchParams) => void) {\n if (typeof window === \"undefined\") return\n\n const { pathname, search, hash } = getCurrentUrlSnapshot()\n const searchParams = new URLSearchParams(search)\n update(searchParams)\n\n const nextUrl = buildUrl(searchParams)\n const currentUrl = `${pathname}${search}${hash}`\n if (nextUrl === currentUrl) return\n\n window.history.replaceState(window.history.state, \"\", nextUrl)\n window.dispatchEvent(new Event(QUERY_OVERLAY_URL_CHANGE_EVENT))\n}\n\nexport function useQueryParam(param: string): string | null {\n const routerUrlSnapshot = useRouterUrlSnapshot()\n return useSyncExternalStore(\n subscribeToQueryOverlayUrl,\n () => getCurrentParamValue(param),\n () => getParamValueFromSearch(routerUrlSnapshot?.search ?? \"\", param),\n )\n}\n\nexport function useQuerySearch(): string {\n const routerUrlSnapshot = useRouterUrlSnapshot()\n return useSyncExternalStore(\n subscribeToQueryOverlayUrl,\n getCurrentSearch,\n () => getSearchFromUrlSnapshot(routerUrlSnapshot),\n )\n}\n\nexport const useQueryOverlay = <TOverlay>({\n params,\n parse,\n write,\n clear,\n closeDelayMs = 0,\n}: UseQueryOverlayOptions<TOverlay>): QueryOverlayApi<TOverlay> => {\n const routerUrlSnapshot = useRouterUrlSnapshot()\n const search = useQuerySearch()\n const [isOptimisticallyClosed, setIsOptimisticallyClosed] = useState(false)\n const closeTimeoutRef = useRef<number | null>(null)\n const value = parse(new URLSearchParams(search))\n const isUrlOpen = value !== null\n const overlayUrlStateKey = buildOverlayUrlStateKey(search, params)\n\n const clearScheduledClose = () => {\n if (closeTimeoutRef.current === null) return\n window.clearTimeout(closeTimeoutRef.current)\n closeTimeoutRef.current = null\n }\n\n const resetOptimisticClose = () => {\n clearScheduledClose()\n setIsOptimisticallyClosed(false)\n }\n\n const closeUrlOverlay = () => {\n replaceQueryParams((searchParams) => {\n clearOverlaySearchParams(searchParams, params, clear)\n })\n }\n\n const buildHref = (nextValue: TOverlay | null): string => {\n const searchParams = new URLSearchParams(getCurrentUrlSnapshot(routerUrlSnapshot).search)\n clearOverlaySearchParams(searchParams, params, clear)\n\n if (nextValue !== null) {\n write(searchParams, nextValue)\n }\n\n return buildUrl(searchParams, routerUrlSnapshot)\n }\n\n const openOverlay = (nextValue: TOverlay) => {\n resetOptimisticClose()\n replaceQueryParams((searchParams) => {\n clearOverlaySearchParams(searchParams, params, clear)\n write(searchParams, nextValue)\n })\n }\n\n const closeOverlay = () => {\n if (!isUrlOpen) return\n\n setIsOptimisticallyClosed(true)\n clearScheduledClose()\n\n if (typeof window === \"undefined\" || closeDelayMs <= 0) {\n closeUrlOverlay()\n return\n }\n\n closeTimeoutRef.current = window.setTimeout(() => {\n closeTimeoutRef.current = null\n closeUrlOverlay()\n }, closeDelayMs)\n }\n\n useEffect(() => {\n if (isUrlOpen) {\n setIsOptimisticallyClosed(false)\n return\n }\n\n clearScheduledClose()\n setIsOptimisticallyClosed(false)\n }, [isUrlOpen, overlayUrlStateKey])\n\n useEffect(() => {\n return () => {\n clearScheduledClose()\n }\n }, [])\n\n return {\n isOpen: isUrlOpen && !isOptimisticallyClosed,\n shouldRender: isUrlOpen,\n value,\n buildHref,\n openOverlay,\n closeOverlay,\n resetOptimisticClose,\n }\n}\n\nexport function QueryOverlay<TOverlay>({\n overlay,\n fallback,\n errorFallback,\n children,\n}: QueryOverlayProps<TOverlay>): ReactElement | null {\n if (!overlay.shouldRender || overlay.value === null) return null\n\n const setOpen = (open: boolean) => {\n if (open) {\n overlay.resetOptimisticClose()\n return\n }\n\n overlay.closeOverlay()\n }\n\n const controls: QueryOverlayRenderControls = {\n open: overlay.isOpen,\n setOpen,\n closeOverlay: overlay.closeOverlay,\n resetOptimisticClose: overlay.resetOptimisticClose,\n }\n const fallbackControls = {\n ...controls,\n onOpenChange: setOpen,\n }\n const resetKey = overlay.buildHref(overlay.value)\n const suspenseFallback = fallback === undefined ? QUERY_OVERLAY_LOADING_FALLBACK : fallback\n\n return createElement(\n QueryOverlayErrorBoundary,\n {\n resetKey,\n fallback: (error: unknown) => renderQueryOverlayFallback(errorFallback, fallbackControls, error, true),\n },\n createElement(\n Suspense,\n {\n fallback: renderQueryOverlayFallback(suspenseFallback, fallbackControls),\n },\n children(overlay.value, controls),\n ),\n )\n}\n","import { useEffect, useRef } from \"react\"\nimport { useNavigate } from \"react-router\"\n\n\nexport type KeyboardShortcut = {\n key: string\n mod?: boolean\n ctrl?: boolean\n meta?: boolean\n alt?: boolean\n shift?: boolean\n}\n\nexport type ShortcutTrigger = \"keydown\" | \"keyup\"\n\nexport type UseShortcutPrefetchNavigateOptions = {\n shortcut: KeyboardShortcut\n getHref: () => string\n prefetch?: (href: string) => Promise<void> | void\n navigate?: (href: string) => Promise<void> | void\n trigger?: ShortcutTrigger\n enabled?: boolean\n preventDefault?: boolean\n ignoreTypingTarget?: boolean\n isTypingTarget?: (target: EventTarget | null) => boolean\n}\n\nconst normalizeKey = (key: string): string => key.toLowerCase()\n\nconst defaultIsTypingTarget = (target: EventTarget | null): boolean => {\n const element = target as HTMLElement | null\n const tagName = element?.tagName\n\n return (\n element?.isContentEditable === true ||\n tagName === \"INPUT\" ||\n tagName === \"TEXTAREA\" ||\n tagName === \"SELECT\"\n )\n}\n\nconst matchesShortcutKeyDown = (event: KeyboardEvent, shortcut: KeyboardShortcut): boolean => {\n if (normalizeKey(event.key) !== normalizeKey(shortcut.key)) return false\n\n if (typeof shortcut.mod === \"boolean\") {\n const hasMod = event.metaKey || event.ctrlKey\n if (hasMod !== shortcut.mod) return false\n }\n if (typeof shortcut.ctrl === \"boolean\" && event.ctrlKey !== shortcut.ctrl) return false\n if (typeof shortcut.meta === \"boolean\" && event.metaKey !== shortcut.meta) return false\n if (typeof shortcut.alt === \"boolean\" && event.altKey !== shortcut.alt) return false\n if (typeof shortcut.shift === \"boolean\" && event.shiftKey !== shortcut.shift) return false\n\n return true\n}\n\nconst callMaybeAsync = (fn: ((href: string) => Promise<void> | void) | undefined, href: string) => {\n if (!fn) return\n void Promise.resolve(fn(href))\n}\n\nexport const useShortcutPrefetchNavigate = ({\n shortcut,\n getHref,\n prefetch,\n navigate,\n trigger = \"keyup\",\n enabled = true,\n preventDefault = true,\n ignoreTypingTarget = true,\n isTypingTarget = defaultIsTypingTarget,\n}: UseShortcutPrefetchNavigateOptions): void => {\n const routerNavigate = useNavigate()\n\n const shortcutRef = useRef(shortcut)\n const getHrefRef = useRef(getHref)\n const prefetchRef = useRef(prefetch)\n const navigateRef = useRef(navigate ?? routerNavigate)\n const triggerRef = useRef(trigger)\n const enabledRef = useRef(enabled)\n const preventDefaultRef = useRef(preventDefault)\n const ignoreTypingTargetRef = useRef(ignoreTypingTarget)\n const isTypingTargetRef = useRef(isTypingTarget)\n const waitingForShortcutKeyUpRef = useRef(false)\n\n shortcutRef.current = shortcut\n getHrefRef.current = getHref\n prefetchRef.current = prefetch\n navigateRef.current = navigate ?? routerNavigate\n triggerRef.current = trigger\n enabledRef.current = enabled\n preventDefaultRef.current = preventDefault\n ignoreTypingTargetRef.current = ignoreTypingTarget\n isTypingTargetRef.current = isTypingTarget\n\n if (!enabled || trigger !== \"keyup\") {\n waitingForShortcutKeyUpRef.current = false\n }\n\n useEffect(() => {\n if (typeof window === \"undefined\") return\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!enabledRef.current) return\n if (ignoreTypingTargetRef.current && isTypingTargetRef.current(event.target)) return\n if (event.repeat) return\n if (!matchesShortcutKeyDown(event, shortcutRef.current)) return\n\n if (preventDefaultRef.current) {\n event.preventDefault()\n }\n\n const href = getHrefRef.current()\n if (!href) return\n\n callMaybeAsync(prefetchRef.current, href)\n\n if (triggerRef.current === \"keydown\") {\n callMaybeAsync(navigateRef.current, href)\n return\n }\n\n waitingForShortcutKeyUpRef.current = true\n }\n\n const onKeyUp = (event: KeyboardEvent) => {\n if (!enabledRef.current) return\n if (triggerRef.current !== \"keyup\") return\n if (!waitingForShortcutKeyUpRef.current) return\n if (normalizeKey(event.key) !== normalizeKey(shortcutRef.current.key)) return\n\n waitingForShortcutKeyUpRef.current = false\n\n if (ignoreTypingTargetRef.current && isTypingTargetRef.current(event.target)) return\n\n if (preventDefaultRef.current) {\n event.preventDefault()\n }\n\n const href = getHrefRef.current()\n if (!href) return\n\n callMaybeAsync(navigateRef.current, href)\n }\n\n const onBlur = () => {\n waitingForShortcutKeyUpRef.current = false\n }\n\n window.addEventListener(\"keydown\", onKeyDown)\n window.addEventListener(\"keyup\", onKeyUp)\n window.addEventListener(\"blur\", onBlur)\n\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown)\n window.removeEventListener(\"keyup\", onKeyUp)\n window.removeEventListener(\"blur\", onBlur)\n }\n }, [])\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["route","routeId","cached","prefetchPromise","error","href","router","to","target","reloadDocument","searchParams","nextValue","event","href"],"sources":["../src/routePrefetchHandles.ts","../src/routePrefetch.tsx","../src/Link.tsx","../src/lazyRoute.tsx","../src/useApplyMeta.tsx","../src/navigationGuards.ts","../src/queryOverlay.ts","../src/shortcutPrefetchNavigate.ts"],"sourcesContent":["export const ROUTE_MODULE_IMPORTER_HANDLE = \"__rpcbaseRouteModuleImporter\"\nexport const ROUTE_PREFETCH_DATA_HANDLE = \"prefetchData\"\n\nexport type RouteHandleObject = Record<string, unknown>\n\ntype RouteModuleImporter = () => Promise<unknown>\n\nconst isHandleObject = (value: unknown): value is RouteHandleObject =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value)\n\nexport const getRouteModuleImporterFromHandle = (handle: unknown): RouteModuleImporter | null => {\n if (!isHandleObject(handle)) return null\n\n const importer = handle[ROUTE_MODULE_IMPORTER_HANDLE]\n return typeof importer === \"function\" ? (importer as RouteModuleImporter) : null\n}\n\nexport const getRoutePrefetchDataFromHandle = (\n handle: unknown,\n key = ROUTE_PREFETCH_DATA_HANDLE,\n): boolean | undefined => {\n if (!isHandleObject(handle)) return undefined\n\n const value = handle[key]\n return typeof value === \"boolean\" ? value : undefined\n}\n\nexport const mergeRouteHandle = (\n handle: unknown,\n {\n importer,\n prefetchData,\n prefetchDataKey = ROUTE_PREFETCH_DATA_HANDLE,\n }: {\n importer?: RouteModuleImporter\n prefetchData?: boolean\n prefetchDataKey?: string\n },\n): RouteHandleObject => {\n const nextHandle: RouteHandleObject = isHandleObject(handle) ? { ...handle } : {}\n\n if (importer) {\n nextHandle[ROUTE_MODULE_IMPORTER_HANDLE] = importer\n }\n\n if (typeof prefetchData === \"boolean\") {\n nextHandle[prefetchDataKey] = prefetchData\n }\n\n return nextHandle\n}\n","import { ReactNode, createContext, useContext, useRef } from \"react\"\nimport {\n UNSAFE_DataRouterContext,\n matchRoutes,\n type DataRouteObject,\n type DataRouter,\n} from \"react-router\"\n\nimport {\n ROUTE_PREFETCH_DATA_HANDLE,\n getRouteModuleImporterFromHandle,\n getRoutePrefetchDataFromHandle,\n} from \"./routePrefetchHandles\"\n\n\nexport type RoutePrefetchBehavior = \"intent\" | \"render\" | \"none\" | \"viewport\"\n\nexport type RoutePrefetchCallOptions = {\n prefetchCode?: boolean\n prefetchData?: boolean\n}\n\nexport type RoutePrefetchApi = {\n defaultPrefetch: RoutePrefetchBehavior\n prefetch: (href: string, opts?: RoutePrefetchCallOptions) => Promise<void>\n prefetchCode: (href: string) => Promise<void>\n prefetchData: (href: string) => Promise<void>\n}\n\ntype RoutePrefetchContextValue = RoutePrefetchApi\n\ntype PrefetchableRoute = DataRouteObject & {\n handle?: unknown\n lazy?: () => Promise<Record<string, unknown>>\n}\n\ntype RoutePrefetchProviderProps = {\n children: ReactNode\n defaultPrefetch?: RoutePrefetchBehavior\n dataPrefetchTtlMs?: number\n dataPrefetchHandleKey?: string\n}\n\ntype DataCacheValue = {\n expiresAt: number\n promise: Promise<void>\n}\n\nconst noop = async () => {}\n\nconst DEFAULT_PREFETCH_API: RoutePrefetchContextValue = {\n defaultPrefetch: \"none\",\n prefetch: noop,\n prefetchCode: noop,\n prefetchData: noop,\n}\n\nconst RoutePrefetchContext = createContext<RoutePrefetchContextValue>(DEFAULT_PREFETCH_API)\n\nconst normalizeHref = (href: string): { pathWithSearch: string; pathname: string; search: string; hash: string } | null => {\n if (typeof window === \"undefined\") return null\n\n try {\n const url = new URL(href, window.location.origin)\n if (url.origin !== window.location.origin) return null\n return {\n pathWithSearch: `${url.pathname}${url.search}`,\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n }\n } catch {\n return null\n }\n}\n\nconst pruneDataCache = (cache: Map<string, DataCacheValue>, now: number): void => {\n cache.forEach((value, key) => {\n if (value.expiresAt <= now) {\n cache.delete(key)\n }\n })\n}\n\nconst resolveDataPrefetchFlag = (\n route: PrefetchableRoute,\n explicitPrefetchData: boolean | undefined,\n dataPrefetchHandleKey: string,\n): boolean => {\n if (typeof explicitPrefetchData === \"boolean\") {\n return explicitPrefetchData\n }\n\n const routeHandlePrefetchData = getRoutePrefetchDataFromHandle(route.handle, dataPrefetchHandleKey)\n if (typeof routeHandlePrefetchData === \"boolean\") {\n return routeHandlePrefetchData\n }\n\n return false\n}\n\nexport const RoutePrefetchProvider = ({\n children,\n defaultPrefetch = \"intent\",\n dataPrefetchTtlMs = 30000,\n dataPrefetchHandleKey = ROUTE_PREFETCH_DATA_HANDLE,\n}: RoutePrefetchProviderProps) => {\n const dataRouterContext = useContext(UNSAFE_DataRouterContext)\n const routeModuleCacheRef = useRef(new Map<string, Promise<Record<string, unknown> | null>>())\n const routeDataCacheRef = useRef(new Map<string, DataCacheValue>())\n\n const prefetchRouteModule = async (route: PrefetchableRoute): Promise<Record<string, unknown> | null> => {\n const routeId = route.id\n if (!routeId) return null\n\n const cached = routeModuleCacheRef.current.get(routeId)\n if (cached) {\n return cached\n }\n\n const lazyRouteLoader = typeof route.lazy === \"function\" ? route.lazy : null\n const routeModuleImporter = getRouteModuleImporterFromHandle(route.handle)\n if (!lazyRouteLoader && !routeModuleImporter) {\n return null\n }\n\n const prefetchPromise = Promise.resolve(lazyRouteLoader ? lazyRouteLoader() : routeModuleImporter!())\n .then((module) => {\n if (!module || typeof module !== \"object\") return null\n return module as Record<string, unknown>\n })\n .catch((error) => {\n routeModuleCacheRef.current.delete(routeId)\n throw error\n })\n\n routeModuleCacheRef.current.set(routeId, prefetchPromise)\n return prefetchPromise\n }\n\n const prefetchRouteData = async (router: DataRouter, route: PrefetchableRoute, href: string): Promise<void> => {\n const routeId = route.id\n if (!routeId) return\n\n const now = Date.now()\n pruneDataCache(routeDataCacheRef.current, now)\n\n const cacheKey = `${routeId}|${href}`\n const cached = routeDataCacheRef.current.get(cacheKey)\n if (cached && cached.expiresAt > now) {\n await cached.promise\n return\n }\n\n let hasLoader = typeof route.loader === \"function\"\n if (!hasLoader) {\n const loadedRouteModule = await prefetchRouteModule(route).catch(() => null)\n hasLoader = typeof loadedRouteModule?.loader === \"function\"\n }\n\n if (!hasLoader) return\n\n const fetcherKey = `rb:prefetch:${routeId}:${href}`\n\n const prefetchPromise = Promise.resolve(router.fetch(fetcherKey, routeId, href))\n .catch((error) => {\n routeDataCacheRef.current.delete(cacheKey)\n throw error\n })\n .finally(() => {\n try {\n router.deleteFetcher(fetcherKey)\n } catch {\n return\n }\n })\n\n const ttl = Math.max(1, dataPrefetchTtlMs)\n routeDataCacheRef.current.set(cacheKey, {\n expiresAt: now + ttl,\n promise: prefetchPromise,\n })\n\n await prefetchPromise\n }\n\n const prefetch = async (href: string, opts?: RoutePrefetchCallOptions): Promise<void> => {\n const normalized = normalizeHref(href)\n if (!normalized) return\n\n const currentPathWithSearch =\n typeof window === \"undefined\"\n ? \"\"\n : `${window.location.pathname}${window.location.search}`\n if (normalized.pathWithSearch === currentPathWithSearch) {\n return\n }\n\n const router = dataRouterContext?.router as DataRouter | undefined\n if (!router) return\n\n const matches = matchRoutes(\n router.routes,\n {\n pathname: normalized.pathname,\n search: normalized.search,\n hash: normalized.hash,\n },\n router.basename,\n )\n\n if (!matches || matches.length === 0) {\n return\n }\n\n const matchedRoutes = matches.map((match) => match.route as PrefetchableRoute)\n\n if (opts?.prefetchCode !== false) {\n await Promise.all(\n matchedRoutes.map(async (route) => {\n try {\n await prefetchRouteModule(route)\n } catch {\n return\n }\n }),\n )\n }\n\n await Promise.all(\n matchedRoutes.map(async (route) => {\n if (!resolveDataPrefetchFlag(route, opts?.prefetchData, dataPrefetchHandleKey)) {\n return\n }\n\n try {\n await prefetchRouteData(router, route, normalized.pathWithSearch)\n } catch {\n return\n }\n }),\n )\n }\n\n return (\n <RoutePrefetchContext.Provider\n value={{\n defaultPrefetch,\n prefetch,\n prefetchCode: async (href) => prefetch(href, { prefetchCode: true, prefetchData: false }),\n prefetchData: async (href) => prefetch(href, { prefetchCode: false, prefetchData: true }),\n }}\n >\n {children}\n </RoutePrefetchContext.Provider>\n )\n}\n\nexport const useRoutePrefetch = (): RoutePrefetchApi => useContext(RoutePrefetchContext)\n\nexport type { RoutePrefetchProviderProps }\n","import { forwardRef, useEffect, useRef, type Ref, type SyntheticEvent } from \"react\"\nimport { Link as RouterLink, type LinkProps as RouterLinkProps } from \"react-router\"\n\nimport { type RoutePrefetchBehavior, useRoutePrefetch } from \"./routePrefetch\"\n\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i\n\ntype LinkProps = Omit<RouterLinkProps, \"prefetch\"> & {\n prefetch?: RoutePrefetchBehavior\n prefetchData?: boolean\n}\n\nconst assignRef = <TValue,>(ref: Ref<TValue> | undefined, value: TValue) => {\n if (!ref) return\n if (typeof ref === \"function\") {\n ref(value)\n return\n }\n ref.current = value\n}\n\nconst composeEventHandlers = <TEvent extends SyntheticEvent>(\n theirHandler: ((event: TEvent) => void) | undefined,\n ourHandler: () => void,\n) => {\n return (event: TEvent) => {\n theirHandler?.(event)\n if (!event.defaultPrevented) {\n ourHandler()\n }\n }\n}\n\nconst shouldPrefetchLink = ({\n prefetch,\n reloadDocument,\n target,\n to,\n}: {\n prefetch: RoutePrefetchBehavior\n reloadDocument: boolean | undefined\n target: string | undefined\n to: RouterLinkProps[\"to\"]\n}): boolean => {\n if (prefetch === \"none\") return false\n if (reloadDocument) return false\n if (typeof target === \"string\" && target !== \"_self\") return false\n if (typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to)) return false\n return true\n}\n\nconst usePrefetchLink = (\n prefetchData: boolean | undefined,\n): {\n anchorRef: Ref<HTMLAnchorElement>\n prefetchHref: () => void\n getAnchorElement: () => HTMLAnchorElement | null\n} => {\n const localRef = useRef<HTMLAnchorElement | null>(null)\n const { prefetch } = useRoutePrefetch()\n\n return {\n anchorRef: (node) => {\n localRef.current = node\n },\n getAnchorElement: () => localRef.current,\n prefetchHref: () => {\n const href = localRef.current?.getAttribute(\"href\")\n if (!href) return\n void prefetch(href, { prefetchData })\n },\n }\n}\n\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>(\n (\n {\n prefetch: prefetchProp,\n prefetchData,\n onMouseEnter,\n onFocus,\n onTouchStart,\n reloadDocument,\n target,\n to,\n ...props\n },\n forwardedRef,\n ) => {\n const { defaultPrefetch } = useRoutePrefetch()\n const prefetchBehavior = prefetchProp ?? defaultPrefetch\n const viewportPrefetchedRef = useRef(false)\n const { anchorRef, prefetchHref, getAnchorElement } = usePrefetchLink(prefetchData)\n const canPrefetch = shouldPrefetchLink({\n prefetch: prefetchBehavior,\n reloadDocument,\n target,\n to,\n })\n\n useEffect(() => {\n viewportPrefetchedRef.current = false\n }, [to])\n\n useEffect(() => {\n if (!canPrefetch || prefetchBehavior !== \"render\") return\n prefetchHref()\n }, [canPrefetch, prefetchBehavior, prefetchHref])\n\n useEffect(() => {\n if (!canPrefetch || prefetchBehavior !== \"viewport\") return\n\n const element = getAnchorElement()\n if (!element || typeof IntersectionObserver === \"undefined\") return\n\n const observer = new IntersectionObserver(\n (entries) => {\n const isVisible = entries.some((entry) => entry.isIntersecting)\n if (!isVisible || viewportPrefetchedRef.current) return\n viewportPrefetchedRef.current = true\n prefetchHref()\n },\n { threshold: 0.5 },\n )\n\n observer.observe(element)\n return () => {\n observer.disconnect()\n }\n }, [canPrefetch, prefetchBehavior, prefetchHref, getAnchorElement])\n\n const handleIntentPrefetch = () => {\n if (!canPrefetch || prefetchBehavior !== \"intent\") return\n prefetchHref()\n }\n\n return (\n <RouterLink\n {...props}\n to={to}\n target={target}\n reloadDocument={reloadDocument}\n prefetch=\"none\"\n onMouseEnter={composeEventHandlers(onMouseEnter, handleIntentPrefetch)}\n onFocus={composeEventHandlers(onFocus, handleIntentPrefetch)}\n onTouchStart={composeEventHandlers(onTouchStart, handleIntentPrefetch)}\n ref={(node) => {\n assignRef(forwardedRef, node)\n assignRef(anchorRef, node)\n }}\n />\n )\n },\n)\n\nLink.displayName = \"Link\"\n\nexport type { LinkProps }\n","import { LoaderFunction } from \"react-router\"\n\nimport { mergeRouteHandle, RouteHandleObject } from \"./routePrefetchHandles\"\n\n\ntype RouteModuleLoader = (...args: any[]) => unknown\n\ntype RouteModule = {\n default: React.ComponentType<unknown>\n loader?: RouteModuleLoader\n}\n\ntype RouteModuleImporter = () => Promise<RouteModule>\n\ntype RouteOptions = {\n handle?: unknown\n prefetchData?: boolean\n prefetchDataKey?: string\n}\n\ntype LazyRouteResult = {\n lazy: () => Promise<{\n Component: React.ComponentType<unknown>\n loader?: LoaderFunction\n }>\n handle: RouteHandleObject\n}\n\nconst DYNAMIC_IMPORT_RELOAD_GUARD_MS = 60_000\nconst DYNAMIC_IMPORT_RELOAD_TIMEOUT_MS = 5_000\nconst DYNAMIC_IMPORT_RELOAD_STORAGE_KEY = \"rpcbase:dynamic-import-reload-at\"\nconst DYNAMIC_IMPORT_ERROR_PATTERNS = [\n /failed to fetch dynamically imported module/i,\n /importing a module script failed/i,\n /error loading dynamically imported module/i,\n /networkerror when attempting to fetch resource/i,\n /unable to preload css/i,\n /loading (?:css )?chunk .+ failed/i,\n]\n\nconst isDynamicImportError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : typeof error === \"string\" ? error : \"\"\n return DYNAMIC_IMPORT_ERROR_PATTERNS.some((pattern) => pattern.test(message))\n}\n\nconst markPageReloadRequested = (): boolean => {\n if (typeof window === \"undefined\") return false\n if (typeof navigator !== \"undefined\" && navigator.onLine === false) return false\n\n const now = Date.now()\n\n try {\n const previousReloadAt = Number(window.sessionStorage.getItem(DYNAMIC_IMPORT_RELOAD_STORAGE_KEY))\n if (Number.isFinite(previousReloadAt) && now - previousReloadAt < DYNAMIC_IMPORT_RELOAD_GUARD_MS) {\n return false\n }\n window.sessionStorage.setItem(DYNAMIC_IMPORT_RELOAD_STORAGE_KEY, String(now))\n } catch {\n return false\n }\n\n return true\n}\n\nconst clearPageReloadGuard = (): void => {\n try {\n window.sessionStorage.removeItem(DYNAMIC_IMPORT_RELOAD_STORAGE_KEY)\n } catch {\n return\n }\n}\n\nconst reloadPage = (error: unknown): Promise<never> =>\n new Promise((_, reject) => {\n let pending = true\n\n const rejectIfPageRemains = () => {\n if (!pending) return\n pending = false\n window.removeEventListener(\"pagehide\", handlePageHide)\n clearPageReloadGuard()\n reject(error)\n }\n\n const timeout = window.setTimeout(rejectIfPageRemains, DYNAMIC_IMPORT_RELOAD_TIMEOUT_MS)\n const handlePageHide = () => {\n if (!pending) return\n pending = false\n window.clearTimeout(timeout)\n }\n\n window.addEventListener(\"pagehide\", handlePageHide, { once: true })\n\n try {\n window.location.reload()\n } catch {\n rejectIfPageRemains()\n }\n })\n\nconst memoizeImporter = (importer: RouteModuleImporter): RouteModuleImporter => {\n let promise: Promise<RouteModule> | null = null\n\n return async () => {\n if (!promise) {\n promise = importer().catch((error) => {\n promise = null\n throw error\n })\n }\n\n return promise\n }\n}\n\nexport const lazyRoute = (importer: RouteModuleImporter, opts?: RouteOptions): LazyRouteResult => {\n const loadModule = memoizeImporter(importer)\n\n return {\n lazy: async () => {\n let module: RouteModule\n try {\n module = await loadModule()\n } catch (error) {\n if (isDynamicImportError(error) && markPageReloadRequested()) {\n return reloadPage(error)\n }\n throw error\n }\n const lazyRouteModule: {\n Component: React.ComponentType<unknown>\n loader?: LoaderFunction\n } = {\n Component: module.default,\n }\n\n if (typeof module.loader === \"function\") {\n lazyRouteModule.loader = module.loader as unknown as LoaderFunction\n }\n\n return lazyRouteModule\n },\n handle: mergeRouteHandle(opts?.handle, {\n importer: loadModule,\n prefetchData: opts?.prefetchData,\n prefetchDataKey: opts?.prefetchDataKey,\n }),\n }\n}\n","import { useEffect } from \"react\"\nimport { useLocation } from \"react-router\"\n\n\ntype MetaAttributeValue = string | number | boolean | undefined\ntype MetaEntry = Record<string, MetaAttributeValue>\n\ntype PageMeta = {\n title: string\n meta: MetaEntry[]\n}\n\n\nexport const useApplyMeta = ({\n defaultTitle = \"\",\n defaultMeta = [],\n pagesMeta = {}\n}: {\n defaultTitle?: string\n defaultMeta?: MetaEntry[]\n pagesMeta?: Record<string, PageMeta>\n} = {}) => {\n const location = useLocation()\n\n useEffect(() => {\n const loadMeta = async () => {\n\n let pageMeta = pagesMeta[location.pathname]\n\n if (!pageMeta) {\n pageMeta = { title: defaultTitle, meta: defaultMeta }\n }\n\n document.title = pageMeta.title\n\n // Remove previous dynamically inserted tags\n document.querySelectorAll(\"[data-react-meta]\").forEach((tag) => tag.remove())\n\n // Inject new tags\n pageMeta.meta.forEach((meta) => {\n const metaElement = document.createElement(\"meta\")\n metaElement.setAttribute(\"data-react-meta\", \"true\")\n\n // Set all attributes from the meta object\n Object.entries(meta).forEach(([key, value]) => {\n if (value) {\n metaElement.setAttribute(key, value.toString())\n }\n })\n\n document.head.appendChild(metaElement)\n })\n\n // Update canonical link\n const canonicalUrl = `${window.location.origin}${location.pathname}`\n\n const existingCanonical = document.querySelector(\"link[rel=\\\"canonical\\\"]\")\n if (existingCanonical) {\n existingCanonical.remove()\n }\n\n const canonicalLink = document.createElement(\"link\")\n canonicalLink.setAttribute(\"rel\", \"canonical\")\n canonicalLink.setAttribute(\"href\", canonicalUrl)\n canonicalLink.setAttribute(\"data-react-meta\", \"true\")\n document.head.appendChild(canonicalLink)\n }\n\n loadMeta()\n }, [location.pathname, defaultTitle, defaultMeta, pagesMeta])\n}\n","import { useEffect, useRef } from \"react\"\nimport type { BlockerFunction } from \"react-router\"\n\n\nexport type NavigationGuard = {\n id: string\n enabled: boolean\n priority?: number\n message: string\n blockOnSearch?: boolean\n shouldBlockNavigation: BlockerFunction\n shouldBlockUnload: boolean\n}\n\ntype NavigationGuardsListener = () => void\n\ntype NavigationGuardsStore = {\n guards: Map<string, NavigationGuard>\n listeners: Set<NavigationGuardsListener>\n}\n\nconst NAVIGATION_GUARDS_STORE_KEY = \"__rpcbaseNavigationGuardsStore\"\n\nconst getNavigationGuardsStore = (): NavigationGuardsStore => {\n const globalAny = globalThis as {\n [NAVIGATION_GUARDS_STORE_KEY]?: NavigationGuardsStore\n }\n\n const existing = globalAny[NAVIGATION_GUARDS_STORE_KEY]\n if (existing) {\n return existing\n }\n\n const created: NavigationGuardsStore = {\n guards: new Map<string, NavigationGuard>(),\n listeners: new Set<NavigationGuardsListener>(),\n }\n\n globalAny[NAVIGATION_GUARDS_STORE_KEY] = created\n return created\n}\n\nconst notify = (): void => {\n getNavigationGuardsStore().listeners.forEach((listener) => {\n listener()\n })\n}\n\nconst isSameGuard = (a: NavigationGuard, b: NavigationGuard): boolean =>\n a.id === b.id &&\n a.enabled === b.enabled &&\n a.priority === b.priority &&\n a.message === b.message &&\n a.blockOnSearch === b.blockOnSearch &&\n a.shouldBlockNavigation === b.shouldBlockNavigation &&\n a.shouldBlockUnload === b.shouldBlockUnload\n\nexport const upsertNavigationGuard = (guard: NavigationGuard): void => {\n const guards = getNavigationGuardsStore().guards\n const prev = guards.get(guard.id)\n if (prev && isSameGuard(prev, guard)) {\n return\n }\n\n guards.set(guard.id, guard)\n notify()\n}\n\nexport const removeNavigationGuard = (id: string): void => {\n const guards = getNavigationGuardsStore().guards\n const didDelete = guards.delete(id)\n if (didDelete) {\n notify()\n }\n}\n\nexport const getNavigationGuards = (): NavigationGuard[] =>\n Array.from(getNavigationGuardsStore().guards.values())\n\nexport const subscribeNavigationGuards = (\n listener: NavigationGuardsListener,\n): (() => void) => {\n const listeners = getNavigationGuardsStore().listeners\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nexport const useRegisterNavigationGuard = (guard: NavigationGuard): void => {\n const latestGuardRef = useRef(guard)\n latestGuardRef.current = guard\n\n const lastIdRef = useRef<string | null>(null)\n\n useEffect(() => {\n const lastId = lastIdRef.current\n if (lastId && lastId !== guard.id) {\n removeNavigationGuard(lastId)\n }\n lastIdRef.current = guard.id\n\n if (!guard.enabled) {\n removeNavigationGuard(guard.id)\n return\n }\n\n upsertNavigationGuard(latestGuardRef.current)\n return () => {\n removeNavigationGuard(guard.id)\n }\n }, [\n guard.id,\n guard.enabled,\n guard.message,\n guard.priority,\n guard.blockOnSearch,\n guard.shouldBlockNavigation,\n guard.shouldBlockUnload,\n ])\n}\n","import {\n Component,\n Suspense,\n cloneElement,\n createElement,\n isValidElement,\n useContext,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type ErrorInfo,\n type ReactElement,\n type ReactNode,\n} from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { UNSAFE_LocationContext } from \"react-router\"\n\n\nexport type UseQueryOverlayOptions<TOverlay> = {\n params: string[]\n parse: (params: URLSearchParams) => TOverlay | null\n write: (params: URLSearchParams, state: TOverlay) => void\n clear: (params: URLSearchParams) => void\n closeDelayMs?: number\n}\n\nexport type QueryOverlayApi<TOverlay> = {\n value: TOverlay | null\n isOpen: boolean\n shouldRender: boolean\n buildHref: (nextValue: TOverlay | null) => string\n openOverlay: (nextValue: TOverlay) => void\n closeOverlay: () => void\n resetOptimisticClose: () => void\n}\n\nexport type QueryOverlayRenderControls = {\n open: boolean\n setOpen: (open: boolean) => void\n closeOverlay: () => void\n resetOptimisticClose: () => void\n}\n\nexport type QueryOverlayFallbackControls = QueryOverlayRenderControls & {\n onOpenChange: (open: boolean) => void\n}\n\nexport type QueryOverlayFallbackRender = (controls: QueryOverlayFallbackControls) => ReactNode\n\nexport type QueryOverlayErrorFallbackRender = (\n controls: QueryOverlayFallbackControls & {\n error: unknown\n },\n) => ReactNode\n\nexport type QueryOverlayLoadingFallbackProps = {\n open?: boolean\n label?: ReactNode\n}\n\nexport type QueryOverlayProps<TOverlay> = {\n overlay: QueryOverlayApi<TOverlay>\n fallback?: ReactNode | QueryOverlayFallbackRender\n errorFallback?: ReactNode | QueryOverlayErrorFallbackRender\n children: (state: TOverlay, controls: QueryOverlayRenderControls) => ReactNode\n}\n\ntype QueryOverlayErrorBoundaryProps = {\n children?: ReactNode\n fallback: (error: unknown) => ReactNode\n resetKey: string\n}\n\nclass QueryOverlayErrorBoundary extends Component<QueryOverlayErrorBoundaryProps, { error: unknown | null }> {\n state = { error: null }\n\n static getDerivedStateFromError(error: unknown) {\n return { error }\n }\n\n componentDidCatch(error: unknown, errorInfo: ErrorInfo) {\n console.error(\"Query overlay rendering error\", error, errorInfo)\n }\n\n componentDidUpdate(previousProps: QueryOverlayErrorBoundaryProps) {\n if (this.state.error === null) return\n if (previousProps.resetKey === this.props.resetKey) return\n this.setState({ error: null })\n }\n\n render() {\n return this.state.error === null ? this.props.children : this.props.fallback(this.state.error)\n }\n}\n\nconst QUERY_OVERLAY_URL_CHANGE_EVENT = \"rpcbase-query-overlay-url-change\"\n\ntype UrlSnapshot = {\n pathname: string\n search: string\n hash: string\n}\n\nfunction getCurrentUrlSnapshot(fallback?: UrlSnapshot): UrlSnapshot {\n if (typeof window === \"undefined\") {\n return fallback ?? { pathname: \"\", search: \"\", hash: \"\" }\n }\n\n return {\n pathname: window.location.pathname,\n search: window.location.search,\n hash: window.location.hash,\n }\n}\n\nfunction getParamValueFromSearch(search: string, param: string) {\n return new URLSearchParams(search).get(param)\n}\n\nfunction getSearchFromUrlSnapshot(fallback?: UrlSnapshot) {\n return getCurrentUrlSnapshot(fallback).search\n}\n\nfunction useRouterUrlSnapshot(): UrlSnapshot | undefined {\n const context = useContext(UNSAFE_LocationContext)\n const location = context?.location\n if (!location) return undefined\n return {\n pathname: location.pathname,\n search: location.search,\n hash: location.hash,\n }\n}\n\nfunction getCurrentParamValue(param: string) {\n if (typeof window === \"undefined\") return null\n return getParamValueFromSearch(window.location.search, param)\n}\n\nfunction getCurrentSearch() {\n if (typeof window === \"undefined\") return \"\"\n return window.location.search\n}\n\nfunction subscribeToQueryOverlayUrl(listener: () => void) {\n if (typeof window === \"undefined\") return () => undefined\n\n window.addEventListener(QUERY_OVERLAY_URL_CHANGE_EVENT, listener)\n window.addEventListener(\"popstate\", listener)\n return () => {\n window.removeEventListener(QUERY_OVERLAY_URL_CHANGE_EVENT, listener)\n window.removeEventListener(\"popstate\", listener)\n }\n}\n\nfunction buildUrl(searchParams: URLSearchParams, fallback?: UrlSnapshot) {\n const { pathname, hash } = getCurrentUrlSnapshot(fallback)\n const nextSearch = searchParams.toString()\n return `${pathname}${nextSearch ? `?${nextSearch}` : \"\"}${hash}`\n}\n\nfunction clearOverlaySearchParams(\n searchParams: URLSearchParams,\n params: string[],\n clear: (params: URLSearchParams) => void,\n) {\n clear(searchParams)\n for (const param of params) {\n searchParams.delete(param)\n }\n}\n\nfunction buildOverlayUrlStateKey(search: string, params: string[]) {\n const searchParams = new URLSearchParams(search)\n return params\n .map((param) => {\n const values = searchParams.getAll(param)\n return `${param}:${values.join(\"\\u0000\")}`\n })\n .join(\"\\u0001\")\n}\n\nconst queryOverlayLoadingBackdropStyle = (open: boolean): CSSProperties => ({\n position: \"fixed\",\n inset: 0,\n zIndex: 50,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0, 0, 0, 0.5)\",\n color: \"white\",\n opacity: open ? 1 : 0,\n pointerEvents: open ? \"auto\" : \"none\",\n transition: \"opacity 150ms ease\",\n})\n\nconst queryOverlayLoadingStatusStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 10,\n fontSize: 14,\n fontWeight: 500,\n}\n\nexport function QueryOverlayLoadingFallback({\n open = true,\n label = \"Loading...\",\n}: QueryOverlayLoadingFallbackProps): ReactElement {\n const backdrop = createElement(\n \"div\",\n {\n \"data-rpcbase-query-overlay-loading\": \"\",\n \"data-state\": open ? \"open\" : \"closed\",\n style: queryOverlayLoadingBackdropStyle(open),\n },\n createElement(\n \"div\",\n {\n role: \"status\",\n \"aria-live\": \"polite\",\n style: queryOverlayLoadingStatusStyle,\n },\n createElement(\n \"svg\",\n {\n \"aria-hidden\": true,\n focusable: \"false\",\n height: 20,\n viewBox: \"0 0 24 24\",\n width: 20,\n },\n createElement(\"circle\", {\n cx: 12,\n cy: 12,\n fill: \"none\",\n r: 9,\n stroke: \"currentColor\",\n strokeOpacity: 0.35,\n strokeWidth: 3,\n }),\n createElement(\n \"path\",\n {\n d: \"M21 12a9 9 0 0 0-9-9\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeWidth: 3,\n },\n createElement(\"animateTransform\", {\n attributeName: \"transform\",\n dur: \"0.8s\",\n from: \"0 12 12\",\n repeatCount: \"indefinite\",\n to: \"360 12 12\",\n type: \"rotate\",\n }),\n ),\n ),\n createElement(\"span\", null, label),\n ),\n )\n\n return typeof document === \"undefined\" ? backdrop : createPortal(backdrop, document.body)\n}\n\nconst QUERY_OVERLAY_LOADING_FALLBACK = createElement(QueryOverlayLoadingFallback)\n\nfunction renderQueryOverlayFallback(\n fallback: ReactNode | QueryOverlayFallbackRender | QueryOverlayErrorFallbackRender | undefined,\n controls: QueryOverlayFallbackControls,\n error?: unknown,\n includeError = false,\n) {\n if (typeof fallback === \"function\") {\n if (!includeError) {\n return (fallback as QueryOverlayFallbackRender)(controls)\n }\n\n return (fallback as QueryOverlayErrorFallbackRender)({ ...controls, error })\n }\n\n if (isValidElement(fallback)) {\n return cloneElement(fallback as ReactElement<Record<string, unknown>>, {\n open: controls.open,\n isOpen: controls.open,\n setOpen: controls.setOpen,\n onOpenChange: controls.onOpenChange,\n closeOverlay: controls.closeOverlay,\n error,\n })\n }\n\n return fallback ?? null\n}\n\nexport function replaceQueryParams(update: (searchParams: URLSearchParams) => void) {\n if (typeof window === \"undefined\") return\n\n const { pathname, search, hash } = getCurrentUrlSnapshot()\n const searchParams = new URLSearchParams(search)\n update(searchParams)\n\n const nextUrl = buildUrl(searchParams)\n const currentUrl = `${pathname}${search}${hash}`\n if (nextUrl === currentUrl) return\n\n window.history.replaceState(window.history.state, \"\", nextUrl)\n window.dispatchEvent(new Event(QUERY_OVERLAY_URL_CHANGE_EVENT))\n}\n\nexport function useQueryParam(param: string): string | null {\n const routerUrlSnapshot = useRouterUrlSnapshot()\n return useSyncExternalStore(\n subscribeToQueryOverlayUrl,\n () => getCurrentParamValue(param),\n () => getParamValueFromSearch(routerUrlSnapshot?.search ?? \"\", param),\n )\n}\n\nexport function useQuerySearch(): string {\n const routerUrlSnapshot = useRouterUrlSnapshot()\n return useSyncExternalStore(\n subscribeToQueryOverlayUrl,\n getCurrentSearch,\n () => getSearchFromUrlSnapshot(routerUrlSnapshot),\n )\n}\n\nexport const useQueryOverlay = <TOverlay>({\n params,\n parse,\n write,\n clear,\n closeDelayMs = 0,\n}: UseQueryOverlayOptions<TOverlay>): QueryOverlayApi<TOverlay> => {\n const routerUrlSnapshot = useRouterUrlSnapshot()\n const search = useQuerySearch()\n const [isOptimisticallyClosed, setIsOptimisticallyClosed] = useState(false)\n const closeTimeoutRef = useRef<number | null>(null)\n const value = parse(new URLSearchParams(search))\n const isUrlOpen = value !== null\n const overlayUrlStateKey = buildOverlayUrlStateKey(search, params)\n\n const clearScheduledClose = () => {\n if (closeTimeoutRef.current === null) return\n window.clearTimeout(closeTimeoutRef.current)\n closeTimeoutRef.current = null\n }\n\n const resetOptimisticClose = () => {\n clearScheduledClose()\n setIsOptimisticallyClosed(false)\n }\n\n const closeUrlOverlay = () => {\n replaceQueryParams((searchParams) => {\n clearOverlaySearchParams(searchParams, params, clear)\n })\n }\n\n const buildHref = (nextValue: TOverlay | null): string => {\n const searchParams = new URLSearchParams(getCurrentUrlSnapshot(routerUrlSnapshot).search)\n clearOverlaySearchParams(searchParams, params, clear)\n\n if (nextValue !== null) {\n write(searchParams, nextValue)\n }\n\n return buildUrl(searchParams, routerUrlSnapshot)\n }\n\n const openOverlay = (nextValue: TOverlay) => {\n resetOptimisticClose()\n replaceQueryParams((searchParams) => {\n clearOverlaySearchParams(searchParams, params, clear)\n write(searchParams, nextValue)\n })\n }\n\n const closeOverlay = () => {\n if (!isUrlOpen) return\n\n setIsOptimisticallyClosed(true)\n clearScheduledClose()\n\n if (typeof window === \"undefined\" || closeDelayMs <= 0) {\n closeUrlOverlay()\n return\n }\n\n closeTimeoutRef.current = window.setTimeout(() => {\n closeTimeoutRef.current = null\n closeUrlOverlay()\n }, closeDelayMs)\n }\n\n useEffect(() => {\n if (isUrlOpen) {\n setIsOptimisticallyClosed(false)\n return\n }\n\n clearScheduledClose()\n setIsOptimisticallyClosed(false)\n }, [isUrlOpen, overlayUrlStateKey])\n\n useEffect(() => {\n return () => {\n clearScheduledClose()\n }\n }, [])\n\n return {\n isOpen: isUrlOpen && !isOptimisticallyClosed,\n shouldRender: isUrlOpen,\n value,\n buildHref,\n openOverlay,\n closeOverlay,\n resetOptimisticClose,\n }\n}\n\nexport function QueryOverlay<TOverlay>({\n overlay,\n fallback,\n errorFallback,\n children,\n}: QueryOverlayProps<TOverlay>): ReactElement | null {\n if (!overlay.shouldRender || overlay.value === null) return null\n\n const setOpen = (open: boolean) => {\n if (open) {\n overlay.resetOptimisticClose()\n return\n }\n\n overlay.closeOverlay()\n }\n\n const controls: QueryOverlayRenderControls = {\n open: overlay.isOpen,\n setOpen,\n closeOverlay: overlay.closeOverlay,\n resetOptimisticClose: overlay.resetOptimisticClose,\n }\n const fallbackControls = {\n ...controls,\n onOpenChange: setOpen,\n }\n const resetKey = overlay.buildHref(overlay.value)\n const suspenseFallback = fallback === undefined ? QUERY_OVERLAY_LOADING_FALLBACK : fallback\n\n return createElement(\n QueryOverlayErrorBoundary,\n {\n resetKey,\n fallback: (error: unknown) => renderQueryOverlayFallback(errorFallback, fallbackControls, error, true),\n },\n createElement(\n Suspense,\n {\n fallback: renderQueryOverlayFallback(suspenseFallback, fallbackControls),\n },\n children(overlay.value, controls),\n ),\n )\n}\n","import { useEffect, useRef } from \"react\"\nimport { useNavigate } from \"react-router\"\n\n\nexport type KeyboardShortcut = {\n key: string\n mod?: boolean\n ctrl?: boolean\n meta?: boolean\n alt?: boolean\n shift?: boolean\n}\n\nexport type ShortcutTrigger = \"keydown\" | \"keyup\"\n\nexport type UseShortcutPrefetchNavigateOptions = {\n shortcut: KeyboardShortcut\n getHref: () => string\n prefetch?: (href: string) => Promise<void> | void\n navigate?: (href: string) => Promise<void> | void\n trigger?: ShortcutTrigger\n enabled?: boolean\n preventDefault?: boolean\n ignoreTypingTarget?: boolean\n isTypingTarget?: (target: EventTarget | null) => boolean\n}\n\nconst normalizeKey = (key: string): string => key.toLowerCase()\n\nconst defaultIsTypingTarget = (target: EventTarget | null): boolean => {\n const element = target as HTMLElement | null\n const tagName = element?.tagName\n\n return (\n element?.isContentEditable === true ||\n tagName === \"INPUT\" ||\n tagName === \"TEXTAREA\" ||\n tagName === \"SELECT\"\n )\n}\n\nconst matchesShortcutKeyDown = (event: KeyboardEvent, shortcut: KeyboardShortcut): boolean => {\n if (normalizeKey(event.key) !== normalizeKey(shortcut.key)) return false\n\n if (typeof shortcut.mod === \"boolean\") {\n const hasMod = event.metaKey || event.ctrlKey\n if (hasMod !== shortcut.mod) return false\n }\n if (typeof shortcut.ctrl === \"boolean\" && event.ctrlKey !== shortcut.ctrl) return false\n if (typeof shortcut.meta === \"boolean\" && event.metaKey !== shortcut.meta) return false\n if (typeof shortcut.alt === \"boolean\" && event.altKey !== shortcut.alt) return false\n if (typeof shortcut.shift === \"boolean\" && event.shiftKey !== shortcut.shift) return false\n\n return true\n}\n\nconst callMaybeAsync = (fn: ((href: string) => Promise<void> | void) | undefined, href: string) => {\n if (!fn) return\n void Promise.resolve(fn(href))\n}\n\nexport const useShortcutPrefetchNavigate = ({\n shortcut,\n getHref,\n prefetch,\n navigate,\n trigger = \"keyup\",\n enabled = true,\n preventDefault = true,\n ignoreTypingTarget = true,\n isTypingTarget = defaultIsTypingTarget,\n}: UseShortcutPrefetchNavigateOptions): void => {\n const routerNavigate = useNavigate()\n\n const shortcutRef = useRef(shortcut)\n const getHrefRef = useRef(getHref)\n const prefetchRef = useRef(prefetch)\n const navigateRef = useRef(navigate ?? routerNavigate)\n const triggerRef = useRef(trigger)\n const enabledRef = useRef(enabled)\n const preventDefaultRef = useRef(preventDefault)\n const ignoreTypingTargetRef = useRef(ignoreTypingTarget)\n const isTypingTargetRef = useRef(isTypingTarget)\n const waitingForShortcutKeyUpRef = useRef(false)\n\n shortcutRef.current = shortcut\n getHrefRef.current = getHref\n prefetchRef.current = prefetch\n navigateRef.current = navigate ?? routerNavigate\n triggerRef.current = trigger\n enabledRef.current = enabled\n preventDefaultRef.current = preventDefault\n ignoreTypingTargetRef.current = ignoreTypingTarget\n isTypingTargetRef.current = isTypingTarget\n\n if (!enabled || trigger !== \"keyup\") {\n waitingForShortcutKeyUpRef.current = false\n }\n\n useEffect(() => {\n if (typeof window === \"undefined\") return\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!enabledRef.current) return\n if (ignoreTypingTargetRef.current && isTypingTargetRef.current(event.target)) return\n if (event.repeat) return\n if (!matchesShortcutKeyDown(event, shortcutRef.current)) return\n\n if (preventDefaultRef.current) {\n event.preventDefault()\n }\n\n const href = getHrefRef.current()\n if (!href) return\n\n callMaybeAsync(prefetchRef.current, href)\n\n if (triggerRef.current === \"keydown\") {\n callMaybeAsync(navigateRef.current, href)\n return\n }\n\n waitingForShortcutKeyUpRef.current = true\n }\n\n const onKeyUp = (event: KeyboardEvent) => {\n if (!enabledRef.current) return\n if (triggerRef.current !== \"keyup\") return\n if (!waitingForShortcutKeyUpRef.current) return\n if (normalizeKey(event.key) !== normalizeKey(shortcutRef.current.key)) return\n\n waitingForShortcutKeyUpRef.current = false\n\n if (ignoreTypingTargetRef.current && isTypingTargetRef.current(event.target)) return\n\n if (preventDefaultRef.current) {\n event.preventDefault()\n }\n\n const href = getHrefRef.current()\n if (!href) return\n\n callMaybeAsync(navigateRef.current, href)\n }\n\n const onBlur = () => {\n waitingForShortcutKeyUpRef.current = false\n }\n\n window.addEventListener(\"keydown\", onKeyDown)\n window.addEventListener(\"keyup\", onKeyUp)\n window.addEventListener(\"blur\", onBlur)\n\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown)\n window.removeEventListener(\"keyup\", onKeyUp)\n window.removeEventListener(\"blur\", onBlur)\n }\n }, [])\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"lazyRoute.d.ts","sourceRoot":"","sources":["../src/lazyRoute.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAoB,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAG5E,KAAK,iBAAiB,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAA;AAEpD,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IACrC,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B,CAAA;AAED,KAAK,mBAAmB,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAA;AAErD,KAAK,YAAY,GAAG;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,MAAM,OAAO,CAAC;QAClB,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QACvC,MAAM,CAAC,EAAE,cAAc,CAAA;KACxB,CAAC,CAAA;IACF,MAAM,EAAE,iBAAiB,CAAA;CAC1B,CAAA;AAiBD,eAAO,MAAM,SAAS,GAAI,UAAU,mBAAmB,EAAE,OAAO,YAAY,KAAG,eAyB9E,CAAA"}
1
+ {"version":3,"file":"lazyRoute.d.ts","sourceRoot":"","sources":["../src/lazyRoute.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAE7C,OAAO,EAAoB,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAG5E,KAAK,iBAAiB,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAA;AAEpD,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IACrC,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B,CAAA;AAED,KAAK,mBAAmB,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAA;AAErD,KAAK,YAAY,GAAG;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,MAAM,OAAO,CAAC;QAClB,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QACvC,MAAM,CAAC,EAAE,cAAc,CAAA;KACxB,CAAC,CAAA;IACF,MAAM,EAAE,iBAAiB,CAAA;CAC1B,CAAA;AAyFD,eAAO,MAAM,SAAS,GAAI,UAAU,mBAAmB,EAAE,OAAO,YAAY,KAAG,eAiC9E,CAAA"}
@@ -16,7 +16,7 @@ type RoutePrefetchProviderProps = {
16
16
  dataPrefetchTtlMs?: number;
17
17
  dataPrefetchHandleKey?: string;
18
18
  };
19
- export declare const RoutePrefetchProvider: ({ children, defaultPrefetch, dataPrefetchTtlMs, dataPrefetchHandleKey, }: RoutePrefetchProviderProps) => import("react/jsx-runtime").JSX.Element;
19
+ export declare const RoutePrefetchProvider: ({ children, defaultPrefetch, dataPrefetchTtlMs, dataPrefetchHandleKey, }: RoutePrefetchProviderProps) => import("react").JSX.Element;
20
20
  export declare const useRoutePrefetch: () => RoutePrefetchApi;
21
21
  export type { RoutePrefetchProviderProps };
22
22
  //# sourceMappingURL=routePrefetch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"routePrefetch.d.ts","sourceRoot":"","sources":["../src/routePrefetch.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqC,MAAM,OAAO,CAAA;AAepE,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;AAE7E,MAAM,MAAM,wBAAwB,GAAG;IACrC,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,eAAe,EAAE,qBAAqB,CAAA;IACtC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1E,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9C,CAAA;AASD,KAAK,0BAA0B,GAAG;IAChC,QAAQ,EAAE,SAAS,CAAA;IACnB,eAAe,CAAC,EAAE,qBAAqB,CAAA;IACvC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B,CAAA;AA4DD,eAAO,MAAM,qBAAqB,GAAI,0EAKnC,0BAA0B,4CAsJ5B,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAO,gBAAoD,CAAA;AAExF,YAAY,EAAE,0BAA0B,EAAE,CAAA"}
1
+ {"version":3,"file":"routePrefetch.d.ts","sourceRoot":"","sources":["../src/routePrefetch.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqC,MAAM,OAAO,CAAA;AAepE,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;AAE7E,MAAM,MAAM,wBAAwB,GAAG;IACrC,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,eAAe,EAAE,qBAAqB,CAAA;IACtC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1E,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9C,CAAA;AASD,KAAK,0BAA0B,GAAG;IAChC,QAAQ,EAAE,SAAS,CAAA;IACnB,eAAe,CAAC,EAAE,qBAAqB,CAAA;IACvC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B,CAAA;AA4DD,eAAO,MAAM,qBAAqB,GAAI,0EAKnC,0BAA0B,gCAsJ5B,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAO,gBAAoD,CAAA;AAExF,YAAY,EAAE,0BAA0B,EAAE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpcbase/router",
3
- "version": "0.166.0",
3
+ "version": "0.168.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -62,6 +62,9 @@
62
62
  }
63
63
  }
64
64
  },
65
+ "peerDependencies": {
66
+ "react-router": "^7.0.0 || ^8.0.0"
67
+ },
65
68
  "dependencies": {},
66
69
  "devDependencies": {}
67
70
  }