@bleedingdev/modern-js-plugin-tanstack 3.5.0-ultramodern.9 → 3.5.0-ultramodern.91
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 +8 -79
- package/dist/cjs/cli/tanstackTypes/canonicalRoutes.js +113 -0
- package/dist/cjs/cli/tanstackTypes/shared.js +123 -0
- package/dist/cjs/cli/tanstackTypes/source.js +255 -0
- package/dist/cjs/cli/tanstackTypes.js +4 -350
- package/dist/cjs/runtime/blockingSubscribe.js +57 -0
- package/dist/cjs/runtime/{pluginCore.js → clientBasepath.js} +12 -19
- package/dist/cjs/runtime/clientHydration.js +118 -0
- package/dist/cjs/runtime/dataMutation.js +11 -176
- package/dist/cjs/runtime/formData.js +116 -0
- package/dist/cjs/runtime/loaderBridge.js +7 -11
- package/dist/cjs/runtime/plugin.js +21 -125
- package/dist/cjs/runtime/plugin.node.js +45 -125
- package/dist/cjs/runtime/pluginShared.js +87 -0
- package/dist/cjs/runtime/prefetchLink.js +15 -2
- package/dist/cjs/runtime/register.js +3 -16
- 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/router.js +15 -2
- package/dist/cjs/runtime/rsc/CompositeComponent.js +18 -13
- package/dist/cjs/runtime/rsc/ReplayableStream.js +0 -4
- 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 +105 -0
- package/dist/cjs/runtime/rsc/payloadRouter.js +21 -142
- package/dist/cjs/runtime/rsc/payloadRoutes.js +94 -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 +68 -0
- package/dist/cjs/runtime/rsc/slotUsageSanitizer.js +1 -0
- package/dist/cjs/runtime/rsc/treeGetter.js +72 -0
- package/dist/cjs/runtime/shared/isAbsoluteUrl.js +47 -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/state.js +1 -1
- 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 +8 -82
- package/dist/esm/cli/tanstackTypes/canonicalRoutes.mjs +75 -0
- package/dist/esm/cli/tanstackTypes/shared.mjs +61 -0
- package/dist/esm/cli/tanstackTypes/source.mjs +207 -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 +71 -0
- package/dist/esm/runtime/dataMutation.mjs +2 -167
- package/dist/esm/runtime/formData.mjs +63 -0
- package/dist/esm/runtime/loaderBridge.mjs +5 -9
- package/dist/esm/runtime/plugin.mjs +14 -118
- package/dist/esm/runtime/plugin.node.mjs +41 -121
- package/dist/esm/runtime/pluginShared.mjs +40 -0
- package/dist/esm/runtime/prefetchLink.mjs +18 -5
- package/dist/esm/runtime/register.mjs +1 -14
- 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/router.mjs +16 -2
- package/dist/esm/runtime/rsc/CompositeComponent.mjs +18 -13
- package/dist/esm/runtime/rsc/ReplayableStream.mjs +1 -1
- 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 +55 -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/slotUsageSanitizer.mjs +1 -0
- package/dist/esm/runtime/rsc/treeGetter.mjs +34 -0
- package/dist/esm/runtime/shared/isAbsoluteUrl.mjs +9 -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/state.mjs +1 -1
- 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 +8 -82
- package/dist/esm-node/cli/tanstackTypes/canonicalRoutes.mjs +76 -0
- package/dist/esm-node/cli/tanstackTypes/shared.mjs +62 -0
- package/dist/esm-node/cli/tanstackTypes/source.mjs +208 -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 +72 -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 +5 -9
- package/dist/esm-node/runtime/plugin.mjs +14 -118
- package/dist/esm-node/runtime/plugin.node.mjs +41 -121
- package/dist/esm-node/runtime/pluginShared.mjs +41 -0
- package/dist/esm-node/runtime/prefetchLink.mjs +18 -5
- package/dist/esm-node/runtime/register.mjs +1 -14
- 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/router.mjs +16 -2
- package/dist/esm-node/runtime/rsc/CompositeComponent.mjs +18 -13
- package/dist/esm-node/runtime/rsc/ReplayableStream.mjs +1 -1
- 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 +56 -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/slotUsageSanitizer.mjs +1 -0
- package/dist/esm-node/runtime/rsc/treeGetter.mjs +35 -0
- package/dist/esm-node/runtime/shared/isAbsoluteUrl.mjs +10 -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/state.mjs +1 -1
- 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 -22
- 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 +12 -0
- package/dist/types/cli/tanstackTypes.d.ts +3 -31
- package/dist/types/runtime/blockingSubscribe.d.ts +1 -0
- package/dist/types/runtime/clientBasepath.d.ts +1 -0
- package/dist/types/runtime/clientHydration.d.ts +10 -0
- package/dist/types/runtime/dataMutation.d.ts +3 -12
- package/dist/types/runtime/formData.d.ts +24 -0
- package/dist/types/runtime/loaderBridge.d.ts +2 -1
- package/dist/types/runtime/plugin.d.ts +1 -1
- package/dist/types/runtime/plugin.node.d.ts +1 -1
- package/dist/types/runtime/pluginShared.d.ts +38 -0
- package/dist/types/runtime/register.d.ts +10 -9
- 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 +76 -0
- package/dist/types/runtime/routeTree.d.ts +1 -9
- package/dist/types/runtime/router.d.ts +6 -7
- package/dist/types/runtime/rsc/CompositeComponent.d.ts +1 -2
- package/dist/types/runtime/rsc/ReplayableStream.d.ts +3 -2
- package/dist/types/runtime/rsc/RscNodeRenderer.d.ts +2 -3
- package/dist/types/runtime/rsc/SlotContext.d.ts +2 -1
- 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 +8 -0
- package/dist/types/runtime/rsc/payloadRouter.d.ts +2 -10
- package/dist/types/runtime/rsc/payloadRoutes.d.ts +40 -0
- package/dist/types/runtime/rsc/payloadStorage.d.ts +5 -0
- package/dist/types/runtime/rsc/shared.d.ts +18 -0
- package/dist/types/runtime/rsc/treeGetter.d.ts +1 -0
- package/dist/types/runtime/shared/isAbsoluteUrl.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 +44 -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 +4 -10
- package/dist/types/runtime/utils.d.ts +4 -24
- package/package.json +37 -17
- package/rstest.config.mts +23 -0
- package/src/cli/artifacts.ts +255 -0
- package/src/cli/index.ts +7 -185
- package/src/cli/tanstackTypes/canonicalRoutes.ts +157 -0
- package/src/cli/tanstackTypes/shared.ts +113 -0
- package/src/cli/tanstackTypes/source.ts +414 -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 +149 -0
- package/src/runtime/dataMutation.tsx +9 -306
- package/src/runtime/formData.ts +153 -0
- package/src/runtime/loaderBridge.ts +11 -12
- package/src/runtime/plugin.node.tsx +76 -291
- package/src/runtime/plugin.tsx +21 -257
- package/src/runtime/pluginShared.ts +112 -0
- package/src/runtime/prefetchLink.tsx +78 -15
- package/src/runtime/register.ts +10 -42
- 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/router.ts +35 -7
- package/src/runtime/rsc/CompositeComponent.tsx +29 -20
- package/src/runtime/rsc/ReplayableStream.ts +2 -2
- package/src/runtime/rsc/RscNodeRenderer.tsx +9 -27
- package/src/runtime/rsc/SlotContext.tsx +1 -1
- 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 +92 -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/slotUsageSanitizer.ts +4 -0
- package/src/runtime/rsc/treeGetter.tsx +52 -0
- package/src/runtime/shared/isAbsoluteUrl.ts +8 -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 +9 -3
- package/src/runtime/submitAction.ts +201 -0
- package/src/runtime/types.ts +4 -18
- package/src/runtime/utils.tsx +76 -110
- package/src/types/react-server-dom-rspack.d.ts +56 -0
- package/tests/castRatchet.test.ts +85 -0
- package/tests/realm-isolation.test.ts +114 -0
- package/tests/router/cli.test.ts +7 -0
- package/tests/router/clientHydration.test.tsx +61 -0
- package/tests/router/dataMutation.test.tsx +59 -0
- package/tests/router/fixtures/legacyRuntimeRouter.ts +10 -0
- package/tests/router/fixtures/router-gen.golden.txt +71 -0
- package/tests/router/fixtures/router-gen.oxlint.json +5 -0
- package/tests/router/flightSerialization.roundtrip.test.tsx +137 -0
- package/tests/router/generateRouteArtifacts.test.ts +106 -0
- package/tests/router/hooks.test.ts +14 -0
- package/tests/router/loaderBridge.test.ts +21 -0
- package/tests/router/prefetchLink.test.tsx +106 -59
- package/tests/router/prefetchLinkPreload.test.tsx +85 -0
- package/tests/router/register.test.ts +1 -39
- package/tests/router/routeTree.test.ts +51 -11
- package/tests/router/routerCompatibility.test.ts +245 -0
- package/tests/router/rsc.test.tsx +189 -0
- package/tests/router/rscPayloadRouterMatrix.test.ts +197 -0
- package/tests/router/slotUsageSanitizer.test.ts +23 -0
- package/tests/router/ssrPreload.test.ts +30 -0
- package/tests/router/tanstackTypes.test.ts +298 -1
- package/dist/esm/runtime/pluginCore.mjs +0 -14
- package/dist/esm-node/runtime/pluginCore.mjs +0 -15
- package/dist/types/runtime/pluginCore.d.ts +0 -21
- package/src/runtime/pluginCore.ts +0 -48
|
@@ -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,138 +9,43 @@ 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 ?
|
|
137
|
-
const
|
|
138
|
-
const
|
|
40
|
+
const _basename = '/' === baseUrl ? joinBasename(baseUrl, basename || '') : baseUrl;
|
|
41
|
+
const rawRequest = request.raw;
|
|
42
|
+
const initialHref = createGetSsrHref(rawRequest);
|
|
43
|
+
const isRSCNavigation = enableRsc && 'true' === rawRequest.headers.get('x-rsc-tree');
|
|
139
44
|
const requestContext = createRequestContext(context.ssrContext?.loaderContext);
|
|
140
45
|
const controller = new AbortController();
|
|
141
|
-
const ssrRequest = new Request(
|
|
46
|
+
const ssrRequest = new Request(rawRequest.url, {
|
|
142
47
|
method: 'GET',
|
|
143
|
-
headers:
|
|
48
|
+
headers: rawRequest.headers,
|
|
144
49
|
signal: controller.signal
|
|
145
50
|
});
|
|
146
51
|
const routerContext = {
|
|
@@ -168,7 +73,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
168
73
|
history,
|
|
169
74
|
basepath: '/',
|
|
170
75
|
rewrite,
|
|
171
|
-
origin: new URL(
|
|
76
|
+
origin: new URL(rawRequest.url).origin,
|
|
172
77
|
ssr: {
|
|
173
78
|
nonce
|
|
174
79
|
},
|
|
@@ -178,6 +83,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
178
83
|
} : {}
|
|
179
84
|
});
|
|
180
85
|
const serverRouter = tanstackRouter;
|
|
86
|
+
if (enableRsc) setTanstackRscRouter(serverRouter);
|
|
181
87
|
await attachServerSsrUtils(serverRouter);
|
|
182
88
|
const end = time();
|
|
183
89
|
try {
|
|
@@ -197,19 +103,19 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
197
103
|
}
|
|
198
104
|
const routerErrors = collectRouterErrors(tanstackRouter);
|
|
199
105
|
if (routerErrors && 'clientRender' === loaderFailureMode) {
|
|
200
|
-
context.ssrContext?.response
|
|
106
|
+
context.ssrContext?.response?.status(200);
|
|
201
107
|
try {
|
|
202
108
|
serverRouter.serverSsr?.cleanup?.();
|
|
203
109
|
} catch {}
|
|
204
110
|
throw Object.values(routerErrors)[0];
|
|
205
111
|
}
|
|
206
112
|
await preloadMatchedRouteComponents(serverRouter);
|
|
207
|
-
context.ssrContext?.response
|
|
113
|
+
context.ssrContext?.response?.status(tanstackRouter.state.statusCode);
|
|
208
114
|
await serverRouter.serverSsr?.dehydrate?.();
|
|
209
|
-
if (
|
|
210
|
-
await waitForRouterSerialization(serverRouter);
|
|
115
|
+
if (enableRsc) {
|
|
116
|
+
if (isRSCNavigation) await waitForRouterSerialization(serverRouter);
|
|
211
117
|
setTanstackRscServerPayload(createTanstackRscServerPayload(serverRouter, {
|
|
212
|
-
omitClientLoaderData:
|
|
118
|
+
omitClientLoaderData: isRSCNavigation
|
|
213
119
|
}));
|
|
214
120
|
}
|
|
215
121
|
const ssrScriptTags = serverRouter.serverSsr?.takeBufferedScripts?.();
|
|
@@ -243,7 +149,20 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
243
149
|
});
|
|
244
150
|
});
|
|
245
151
|
api.wrapRoot((App)=>{
|
|
246
|
-
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)=>{
|
|
247
166
|
const context = useContext(InternalRuntimeContext);
|
|
248
167
|
const router = getRouterRuntimeState(context)?.instance;
|
|
249
168
|
if (!router) return App ? /*#__PURE__*/ jsx(App, {
|
|
@@ -256,6 +175,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
256
175
|
children: routerWrapper
|
|
257
176
|
}) : routerWrapper;
|
|
258
177
|
};
|
|
178
|
+
};
|
|
259
179
|
return getRouteApp();
|
|
260
180
|
});
|
|
261
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, getMergedRouterConfig, getTanstackRouteConfig, joinBasename };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { useLinkProps } from "@tanstack/react-router";
|
|
3
3
|
function resolvePreloadFromPrefetch(prefetch, preload) {
|
|
4
4
|
if (void 0 !== preload) return preload;
|
|
5
5
|
if ('none' === prefetch) return false;
|
|
@@ -7,12 +7,25 @@ function resolvePreloadFromPrefetch(prefetch, preload) {
|
|
|
7
7
|
return 'viewport';
|
|
8
8
|
}
|
|
9
9
|
const LinkComponentImpl = (props)=>{
|
|
10
|
-
const { prefetch, preload, ...rest } = props;
|
|
11
|
-
|
|
10
|
+
const { prefetch, preload, 'aria-current': ariaCurrentProp, ref, children, ...rest } = props;
|
|
11
|
+
const hasAriaCurrentOverride = 'aria-current' in props;
|
|
12
|
+
const linkOptions = {
|
|
12
13
|
...rest,
|
|
13
14
|
preload: resolvePreloadFromPrefetch(prefetch, preload)
|
|
15
|
+
};
|
|
16
|
+
const linkProps = useLinkProps(linkOptions, ref);
|
|
17
|
+
const { disabled: _disabled, type: _type, ...anchorProps } = linkProps;
|
|
18
|
+
if (hasAriaCurrentOverride) if (false === ariaCurrentProp || void 0 === ariaCurrentProp) delete anchorProps['aria-current'];
|
|
19
|
+
else anchorProps['aria-current'] = ariaCurrentProp;
|
|
20
|
+
const resolvedChildren = 'function' == typeof children ? children({
|
|
21
|
+
isActive: 'active' === anchorProps['data-status'],
|
|
22
|
+
isTransitioning: 'transitioning' === anchorProps['data-transitioning']
|
|
23
|
+
}) : children;
|
|
24
|
+
return /*#__PURE__*/ jsx("a", {
|
|
25
|
+
...anchorProps,
|
|
26
|
+
children: resolvedChildren
|
|
14
27
|
});
|
|
15
28
|
};
|
|
16
|
-
const
|
|
29
|
+
const Link = LinkComponentImpl;
|
|
17
30
|
const NavLink = LinkComponentImpl;
|
|
18
|
-
export {
|
|
31
|
+
export { Link, NavLink };
|
|
@@ -1,18 +1,5 @@
|
|
|
1
1
|
import { registerRouterProvider } from "@modern-js/runtime/context";
|
|
2
|
-
import { Form, RouteActionResponseError, useFetcher } from "./dataMutation.mjs";
|
|
3
|
-
import { Outlet } from "./outlet.mjs";
|
|
4
2
|
import { tanstackRouterPlugin } from "./plugin.mjs";
|
|
5
|
-
import { Link, NavLink } from "./prefetchLink.mjs";
|
|
6
3
|
const tanstackRouterProviderFactory = (userConfig)=>tanstackRouterPlugin(userConfig);
|
|
7
4
|
registerRouterProvider('tanstack', tanstackRouterProviderFactory);
|
|
8
|
-
|
|
9
|
-
const tanstackRouterCompatBindings = {
|
|
10
|
-
Form: Form,
|
|
11
|
-
Link: Link,
|
|
12
|
-
NavLink: NavLink,
|
|
13
|
-
Outlet: Outlet,
|
|
14
|
-
RouteActionResponseError: RouteActionResponseError,
|
|
15
|
-
useFetcher: useFetcher
|
|
16
|
-
};
|
|
17
|
-
globalThis[COMPAT_BINDINGS_SLOT] ??= tanstackRouterCompatBindings;
|
|
18
|
-
export { tanstackRouterCompatBindings };
|
|
5
|
+
export { tanstackRouterProviderFactory };
|
|
@@ -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 };
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { notFound } from "@tanstack/react-router";
|
|
2
|
+
import { isRedirectResponse, isResponse, isTanstackRedirect, throwTanstackRedirect } from "../loaderBridge.mjs";
|
|
3
|
+
import { isTanstackRscPayloadNavigationEnabled, loadTanstackRscRouteData } from "../rsc/payloadRouter.mjs";
|
|
4
|
+
function isModernDeferredData(value) {
|
|
5
|
+
if (!value || 'object' != typeof value) return false;
|
|
6
|
+
const deferred = value;
|
|
7
|
+
return true === deferred.__modern_deferred && Boolean(deferred.data) && 'object' == typeof deferred.data && !Array.isArray(deferred.data);
|
|
8
|
+
}
|
|
9
|
+
function normalizeModernLoaderResult(result) {
|
|
10
|
+
return isModernDeferredData(result) ? result.data : result;
|
|
11
|
+
}
|
|
12
|
+
function normalizeModernLoaderResponse(result) {
|
|
13
|
+
if (isResponse(result)) {
|
|
14
|
+
if (isRedirectResponse(result)) {
|
|
15
|
+
const location = result.headers.get('Location') || '/';
|
|
16
|
+
throwTanstackRedirect(location);
|
|
17
|
+
}
|
|
18
|
+
if (404 === result.status) throw notFound();
|
|
19
|
+
}
|
|
20
|
+
return normalizeModernLoaderResult(result);
|
|
21
|
+
}
|
|
22
|
+
function createModernRequest(input, signal) {
|
|
23
|
+
return new Request(input, {
|
|
24
|
+
signal
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function getModernUrlFromLoaderContext(ctx) {
|
|
28
|
+
const href = 'string' == typeof ctx?.location ? ctx.location : ctx?.location?.publicHref || ctx?.location?.href || ctx?.location?.url?.href || '/';
|
|
29
|
+
const baseRequest = ctx?.context?.request instanceof Request ? ctx.context.request : void 0;
|
|
30
|
+
const baseUrl = baseRequest?.url || ("u" > typeof window ? window.origin : 'http://localhost');
|
|
31
|
+
return new URL(href || '/', baseUrl);
|
|
32
|
+
}
|
|
33
|
+
function rememberRouteLocation(state, ctx) {
|
|
34
|
+
state.currentUrl = getModernUrlFromLoaderContext(ctx);
|
|
35
|
+
state.currentParams = ctx?.params || {};
|
|
36
|
+
}
|
|
37
|
+
function createModernShouldReload(shouldRevalidate, state) {
|
|
38
|
+
if ('function' != typeof shouldRevalidate) return;
|
|
39
|
+
const revalidate = shouldRevalidate;
|
|
40
|
+
return (ctx)=>{
|
|
41
|
+
const nextUrl = getModernUrlFromLoaderContext(ctx);
|
|
42
|
+
const nextParams = ctx?.params || {};
|
|
43
|
+
const result = revalidate({
|
|
44
|
+
currentUrl: state.currentUrl || nextUrl,
|
|
45
|
+
currentParams: state.currentParams || nextParams,
|
|
46
|
+
nextUrl,
|
|
47
|
+
nextParams,
|
|
48
|
+
defaultShouldRevalidate: void 0
|
|
49
|
+
});
|
|
50
|
+
state.currentUrl = nextUrl;
|
|
51
|
+
state.currentParams = nextParams;
|
|
52
|
+
return 'boolean' == typeof result ? result : void 0;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function isRouteObjectSplatRoute(route) {
|
|
56
|
+
return 'string' == typeof route.path && route.path.includes('*');
|
|
57
|
+
}
|
|
58
|
+
function mapParamsForRouteObjectLoader({ route, params }) {
|
|
59
|
+
if (isRouteObjectSplatRoute(route)) {
|
|
60
|
+
const { _splat, ...rest } = params;
|
|
61
|
+
if (void 0 !== _splat) return {
|
|
62
|
+
...rest,
|
|
63
|
+
'*': _splat
|
|
64
|
+
};
|
|
65
|
+
return rest;
|
|
66
|
+
}
|
|
67
|
+
return params;
|
|
68
|
+
}
|
|
69
|
+
function wrapRouteObjectLoader(route, revalidationState, options = {}) {
|
|
70
|
+
const modernRoute = route;
|
|
71
|
+
const routeLoader = modernRoute.loader;
|
|
72
|
+
if ('function' != typeof routeLoader) return;
|
|
73
|
+
return async (ctx)=>{
|
|
74
|
+
try {
|
|
75
|
+
if (revalidationState) rememberRouteLocation(revalidationState, ctx);
|
|
76
|
+
if ('function' == typeof modernRoute.lazyImport) try {
|
|
77
|
+
await modernRoute.lazyImport();
|
|
78
|
+
} catch {}
|
|
79
|
+
const signal = ctx?.abortController?.signal || ctx?.signal || new AbortController().signal;
|
|
80
|
+
const baseRequest = ctx?.context?.request instanceof Request ? ctx.context.request : void 0;
|
|
81
|
+
const href = 'string' == typeof ctx?.location ? ctx.location : ctx?.location?.publicHref || ctx?.location?.href || ctx?.location?.url?.href || '';
|
|
82
|
+
const request = void 0 !== baseRequest ? new Request(baseRequest, {
|
|
83
|
+
signal
|
|
84
|
+
}) : createModernRequest(href, signal);
|
|
85
|
+
const params = mapParamsForRouteObjectLoader({
|
|
86
|
+
route,
|
|
87
|
+
params: ctx.params || {}
|
|
88
|
+
});
|
|
89
|
+
const loadModernData = async ()=>{
|
|
90
|
+
const result = await routeLoader({
|
|
91
|
+
request,
|
|
92
|
+
params,
|
|
93
|
+
context: ctx?.context?.requestContext
|
|
94
|
+
});
|
|
95
|
+
return normalizeModernLoaderResponse(result);
|
|
96
|
+
};
|
|
97
|
+
if (options.rscPayloadRouter && isTanstackRscPayloadNavigationEnabled()) return loadTanstackRscRouteData({
|
|
98
|
+
hasClientLoader: modernRoute.hasClientLoader || void 0 !== modernRoute.clientData,
|
|
99
|
+
loadClientData: loadModernData,
|
|
100
|
+
request,
|
|
101
|
+
routeId: ctx.route?.id
|
|
102
|
+
});
|
|
103
|
+
return loadModernData();
|
|
104
|
+
} catch (err) {
|
|
105
|
+
if (isResponse(err)) {
|
|
106
|
+
if (isTanstackRedirect(err)) throw err;
|
|
107
|
+
if (isRedirectResponse(err)) {
|
|
108
|
+
const location = err.headers.get('Location') || '/';
|
|
109
|
+
throwTanstackRedirect(location);
|
|
110
|
+
}
|
|
111
|
+
if (404 === err.status) throw notFound();
|
|
112
|
+
}
|
|
113
|
+
throw err;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export { createModernShouldReload, wrapRouteObjectLoader };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
function toTanstackPath(pathname) {
|
|
2
|
+
return pathname.split('/').map((segment)=>{
|
|
3
|
+
if (!segment) return segment;
|
|
4
|
+
if ('*' === segment) return '$';
|
|
5
|
+
if (segment.startsWith(':')) {
|
|
6
|
+
const name = segment.slice(1);
|
|
7
|
+
if (name.endsWith('?')) return `{-$${name.slice(0, -1)}}`;
|
|
8
|
+
return `$${name}`;
|
|
9
|
+
}
|
|
10
|
+
return segment;
|
|
11
|
+
}).join('/');
|
|
12
|
+
}
|
|
13
|
+
function isRouteObjectPathlessLayout(route) {
|
|
14
|
+
return !route.path && !route.index;
|
|
15
|
+
}
|
|
16
|
+
export { isRouteObjectPathlessLayout, toTanstackPath };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
function mergeModernRouteHandle(route) {
|
|
2
|
+
const config = route.config;
|
|
3
|
+
const handle = {
|
|
4
|
+
...route.handle,
|
|
5
|
+
...config && 'object' == typeof config ? config.handle : {}
|
|
6
|
+
};
|
|
7
|
+
return Object.keys(handle).length > 0 ? handle : void 0;
|
|
8
|
+
}
|
|
9
|
+
function createRouteStaticData(opts) {
|
|
10
|
+
const staticData = {};
|
|
11
|
+
if (opts.modernRouteId) staticData.modernRouteId = opts.modernRouteId;
|
|
12
|
+
if (opts.modernRouteAction) staticData.modernRouteAction = opts.modernRouteAction;
|
|
13
|
+
if (opts.modernRouteHandle) staticData.modernRouteHandle = opts.modernRouteHandle;
|
|
14
|
+
if (opts.modernRouteHasAction) staticData.modernRouteHasAction = true;
|
|
15
|
+
if (opts.modernRouteHasClientLoader) staticData.modernRouteHasClientLoader = true;
|
|
16
|
+
if (opts.modernRouteHasLoader) staticData.modernRouteHasLoader = true;
|
|
17
|
+
if (opts.modernRouteIsClientComponent) staticData.modernRouteIsClientComponent = true;
|
|
18
|
+
if (opts.modernRouteLoader) staticData.modernRouteLoader = opts.modernRouteLoader;
|
|
19
|
+
if (opts.modernRouteShouldRevalidate) staticData.modernRouteShouldRevalidate = opts.modernRouteShouldRevalidate;
|
|
20
|
+
return Object.keys(staticData).length > 0 ? staticData : void 0;
|
|
21
|
+
}
|
|
22
|
+
export { createRouteStaticData, mergeModernRouteHandle };
|