@bleedingdev/modern-js-plugin-tanstack 3.5.0-ultramodern.30 → 3.5.0-ultramodern.31
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/dist/cjs/cli/artifacts.js +157 -0
- package/dist/cjs/cli/index.js +6 -103
- package/dist/cjs/cli/tanstackTypes/canonicalRoutes.js +113 -0
- package/dist/cjs/cli/tanstackTypes/shared.js +130 -0
- package/dist/cjs/cli/tanstackTypes/source.js +251 -0
- package/dist/cjs/cli/tanstackTypes.js +4 -350
- package/dist/cjs/runtime/blockingSubscribe.js +64 -0
- package/dist/cjs/runtime/{pluginCore.js → clientBasepath.js} +12 -19
- package/dist/cjs/runtime/clientHydration.js +129 -0
- package/dist/cjs/runtime/dataMutation.js +11 -176
- package/dist/cjs/runtime/formData.js +116 -0
- package/dist/cjs/runtime/loaderBridge.js +4 -1
- package/dist/cjs/runtime/plugin.js +21 -125
- package/dist/cjs/runtime/plugin.node.js +38 -119
- package/dist/cjs/runtime/pluginShared.js +90 -0
- package/dist/cjs/runtime/routeTree/components.js +102 -0
- package/dist/cjs/runtime/routeTree/construction.js +152 -0
- package/dist/cjs/runtime/routeTree/index.js +47 -0
- package/dist/cjs/runtime/routeTree/loaders.js +158 -0
- package/dist/cjs/runtime/routeTree/paths.js +57 -0
- package/dist/cjs/runtime/routeTree/staticData.js +63 -0
- package/dist/cjs/runtime/routeTree/tanstackRoutes.js +57 -0
- package/dist/cjs/runtime/routeTree/types.js +18 -0
- package/dist/cjs/runtime/routeTree.js +7 -320
- package/dist/cjs/runtime/rsc/CompositeComponent.js +18 -13
- package/dist/cjs/runtime/rsc/RscNodeRenderer.js +5 -16
- package/dist/cjs/runtime/rsc/client.js +8 -25
- package/dist/cjs/runtime/rsc/flightSerialization.js +132 -0
- package/dist/cjs/runtime/rsc/payloadErrors.js +99 -0
- package/dist/cjs/runtime/rsc/payloadFetch.js +117 -0
- package/dist/cjs/runtime/rsc/payloadRouter.js +21 -142
- package/dist/cjs/runtime/rsc/payloadRoutes.js +106 -0
- package/dist/cjs/runtime/rsc/payloadStorage.js +58 -0
- package/dist/cjs/runtime/rsc/server.js +14 -18
- package/dist/cjs/runtime/rsc/shared.js +71 -0
- package/dist/cjs/runtime/rsc/treeGetter.js +72 -0
- package/dist/cjs/runtime/ssrManagedTags.js +103 -0
- package/dist/cjs/runtime/ssrPreload.js +89 -0
- package/dist/cjs/runtime/ssrTypes.js +18 -0
- package/dist/cjs/runtime/submitAction.js +161 -0
- package/dist/cjs/runtime/utils.js +49 -86
- package/dist/esm/cli/artifacts.mjs +103 -0
- package/dist/esm/cli/index.mjs +4 -101
- package/dist/esm/cli/tanstackTypes/canonicalRoutes.mjs +75 -0
- package/dist/esm/cli/tanstackTypes/shared.mjs +68 -0
- package/dist/esm/cli/tanstackTypes/source.mjs +203 -0
- package/dist/esm/cli/tanstackTypes.mjs +2 -339
- package/dist/esm/runtime/blockingSubscribe.mjs +19 -0
- package/dist/esm/runtime/clientBasepath.mjs +10 -0
- package/dist/esm/runtime/clientHydration.mjs +70 -0
- package/dist/esm/runtime/dataMutation.mjs +2 -167
- package/dist/esm/runtime/formData.mjs +63 -0
- package/dist/esm/runtime/loaderBridge.mjs +4 -1
- package/dist/esm/runtime/plugin.mjs +14 -118
- package/dist/esm/runtime/plugin.node.mjs +33 -114
- package/dist/esm/runtime/pluginShared.mjs +40 -0
- package/dist/esm/runtime/routeTree/components.mjs +55 -0
- package/dist/esm/runtime/routeTree/construction.mjs +111 -0
- package/dist/esm/runtime/routeTree/index.mjs +2 -0
- package/dist/esm/runtime/routeTree/loaders.mjs +117 -0
- package/dist/esm/runtime/routeTree/paths.mjs +16 -0
- package/dist/esm/runtime/routeTree/staticData.mjs +22 -0
- package/dist/esm/runtime/routeTree/tanstackRoutes.mjs +13 -0
- package/dist/esm/runtime/routeTree/types.mjs +0 -0
- package/dist/esm/runtime/routeTree.mjs +1 -318
- package/dist/esm/runtime/rsc/CompositeComponent.mjs +18 -13
- package/dist/esm/runtime/rsc/RscNodeRenderer.mjs +4 -15
- package/dist/esm/runtime/rsc/client.mjs +6 -26
- package/dist/esm/runtime/rsc/flightSerialization.mjs +88 -0
- package/dist/esm/runtime/rsc/payloadErrors.mjs +49 -0
- package/dist/esm/runtime/rsc/payloadFetch.mjs +61 -0
- package/dist/esm/runtime/rsc/payloadRouter.mjs +12 -133
- package/dist/esm/runtime/rsc/payloadRoutes.mjs +50 -0
- package/dist/esm/runtime/rsc/payloadStorage.mjs +14 -0
- package/dist/esm/runtime/rsc/server.mjs +17 -21
- package/dist/esm/runtime/rsc/shared.mjs +21 -0
- package/dist/esm/runtime/rsc/treeGetter.mjs +34 -0
- package/dist/esm/runtime/ssrManagedTags.mjs +53 -0
- package/dist/esm/runtime/ssrPreload.mjs +51 -0
- package/dist/esm/runtime/ssrTypes.mjs +0 -0
- package/dist/esm/runtime/submitAction.mjs +120 -0
- package/dist/esm/runtime/utils.mjs +47 -75
- package/dist/esm-node/cli/artifacts.mjs +104 -0
- package/dist/esm-node/cli/index.mjs +4 -101
- package/dist/esm-node/cli/tanstackTypes/canonicalRoutes.mjs +76 -0
- package/dist/esm-node/cli/tanstackTypes/shared.mjs +69 -0
- package/dist/esm-node/cli/tanstackTypes/source.mjs +204 -0
- package/dist/esm-node/cli/tanstackTypes.mjs +2 -339
- package/dist/esm-node/runtime/blockingSubscribe.mjs +20 -0
- package/dist/esm-node/runtime/clientBasepath.mjs +11 -0
- package/dist/esm-node/runtime/clientHydration.mjs +71 -0
- package/dist/esm-node/runtime/dataMutation.mjs +2 -167
- package/dist/esm-node/runtime/formData.mjs +64 -0
- package/dist/esm-node/runtime/loaderBridge.mjs +4 -1
- package/dist/esm-node/runtime/plugin.mjs +14 -118
- package/dist/esm-node/runtime/plugin.node.mjs +33 -114
- package/dist/esm-node/runtime/pluginShared.mjs +41 -0
- package/dist/esm-node/runtime/routeTree/components.mjs +56 -0
- package/dist/esm-node/runtime/routeTree/construction.mjs +112 -0
- package/dist/esm-node/runtime/routeTree/index.mjs +3 -0
- package/dist/esm-node/runtime/routeTree/loaders.mjs +118 -0
- package/dist/esm-node/runtime/routeTree/paths.mjs +17 -0
- package/dist/esm-node/runtime/routeTree/staticData.mjs +23 -0
- package/dist/esm-node/runtime/routeTree/tanstackRoutes.mjs +14 -0
- package/dist/esm-node/runtime/routeTree/types.mjs +1 -0
- package/dist/esm-node/runtime/routeTree.mjs +1 -318
- package/dist/esm-node/runtime/rsc/CompositeComponent.mjs +18 -13
- package/dist/esm-node/runtime/rsc/RscNodeRenderer.mjs +4 -15
- package/dist/esm-node/runtime/rsc/client.mjs +6 -26
- package/dist/esm-node/runtime/rsc/flightSerialization.mjs +89 -0
- package/dist/esm-node/runtime/rsc/payloadErrors.mjs +50 -0
- package/dist/esm-node/runtime/rsc/payloadFetch.mjs +62 -0
- package/dist/esm-node/runtime/rsc/payloadRouter.mjs +12 -133
- package/dist/esm-node/runtime/rsc/payloadRoutes.mjs +51 -0
- package/dist/esm-node/runtime/rsc/payloadStorage.mjs +15 -0
- package/dist/esm-node/runtime/rsc/server.mjs +17 -21
- package/dist/esm-node/runtime/rsc/shared.mjs +22 -0
- package/dist/esm-node/runtime/rsc/treeGetter.mjs +35 -0
- package/dist/esm-node/runtime/ssrManagedTags.mjs +54 -0
- package/dist/esm-node/runtime/ssrPreload.mjs +52 -0
- package/dist/esm-node/runtime/ssrTypes.mjs +1 -0
- package/dist/esm-node/runtime/submitAction.mjs +121 -0
- package/dist/esm-node/runtime/utils.mjs +47 -75
- package/dist/types/cli/artifacts.d.ts +33 -0
- package/dist/types/cli/index.d.ts +2 -33
- package/dist/types/cli/tanstackTypes/canonicalRoutes.d.ts +22 -0
- package/dist/types/cli/tanstackTypes/shared.d.ts +20 -0
- package/dist/types/cli/tanstackTypes/source.d.ts +10 -0
- package/dist/types/cli/tanstackTypes.d.ts +3 -31
- package/dist/types/runtime/blockingSubscribe.d.ts +3 -0
- package/dist/types/runtime/clientBasepath.d.ts +1 -0
- package/dist/types/runtime/clientHydration.d.ts +19 -0
- package/dist/types/runtime/dataMutation.d.ts +3 -12
- package/dist/types/runtime/formData.d.ts +23 -0
- package/dist/types/runtime/plugin.d.ts +1 -1
- package/dist/types/runtime/plugin.node.d.ts +1 -1
- package/dist/types/runtime/{pluginCore.d.ts → pluginShared.d.ts} +14 -0
- package/dist/types/runtime/routeTree/components.d.ts +7 -0
- package/dist/types/runtime/routeTree/construction.d.ts +5 -0
- package/dist/types/runtime/routeTree/index.d.ts +2 -0
- package/dist/types/runtime/routeTree/loaders.d.ts +4 -0
- package/dist/types/runtime/routeTree/paths.d.ts +3 -0
- package/dist/types/runtime/routeTree/staticData.d.ts +19 -0
- package/dist/types/runtime/routeTree/tanstackRoutes.d.ts +4 -0
- package/dist/types/runtime/routeTree/types.d.ts +75 -0
- package/dist/types/runtime/routeTree.d.ts +1 -9
- package/dist/types/runtime/rsc/CompositeComponent.d.ts +1 -2
- package/dist/types/runtime/rsc/RscNodeRenderer.d.ts +2 -3
- package/dist/types/runtime/rsc/client.d.ts +2 -0
- package/dist/types/runtime/rsc/flightSerialization.d.ts +3 -0
- package/dist/types/runtime/rsc/payloadErrors.d.ts +6 -0
- package/dist/types/runtime/rsc/payloadFetch.d.ts +10 -0
- package/dist/types/runtime/rsc/payloadRouter.d.ts +2 -10
- package/dist/types/runtime/rsc/payloadRoutes.d.ts +43 -0
- package/dist/types/runtime/rsc/payloadStorage.d.ts +5 -0
- package/dist/types/runtime/rsc/shared.d.ts +19 -0
- package/dist/types/runtime/rsc/treeGetter.d.ts +1 -0
- package/dist/types/runtime/ssrManagedTags.d.ts +7 -0
- package/dist/types/runtime/ssrPreload.d.ts +2 -0
- package/dist/types/runtime/ssrTypes.d.ts +43 -0
- package/dist/types/runtime/state.d.ts +1 -1
- package/dist/types/runtime/submitAction.d.ts +14 -0
- package/dist/types/runtime/types.d.ts +3 -46
- package/dist/types/runtime/utils.d.ts +1 -22
- package/package.json +30 -9
- package/rstest.config.mts +1 -0
- package/src/cli/artifacts.ts +255 -0
- package/src/cli/index.ts +6 -246
- package/src/cli/tanstackTypes/canonicalRoutes.ts +157 -0
- package/src/cli/tanstackTypes/shared.ts +119 -0
- package/src/cli/tanstackTypes/source.ts +405 -0
- package/src/cli/tanstackTypes.ts +4 -647
- package/src/runtime/blockingSubscribe.ts +48 -0
- package/src/runtime/clientBasepath.ts +12 -0
- package/src/runtime/clientHydration.ts +151 -0
- package/src/runtime/dataMutation.tsx +9 -306
- package/src/runtime/formData.ts +153 -0
- package/src/runtime/loaderBridge.ts +8 -3
- package/src/runtime/plugin.node.tsx +60 -284
- package/src/runtime/plugin.tsx +21 -257
- package/src/runtime/pluginShared.ts +112 -0
- package/src/runtime/routeTree/components.ts +130 -0
- package/src/runtime/routeTree/construction.ts +238 -0
- package/src/runtime/routeTree/index.ts +7 -0
- package/src/runtime/routeTree/loaders.ts +232 -0
- package/src/runtime/routeTree/paths.ts +36 -0
- package/src/runtime/routeTree/staticData.ts +66 -0
- package/src/runtime/routeTree/tanstackRoutes.ts +36 -0
- package/src/runtime/routeTree/types.ts +87 -0
- package/src/runtime/routeTree.ts +5 -750
- package/src/runtime/rsc/CompositeComponent.tsx +29 -20
- package/src/runtime/rsc/RscNodeRenderer.tsx +9 -27
- package/src/runtime/rsc/client.tsx +12 -40
- package/src/runtime/rsc/flightSerialization.ts +158 -0
- package/src/runtime/rsc/payloadErrors.ts +73 -0
- package/src/runtime/rsc/payloadFetch.ts +97 -0
- package/src/runtime/rsc/payloadRouter.ts +29 -234
- package/src/runtime/rsc/payloadRoutes.ts +122 -0
- package/src/runtime/rsc/payloadStorage.ts +35 -0
- package/src/runtime/rsc/server.tsx +20 -29
- package/src/runtime/rsc/shared.ts +70 -0
- package/src/runtime/rsc/treeGetter.tsx +52 -0
- package/src/runtime/ssrManagedTags.ts +107 -0
- package/src/runtime/ssrPreload.ts +125 -0
- package/src/runtime/ssrTypes.ts +51 -0
- package/src/runtime/state.ts +4 -2
- package/src/runtime/submitAction.ts +194 -0
- package/src/runtime/types.ts +14 -51
- package/src/runtime/utils.tsx +72 -108
- package/src/types/react-server-dom-rspack.d.ts +56 -0
- package/tests/castRatchet.test.ts +85 -0
- package/tests/router/dataMutation.test.tsx +59 -0
- package/tests/router/fixtures/router-gen.golden.txt +72 -0
- package/tests/router/loaderBridge.test.ts +21 -0
- package/tests/router/routeTree.test.ts +46 -11
- package/tests/router/rsc.test.tsx +189 -0
- package/tests/router/ssrPreload.test.ts +30 -0
- package/tests/router/tanstackTypes.test.ts +254 -1
- package/dist/esm/runtime/pluginCore.mjs +0 -14
- package/dist/esm-node/runtime/pluginCore.mjs +0 -15
- package/src/runtime/pluginCore.ts +0 -56
|
@@ -95,7 +95,10 @@ function modernLoaderToTanstack(opts, modernLoader) {
|
|
|
95
95
|
const signal = getLoaderSignal(ctx);
|
|
96
96
|
const baseRequest = ctx?.context?.request instanceof Request ? ctx.context.request : void 0;
|
|
97
97
|
const href = getLoaderHref(ctx);
|
|
98
|
-
const request = void 0 !== baseRequest ? new Request(baseRequest, {
|
|
98
|
+
const request = void 0 !== baseRequest && '' !== href ? new Request(new URL(href, baseRequest.url).href, {
|
|
99
|
+
headers: baseRequest.headers,
|
|
100
|
+
signal
|
|
101
|
+
}) : void 0 !== baseRequest ? new Request(baseRequest, {
|
|
99
102
|
signal
|
|
100
103
|
}) : new Request(href, {
|
|
101
104
|
signal
|
|
@@ -4,123 +4,18 @@ import { normalizePathname } from "@modern-js/runtime-utils/url";
|
|
|
4
4
|
import { RouterProvider, createBrowserHistory, createHashHistory, createRouter, useLocation, useNavigate, useRouter } from "@tanstack/react-router";
|
|
5
5
|
import { useContext, useMemo } from "react";
|
|
6
6
|
import { createModernBasepathRewrite } from "./basepathRewrite.mjs";
|
|
7
|
+
import { wrapRouterSubscribeWithBlockState } from "./blockingSubscribe.mjs";
|
|
8
|
+
import { isSegmentPrefix } from "./clientBasepath.mjs";
|
|
9
|
+
import { ModernRouterClient, getTanstackSsrHydrationPromise, hasTanstackSsrHydrationRecord } from "./clientHydration.mjs";
|
|
7
10
|
import { routerProviderRegistryHooks } from "./hooks.mjs";
|
|
8
11
|
import { wrapTanstackSsrHydrationBoundary } from "./hydrationBoundary.mjs";
|
|
9
12
|
import { applyRouterRuntimeState } from "./lifecycle.mjs";
|
|
10
|
-
import {
|
|
11
|
-
import { getFinalRouteConfig, getMergedRouterConfig } from "./pluginCore.mjs";
|
|
13
|
+
import { createTanstackRouteObjects, getMergedRouterConfig, getTanstackRouteConfig, joinBasename } from "./pluginShared.mjs";
|
|
12
14
|
import { Link } from "./prefetchLink.mjs";
|
|
13
15
|
import { useMatches } from "./routeHooks.mjs";
|
|
14
16
|
import { createRouteTreeFromRouteObjects } from "./routeTree.mjs";
|
|
15
17
|
import { getTanstackRscSerializationAdapters } from "./rsc/client.mjs";
|
|
16
18
|
import { getModernTanstackRouterFastDefaults } from "./types.mjs";
|
|
17
|
-
import { createRouteObjectsFromConfig, urlJoin } from "./utils.mjs";
|
|
18
|
-
const BLOCKING_SUBSCRIBE_SYMBOL = Symbol.for('@modern-js/plugin-tanstack:blocking-subscribe');
|
|
19
|
-
const BLOCKING_STATE_SYMBOL = Symbol.for('@modern-js/plugin-tanstack:blocking-state');
|
|
20
|
-
function normalizeBase(b) {
|
|
21
|
-
if (b.length > 1 && b.endsWith('/')) return b.slice(0, -1);
|
|
22
|
-
return b || '/';
|
|
23
|
-
}
|
|
24
|
-
function isSegmentPrefix(pathname, base) {
|
|
25
|
-
const b = normalizeBase(base);
|
|
26
|
-
const p = pathname || '/';
|
|
27
|
-
return p === b || p.startsWith(`${b}/`);
|
|
28
|
-
}
|
|
29
|
-
function wrapRouterSubscribeWithBlockState(router, getBlockNavState) {
|
|
30
|
-
if (!router || 'object' != typeof router) return;
|
|
31
|
-
const target = router;
|
|
32
|
-
target[BLOCKING_STATE_SYMBOL] = getBlockNavState;
|
|
33
|
-
if (target[BLOCKING_SUBSCRIBE_SYMBOL] || 'function' != typeof target.subscribe) return;
|
|
34
|
-
const originSubscribe = target.subscribe.bind(target);
|
|
35
|
-
target.subscribe = (eventType, listener)=>{
|
|
36
|
-
const wrappedListener = (...args)=>{
|
|
37
|
-
const blockRoute = target[BLOCKING_STATE_SYMBOL]?.() || false;
|
|
38
|
-
if (blockRoute) return;
|
|
39
|
-
return listener(...args);
|
|
40
|
-
};
|
|
41
|
-
return originSubscribe(eventType, wrappedListener);
|
|
42
|
-
};
|
|
43
|
-
target[BLOCKING_SUBSCRIBE_SYMBOL] = true;
|
|
44
|
-
}
|
|
45
|
-
const routerHydrationRecords = new WeakMap();
|
|
46
|
-
const routeModulesKey = '_routeModules';
|
|
47
|
-
function pickRouteModuleComponent(routeModule, seen = new Set()) {
|
|
48
|
-
if ('function' == typeof routeModule || routeModule && 'object' == typeof routeModule && '$$typeof' in routeModule) return routeModule;
|
|
49
|
-
if (!routeModule || 'object' != typeof routeModule) return;
|
|
50
|
-
if (seen.has(routeModule)) return;
|
|
51
|
-
seen.add(routeModule);
|
|
52
|
-
const module = routeModule;
|
|
53
|
-
for (const candidate of [
|
|
54
|
-
module.default,
|
|
55
|
-
module.Component
|
|
56
|
-
]){
|
|
57
|
-
const component = pickRouteModuleComponent(candidate, seen);
|
|
58
|
-
if (component) return component;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
function getCachedRouteModule(routeId) {
|
|
62
|
-
if ("u" < typeof window) return;
|
|
63
|
-
return window[routeModulesKey]?.[routeId];
|
|
64
|
-
}
|
|
65
|
-
function preloadHydratedRouteComponents(router) {
|
|
66
|
-
const preloadableRouter = router;
|
|
67
|
-
const routesById = preloadableRouter.routesById || {};
|
|
68
|
-
const matches = preloadableRouter.stores.matches.get();
|
|
69
|
-
return Promise.all(matches.map((match)=>{
|
|
70
|
-
if (void 0 === match.routeId || '' === match.routeId) return;
|
|
71
|
-
const route = routesById[match.routeId];
|
|
72
|
-
const component = route?.options?.component;
|
|
73
|
-
const preload = component?.load || component?.preload;
|
|
74
|
-
if ('function' != typeof preload) return;
|
|
75
|
-
return Promise.resolve(preload.call(component)).then((routeModule)=>{
|
|
76
|
-
const modernRouteId = route?.options?.staticData?.modernRouteId;
|
|
77
|
-
const cachedRouteModule = 'string' == typeof modernRouteId && '' !== modernRouteId ? getCachedRouteModule(modernRouteId) : void 0;
|
|
78
|
-
const resolvedComponent = pickRouteModuleComponent(cachedRouteModule ?? routeModule);
|
|
79
|
-
if (void 0 !== resolvedComponent && 'string' == typeof modernRouteId && '' !== modernRouteId) route.options.component = withModernRouteMatchContext(resolvedComponent, modernRouteId);
|
|
80
|
-
});
|
|
81
|
-
})).then(()=>void 0);
|
|
82
|
-
}
|
|
83
|
-
function hydrateTanstackRouter(router) {
|
|
84
|
-
return import("@tanstack/react-router/ssr/client").then(({ hydrate })=>hydrate(router));
|
|
85
|
-
}
|
|
86
|
-
function getTanstackSsrHydrationRecord(router) {
|
|
87
|
-
const existingHydrationRecord = routerHydrationRecords.get(router);
|
|
88
|
-
if (void 0 !== existingHydrationRecord) return existingHydrationRecord;
|
|
89
|
-
const hydrationRecord = {
|
|
90
|
-
promise: Promise.resolve(),
|
|
91
|
-
status: 'pending'
|
|
92
|
-
};
|
|
93
|
-
routerHydrationRecords.set(router, hydrationRecord);
|
|
94
|
-
try {
|
|
95
|
-
hydrationRecord.promise = hydrateTanstackRouter(router).then((value)=>preloadHydratedRouteComponents(router).then(()=>value)).then((value)=>{
|
|
96
|
-
hydrationRecord.status = 'fulfilled';
|
|
97
|
-
return value;
|
|
98
|
-
}, (error)=>{
|
|
99
|
-
hydrationRecord.status = 'rejected';
|
|
100
|
-
hydrationRecord.error = error;
|
|
101
|
-
throw error;
|
|
102
|
-
});
|
|
103
|
-
} catch (error) {
|
|
104
|
-
hydrationRecord.status = 'rejected';
|
|
105
|
-
hydrationRecord.error = error;
|
|
106
|
-
hydrationRecord.promise = Promise.reject(error);
|
|
107
|
-
hydrationRecord.promise.catch(()=>{});
|
|
108
|
-
}
|
|
109
|
-
return hydrationRecord;
|
|
110
|
-
}
|
|
111
|
-
function getTanstackSsrHydrationPromise(router) {
|
|
112
|
-
return getTanstackSsrHydrationRecord(router).promise;
|
|
113
|
-
}
|
|
114
|
-
function hasTanstackSsrHydrationRecord(router) {
|
|
115
|
-
return routerHydrationRecords.has(router);
|
|
116
|
-
}
|
|
117
|
-
function ModernRouterClient({ router }) {
|
|
118
|
-
const hydrationRecord = getTanstackSsrHydrationRecord(router);
|
|
119
|
-
if ('rejected' === hydrationRecord.status) throw hydrationRecord.error;
|
|
120
|
-
return /*#__PURE__*/ jsx(RouterProvider, {
|
|
121
|
-
router: router
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
19
|
const tanstackRouterPlugin = (userConfig = {})=>{
|
|
125
20
|
const plugin = {
|
|
126
21
|
name: '@modern-js/plugin-router-tanstack',
|
|
@@ -134,13 +29,10 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
134
29
|
const getMergedConfig = ()=>getMergedRouterConfig(api, userConfig);
|
|
135
30
|
const getRouteObjects = ()=>{
|
|
136
31
|
if (void 0 !== cachedRouteObjects) return cachedRouteObjects;
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
routesConfig: finalRouteConfig
|
|
142
|
-
}) || [];
|
|
143
|
-
cachedRouteObjects = hooks.modifyRoutes.call(routeObjects);
|
|
32
|
+
cachedRouteObjects = createTanstackRouteObjects({
|
|
33
|
+
hooks,
|
|
34
|
+
routeConfig: getTanstackRouteConfig(api, userConfig)
|
|
35
|
+
});
|
|
144
36
|
return cachedRouteObjects;
|
|
145
37
|
};
|
|
146
38
|
const getRouteTree = ()=>{
|
|
@@ -160,7 +52,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
160
52
|
const getClientBasename = (runtimeContext)=>{
|
|
161
53
|
const { basename = '' } = getMergedConfig();
|
|
162
54
|
const baseUrl = selectBasePath(location.pathname).replace(/^\/*/, '/');
|
|
163
|
-
return '/' === baseUrl ?
|
|
55
|
+
return '/' === baseUrl ? joinBasename(baseUrl, runtimeContext._internalRouterBaseName || basename || '') : baseUrl;
|
|
164
56
|
};
|
|
165
57
|
const getRouter = (runtimeContext, _basename)=>{
|
|
166
58
|
const routeTree = getRouteTree();
|
|
@@ -187,8 +79,12 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
187
79
|
const history = supportHtml5History ? createBrowserHistory() : createHashHistory();
|
|
188
80
|
const rewrite = createModernBasepathRewrite(_basename);
|
|
189
81
|
const serializationAdapters = getGlobalEnableRsc() ? getTanstackRscSerializationAdapters() : void 0;
|
|
82
|
+
const routerFastDefaults = getModernTanstackRouterFastDefaults(mergedConfig);
|
|
190
83
|
cachedRouter = createRouter({
|
|
191
|
-
...
|
|
84
|
+
...routerFastDefaults,
|
|
85
|
+
...serializationAdapters ? {
|
|
86
|
+
defaultStructuralSharing: false
|
|
87
|
+
} : {},
|
|
192
88
|
routeTree,
|
|
193
89
|
basepath: '/',
|
|
194
90
|
rewrite,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import { InternalRuntimeContext, getGlobalEnableRsc } from "@modern-js/runtime/context";
|
|
3
|
-
import { createRequestContext
|
|
3
|
+
import { createRequestContext } from "@modern-js/runtime-utils/node";
|
|
4
4
|
import { time } from "@modern-js/runtime-utils/time";
|
|
5
5
|
import { LOADER_REPORTER_NAME } from "@modern-js/utils/universal/constants";
|
|
6
6
|
import { RouterProvider, createMemoryHistory, createRouter } from "@tanstack/react-router";
|
|
@@ -9,131 +9,35 @@ import { createModernBasepathRewrite } from "./basepathRewrite.mjs";
|
|
|
9
9
|
import { routerProviderRegistryHooks } from "./hooks.mjs";
|
|
10
10
|
import { wrapTanstackSsrHydrationBoundary } from "./hydrationBoundary.mjs";
|
|
11
11
|
import { applyRouterServerPrepareResult, createRouterServerSnapshot, getRouterRuntimeState } from "./lifecycle.mjs";
|
|
12
|
-
import {
|
|
12
|
+
import { createTanstackRouteObjects, getTanstackRouteConfig, joinBasename } from "./pluginShared.mjs";
|
|
13
13
|
import { createRouteTreeFromRouteObjects, getModernRouteIdsFromMatches } from "./routeTree.mjs";
|
|
14
14
|
import { createTanstackRscServerPayload, handleTanstackRscRedirect } from "./rsc/payloadRouter.mjs";
|
|
15
|
+
import { getTanstackRscRouter, setTanstackRscRouter, setTanstackRscServerPayload } from "./rsc/payloadStorage.mjs";
|
|
16
|
+
import { attachServerSsrUtils, collectRouterErrors, createGetSsrHref, routerManagedTagsToHtml, waitForRouterSerialization } from "./ssrManagedTags.mjs";
|
|
17
|
+
import { preloadMatchedRouteComponents } from "./ssrPreload.mjs";
|
|
15
18
|
import { getModernTanstackRouterFastDefaults } from "./types.mjs";
|
|
16
|
-
import { createRouteObjectsFromConfig, urlJoin } from "./utils.mjs";
|
|
17
|
-
const setTanstackRscServerPayload = (payload)=>{
|
|
18
|
-
const storageContext = storage.useContext?.();
|
|
19
|
-
if (storageContext) storageContext.serverPayload = payload;
|
|
20
|
-
};
|
|
21
|
-
function isPromiseLike(value) {
|
|
22
|
-
return Boolean(value && 'function' == typeof value.then);
|
|
23
|
-
}
|
|
24
|
-
function isPreloadableRouteComponent(component) {
|
|
25
|
-
if (!component || 'function' != typeof component) return false;
|
|
26
|
-
const preloadable = component;
|
|
27
|
-
return 'function' == typeof preloadable.load || 'function' == typeof preloadable.preload;
|
|
28
|
-
}
|
|
29
|
-
function isReactLazyRouteComponent(component) {
|
|
30
|
-
return null != component && 'object' == typeof component && 'function' == typeof component._init && '_payload' in component;
|
|
31
|
-
}
|
|
32
|
-
async function preloadReactLazyRouteComponent(component) {
|
|
33
|
-
try {
|
|
34
|
-
component._init?.(component._payload);
|
|
35
|
-
} catch (thrown) {
|
|
36
|
-
if (!isPromiseLike(thrown)) throw thrown;
|
|
37
|
-
await thrown;
|
|
38
|
-
component._init?.(component._payload);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
async function preloadRouteComponent(component) {
|
|
42
|
-
if (isReactLazyRouteComponent(component)) return void await preloadReactLazyRouteComponent(component);
|
|
43
|
-
if (!isPreloadableRouteComponent(component)) return;
|
|
44
|
-
if ('function' == typeof component.load) return void await component.load({});
|
|
45
|
-
await component.preload?.({});
|
|
46
|
-
}
|
|
47
|
-
async function preloadMatchedRouteComponents(tanstackRouter) {
|
|
48
|
-
const matches = Array.isArray(tanstackRouter.state.matches) ? tanstackRouter.state.matches : [];
|
|
49
|
-
const routesById = tanstackRouter.routesById || {};
|
|
50
|
-
await Promise.all(matches.map(async (match)=>{
|
|
51
|
-
const routeId = 'string' == typeof match.routeId ? match.routeId : 'string' == typeof match.route?.id ? match.route.id : void 0;
|
|
52
|
-
const route = routeId ? routesById[routeId] : match.route;
|
|
53
|
-
const options = route?.options;
|
|
54
|
-
if (!options) return;
|
|
55
|
-
await Promise.all([
|
|
56
|
-
preloadRouteComponent(options.component),
|
|
57
|
-
preloadRouteComponent(options.pendingComponent),
|
|
58
|
-
preloadRouteComponent(options.errorComponent),
|
|
59
|
-
preloadRouteComponent(options.notFoundComponent)
|
|
60
|
-
]);
|
|
61
|
-
}));
|
|
62
|
-
}
|
|
63
|
-
async function waitForRouterSerialization(tanstackRouter) {
|
|
64
|
-
const serverSsr = tanstackRouter.serverSsr;
|
|
65
|
-
if (!serverSsr || 'function' != typeof serverSsr.onSerializationFinished || serverSsr.isSerializationFinished?.()) return;
|
|
66
|
-
await new Promise((resolve)=>{
|
|
67
|
-
serverSsr.onSerializationFinished?.(resolve);
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
function htmlEscapeAttr(value) {
|
|
71
|
-
return value.replace(/&/g, '&').replace(/"/g, '"');
|
|
72
|
-
}
|
|
73
|
-
function routerManagedTagToHtml(tag) {
|
|
74
|
-
if (!tag || 'object' != typeof tag) return '';
|
|
75
|
-
const managedTag = tag;
|
|
76
|
-
if (!managedTag || "script" !== managedTag.tag) return '';
|
|
77
|
-
const attrs = managedTag.attrs || {};
|
|
78
|
-
const attrsStr = Object.entries(attrs).filter(([, v])=>null != v && false !== v).map(([k, v])=>{
|
|
79
|
-
const name = 'className' === k ? 'class' : k;
|
|
80
|
-
if (true === v) return name;
|
|
81
|
-
return `${name}="${htmlEscapeAttr(String(v))}"`;
|
|
82
|
-
}).join(' ');
|
|
83
|
-
const open = attrsStr.length ? `<script ${attrsStr}>` : "<script>";
|
|
84
|
-
const children = 'string' == typeof managedTag.children ? managedTag.children : '';
|
|
85
|
-
return `${open}${children}</script>`;
|
|
86
|
-
}
|
|
87
|
-
function routerManagedTagsToHtml(tags) {
|
|
88
|
-
const normalizedTags = Array.isArray(tags) ? tags : [
|
|
89
|
-
tags
|
|
90
|
-
];
|
|
91
|
-
return normalizedTags.map(routerManagedTagToHtml).filter(Boolean);
|
|
92
|
-
}
|
|
93
|
-
function createGetSsrHref(request) {
|
|
94
|
-
const url = new URL(request.url);
|
|
95
|
-
return `${url.pathname}${url.search}${url.hash}`;
|
|
96
|
-
}
|
|
97
|
-
function collectRouterErrors(tanstackRouter) {
|
|
98
|
-
const state = tanstackRouter.state;
|
|
99
|
-
const matches = Array.isArray(state.matches) ? state.matches : [];
|
|
100
|
-
const errors = matches.reduce((acc, match)=>{
|
|
101
|
-
if (!match.error) return acc;
|
|
102
|
-
const routeId = 'string' == typeof match.routeId ? match.routeId : 'string' == typeof match.route?.id ? match.route.id : `match-${Object.keys(acc).length}`;
|
|
103
|
-
acc[routeId] = match.error;
|
|
104
|
-
return acc;
|
|
105
|
-
}, {});
|
|
106
|
-
return Object.keys(errors).length > 0 ? errors : void 0;
|
|
107
|
-
}
|
|
108
|
-
async function attachServerSsrUtils(router) {
|
|
109
|
-
const { attachRouterServerSsrUtils } = await import("@tanstack/router-core/ssr/server");
|
|
110
|
-
attachRouterServerSsrUtils({
|
|
111
|
-
router,
|
|
112
|
-
manifest: void 0
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
19
|
const tanstackRouterPlugin = (userConfig = {})=>{
|
|
116
20
|
const plugin = {
|
|
117
21
|
name: '@modern-js/plugin-router-tanstack',
|
|
118
22
|
registryHooks: routerProviderRegistryHooks,
|
|
119
23
|
setup: (api)=>{
|
|
120
24
|
api.onBeforeRender(async (context, interrupt)=>{
|
|
121
|
-
const
|
|
25
|
+
const routeConfig = getTanstackRouteConfig(api, userConfig);
|
|
26
|
+
const { mergedConfig } = routeConfig;
|
|
122
27
|
const serializationAdapters = getGlobalEnableRsc() ? (await import("./rsc/server.mjs")).getTanstackRscSerializationAdapters() : void 0;
|
|
123
28
|
const enableRsc = getGlobalEnableRsc();
|
|
124
|
-
const { basename = ''
|
|
125
|
-
|
|
126
|
-
if (!finalRouteConfig.routes && !createRoutes) return;
|
|
29
|
+
const { basename = '' } = mergedConfig;
|
|
30
|
+
if (!routeConfig.hasConfiguredRoutes) return;
|
|
127
31
|
const hooks = api.getHooks();
|
|
128
32
|
await hooks.onBeforeCreateRoutes.call(context);
|
|
129
|
-
const
|
|
130
|
-
|
|
33
|
+
const modifiedRouteObjects = createTanstackRouteObjects({
|
|
34
|
+
hooks,
|
|
35
|
+
routeConfig,
|
|
131
36
|
ssrMode: context.ssrContext?.mode
|
|
132
|
-
})
|
|
133
|
-
const modifiedRouteObjects = hooks.modifyRoutes.call(routeObjects);
|
|
37
|
+
});
|
|
134
38
|
if (!modifiedRouteObjects.length) return;
|
|
135
39
|
const { request, nonce, baseUrl, loaderFailureMode = 'errorBoundary' } = context.ssrContext;
|
|
136
|
-
const _basename = '/' === baseUrl ?
|
|
40
|
+
const _basename = '/' === baseUrl ? joinBasename(baseUrl, basename || '') : baseUrl;
|
|
137
41
|
const rawRequest = request.raw;
|
|
138
42
|
const initialHref = createGetSsrHref(rawRequest);
|
|
139
43
|
const isRSCNavigation = enableRsc && 'true' === rawRequest.headers.get('x-rsc-tree');
|
|
@@ -179,6 +83,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
179
83
|
} : {}
|
|
180
84
|
});
|
|
181
85
|
const serverRouter = tanstackRouter;
|
|
86
|
+
if (enableRsc) setTanstackRscRouter(serverRouter);
|
|
182
87
|
await attachServerSsrUtils(serverRouter);
|
|
183
88
|
const end = time();
|
|
184
89
|
try {
|
|
@@ -207,10 +112,10 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
207
112
|
await preloadMatchedRouteComponents(serverRouter);
|
|
208
113
|
context.ssrContext?.response?.status(tanstackRouter.state.statusCode);
|
|
209
114
|
await serverRouter.serverSsr?.dehydrate?.();
|
|
210
|
-
if (
|
|
211
|
-
await waitForRouterSerialization(serverRouter);
|
|
115
|
+
if (enableRsc) {
|
|
116
|
+
if (isRSCNavigation) await waitForRouterSerialization(serverRouter);
|
|
212
117
|
setTanstackRscServerPayload(createTanstackRscServerPayload(serverRouter, {
|
|
213
|
-
omitClientLoaderData:
|
|
118
|
+
omitClientLoaderData: isRSCNavigation
|
|
214
119
|
}));
|
|
215
120
|
}
|
|
216
121
|
const ssrScriptTags = serverRouter.serverSsr?.takeBufferedScripts?.();
|
|
@@ -244,7 +149,20 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
244
149
|
});
|
|
245
150
|
});
|
|
246
151
|
api.wrapRoot((App)=>{
|
|
247
|
-
const getRouteApp = ()=>
|
|
152
|
+
const getRouteApp = ()=>{
|
|
153
|
+
if (getGlobalEnableRsc()) return (props)=>{
|
|
154
|
+
const router = getTanstackRscRouter();
|
|
155
|
+
if (!router) return App ? /*#__PURE__*/ jsx(App, {
|
|
156
|
+
...props
|
|
157
|
+
}) : null;
|
|
158
|
+
const routerWrapper = wrapTanstackSsrHydrationBoundary(/*#__PURE__*/ jsx(RouterProvider, {
|
|
159
|
+
router: router
|
|
160
|
+
}), true);
|
|
161
|
+
return App ? /*#__PURE__*/ jsx(App, {
|
|
162
|
+
children: routerWrapper
|
|
163
|
+
}) : routerWrapper;
|
|
164
|
+
};
|
|
165
|
+
return (props)=>{
|
|
248
166
|
const context = useContext(InternalRuntimeContext);
|
|
249
167
|
const router = getRouterRuntimeState(context)?.instance;
|
|
250
168
|
if (!router) return App ? /*#__PURE__*/ jsx(App, {
|
|
@@ -257,6 +175,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
257
175
|
children: routerWrapper
|
|
258
176
|
}) : routerWrapper;
|
|
259
177
|
};
|
|
178
|
+
};
|
|
260
179
|
return getRouteApp();
|
|
261
180
|
});
|
|
262
181
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { getGlobalLayoutApp, getGlobalRoutes } from "@modern-js/runtime/context";
|
|
2
|
+
import { merge } from "@modern-js/runtime-utils/merge";
|
|
3
|
+
import { createTanstackRouteObjectsFromConfig } from "./utils.mjs";
|
|
4
|
+
function getMergedRouterConfig(api, userConfig) {
|
|
5
|
+
const pluginConfig = api.getRuntimeConfig();
|
|
6
|
+
return merge(pluginConfig.router || {}, userConfig);
|
|
7
|
+
}
|
|
8
|
+
function getFinalRouteConfig(mergedConfig) {
|
|
9
|
+
return {
|
|
10
|
+
routes: getGlobalRoutes(),
|
|
11
|
+
globalApp: getGlobalLayoutApp(),
|
|
12
|
+
...mergedConfig.routesConfig
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function getTanstackRouteConfig(api, userConfig) {
|
|
16
|
+
const mergedConfig = getMergedRouterConfig(api, userConfig);
|
|
17
|
+
const finalRouteConfig = getFinalRouteConfig(mergedConfig);
|
|
18
|
+
return {
|
|
19
|
+
mergedConfig,
|
|
20
|
+
finalRouteConfig,
|
|
21
|
+
hasConfiguredRoutes: Boolean(finalRouteConfig.routes) || Boolean(mergedConfig.createRoutes)
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function createTanstackRouteObjects({ hooks, routeConfig, ssrMode }) {
|
|
25
|
+
const { mergedConfig, finalRouteConfig } = routeConfig;
|
|
26
|
+
const routeObjects = mergedConfig.createRoutes ? mergedConfig.createRoutes() : createTanstackRouteObjectsFromConfig({
|
|
27
|
+
routesConfig: finalRouteConfig,
|
|
28
|
+
ssrMode
|
|
29
|
+
}) || [];
|
|
30
|
+
return hooks.modifyRoutes.call(routeObjects);
|
|
31
|
+
}
|
|
32
|
+
function joinBasename(baseUrl, basename) {
|
|
33
|
+
const base = baseUrl || '/';
|
|
34
|
+
const normalizedBase = base.startsWith('/') ? base : `/${base}`;
|
|
35
|
+
const trimmedBase = normalizedBase.length > 1 ? normalizedBase.replace(/\/+$/g, '') : normalizedBase;
|
|
36
|
+
const trimmedBasename = basename.replace(/^\/+|\/+$/g, '');
|
|
37
|
+
if (!trimmedBasename) return trimmedBase || '/';
|
|
38
|
+
return `${trimmedBase}/${trimmedBasename}`.replace(/\/{2,}/g, '/');
|
|
39
|
+
}
|
|
40
|
+
export { createTanstackRouteObjects, getFinalRouteConfig, getMergedRouterConfig, getTanstackRouteConfig, joinBasename };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createElement } from "react";
|
|
2
|
+
function pickRouteModuleComponent(routeModule, seen = new Set()) {
|
|
3
|
+
if ('function' == typeof routeModule || routeModule && 'object' == typeof routeModule && '$$typeof' in routeModule) return routeModule;
|
|
4
|
+
if (!routeModule || 'object' != typeof routeModule) return;
|
|
5
|
+
if (seen.has(routeModule)) return;
|
|
6
|
+
seen.add(routeModule);
|
|
7
|
+
const module = routeModule;
|
|
8
|
+
for (const candidate of [
|
|
9
|
+
module.default,
|
|
10
|
+
module.Component
|
|
11
|
+
]){
|
|
12
|
+
const component = pickRouteModuleComponent(candidate, seen);
|
|
13
|
+
if (component) return component;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function createServerLazyImportComponent(lazyImport, fallbackComponent) {
|
|
17
|
+
if ("u" > typeof document) return fallbackComponent;
|
|
18
|
+
let resolvedComponent;
|
|
19
|
+
let pendingLoad;
|
|
20
|
+
const load = async ()=>{
|
|
21
|
+
if (resolvedComponent) return resolvedComponent;
|
|
22
|
+
const routeModule = await lazyImport();
|
|
23
|
+
const component = pickRouteModuleComponent(routeModule);
|
|
24
|
+
if (component) resolvedComponent = component;
|
|
25
|
+
return resolvedComponent;
|
|
26
|
+
};
|
|
27
|
+
const Component = (props)=>{
|
|
28
|
+
if (resolvedComponent) return createElement(resolvedComponent, props);
|
|
29
|
+
pendingLoad ||= load();
|
|
30
|
+
throw pendingLoad;
|
|
31
|
+
};
|
|
32
|
+
Component.load = load;
|
|
33
|
+
Component.preload = load;
|
|
34
|
+
return Component;
|
|
35
|
+
}
|
|
36
|
+
function toRouteComponent(routeObject, options = {}) {
|
|
37
|
+
const route = routeObject;
|
|
38
|
+
const lazyImport = 'function' == typeof route.lazyImport ? route.lazyImport : void 0;
|
|
39
|
+
const routeComponent = route.Component || route.component;
|
|
40
|
+
const fallbackComponent = routeComponent ? routeComponent : route.element ? ()=>route.element : void 0;
|
|
41
|
+
if (lazyImport && fallbackComponent) return createServerLazyImportComponent(lazyImport, fallbackComponent);
|
|
42
|
+
if (routeComponent) return routeComponent;
|
|
43
|
+
const element = route.element;
|
|
44
|
+
if (element) return ()=>element;
|
|
45
|
+
}
|
|
46
|
+
function toErrorComponent(routeObject) {
|
|
47
|
+
const route = routeObject;
|
|
48
|
+
if (route.ErrorBoundary) return route.ErrorBoundary;
|
|
49
|
+
if (route.errorElement) return ()=>route.errorElement;
|
|
50
|
+
}
|
|
51
|
+
function toPendingComponent(routeObject) {
|
|
52
|
+
const route = routeObject;
|
|
53
|
+
return route.HydrateFallback || route.pendingComponent || void 0;
|
|
54
|
+
}
|
|
55
|
+
export { pickRouteModuleComponent, toErrorComponent, toPendingComponent, toRouteComponent };
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { DefaultNotFound } from "@modern-js/runtime/context";
|
|
2
|
+
import { rootRouteId } from "@tanstack/react-router";
|
|
3
|
+
import { withModernRouteMatchContext } from "../outlet.mjs";
|
|
4
|
+
import { toErrorComponent, toPendingComponent, toRouteComponent } from "./components.mjs";
|
|
5
|
+
import { createModernShouldReload, wrapRouteObjectLoader } from "./loaders.mjs";
|
|
6
|
+
import { isRouteObjectPathlessLayout, toTanstackPath } from "./paths.mjs";
|
|
7
|
+
import { createRouteStaticData, mergeModernRouteHandle } from "./staticData.mjs";
|
|
8
|
+
import { createTanstackRootRoute, createTanstackRoute, wrapRouteComponentWithModernContext } from "./tanstackRoutes.mjs";
|
|
9
|
+
function createRouteFromRouteObject(opts) {
|
|
10
|
+
const { options = {}, parent, pathlessFallbackId = 'pathless', routeObject } = opts;
|
|
11
|
+
const modernRouteObject = routeObject;
|
|
12
|
+
const revalidationState = {};
|
|
13
|
+
const shouldRevalidate = modernRouteObject.shouldRevalidate;
|
|
14
|
+
const shouldReload = createModernShouldReload(shouldRevalidate, revalidationState);
|
|
15
|
+
const stableFallbackId = routeObject.id || modernRouteObject.file || pathlessFallbackId;
|
|
16
|
+
const component = toRouteComponent(routeObject, options);
|
|
17
|
+
const base = {
|
|
18
|
+
getParentRoute: ()=>parent,
|
|
19
|
+
component,
|
|
20
|
+
pendingComponent: toPendingComponent(routeObject),
|
|
21
|
+
errorComponent: toErrorComponent(routeObject),
|
|
22
|
+
validateSearch: modernRouteObject.validateSearch,
|
|
23
|
+
loaderDeps: modernRouteObject.loaderDeps,
|
|
24
|
+
staticData: createRouteStaticData({
|
|
25
|
+
modernRouteId: routeObject.id,
|
|
26
|
+
modernRouteAction: modernRouteObject.action,
|
|
27
|
+
modernRouteHandle: mergeModernRouteHandle(modernRouteObject),
|
|
28
|
+
modernRouteHasAction: modernRouteObject.hasAction || Boolean(modernRouteObject.action),
|
|
29
|
+
modernRouteHasClientLoader: modernRouteObject.hasClientLoader || void 0 !== modernRouteObject.clientData,
|
|
30
|
+
modernRouteHasLoader: modernRouteObject.hasLoader || 'function' == typeof modernRouteObject.loader,
|
|
31
|
+
modernRouteIsClientComponent: modernRouteObject.isClientComponent,
|
|
32
|
+
modernRouteLoader: modernRouteObject.loader,
|
|
33
|
+
modernRouteShouldRevalidate: shouldRevalidate
|
|
34
|
+
}),
|
|
35
|
+
loader: wrapRouteObjectLoader(routeObject, revalidationState, options)
|
|
36
|
+
};
|
|
37
|
+
if (modernRouteObject.inValidSSRRoute) base.ssr = false;
|
|
38
|
+
if (shouldReload) base.shouldReload = shouldReload;
|
|
39
|
+
if (isRouteObjectPathlessLayout(routeObject)) base.id = stableFallbackId;
|
|
40
|
+
else base.path = routeObject.index ? '/' : toTanstackPath(routeObject.path || '');
|
|
41
|
+
const route = createTanstackRoute(base);
|
|
42
|
+
wrapRouteComponentWithModernContext(route, component, routeObject.id);
|
|
43
|
+
const children = routeObject.children;
|
|
44
|
+
if (children && children.length > 0) {
|
|
45
|
+
const childRoutes = children.map((child, index)=>createRouteFromRouteObject({
|
|
46
|
+
options,
|
|
47
|
+
parent: route,
|
|
48
|
+
pathlessFallbackId: `pathless-${index}`,
|
|
49
|
+
routeObject: child
|
|
50
|
+
}));
|
|
51
|
+
route.addChildren(childRoutes);
|
|
52
|
+
}
|
|
53
|
+
return route;
|
|
54
|
+
}
|
|
55
|
+
function getRootLikeRouteObject(routes) {
|
|
56
|
+
return routes.find((route)=>'/' === route.path && !route.index);
|
|
57
|
+
}
|
|
58
|
+
function createRouteTreeFromRouteObjects(routes, options = {}) {
|
|
59
|
+
const rootLikeRoute = getRootLikeRouteObject(routes);
|
|
60
|
+
const rootRevalidationState = {};
|
|
61
|
+
const rootShouldRevalidate = rootLikeRoute?.shouldRevalidate;
|
|
62
|
+
const rootShouldReload = createModernShouldReload(rootShouldRevalidate, rootRevalidationState);
|
|
63
|
+
const rootComponent = rootLikeRoute ? toRouteComponent(rootLikeRoute) : void 0;
|
|
64
|
+
const rootRouteOptions = {
|
|
65
|
+
component: rootComponent,
|
|
66
|
+
pendingComponent: rootLikeRoute ? toPendingComponent(rootLikeRoute) : void 0,
|
|
67
|
+
errorComponent: rootLikeRoute ? toErrorComponent(rootLikeRoute) : void 0,
|
|
68
|
+
validateSearch: rootLikeRoute?.validateSearch,
|
|
69
|
+
loaderDeps: rootLikeRoute?.loaderDeps,
|
|
70
|
+
notFoundComponent: DefaultNotFound,
|
|
71
|
+
staticData: createRouteStaticData({
|
|
72
|
+
modernRouteId: rootLikeRoute?.id,
|
|
73
|
+
modernRouteAction: rootLikeRoute?.action,
|
|
74
|
+
modernRouteHandle: rootLikeRoute ? mergeModernRouteHandle(rootLikeRoute) : void 0,
|
|
75
|
+
modernRouteHasAction: rootLikeRoute?.hasAction || Boolean(rootLikeRoute?.action),
|
|
76
|
+
modernRouteHasClientLoader: rootLikeRoute?.hasClientLoader || void 0 !== rootLikeRoute?.clientData,
|
|
77
|
+
modernRouteHasLoader: rootLikeRoute?.hasLoader || 'function' == typeof rootLikeRoute?.loader,
|
|
78
|
+
modernRouteIsClientComponent: rootLikeRoute?.isClientComponent,
|
|
79
|
+
modernRouteLoader: rootLikeRoute?.loader,
|
|
80
|
+
modernRouteShouldRevalidate: rootShouldRevalidate
|
|
81
|
+
}),
|
|
82
|
+
loader: rootLikeRoute ? wrapRouteObjectLoader(rootLikeRoute, rootRevalidationState, options) : void 0
|
|
83
|
+
};
|
|
84
|
+
if (rootShouldReload) rootRouteOptions.shouldReload = rootShouldReload;
|
|
85
|
+
if (rootLikeRoute?.inValidSSRRoute) rootRouteOptions.ssr = false;
|
|
86
|
+
const rootRoute = createTanstackRootRoute(rootRouteOptions);
|
|
87
|
+
if (rootComponent) rootRoute.options.component = withModernRouteMatchContext(rootComponent, rootRouteId);
|
|
88
|
+
const topLevel = rootLikeRoute ? [
|
|
89
|
+
...rootLikeRoute.children || [],
|
|
90
|
+
...routes.filter((route)=>route !== rootLikeRoute)
|
|
91
|
+
] : routes;
|
|
92
|
+
const childRoutes = topLevel.map((routeObject, index)=>createRouteFromRouteObject({
|
|
93
|
+
options,
|
|
94
|
+
parent: rootRoute,
|
|
95
|
+
pathlessFallbackId: `pathless-${index}`,
|
|
96
|
+
routeObject
|
|
97
|
+
}));
|
|
98
|
+
rootRoute.addChildren(childRoutes);
|
|
99
|
+
return rootRoute;
|
|
100
|
+
}
|
|
101
|
+
function getModernRouteIdsFromMatches(router) {
|
|
102
|
+
const matches = router.state.matches || [];
|
|
103
|
+
const routesById = router.routesById;
|
|
104
|
+
const ids = matches.map((match)=>{
|
|
105
|
+
const normalizedMatch = match;
|
|
106
|
+
const routeId = 'string' == typeof normalizedMatch.routeId ? normalizedMatch.routeId : void 0;
|
|
107
|
+
return normalizedMatch.route?.options?.staticData?.modernRouteId ?? (routeId ? routesById?.[routeId]?.options?.staticData?.modernRouteId : void 0);
|
|
108
|
+
}).filter((id)=>'string' == typeof id);
|
|
109
|
+
return Array.from(new Set(ids));
|
|
110
|
+
}
|
|
111
|
+
export { createRouteTreeFromRouteObjects, getModernRouteIdsFromMatches };
|