@rpcbase/router 0.93.0 → 0.95.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 ADDED
@@ -0,0 +1,75 @@
1
+ # `@rpcbase/router`
2
+
3
+ ## `lazyRoute` (replacement for `loadRoute`)
4
+
5
+ `loadRoute` has been removed.
6
+ Use `lazyRoute` everywhere.
7
+
8
+ ### Migration (drop-in)
9
+
10
+ Before:
11
+
12
+ ```tsx
13
+ import { Route, loadRoute } from "@rpcbase/router"
14
+
15
+ const homePageRoute = loadRoute(import("@/pages/HomePage"))
16
+
17
+ <Route path="/" {...homePageRoute} />
18
+ ```
19
+
20
+ After:
21
+
22
+ ```tsx
23
+ import { Route, lazyRoute } from "@rpcbase/router"
24
+
25
+ const homePageRoute = lazyRoute(() => import("@/pages/HomePage"))
26
+
27
+ <Route path="/" {...homePageRoute} />
28
+ ```
29
+
30
+ ## Route module contract
31
+
32
+ A lazy route module should export:
33
+
34
+ - `default`: React component
35
+ - `loader` (optional): route loader
36
+
37
+ ```tsx
38
+ export default function HomePage() {
39
+ return <h1>Home</h1>
40
+ }
41
+
42
+ export const loader = async ({ ctx }) => {
43
+ return { user: ctx.req.session?.user ?? null }
44
+ }
45
+ ```
46
+
47
+ ## Promise behavior (important)
48
+
49
+ Use a function that returns the import promise:
50
+
51
+ ```tsx
52
+ lazyRoute(() => import("@/pages/HomePage"))
53
+ ```
54
+
55
+ Do not pass an already-started promise:
56
+
57
+ ```tsx
58
+ lazyRoute(import("@/pages/HomePage"))
59
+ ```
60
+
61
+ Why:
62
+
63
+ - `() => import(...)` delays loading until route lazy resolution/prefetch.
64
+ - The importer is memoized, so concurrent lazy/load/prefetch calls share the same promise.
65
+
66
+ ## Optional prefetch data flag
67
+
68
+ Code prefetch can happen without data prefetch by default.
69
+ If you want route data prefetch for a route, set `prefetchData: true`:
70
+
71
+ ```tsx
72
+ const reportsRoute = lazyRoute(() => import("@/pages/ReportsPage"), {
73
+ prefetchData: true,
74
+ })
75
+ ```
package/dist/Link.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ import { LinkProps as RouterLinkProps } from 'react-router';
2
+ import { RoutePrefetchBehavior } from './routePrefetch';
3
+ type LinkProps = Omit<RouterLinkProps, "prefetch"> & {
4
+ prefetch?: RoutePrefetchBehavior;
5
+ prefetchData?: boolean;
6
+ };
7
+ export declare const Link: import('react').ForwardRefExoticComponent<Omit<RouterLinkProps, "prefetch"> & {
8
+ prefetch?: RoutePrefetchBehavior;
9
+ prefetchData?: boolean;
10
+ } & import('react').RefAttributes<HTMLAnchorElement>>;
11
+ export type { LinkProps };
12
+ //# sourceMappingURL=Link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../src/Link.tsx"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,SAAS,IAAI,eAAe,EAAE,MAAM,cAAc,CAAA;AAEpF,OAAO,EAAE,KAAK,qBAAqB,EAAoB,MAAM,iBAAiB,CAAA;AAK9E,KAAK,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GAAG;IACnD,QAAQ,CAAC,EAAE,qBAAqB,CAAA;IAChC,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAgED,eAAO,MAAM,IAAI;eAlEJ,qBAAqB;mBACjB,OAAO;qDAgJvB,CAAA;AAID,YAAY,EAAE,SAAS,EAAE,CAAA"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  export * from 'react-router';
2
- export * from './loadRoute';
2
+ export { Link } from './Link';
3
+ export type { LinkProps } from './Link';
4
+ export * from './lazyRoute';
3
5
  export * from './useApplyMeta';
4
6
  export * from './navigationGuards';
7
+ export * from './routePrefetch';
5
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACvC,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA"}
package/dist/index.js CHANGED
@@ -1,22 +1,617 @@
1
- import { useLocation } from "react-router";
1
+ import { UNSAFE_DataRouterContext, matchRoutes, Link as Link$1, useLocation } from "react-router";
2
2
  export * from "react-router";
3
- import { lazy, useEffect, useRef } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
4
  import { c } from "react/compiler-runtime";
