@rpcbase/router 0.92.0 → 0.94.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 +75 -0
- package/dist/Link.d.ts +12 -0
- package/dist/Link.d.ts.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +704 -56
- package/dist/index.js.map +1 -1
- package/dist/lazyRoute.d.ts +23 -0
- package/dist/lazyRoute.d.ts.map +1 -0
- package/dist/routePrefetch.d.ts +22 -0
- package/dist/routePrefetch.d.ts.map +1 -0
- package/dist/routePrefetchHandles.d.ts +13 -0
- package/dist/routePrefetchHandles.d.ts.map +1 -0
- package/package.json +1 -1
- package/dist/loadRoute.d.ts +0 -13
- package/dist/loadRoute.d.ts.map +0 -1
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
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,56 +1,709 @@
|
|
|
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 {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import { c } from "react/compiler-runtime";
|
|
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;
|
|
49
|
+
return {
|
|
50
|
+
pathWithSearch: `${url.pathname}${url.search}`,
|
|
51
|
+
pathname: url.pathname,
|
|
52
|
+
search: url.search,
|
|
53
|
+
hash: url.hash
|
|
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
|
+
}
|
|
8
64
|
});
|
|
9
|
-
const loader = async (args) => {
|
|
10
|
-
const module = await importPromise;
|
|
11
|
-
if (!module.loader) return null;
|
|
12
|
-
return module.loader(args);
|
|
13
|
-
};
|
|
14
|
-
return { Component, loader };
|
|
15
65
|
};
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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 = `rpcbase: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;
|
|
36
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
|
|
37
351
|
});
|
|
38
|
-
|
|
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
|
|
39
491
|
});
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
const canonicalLink = document.createElement("link");
|
|
46
|
-
canonicalLink.setAttribute("rel", "canonical");
|
|
47
|
-
canonicalLink.setAttribute("href", canonicalUrl);
|
|
48
|
-
canonicalLink.setAttribute("data-react-meta", "true");
|
|
49
|
-
document.head.appendChild(canonicalLink);
|
|
492
|
+
observer.observe(element);
|
|
493
|
+
return () => {
|
|
494
|
+
observer.disconnect();
|
|
495
|
+
};
|
|
50
496
|
};
|
|
51
|
-
|
|
52
|
-
|
|
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;
|
|
595
|
+
};
|
|
53
596
|
};
|
|
597
|
+
const lazyRoute = (importer, opts) => {
|
|
598
|
+
const loadModule = memoizeImporter(importer);
|
|
599
|
+
return {
|
|
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
|
+
})
|
|
615
|
+
};
|
|
616
|
+
};
|
|
617
|
+
const useApplyMeta = (t0) => {
|
|
618
|
+
const $ = c(12);
|
|
619
|
+
let t1;
|
|
620
|
+
if ($[0] !== t0) {
|
|
621
|
+
t1 = t0 === void 0 ? {} : t0;
|
|
622
|
+
$[0] = t0;
|
|
623
|
+
$[1] = t1;
|
|
624
|
+
} else {
|
|
625
|
+
t1 = $[1];
|
|
626
|
+
}
|
|
627
|
+
const {
|
|
628
|
+
defaultTitle: t2,
|
|
629
|
+
defaultMeta: t3,
|
|
630
|
+
pagesMeta: t4
|
|
631
|
+
} = t1;
|
|
632
|
+
const defaultTitle = t2 === void 0 ? "" : t2;
|
|
633
|
+
let t5;
|
|
634
|
+
if ($[2] !== t3) {
|
|
635
|
+
t5 = t3 === void 0 ? [] : t3;
|
|
636
|
+
$[2] = t3;
|
|
637
|
+
$[3] = t5;
|
|
638
|
+
} else {
|
|
639
|
+
t5 = $[3];
|
|
640
|
+
}
|
|
641
|
+
const defaultMeta = t5;
|
|
642
|
+
let t6;
|
|
643
|
+
if ($[4] !== t4) {
|
|
644
|
+
t6 = t4 === void 0 ? {} : t4;
|
|
645
|
+
$[4] = t4;
|
|
646
|
+
$[5] = t6;
|
|
647
|
+
} else {
|
|
648
|
+
t6 = $[5];
|
|
649
|
+
}
|
|
650
|
+
const pagesMeta = t6;
|
|
651
|
+
const location = useLocation();
|
|
652
|
+
let t7;
|
|
653
|
+
let t8;
|
|
654
|
+
if ($[6] !== defaultMeta || $[7] !== defaultTitle || $[8] !== location.pathname || $[9] !== pagesMeta) {
|
|
655
|
+
t7 = () => {
|
|
656
|
+
const loadMeta = async () => {
|
|
657
|
+
let pageMeta = pagesMeta[location.pathname];
|
|
658
|
+
if (!pageMeta) {
|
|
659
|
+
pageMeta = {
|
|
660
|
+
title: defaultTitle,
|
|
661
|
+
meta: defaultMeta
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
document.title = pageMeta.title;
|
|
665
|
+
document.querySelectorAll("[data-react-meta]").forEach(_temp);
|
|
666
|
+
pageMeta.meta.forEach(_temp2);
|
|
667
|
+
const canonicalUrl = `${window.location.origin}${location.pathname}`;
|
|
668
|
+
const existingCanonical = document.querySelector('link[rel="canonical"]');
|
|
669
|
+
if (existingCanonical) {
|
|
670
|
+
existingCanonical.remove();
|
|
671
|
+
}
|
|
672
|
+
const canonicalLink = document.createElement("link");
|
|
673
|
+
canonicalLink.setAttribute("rel", "canonical");
|
|
674
|
+
canonicalLink.setAttribute("href", canonicalUrl);
|
|
675
|
+
canonicalLink.setAttribute("data-react-meta", "true");
|
|
676
|
+
document.head.appendChild(canonicalLink);
|
|
677
|
+
};
|
|
678
|
+
loadMeta();
|
|
679
|
+
};
|
|
680
|
+
t8 = [location.pathname, defaultTitle, defaultMeta, pagesMeta];
|
|
681
|
+
$[6] = defaultMeta;
|
|
682
|
+
$[7] = defaultTitle;
|
|
683
|
+
$[8] = location.pathname;
|
|
684
|
+
$[9] = pagesMeta;
|
|
685
|
+
$[10] = t7;
|
|
686
|
+
$[11] = t8;
|
|
687
|
+
} else {
|
|
688
|
+
t7 = $[10];
|
|
689
|
+
t8 = $[11];
|
|
690
|
+
}
|
|
691
|
+
useEffect(t7, t8);
|
|
692
|
+
};
|
|
693
|
+
function _temp(tag) {
|
|
694
|
+
return tag.remove();
|
|
695
|
+
}
|
|
696
|
+
function _temp2(meta) {
|
|
697
|
+
const metaElement = document.createElement("meta");
|
|
698
|
+
metaElement.setAttribute("data-react-meta", "true");
|
|
699
|
+
Object.entries(meta).forEach((t0) => {
|
|
700
|
+
const [key, value] = t0;
|
|
701
|
+
if (value) {
|
|
702
|
+
metaElement.setAttribute(key, value.toString());
|
|
703
|
+
}
|
|
704
|
+
});
|
|
705
|
+
document.head.appendChild(metaElement);
|
|
706
|
+
}
|
|
54
707
|
const NAVIGATION_GUARDS_STORE_KEY = "__rpcbaseNavigationGuardsStore";
|
|
55
708
|
const getNavigationGuardsStore = () => {
|
|
56
709
|
const globalAny = globalThis;
|
|
@@ -113,23 +766,18 @@ const useRegisterNavigationGuard = (guard) => {
|
|
|
113
766
|
return () => {
|
|
114
767
|
removeNavigationGuard(guard.id);
|
|
115
768
|
};
|
|
116
|
-
}, [
|
|
117
|
-
guard.id,
|
|
118
|
-
guard.enabled,
|
|
119
|
-
guard.message,
|
|
120
|
-
guard.priority,
|
|
121
|
-
guard.blockOnSearch,
|
|
122
|
-
guard.shouldBlockNavigation,
|
|
123
|
-
guard.shouldBlockUnload
|
|
124
|
-
]);
|
|
769
|
+
}, [guard.id, guard.enabled, guard.message, guard.priority, guard.blockOnSearch, guard.shouldBlockNavigation, guard.shouldBlockUnload]);
|
|
125
770
|
};
|
|
126
771
|
export {
|
|
772
|
+
Link,
|
|
773
|
+
RoutePrefetchProvider,
|
|
127
774
|
getNavigationGuards,
|
|
128
|
-
|
|
775
|
+
lazyRoute,
|
|
129
776
|
removeNavigationGuard,
|
|
130
777
|
subscribeNavigationGuards,
|
|
131
778
|
upsertNavigationGuard,
|
|
132
779
|
useApplyMeta,
|
|
133
|
-
useRegisterNavigationGuard
|
|
780
|
+
useRegisterNavigationGuard,
|
|
781
|
+
useRoutePrefetch
|
|
134
782
|
};
|
|
135
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":[],"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 = `rpcbase: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
package/dist/loadRoute.d.ts
DELETED
|
@@ -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
|
package/dist/loadRoute.d.ts.map
DELETED
|
@@ -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"}
|