5
- const loadRoute = (importPromise) => {
6
- const Component = lazy(async () => {
7
- const module = await importPromise;
5
+ import { createContext, useContext, useRef, forwardRef, useEffect } from "react";
6
+ const ROUTE_MODULE_IMPORTER_HANDLE = "__rpcbaseRouteModuleImporter";
7
+ const ROUTE_PREFETCH_DATA_HANDLE = "prefetchData";
8
+ const isHandleObject = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
9
+ const getRouteModuleImporterFromHandle = (handle) => {
10
+ if (!isHandleObject(handle)) return null;
11
+ const importer = handle[ROUTE_MODULE_IMPORTER_HANDLE];
12
+ return typeof importer === "function" ? importer : null;
13
+ };
14
+ const getRoutePrefetchDataFromHandle = (handle, key = ROUTE_PREFETCH_DATA_HANDLE) => {
15
+ if (!isHandleObject(handle)) return void 0;
16
+ const value = handle[key];
17
+ return typeof value === "boolean" ? value : void 0;
18
+ };
19
+ const mergeRouteHandle = (handle, {
20
+ importer,
21
+ prefetchData,
22
+ prefetchDataKey = ROUTE_PREFETCH_DATA_HANDLE
23
+ }) => {
24
+ const nextHandle = isHandleObject(handle) ? {
25
+ ...handle
26
+ } : {};
27
+ if (importer) {
28
+ nextHandle[ROUTE_MODULE_IMPORTER_HANDLE] = importer;
29
+ }
30
+ if (typeof prefetchData === "boolean") {
31
+ nextHandle[prefetchDataKey] = prefetchData;
32
+ }
33
+ return nextHandle;
34
+ };
35
+ const noop = async () => {
36
+ };
37
+ const DEFAULT_PREFETCH_API = {
38
+ defaultPrefetch: "none",
39
+ prefetch: noop,
40
+ prefetchCode: noop,
41
+ prefetchData: noop
42
+ };
43
+ const RoutePrefetchContext = createContext(DEFAULT_PREFETCH_API);
44
+ const normalizeHref = (href) => {
45
+ if (typeof window === "undefined") return null;
46
+ try {
47
+ const url = new URL(href, window.location.origin);
48
+ if (url.origin !== window.location.origin) return null;
8
49
  return {
9
- default: module.default
50
+ pathWithSearch: `${url.pathname}${url.search}`,
51
+ pathname: url.pathname,
52
+ search: url.search,
53
+ hash: url.hash
10
54
  };
55
+ } catch {
56
+ return null;
57
+ }
58
+ };
59
+ const pruneDataCache = (cache, now) => {
60
+ cache.forEach((value, key) => {
61
+ if (value.expiresAt <= now) {
62
+ cache.delete(key);
63
+ }
11
64
  });
12
- const loader = async (args) => {
13
- const module = await importPromise;
14
- if (!module.loader) return null;
15
- return module.loader(args);
65
+ };
66
+ const resolveDataPrefetchFlag = (route, explicitPrefetchData, dataPrefetchHandleKey) => {
67
+ if (typeof explicitPrefetchData === "boolean") {
68
+ return explicitPrefetchData;
69
+ }
70
+ const routeHandlePrefetchData = getRoutePrefetchDataFromHandle(route.handle, dataPrefetchHandleKey);
71
+ if (typeof routeHandlePrefetchData === "boolean") {
72
+ return routeHandlePrefetchData;
73
+ }
74
+ return false;
75
+ };
76
+ const RoutePrefetchProvider = (t0) => {
77
+ const $ = c(20);
78
+ const {
79
+ children,
80
+ defaultPrefetch: t1,
81
+ dataPrefetchTtlMs: t2,
82
+ dataPrefetchHandleKey: t3
83
+ } = t0;
84
+ const defaultPrefetch = t1 === void 0 ? "intent" : t1;
85
+ const dataPrefetchTtlMs = t2 === void 0 ? 3e4 : t2;
86
+ const dataPrefetchHandleKey = t3 === void 0 ? ROUTE_PREFETCH_DATA_HANDLE : t3;
87
+ const dataRouterContext = useContext(UNSAFE_DataRouterContext);
88
+ let t4;
89
+ if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
90
+ t4 = /* @__PURE__ */ new Map();
91
+ $[0] = t4;
92
+ } else {
93
+ t4 = $[0];
94
+ }
95
+ const routeModuleCacheRef = useRef(t4);
96
+ let t5;
97
+ if ($[1] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
98
+ t5 = /* @__PURE__ */ new Map();
99
+ $[1] = t5;
100
+ } else {
101
+ t5 = $[1];
102
+ }
103
+ const routeDataCacheRef = useRef(t5);
104
+ let t6;
105
+ if ($[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
106
+ t6 = async (route) => {
107
+ const routeId = route.id;
108
+ if (!routeId) {
109
+ return null;
110
+ }
111
+ const cached = routeModuleCacheRef.current.get(routeId);
112
+ if (cached) {
113
+ return cached;
114
+ }
115
+ const lazyRouteLoader = typeof route.lazy === "function" ? route.lazy : null;
116
+ const routeModuleImporter = getRouteModuleImporterFromHandle(route.handle);
117
+ if (!lazyRouteLoader && !routeModuleImporter) {
118
+ return null;
119
+ }
120
+ const prefetchPromise = Promise.resolve(lazyRouteLoader ? lazyRouteLoader() : routeModuleImporter()).then(_temp$2).catch((error) => {
121
+ routeModuleCacheRef.current.delete(routeId);
122
+ throw error;
123
+ });
124
+ routeModuleCacheRef.current.set(routeId, prefetchPromise);
125
+ return prefetchPromise;
126
+ };
127
+ $[2] = t6;
128
+ } else {
129
+ t6 = $[2];
130
+ }
131
+ const prefetchRouteModule = t6;
132
+ let t7;
133
+ if ($[3] !== dataPrefetchTtlMs) {
134
+ t7 = async (router, route_0, href) => {
135
+ const routeId_0 = route_0.id;
136
+ if (!routeId_0) {
137
+ return;
138
+ }
139
+ const now = Date.now();
140
+ pruneDataCache(routeDataCacheRef.current, now);
141
+ const cacheKey = `${routeId_0}|${href}`;
142
+ const cached_0 = routeDataCacheRef.current.get(cacheKey);
143
+ if (cached_0 && cached_0.expiresAt > now) {
144
+ await cached_0.promise;
145
+ return;
146
+ }
147
+ let hasLoader = typeof route_0.loader === "function";
148
+ if (!hasLoader) {
149
+ const loadedRouteModule = await prefetchRouteModule(route_0).catch(_temp2$1);
150
+ hasLoader = typeof loadedRouteModule?.loader === "function";
151
+ }
152
+ if (!hasLoader) {
153
+ return;
154
+ }
155
+ const fetcherKey = `rb:prefetch:${routeId_0}:${href}`;
156
+ const prefetchPromise_0 = Promise.resolve(router.fetch(fetcherKey, routeId_0, href)).catch((error_0) => {
157
+ routeDataCacheRef.current.delete(cacheKey);
158
+ throw error_0;
159
+ }).finally(() => {
160
+ try {
161
+ router.deleteFetcher(fetcherKey);
162
+ } catch {
163
+ return;
164
+ }
165
+ });
166
+ const ttl = Math.max(1, dataPrefetchTtlMs);
167
+ routeDataCacheRef.current.set(cacheKey, {
168
+ expiresAt: now + ttl,
169
+ promise: prefetchPromise_0
170
+ });
171
+ await prefetchPromise_0;
172
+ };
173
+ $[3] = dataPrefetchTtlMs;
174
+ $[4] = t7;
175
+ } else {
176
+ t7 = $[4];
177
+ }
178
+ const prefetchRouteData = t7;
179
+ let t8;
180
+ if ($[5] !== dataPrefetchHandleKey || $[6] !== dataRouterContext?.router || $[7] !== prefetchRouteData) {
181
+ t8 = async (href_0, opts) => {
182
+ const normalized = normalizeHref(href_0);
183
+ if (!normalized) {
184
+ return;
185
+ }
186
+ const currentPathWithSearch = typeof window === "undefined" ? "" : `${window.location.pathname}${window.location.search}`;
187
+ if (normalized.pathWithSearch === currentPathWithSearch) {
188
+ return;
189
+ }
190
+ const router_0 = dataRouterContext?.router;
191
+ if (!router_0) {
192
+ return;
193
+ }
194
+ const matches = matchRoutes(router_0.routes, {
195
+ pathname: normalized.pathname,
196
+ search: normalized.search,
197
+ hash: normalized.hash
198
+ }, router_0.basename);
199
+ if (!matches || matches.length === 0) {
200
+ return;
201
+ }
202
+ const matchedRoutes = matches.map(_temp3);
203
+ if (opts?.prefetchCode !== false) {
204
+ await Promise.all(matchedRoutes.map(async (route_1) => {
205
+ try {
206
+ await prefetchRouteModule(route_1);
207
+ } catch {
208
+ return;
209
+ }
210
+ }));
211
+ }
212
+ await Promise.all(matchedRoutes.map(async (route_2) => {
213
+ if (!resolveDataPrefetchFlag(route_2, opts?.prefetchData, dataPrefetchHandleKey)) {
214
+ return;
215
+ }
216
+ try {
217
+ await prefetchRouteData(router_0, route_2, normalized.pathWithSearch);
218
+ } catch {
219
+ return;
220
+ }
221
+ }));
222
+ };
223
+ $[5] = dataPrefetchHandleKey;
224
+ $[6] = dataRouterContext?.router;
225
+ $[7] = prefetchRouteData;
226
+ $[8] = t8;
227
+ } else {
228
+ t8 = $[8];
229
+ }
230
+ const prefetch = t8;
231
+ let t10;
232
+ let t9;
233
+ if ($[9] !== prefetch) {
234
+ t9 = async (href_1) => prefetch(href_1, {
235
+ prefetchCode: true,
236
+ prefetchData: false
237
+ });
238
+ t10 = async (href_2) => prefetch(href_2, {
239
+ prefetchCode: false,
240
+ prefetchData: true
241
+ });
242
+ $[9] = prefetch;
243
+ $[10] = t10;
244
+ $[11] = t9;
245
+ } else {
246
+ t10 = $[10];
247
+ t9 = $[11];
248
+ }
249
+ let t11;
250
+ if ($[12] !== defaultPrefetch || $[13] !== prefetch || $[14] !== t10 || $[15] !== t9) {
251
+ t11 = {
252
+ defaultPrefetch,
253
+ prefetch,
254
+ prefetchCode: t9,
255
+ prefetchData: t10
256
+ };
257
+ $[12] = defaultPrefetch;
258
+ $[13] = prefetch;
259
+ $[14] = t10;
260
+ $[15] = t9;
261
+ $[16] = t11;
262
+ } else {
263
+ t11 = $[16];
264
+ }
265
+ let t12;
266
+ if ($[17] !== children || $[18] !== t11) {
267
+ t12 = /* @__PURE__ */ jsx(RoutePrefetchContext.Provider, { value: t11, children });
268
+ $[17] = children;
269
+ $[18] = t11;
270
+ $[19] = t12;
271
+ } else {
272
+ t12 = $[19];
273
+ }
274
+ return t12;
275
+ };
276
+ const useRoutePrefetch = () => {
277
+ return useContext(RoutePrefetchContext);
278
+ };
279
+ function _temp$2(module) {
280
+ if (!module || typeof module !== "object") {
281
+ return null;
282
+ }
283
+ return module;
284
+ }
285
+ function _temp2$1() {
286
+ return null;
287
+ }
288
+ function _temp3(match) {
289
+ return match.route;
290
+ }
291
+ const ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
292
+ const assignRef = (ref, value) => {
293
+ if (!ref) return;
294
+ if (typeof ref === "function") {
295
+ ref(value);
296
+ return;
297
+ }
298
+ ref.current = value;
299
+ };
300
+ const composeEventHandlers = (theirHandler, ourHandler) => {
301
+ return (event) => {
302
+ theirHandler?.(event);
303
+ if (!event.defaultPrevented) {
304
+ ourHandler();
305
+ }
306
+ };
307
+ };
308
+ const shouldPrefetchLink = ({
309
+ prefetch,
310
+ reloadDocument,
311
+ target,
312
+ to
313
+ }) => {
314
+ if (prefetch === "none") return false;
315
+ if (reloadDocument) return false;
316
+ if (typeof target === "string" && target !== "_self") return false;
317
+ if (typeof to === "string" && ABSOLUTE_URL_REGEX.test(to)) return false;
318
+ return true;
319
+ };
320
+ const usePrefetchLink = (prefetchData) => {
321
+ const $ = c(5);
322
+ const localRef = useRef(null);
323
+ const {
324
+ prefetch
325
+ } = useRoutePrefetch();
326
+ let t0;
327
+ let t1;
328
+ if ($[0] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
329
+ t0 = (node) => {
330
+ localRef.current = node;
331
+ };
332
+ t1 = () => localRef.current;
333
+ $[0] = t0;
334
+ $[1] = t1;
335
+ } else {
336
+ t0 = $[0];
337
+ t1 = $[1];
338
+ }
339
+ let t2;
340
+ if ($[2] !== prefetch || $[3] !== prefetchData) {
341
+ t2 = {
342
+ anchorRef: t0,
343
+ getAnchorElement: t1,
344
+ prefetchHref: () => {
345
+ const href = localRef.current?.getAttribute("href");
346
+ if (!href) {
347
+ return;
348
+ }
349
+ prefetch(href, {
350
+ prefetchData
351
+ });
352
+ }
353
+ };
354
+ $[2] = prefetch;
355
+ $[3] = prefetchData;
356
+ $[4] = t2;
357
+ } else {
358
+ t2 = $[4];
359
+ }
360
+ return t2;
361
+ };
362
+ const Link = forwardRef((t0, forwardedRef) => {
363
+ const $ = c(54);
364
+ let onFocus;
365
+ let onMouseEnter;
366
+ let onTouchStart;
367
+ let prefetchData;
368
+ let prefetchProp;
369
+ let props;
370
+ let reloadDocument;
371
+ let target;
372
+ let to;
373
+ if ($[0] !== t0) {
374
+ ({
375
+ prefetch: prefetchProp,
376
+ prefetchData,
377
+ onMouseEnter,
378
+ onFocus,
379
+ onTouchStart,
380
+ reloadDocument,
381
+ target,
382
+ to,
383
+ ...props
384
+ } = t0);
385
+ $[0] = t0;
386
+ $[1] = onFocus;
387
+ $[2] = onMouseEnter;
388
+ $[3] = onTouchStart;
389
+ $[4] = prefetchData;
390
+ $[5] = prefetchProp;
391
+ $[6] = props;
392
+ $[7] = reloadDocument;
393
+ $[8] = target;
394
+ $[9] = to;
395
+ } else {
396
+ onFocus = $[1];
397
+ onMouseEnter = $[2];
398
+ onTouchStart = $[3];
399
+ prefetchData = $[4];
400
+ prefetchProp = $[5];
401
+ props = $[6];
402
+ reloadDocument = $[7];
403
+ target = $[8];
404
+ to = $[9];
405
+ }
406
+ const {
407
+ defaultPrefetch
408
+ } = useRoutePrefetch();
409
+ const prefetchBehavior = prefetchProp ?? defaultPrefetch;
410
+ const viewportPrefetchedRef = useRef(false);
411
+ const {
412
+ anchorRef,
413
+ prefetchHref,
414
+ getAnchorElement
415
+ } = usePrefetchLink(prefetchData);
416
+ let t1;
417
+ if ($[10] !== prefetchBehavior || $[11] !== reloadDocument || $[12] !== target || $[13] !== to) {
418
+ t1 = shouldPrefetchLink({
419
+ prefetch: prefetchBehavior,
420
+ reloadDocument,
421
+ target,
422
+ to
423
+ });
424
+ $[10] = prefetchBehavior;
425
+ $[11] = reloadDocument;
426
+ $[12] = target;
427
+ $[13] = to;
428
+ $[14] = t1;
429
+ } else {
430
+ t1 = $[14];
431
+ }
432
+ const canPrefetch = t1;
433
+ let t2;
434
+ if ($[15] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel")) {
435
+ t2 = () => {
436
+ viewportPrefetchedRef.current = false;
437
+ };
438
+ $[15] = t2;
439
+ } else {
440
+ t2 = $[15];
441
+ }
442
+ let t3;
443
+ if ($[16] !== to) {
444
+ t3 = [to];
445
+ $[16] = to;
446
+ $[17] = t3;
447
+ } else {
448
+ t3 = $[17];
449
+ }
450
+ useEffect(t2, t3);
451
+ let t4;
452
+ let t5;
453
+ if ($[18] !== canPrefetch || $[19] !== prefetchBehavior || $[20] !== prefetchHref) {
454
+ t4 = () => {
455
+ if (!canPrefetch || prefetchBehavior !== "render") {
456
+ return;
457
+ }
458
+ prefetchHref();
459
+ };
460
+ t5 = [canPrefetch, prefetchBehavior, prefetchHref];
461
+ $[18] = canPrefetch;
462
+ $[19] = prefetchBehavior;
463
+ $[20] = prefetchHref;
464
+ $[21] = t4;
465
+ $[22] = t5;
466
+ } else {
467
+ t4 = $[21];
468
+ t5 = $[22];
469
+ }
470
+ useEffect(t4, t5);
471
+ let t6;
472
+ let t7;
473
+ if ($[23] !== canPrefetch || $[24] !== getAnchorElement || $[25] !== prefetchBehavior || $[26] !== prefetchHref) {
474
+ t6 = () => {
475
+ if (!canPrefetch || prefetchBehavior !== "viewport") {
476
+ return;
477
+ }
478
+ const element = getAnchorElement();
479
+ if (!element || typeof IntersectionObserver === "undefined") {
480
+ return;
481
+ }
482
+ const observer = new IntersectionObserver((entries) => {
483
+ const isVisible = entries.some(_temp$1);
484
+ if (!isVisible || viewportPrefetchedRef.current) {
485
+ return;
486
+ }
487
+ viewportPrefetchedRef.current = true;
488
+ prefetchHref();
489
+ }, {
490
+ threshold: 0.5
491
+ });
492
+ observer.observe(element);
493
+ return () => {
494
+ observer.disconnect();
495
+ };
496
+ };
497
+ t7 = [canPrefetch, prefetchBehavior, prefetchHref, getAnchorElement];
498
+ $[23] = canPrefetch;
499
+ $[24] = getAnchorElement;
500
+ $[25] = prefetchBehavior;
501
+ $[26] = prefetchHref;
502
+ $[27] = t6;
503
+ $[28] = t7;
504
+ } else {
505
+ t6 = $[27];
506
+ t7 = $[28];
507
+ }
508
+ useEffect(t6, t7);
509
+ let t8;
510
+ if ($[29] !== canPrefetch || $[30] !== prefetchBehavior || $[31] !== prefetchHref) {
511
+ t8 = () => {
512
+ if (!canPrefetch || prefetchBehavior !== "intent") {
513
+ return;
514
+ }
515
+ prefetchHref();
516
+ };
517
+ $[29] = canPrefetch;
518
+ $[30] = prefetchBehavior;
519
+ $[31] = prefetchHref;
520
+ $[32] = t8;
521
+ } else {
522
+ t8 = $[32];
523
+ }
524
+ const handleIntentPrefetch = t8;
525
+ let t9;
526
+ if ($[33] !== handleIntentPrefetch || $[34] !== onMouseEnter) {
527
+ t9 = composeEventHandlers(onMouseEnter, handleIntentPrefetch);
528
+ $[33] = handleIntentPrefetch;
529
+ $[34] = onMouseEnter;
530
+ $[35] = t9;
531
+ } else {
532
+ t9 = $[35];
533
+ }
534
+ let t10;
535
+ if ($[36] !== handleIntentPrefetch || $[37] !== onFocus) {
536
+ t10 = composeEventHandlers(onFocus, handleIntentPrefetch);
537
+ $[36] = handleIntentPrefetch;
538
+ $[37] = onFocus;
539
+ $[38] = t10;
540
+ } else {
541
+ t10 = $[38];
542
+ }
543
+ let t11;
544
+ if ($[39] !== handleIntentPrefetch || $[40] !== onTouchStart) {
545
+ t11 = composeEventHandlers(onTouchStart, handleIntentPrefetch);
546
+ $[39] = handleIntentPrefetch;
547
+ $[40] = onTouchStart;
548
+ $[41] = t11;
549
+ } else {
550
+ t11 = $[41];
551
+ }
552
+ let t12;
553
+ if ($[42] !== anchorRef || $[43] !== forwardedRef) {
554
+ t12 = (node) => {
555
+ assignRef(forwardedRef, node);
556
+ assignRef(anchorRef, node);
557
+ };
558
+ $[42] = anchorRef;
559
+ $[43] = forwardedRef;
560
+ $[44] = t12;
561
+ } else {
562
+ t12 = $[44];
563
+ }
564
+ let t13;
565
+ if ($[45] !== props || $[46] !== reloadDocument || $[47] !== t10 || $[48] !== t11 || $[49] !== t12 || $[50] !== t9 || $[51] !== target || $[52] !== to) {
566
+ t13 = /* @__PURE__ */ jsx(Link$1, { ...props, to, target, reloadDocument, prefetch: "none", onMouseEnter: t9, onFocus: t10, onTouchStart: t11, ref: t12 });
567
+ $[45] = props;
568
+ $[46] = reloadDocument;
569
+ $[47] = t10;
570
+ $[48] = t11;
571
+ $[49] = t12;
572
+ $[50] = t9;
573
+ $[51] = target;
574
+ $[52] = to;
575
+ $[53] = t13;
576
+ } else {
577
+ t13 = $[53];
578
+ }
579
+ return t13;
580
+ });
581
+ Link.displayName = "Link";
582
+ function _temp$1(entry) {
583
+ return entry.isIntersecting;
584
+ }
585
+ const memoizeImporter = (importer) => {
586
+ let promise = null;
587
+ return async () => {
588
+ if (!promise) {
589
+ promise = importer().catch((error) => {
590
+ promise = null;
591
+ throw error;
592
+ });
593
+ }
594
+ return promise;
16
595
  };
596
+ };
597
+ const lazyRoute = (importer, opts) => {
598
+ const loadModule = memoizeImporter(importer);
17
599
  return {
18
- Component,
19
- loader
600
+ lazy: async () => {
601
+ const module = await loadModule();
602
+ const lazyRouteModule = {
603
+ Component: module.default
604
+ };
605
+ if (typeof module.loader === "function") {
606
+ lazyRouteModule.loader = module.loader;
607
+ }
608
+ return lazyRouteModule;
609
+ },
610
+ handle: mergeRouteHandle(opts?.handle, {
611
+ importer: loadModule,
612
+ prefetchData: opts?.prefetchData,
613
+ prefetchDataKey: opts?.prefetchDataKey
614
+ })
20
615
  };
21
616
  };
22
617
  const useApplyMeta = (t0) => {
@@ -174,12 +769,15 @@ const useRegisterNavigationGuard = (guard) => {
174
769
  }, [guard.id, guard.enabled, guard.message, guard.priority, guard.blockOnSearch, guard.shouldBlockNavigation, guard.shouldBlockUnload]);
175
770
  };
176
771
  export {
772
+ Link,
773
+ RoutePrefetchProvider,
177
774
  getNavigationGuards,
178
- loadRoute,
775
+ lazyRoute,
179
776
  removeNavigationGuard,
180
777
  subscribeNavigationGuards,
181
778
  upsertNavigationGuard,
182
779
  useApplyMeta,
183
- useRegisterNavigationGuard
780
+ useRegisterNavigationGuard,
781
+ useRoutePrefetch
184
782
  };
185
783
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/loadRoute.tsx","../src/useApplyMeta.tsx","../src/navigationGuards.ts"],"sourcesContent":["import { lazy } from \"react\"\nimport { LoaderFunction } from \"react-router\"\nimport { Loader, LoaderArgs } from \"@rpcbase/client\"\n\n\ntype RouteModule = {\n default: React.ComponentType<unknown>\n loader?: Loader\n}\n\ntype RouteWithLoader = {\n Component: React.LazyExoticComponent<React.ComponentType<unknown>>\n loader?: LoaderFunction\n}\n\nexport const loadRoute = (importPromise: Promise<RouteModule>): RouteWithLoader => {\n const Component = lazy(async () => {\n const module = await importPromise\n return { default: module.default }\n })\n\n const loader = async (args: LoaderArgs) => {\n const module = await importPromise\n if (!module.loader) return null\n return module.loader(args)\n }\n\n return { Component, loader: loader as unknown as LoaderFunction }\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"],"names":["loadRoute","importPromise","Component","lazy","module","default","loader","args","useApplyMeta","t0","$","_c","t1","undefined","defaultTitle","t2","defaultMeta","t3","pagesMeta","t4","t5","t6","location","useLocation","t7","t8","pathname","loadMeta","pageMeta","meta","document","title","querySelectorAll","forEach","_temp","_temp2","canonicalUrl","window","origin","existingCanonical","querySelector","remove","canonicalLink","createElement","setAttribute","head","appendChild","useEffect","tag","metaElement","Object","entries","key","value","toString","NAVIGATION_GUARDS_STORE_KEY","getNavigationGuardsStore","globalAny","globalThis","existing","created","guards","Map","listeners","Set","notify","listener","isSameGuard","a","b","id","enabled","priority","message","blockOnSearch","shouldBlockNavigation","shouldBlockUnload","upsertNavigationGuard","guard","prev","get","set","removeNavigationGuard","didDelete","delete","getNavigationGuards","Array","from","values","subscribeNavigationGuards","add","useRegisterNavigationGuard","latestGuardRef","useRef","current","lastIdRef","lastId"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/routePrefetchHandles.ts","../src/routePrefetch.tsx","../src/Link.tsx","../src/lazyRoute.tsx","../src/useApplyMeta.tsx","../src/navigationGuards.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\"\nimport { Loader } from \"@rpcbase/client\"\n\nimport { mergeRouteHandle, RouteHandleObject } from \"./routePrefetchHandles\"\n\n\ntype RouteModule = {\n default: React.ComponentType<unknown>\n loader?: Loader\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"],"names":["ROUTE_MODULE_IMPORTER_HANDLE","ROUTE_PREFETCH_DATA_HANDLE","isHandleObject","value","Boolean","Array","isArray","getRouteModuleImporterFromHandle","handle","importer","getRoutePrefetchDataFromHandle","key","undefined","mergeRouteHandle","prefetchData","prefetchDataKey","nextHandle","noop","DEFAULT_PREFETCH_API","defaultPrefetch","prefetch","prefetchCode","RoutePrefetchContext","createContext","normalizeHref","href","window","url","URL","location","origin","pathWithSearch","pathname","search","hash","pruneDataCache","cache","now","forEach","expiresAt","delete","resolveDataPrefetchFlag","route","explicitPrefetchData","dataPrefetchHandleKey","routeHandlePrefetchData","RoutePrefetchProvider","t0","$","_c","children","t1","dataPrefetchTtlMs","t2","t3","dataRouterContext","useContext","UNSAFE_DataRouterContext","t4","Symbol","for","Map","routeModuleCacheRef","useRef","t5","routeDataCacheRef","t6","routeId","id","cached","current","get","lazyRouteLoader","lazy","routeModuleImporter","prefetchPromise","Promise","resolve","then","_temp","catch","error","set","prefetchRouteModule","t7","router","route_0","routeId_0","Date","cacheKey","cached_0","promise","hasLoader","loader","loadedRouteModule","_temp2","fetcherKey","prefetchPromise_0","fetch","error_0","finally","deleteFetcher","ttl","Math","max","prefetchRouteData","t8","href_0","opts","normalized","currentPathWithSearch","router_0","matches","matchRoutes","routes","basename","length","matchedRoutes","map","_temp3","all","route_1","route_2","t10","t9","href_1","href_2","t11","t12","useRoutePrefetch","module","match","ABSOLUTE_URL_REGEX","assignRef","ref","composeEventHandlers","theirHandler","ourHandler","event","defaultPrevented","shouldPrefetchLink","reloadDocument","target","to","test","usePrefetchLink","localRef","node","anchorRef","getAnchorElement","prefetchHref","getAttribute","Link","forwardRef","forwardedRef","onFocus","onMouseEnter","onTouchStart","prefetchProp","props","prefetchBehavior","viewportPrefetchedRef","canPrefetch","useEffect","element","IntersectionObserver","observer","entries","isVisible","some","threshold","observe","disconnect","handleIntentPrefetch","t13","RouterLink","displayName","entry","isIntersecting","memoizeImporter","lazyRoute","loadModule","lazyRouteModule","Component","default","useApplyMeta","defaultTitle","defaultMeta","pagesMeta","useLocation","loadMeta","pageMeta","meta","document","title","querySelectorAll","canonicalUrl","existingCanonical","querySelector","remove","canonicalLink","createElement","setAttribute","head","appendChild","tag","metaElement","Object","toString","NAVIGATION_GUARDS_STORE_KEY","getNavigationGuardsStore","globalAny","globalThis","existing","created","guards","listeners","Set","notify","listener","isSameGuard","a","b","enabled","priority","message","blockOnSearch","shouldBlockNavigation","shouldBlockUnload","upsertNavigationGuard","guard","prev","removeNavigationGuard","didDelete","getNavigationGuards","from","values","subscribeNavigationGuards","add","useRegisterNavigationGuard","latestGuardRef","lastIdRef","lastId"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { LoaderFunction } from 'react-router';
2
+ import { Loader } from '@rpcbase/client';
3
+ import { RouteHandleObject } from './routePrefetchHandles';
4
+ type RouteModule = {
5
+ default: React.ComponentType<unknown>;
6
+ loader?: Loader;
7
+ };
8
+ type RouteModuleImporter = () => Promise<RouteModule>;
9
+ type RouteOptions = {
10
+ handle?: unknown;
11
+ prefetchData?: boolean;
12
+ prefetchDataKey?: string;
13
+ };
14
+ type LazyRouteResult = {
15
+ lazy: () => Promise<{
16
+ Component: React.ComponentType<unknown>;
17
+ loader?: LoaderFunction;
18
+ }>;
19
+ handle: RouteHandleObject;
20
+ };
21
+ export declare const lazyRoute: (importer: RouteModuleImporter, opts?: RouteOptions) => LazyRouteResult;
22
+ export {};
23
+ //# sourceMappingURL=lazyRoute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazyRoute.d.ts","sourceRoot":"","sources":["../src/lazyRoute.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAExC,OAAO,EAAoB,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAG5E,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IACrC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,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"}
@@ -0,0 +1,22 @@
1
+ import { ReactNode } from 'react';
2
+ export type RoutePrefetchBehavior = "intent" | "render" | "none" | "viewport";
3
+ export type RoutePrefetchCallOptions = {
4
+ prefetchCode?: boolean;
5
+ prefetchData?: boolean;
6
+ };
7
+ export type RoutePrefetchApi = {
8
+ defaultPrefetch: RoutePrefetchBehavior;
9
+ prefetch: (href: string, opts?: RoutePrefetchCallOptions) => Promise<void>;
10
+ prefetchCode: (href: string) => Promise<void>;
11
+ prefetchData: (href: string) => Promise<void>;
12
+ };
13
+ type RoutePrefetchProviderProps = {
14
+ children: ReactNode;
15
+ defaultPrefetch?: RoutePrefetchBehavior;
16
+ dataPrefetchTtlMs?: number;
17
+ dataPrefetchHandleKey?: string;
18
+ };
19
+ export declare const RoutePrefetchProvider: ({ children, defaultPrefetch, dataPrefetchTtlMs, dataPrefetchHandleKey, }: RoutePrefetchProviderProps) => import("react/jsx-runtime").JSX.Element;
20
+ export declare const useRoutePrefetch: () => RoutePrefetchApi;
21
+ export type { RoutePrefetchProviderProps };
22
+ //# sourceMappingURL=routePrefetch.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,13 @@
1
+ export declare const ROUTE_MODULE_IMPORTER_HANDLE = "__rpcbaseRouteModuleImporter";
2
+ export declare const ROUTE_PREFETCH_DATA_HANDLE = "prefetchData";
3
+ export type RouteHandleObject = Record<string, unknown>;
4
+ type RouteModuleImporter = () => Promise<unknown>;
5
+ export declare const getRouteModuleImporterFromHandle: (handle: unknown) => RouteModuleImporter | null;
6
+ export declare const getRoutePrefetchDataFromHandle: (handle: unknown, key?: string) => boolean | undefined;
7
+ export declare const mergeRouteHandle: (handle: unknown, { importer, prefetchData, prefetchDataKey, }: {
8
+ importer?: RouteModuleImporter;
9
+ prefetchData?: boolean;
10
+ prefetchDataKey?: string;
11
+ }) => RouteHandleObject;
12
+ export {};
13
+ //# sourceMappingURL=routePrefetchHandles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routePrefetchHandles.d.ts","sourceRoot":"","sources":["../src/routePrefetchHandles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,iCAAiC,CAAA;AAC1E,eAAO,MAAM,0BAA0B,iBAAiB,CAAA;AAExD,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEvD,KAAK,mBAAmB,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;AAKjD,eAAO,MAAM,gCAAgC,GAAI,QAAQ,OAAO,KAAG,mBAAmB,GAAG,IAKxF,CAAA;AAED,eAAO,MAAM,8BAA8B,GACzC,QAAQ,OAAO,EACf,YAAgC,KAC/B,OAAO,GAAG,SAKZ,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,OAAO,EACf,8CAIG;IACD,QAAQ,CAAC,EAAE,mBAAmB,CAAA;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,KACA,iBAYF,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpcbase/router",
3
- "version": "0.93.0",
3
+ "version": "0.95.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -1,13 +0,0 @@
1
- import { LoaderFunction } from 'react-router';
2
- import { Loader } from '@rpcbase/client';
3
- type RouteModule = {
4
- default: React.ComponentType<unknown>;
5
- loader?: Loader;
6
- };
7
- type RouteWithLoader = {
8
- Component: React.LazyExoticComponent<React.ComponentType<unknown>>;
9
- loader?: LoaderFunction;
10
- };
11
- export declare const loadRoute: (importPromise: Promise<RouteModule>) => RouteWithLoader;
12
- export {};
13
- //# sourceMappingURL=loadRoute.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loadRoute.d.ts","sourceRoot":"","sources":["../src/loadRoute.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,MAAM,EAAc,MAAM,iBAAiB,CAAA;AAGpD,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IACrC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,KAAK,eAAe,GAAG;IACrB,SAAS,EAAE,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA;IAClE,MAAM,CAAC,EAAE,cAAc,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,eAAe,OAAO,CAAC,WAAW,CAAC,KAAG,eAa/D,CAAA"}