@bleedingdev/modern-js-plugin-tanstack 3.5.0-ultramodern.30 → 3.5.0-ultramodern.32
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 +51 -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
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { RSC_PROXY_GET_TREE, RSC_PROXY_PATH } from "./symbols.mjs";
|
|
3
|
+
const TANSTACK_RSC_FLIGHT_VALUE = '__modernTanstackRsc';
|
|
4
|
+
function isSerializedTanstackRscFlightValue(value) {
|
|
5
|
+
return Boolean(value) && 'object' == typeof value && true === value[TANSTACK_RSC_FLIGHT_VALUE] && ('renderable' === value.kind || 'composite' === value.kind) && value.stream instanceof ReadableStream;
|
|
6
|
+
}
|
|
7
|
+
function EmptyFallback() {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
function selectTreePath(tree, path) {
|
|
11
|
+
let current = tree;
|
|
12
|
+
for (const key of path){
|
|
13
|
+
if (null === current || 'object' != typeof current) return null;
|
|
14
|
+
current = current[key];
|
|
15
|
+
}
|
|
16
|
+
return current;
|
|
17
|
+
}
|
|
18
|
+
function renderSelectedTree(src, { getTree = src[RSC_PROXY_GET_TREE], missingTreeError }) {
|
|
19
|
+
if (!getTree) throw new Error(missingTreeError);
|
|
20
|
+
return selectTreePath(getTree(), src[RSC_PROXY_PATH] || []);
|
|
21
|
+
}
|
|
22
|
+
export { EmptyFallback, TANSTACK_RSC_FLIGHT_VALUE, isSerializedTanstackRscFlightValue, renderSelectedTree, selectTreePath };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
"use client";
|
|
3
|
+
import { use } from "react";
|
|
4
|
+
let modernRscClientRuntimePromise;
|
|
5
|
+
function loadModernRscClientRuntime() {
|
|
6
|
+
modernRscClientRuntimePromise ??= import("@modern-js/runtime/rsc/client").then((runtime)=>{
|
|
7
|
+
runtime.setServerCallback(runtime.callServer);
|
|
8
|
+
return runtime;
|
|
9
|
+
});
|
|
10
|
+
return modernRscClientRuntimePromise;
|
|
11
|
+
}
|
|
12
|
+
async function createFromFlightStream(stream) {
|
|
13
|
+
if ("u" < typeof window) {
|
|
14
|
+
const runtime = await import("react-server-dom-rspack/client.edge");
|
|
15
|
+
return runtime.createFromReadableStream(stream);
|
|
16
|
+
}
|
|
17
|
+
const runtime = await loadModernRscClientRuntime();
|
|
18
|
+
return runtime.createFromReadableStream(stream, {
|
|
19
|
+
callServer: runtime.callServer
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function createTreeGetterFromFlightStream(stream) {
|
|
23
|
+
let ready = false;
|
|
24
|
+
let tree;
|
|
25
|
+
const treePromise = createFromFlightStream(stream).then((value)=>{
|
|
26
|
+
tree = value;
|
|
27
|
+
ready = true;
|
|
28
|
+
return value;
|
|
29
|
+
});
|
|
30
|
+
return ()=>{
|
|
31
|
+
if (ready) return tree;
|
|
32
|
+
return use(treePromise);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export { createTreeGetterFromFlightStream };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
async function waitForRouterSerialization(tanstackRouter) {
|
|
3
|
+
const serverSsr = tanstackRouter.serverSsr;
|
|
4
|
+
if (!serverSsr || 'function' != typeof serverSsr.onSerializationFinished || serverSsr.isSerializationFinished?.()) return;
|
|
5
|
+
await new Promise((resolve)=>{
|
|
6
|
+
serverSsr.onSerializationFinished?.(resolve);
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
function htmlEscapeAttr(value) {
|
|
10
|
+
return value.replace(/&/g, '&').replace(/"/g, '"');
|
|
11
|
+
}
|
|
12
|
+
function routerManagedTagToHtml(tag) {
|
|
13
|
+
if (!tag || 'object' != typeof tag) return '';
|
|
14
|
+
const managedTag = tag;
|
|
15
|
+
if (!managedTag || "script" !== managedTag.tag) return '';
|
|
16
|
+
const attrs = managedTag.attrs || {};
|
|
17
|
+
const attrsStr = Object.entries(attrs).filter(([, v])=>null != v && false !== v).map(([k, v])=>{
|
|
18
|
+
const name = 'className' === k ? 'class' : k;
|
|
19
|
+
if (true === v) return name;
|
|
20
|
+
return `${name}="${htmlEscapeAttr(String(v))}"`;
|
|
21
|
+
}).join(' ');
|
|
22
|
+
const open = attrsStr.length ? `<script ${attrsStr}>` : "<script>";
|
|
23
|
+
const children = 'string' == typeof managedTag.children ? managedTag.children : '';
|
|
24
|
+
return `${open}${children}</script>`;
|
|
25
|
+
}
|
|
26
|
+
function routerManagedTagsToHtml(tags) {
|
|
27
|
+
const normalizedTags = Array.isArray(tags) ? tags : [
|
|
28
|
+
tags
|
|
29
|
+
];
|
|
30
|
+
return normalizedTags.map(routerManagedTagToHtml).filter(Boolean);
|
|
31
|
+
}
|
|
32
|
+
function createGetSsrHref(request) {
|
|
33
|
+
const url = new URL(request.url);
|
|
34
|
+
return `${url.pathname}${url.search}${url.hash}`;
|
|
35
|
+
}
|
|
36
|
+
function collectRouterErrors(tanstackRouter) {
|
|
37
|
+
const state = tanstackRouter.state;
|
|
38
|
+
const matches = Array.isArray(state.matches) ? state.matches : [];
|
|
39
|
+
const errors = matches.reduce((acc, match)=>{
|
|
40
|
+
if (!match.error) return acc;
|
|
41
|
+
const routeId = 'string' == typeof match.routeId ? match.routeId : 'string' == typeof match.route?.id ? match.route.id : `match-${Object.keys(acc).length}`;
|
|
42
|
+
acc[routeId] = match.error;
|
|
43
|
+
return acc;
|
|
44
|
+
}, {});
|
|
45
|
+
return Object.keys(errors).length > 0 ? errors : void 0;
|
|
46
|
+
}
|
|
47
|
+
async function attachServerSsrUtils(router) {
|
|
48
|
+
const { attachRouterServerSsrUtils } = await import("@tanstack/router-core/ssr/server");
|
|
49
|
+
attachRouterServerSsrUtils({
|
|
50
|
+
router,
|
|
51
|
+
manifest: void 0
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export { attachServerSsrUtils, collectRouterErrors, createGetSsrHref, routerManagedTagsToHtml, waitForRouterSerialization };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
function isPromiseLike(value) {
|
|
3
|
+
return Boolean(value && 'function' == typeof value.then);
|
|
4
|
+
}
|
|
5
|
+
function isPreloadableRouteComponent(component) {
|
|
6
|
+
if (!component || 'function' != typeof component) return false;
|
|
7
|
+
const preloadable = component;
|
|
8
|
+
return 'function' == typeof preloadable.load || 'function' == typeof preloadable.preload;
|
|
9
|
+
}
|
|
10
|
+
function isReactLazyRouteComponent(component) {
|
|
11
|
+
return null != component && 'object' == typeof component && 'function' == typeof component._init && '_payload' in component;
|
|
12
|
+
}
|
|
13
|
+
async function preloadReactLazyRouteComponent(component) {
|
|
14
|
+
try {
|
|
15
|
+
component._init?.(component._payload);
|
|
16
|
+
} catch (thrown) {
|
|
17
|
+
if (!isPromiseLike(thrown)) throw thrown;
|
|
18
|
+
await thrown;
|
|
19
|
+
component._init?.(component._payload);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function preloadRouteComponent(component, preloadedComponents) {
|
|
23
|
+
if (isReactLazyRouteComponent(component)) {
|
|
24
|
+
if (preloadedComponents.has(component)) return;
|
|
25
|
+
preloadedComponents.add(component);
|
|
26
|
+
await preloadReactLazyRouteComponent(component);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (!isPreloadableRouteComponent(component)) return;
|
|
30
|
+
if (preloadedComponents.has(component)) return;
|
|
31
|
+
preloadedComponents.add(component);
|
|
32
|
+
if ('function' == typeof component.load) return void await component.load({});
|
|
33
|
+
await component.preload?.({});
|
|
34
|
+
}
|
|
35
|
+
async function preloadMatchedRouteComponents(tanstackRouter) {
|
|
36
|
+
const matches = Array.isArray(tanstackRouter.state.matches) ? tanstackRouter.state.matches : [];
|
|
37
|
+
const routesById = tanstackRouter.routesById || {};
|
|
38
|
+
const preloadedComponents = new Set();
|
|
39
|
+
await Promise.all(matches.map(async (match)=>{
|
|
40
|
+
const routeId = 'string' == typeof match.routeId ? match.routeId : 'string' == typeof match.route?.id ? match.route.id : void 0;
|
|
41
|
+
const route = routeId ? routesById[routeId] : match.route;
|
|
42
|
+
const options = route?.options;
|
|
43
|
+
if (!options) return;
|
|
44
|
+
await Promise.all([
|
|
45
|
+
preloadRouteComponent(options.component, preloadedComponents),
|
|
46
|
+
preloadRouteComponent(options.pendingComponent, preloadedComponents),
|
|
47
|
+
preloadRouteComponent(options.errorComponent, preloadedComponents),
|
|
48
|
+
preloadRouteComponent(options.notFoundComponent, preloadedComponents)
|
|
49
|
+
]);
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
export { preloadMatchedRouteComponents };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "node:module";
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
import { formDataToTextPlain, formDataToUrlSearchParams, toFormData } from "./formData.mjs";
|
|
3
|
+
class RouteActionResponseError extends Error {
|
|
4
|
+
constructor(response, data){
|
|
5
|
+
super(`Route action failed with status ${response.status}`);
|
|
6
|
+
this.name = 'RouteActionResponseError';
|
|
7
|
+
this.response = response;
|
|
8
|
+
this.data = data;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function resolveRouteHandlers(router, actionTo) {
|
|
12
|
+
const builtLocation = router.buildLocation({
|
|
13
|
+
to: actionTo
|
|
14
|
+
});
|
|
15
|
+
const href = router.getParsedLocationHref(builtLocation);
|
|
16
|
+
const matchedRoutes = router.getMatchedRoutes(builtLocation.pathname);
|
|
17
|
+
const routeStaticData = matchedRoutes.foundRoute?.options?.staticData;
|
|
18
|
+
const action = routeStaticData?.modernRouteAction;
|
|
19
|
+
const loader = routeStaticData?.modernRouteLoader;
|
|
20
|
+
return {
|
|
21
|
+
action,
|
|
22
|
+
loader,
|
|
23
|
+
href,
|
|
24
|
+
params: matchedRoutes.routeParams || {}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function isRedirectResponse(value) {
|
|
28
|
+
if (!(value instanceof Response)) return false;
|
|
29
|
+
return [
|
|
30
|
+
301,
|
|
31
|
+
302,
|
|
32
|
+
303,
|
|
33
|
+
307,
|
|
34
|
+
308
|
|
35
|
+
].includes(value.status);
|
|
36
|
+
}
|
|
37
|
+
async function parseResponseData(response) {
|
|
38
|
+
if (204 === response.status) return null;
|
|
39
|
+
const contentType = response.headers.get('Content-Type') || '';
|
|
40
|
+
if (contentType.includes('application/json')) return response.json();
|
|
41
|
+
return response.text();
|
|
42
|
+
}
|
|
43
|
+
async function parseResponseResultOrThrow(response) {
|
|
44
|
+
const parsed = await parseResponseData(response);
|
|
45
|
+
if (!response.ok) throw new RouteActionResponseError(response, parsed);
|
|
46
|
+
return parsed;
|
|
47
|
+
}
|
|
48
|
+
async function submitRouteAction({ router, target, options = {}, isFetcher = false, onInvalidateStart }) {
|
|
49
|
+
const method = (options.method || 'post').toLowerCase();
|
|
50
|
+
const encType = options.encType || 'application/x-www-form-urlencoded';
|
|
51
|
+
const actionTo = options.action || '.';
|
|
52
|
+
const formData = toFormData(target);
|
|
53
|
+
const resolved = resolveRouteHandlers(router, actionTo);
|
|
54
|
+
if ('get' === method) {
|
|
55
|
+
const search = formDataToUrlSearchParams(formData).toString();
|
|
56
|
+
const requestUrl = new URL(resolved.href, window.location.origin);
|
|
57
|
+
requestUrl.search = search;
|
|
58
|
+
if (isFetcher && resolved.loader) {
|
|
59
|
+
const result = await resolved.loader({
|
|
60
|
+
request: new Request(requestUrl, {
|
|
61
|
+
method: 'GET'
|
|
62
|
+
}),
|
|
63
|
+
params: resolved.params
|
|
64
|
+
});
|
|
65
|
+
if (result instanceof Response) {
|
|
66
|
+
const redirectTo = result.headers.get('X-Modernjs-Redirect') || result.headers.get('Location');
|
|
67
|
+
if (redirectTo || isRedirectResponse(result)) {
|
|
68
|
+
await router.navigate({
|
|
69
|
+
to: redirectTo || '/'
|
|
70
|
+
});
|
|
71
|
+
return parseResponseData(result);
|
|
72
|
+
}
|
|
73
|
+
return parseResponseResultOrThrow(result);
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
await router.navigate({
|
|
78
|
+
href: `${requestUrl.pathname}${requestUrl.search}${requestUrl.hash}`
|
|
79
|
+
});
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (!resolved.action) throw new Error(`No route action found for "${actionTo}"`);
|
|
83
|
+
const headers = new Headers();
|
|
84
|
+
let body = null;
|
|
85
|
+
if (encType.includes('application/json')) {
|
|
86
|
+
headers.set('Content-Type', 'application/json');
|
|
87
|
+
body = JSON.stringify(Object.fromEntries(formDataToUrlSearchParams(formData).entries()));
|
|
88
|
+
} else if (encType.includes('text/plain')) {
|
|
89
|
+
headers.set('Content-Type', 'text/plain;charset=UTF-8');
|
|
90
|
+
body = formDataToTextPlain(formData);
|
|
91
|
+
} else if (encType.includes('application/x-www-form-urlencoded')) {
|
|
92
|
+
headers.set('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');
|
|
93
|
+
body = formDataToUrlSearchParams(formData);
|
|
94
|
+
} else body = formData;
|
|
95
|
+
const request = new Request(new URL(resolved.href, window.location.origin), {
|
|
96
|
+
method: method.toUpperCase(),
|
|
97
|
+
headers,
|
|
98
|
+
body
|
|
99
|
+
});
|
|
100
|
+
const result = await resolved.action({
|
|
101
|
+
request,
|
|
102
|
+
params: resolved.params
|
|
103
|
+
});
|
|
104
|
+
if (result instanceof Response) {
|
|
105
|
+
const redirectTo = result.headers.get('X-Modernjs-Redirect') || result.headers.get('Location');
|
|
106
|
+
if (redirectTo || isRedirectResponse(result)) {
|
|
107
|
+
await router.navigate({
|
|
108
|
+
to: redirectTo || '/'
|
|
109
|
+
});
|
|
110
|
+
return parseResponseData(result);
|
|
111
|
+
}
|
|
112
|
+
const parsed = isFetcher ? await parseResponseResultOrThrow(result) : await parseResponseData(result);
|
|
113
|
+
onInvalidateStart?.();
|
|
114
|
+
await router.invalidate();
|
|
115
|
+
return parsed;
|
|
116
|
+
}
|
|
117
|
+
onInvalidateStart?.();
|
|
118
|
+
await router.invalidate();
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
export { RouteActionResponseError, submitRouteAction };
|
|
@@ -1,84 +1,56 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
import react from "react";
|
|
4
|
-
function
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
...props
|
|
13
|
-
});
|
|
14
|
-
};
|
|
15
|
-
return LayoutWrapper;
|
|
4
|
+
function withGlobalLayout(Component, globalApp) {
|
|
5
|
+
if (!globalApp) return Component;
|
|
6
|
+
const GlobalLayout = globalApp;
|
|
7
|
+
return function(props) {
|
|
8
|
+
return /*#__PURE__*/ jsx(GlobalLayout, {
|
|
9
|
+
Component: Component,
|
|
10
|
+
...props
|
|
11
|
+
});
|
|
16
12
|
};
|
|
17
|
-
const routeObjects = [];
|
|
18
|
-
for (const route of routes)if ('nested' === route.type) {
|
|
19
|
-
const nestedRouteObject = {
|
|
20
|
-
path: route.path,
|
|
21
|
-
id: route.id,
|
|
22
|
-
loader: route.loader,
|
|
23
|
-
action: route.action,
|
|
24
|
-
shouldRevalidate: route.shouldRevalidate,
|
|
25
|
-
handle: {
|
|
26
|
-
...route.handle,
|
|
27
|
-
...'object' == typeof route.config ? route.config?.handle : {}
|
|
28
|
-
},
|
|
29
|
-
index: route.index,
|
|
30
|
-
hasLoader: Boolean(route.loader),
|
|
31
|
-
hasClientLoader: Boolean(route.clientData),
|
|
32
|
-
hasAction: Boolean(route.action),
|
|
33
|
-
...route.isClientComponent ? {
|
|
34
|
-
isClientComponent: true
|
|
35
|
-
} : {},
|
|
36
|
-
...route.inValidSSRRoute ? {
|
|
37
|
-
inValidSSRRoute: true
|
|
38
|
-
} : {},
|
|
39
|
-
lazyImport: route.lazyImport,
|
|
40
|
-
Component: route.component ? route.component : void 0,
|
|
41
|
-
errorElement: route.error ? /*#__PURE__*/ jsx(route.error, {}) : void 0,
|
|
42
|
-
children: route.children ? route.children.map((child)=>getRouteObjects([
|
|
43
|
-
child
|
|
44
|
-
], {
|
|
45
|
-
globalApp,
|
|
46
|
-
ssrMode,
|
|
47
|
-
props
|
|
48
|
-
})[0]) : void 0
|
|
49
|
-
};
|
|
50
|
-
routeObjects.push(nestedRouteObject);
|
|
51
|
-
} else if ('function' == typeof route.component || 'object' == typeof route.component) {
|
|
52
|
-
const LayoutComponent = createLayoutElement(route.component);
|
|
53
|
-
const routeObject = {
|
|
54
|
-
path: route.path,
|
|
55
|
-
element: /*#__PURE__*/ react.createElement(LayoutComponent)
|
|
56
|
-
};
|
|
57
|
-
routeObjects.push(routeObject);
|
|
58
|
-
}
|
|
59
|
-
return routeObjects;
|
|
60
13
|
}
|
|
61
|
-
function
|
|
14
|
+
function getRouteHandle(route) {
|
|
15
|
+
return {
|
|
16
|
+
...route.handle,
|
|
17
|
+
...'object' == typeof route.config ? route.config?.handle : {}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function toTanstackRouteObject(route, globalApp) {
|
|
21
|
+
if ('nested' === route.type) return {
|
|
22
|
+
path: route.path,
|
|
23
|
+
id: route.id,
|
|
24
|
+
loader: route.loader,
|
|
25
|
+
action: route.action,
|
|
26
|
+
shouldRevalidate: route.shouldRevalidate,
|
|
27
|
+
handle: getRouteHandle(route),
|
|
28
|
+
index: route.index,
|
|
29
|
+
hasLoader: route.hasLoader || Boolean(route.loader),
|
|
30
|
+
hasClientLoader: route.hasClientLoader || Boolean(route.clientData),
|
|
31
|
+
hasAction: route.hasAction || Boolean(route.action),
|
|
32
|
+
...route.isClientComponent ? {
|
|
33
|
+
isClientComponent: true
|
|
34
|
+
} : {},
|
|
35
|
+
...route.inValidSSRRoute ? {
|
|
36
|
+
inValidSSRRoute: true
|
|
37
|
+
} : {},
|
|
38
|
+
lazyImport: route.lazyImport,
|
|
39
|
+
Component: route.component ? route.component : void 0,
|
|
40
|
+
errorElement: route.error ? /*#__PURE__*/ react.createElement(route.error) : void 0,
|
|
41
|
+
children: route.children ? route.children.map((child)=>toTanstackRouteObject(child, globalApp)).filter((child)=>null !== child) : void 0
|
|
42
|
+
};
|
|
43
|
+
if ('function' != typeof route.component && 'object' != typeof route.component) return null;
|
|
44
|
+
const LayoutComponent = withGlobalLayout(route.component, globalApp);
|
|
45
|
+
return {
|
|
46
|
+
path: route.path,
|
|
47
|
+
element: /*#__PURE__*/ react.createElement(LayoutComponent)
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function createTanstackRouteObjectsFromConfig({ routesConfig }) {
|
|
62
51
|
if (!routesConfig) return null;
|
|
63
52
|
const { routes, globalApp } = routesConfig;
|
|
64
53
|
if (!routes) return null;
|
|
65
|
-
return
|
|
66
|
-
globalApp,
|
|
67
|
-
ssrMode,
|
|
68
|
-
props
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
const urlJoin = (...parts)=>{
|
|
72
|
-
const separator = '/';
|
|
73
|
-
const replace = new RegExp(`${separator}{1,}`, 'g');
|
|
74
|
-
return standardSlash(parts.join(separator).replace(replace, separator));
|
|
75
|
-
};
|
|
76
|
-
function standardSlash(str) {
|
|
77
|
-
let addr = str;
|
|
78
|
-
if (!addr || 'string' != typeof addr) return addr;
|
|
79
|
-
if (addr.startsWith('.')) addr = addr.slice(1);
|
|
80
|
-
if (!addr.startsWith('/')) addr = `/${addr}`;
|
|
81
|
-
if (addr.endsWith('/') && '/' !== addr) addr = addr.slice(0, addr.length - 1);
|
|
82
|
-
return addr;
|
|
54
|
+
return routes.map((route)=>toTanstackRouteObject(route, globalApp)).filter((route)=>null !== route);
|
|
83
55
|
}
|
|
84
|
-
export {
|
|
56
|
+
export { createTanstackRouteObjectsFromConfig };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AppToolsContext } from '@modern-js/app-tools';
|
|
2
|
+
import type { NestedRouteForCli, PageRoute } from '@modern-js/types';
|
|
3
|
+
export declare function writeTanstackRegisterFile(opts: {
|
|
4
|
+
entries: string[];
|
|
5
|
+
generatedDirName?: string;
|
|
6
|
+
runtimeModule?: string;
|
|
7
|
+
srcDirectory: string;
|
|
8
|
+
canonicalRoutes?: Record<string, string> | null;
|
|
9
|
+
i18nRuntimeModule?: string;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
export declare function writeTanstackRouterTypesForEntries(opts: {
|
|
12
|
+
appContext: AppToolsContext;
|
|
13
|
+
generatedDirName?: string;
|
|
14
|
+
routesByEntry: Record<string, (NestedRouteForCli | PageRoute)[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Whether `@modern-js/plugin-i18n` is actually installed in the app. The
|
|
17
|
+
* `register.gen.d.ts` augmentation of '@modern-js/plugin-i18n/runtime' is
|
|
18
|
+
* only emitted when this is true — otherwise apps with a hand-rolled
|
|
19
|
+
* `/:lang/` param would fail typechecking on an unresolvable module.
|
|
20
|
+
*/
|
|
21
|
+
i18nPluginInstalled?: boolean;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Headless regeneration of `router.gen.ts` / `register.gen.d.ts` for a generated
|
|
25
|
+
* app, without running a full dev/build. Drives the app-tools analyze `onPrepare`
|
|
26
|
+
* (which fires `generateEntryCode`) and returns before any bundling — the app's
|
|
27
|
+
* own registered plugin-tanstack writes the artifacts via its `generateEntryCode`
|
|
28
|
+
* subscriber. Reuses the exact hook dev/build use, so there is no scanning drift.
|
|
29
|
+
*/
|
|
30
|
+
export declare function generateTanstackRouteArtifacts(opts: {
|
|
31
|
+
appDirectory: string;
|
|
32
|
+
version?: string;
|
|
33
|
+
}): Promise<void>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { AppTools,
|
|
2
|
-
import type { NestedRouteForCli, PageRoute } from '@modern-js/types';
|
|
1
|
+
import type { AppTools, CliPlugin } from '@modern-js/app-tools';
|
|
3
2
|
import { type TanstackRouteCodeSplittingOption } from './routeSplitting';
|
|
3
|
+
export { generateTanstackRouteArtifacts, writeTanstackRegisterFile, writeTanstackRouterTypesForEntries, } from './artifacts';
|
|
4
4
|
export type { TanstackRouteCodeSplittingOption, TanstackRsbuildRouteSplittingProfile, } from './routeSplitting';
|
|
5
5
|
export { createTanstackRsbuildRouteSplittingProfile, resolveTanstackRouteCodeSplittingEnabled, } from './routeSplitting';
|
|
6
6
|
export { type CollectCanonicalRoutesOptions, collectCanonicalRoutesForEntry, generateTanstackRouterTypesSourceForEntry, } from './tanstackTypes';
|
|
@@ -9,36 +9,5 @@ export type TanstackRouterPluginOptions = {
|
|
|
9
9
|
generatedDirName?: string;
|
|
10
10
|
routeCodeSplitting?: TanstackRouteCodeSplittingOption;
|
|
11
11
|
};
|
|
12
|
-
export declare function writeTanstackRegisterFile(opts: {
|
|
13
|
-
entries: string[];
|
|
14
|
-
generatedDirName?: string;
|
|
15
|
-
runtimeModule?: string;
|
|
16
|
-
srcDirectory: string;
|
|
17
|
-
canonicalRoutes?: Record<string, string> | null;
|
|
18
|
-
i18nRuntimeModule?: string;
|
|
19
|
-
}): Promise<void>;
|
|
20
|
-
export declare function writeTanstackRouterTypesForEntries(opts: {
|
|
21
|
-
appContext: AppToolsContext;
|
|
22
|
-
generatedDirName?: string;
|
|
23
|
-
routesByEntry: Record<string, (NestedRouteForCli | PageRoute)[]>;
|
|
24
|
-
/**
|
|
25
|
-
* Whether `@modern-js/plugin-i18n` is actually installed in the app. The
|
|
26
|
-
* `register.gen.d.ts` augmentation of '@modern-js/plugin-i18n/runtime' is
|
|
27
|
-
* only emitted when this is true — otherwise apps with a hand-rolled
|
|
28
|
-
* `/:lang/` param would fail typechecking on an unresolvable module.
|
|
29
|
-
*/
|
|
30
|
-
i18nPluginInstalled?: boolean;
|
|
31
|
-
}): Promise<void>;
|
|
32
12
|
export declare function tanstackRouterPlugin(options?: TanstackRouterPluginOptions): CliPlugin<AppTools>;
|
|
33
|
-
/**
|
|
34
|
-
* Headless regeneration of `router.gen.ts` / `register.gen.d.ts` for a generated
|
|
35
|
-
* app, without running a full dev/build. Drives the app-tools analyze `onPrepare`
|
|
36
|
-
* (which fires `generateEntryCode`) and returns before any bundling — the app's
|
|
37
|
-
* own registered plugin-tanstack writes the artifacts via its `generateEntryCode`
|
|
38
|
-
* subscriber. Reuses the exact hook dev/build use, so there is no scanning drift.
|
|
39
|
-
*/
|
|
40
|
-
export declare function generateTanstackRouteArtifacts(opts: {
|
|
41
|
-
appDirectory: string;
|
|
42
|
-
version?: string;
|
|
43
|
-
}): Promise<void>;
|
|
44
13
|
export default tanstackRouterPlugin;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { NestedRouteForCli, PageRoute } from '@modern-js/types';
|
|
2
|
+
export type CollectCanonicalRoutesOptions = {
|
|
3
|
+
/**
|
|
4
|
+
* Whether a leading `:lang`/`:locale`/`:language` route param may be
|
|
5
|
+
* treated as an i18n locale prefix. This MUST only be enabled when
|
|
6
|
+
* `@modern-js/plugin-i18n` is actually installed: the emitted
|
|
7
|
+
* `declare module '@modern-js/plugin-i18n/runtime'` augmentation breaks
|
|
8
|
+
* typechecking (TS2664) for apps that hand-roll a `/:lang/` param without
|
|
9
|
+
* the plugin. Routes carrying `modernCanonicalPath` metadata are always
|
|
10
|
+
* honored — only plugin-i18n produces them.
|
|
11
|
+
*/
|
|
12
|
+
localeParamHeuristic?: boolean;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Derive the canonical (language-agnostic) route map for an entry: the
|
|
16
|
+
* leading locale param is stripped and localized physical variants (routes
|
|
17
|
+
* carrying `modernCanonicalPath` metadata from `@modern-js/plugin-i18n`)
|
|
18
|
+
* collapse to their canonical pattern. Returns `null` when the entry has no
|
|
19
|
+
* i18n routing surface (no locale param and no localized variants), so plain
|
|
20
|
+
* TanStack apps never get a `@modern-js/plugin-i18n` module augmentation.
|
|
21
|
+
*/
|
|
22
|
+
export declare function collectCanonicalRoutesForEntry(routes: (NestedRouteForCli | PageRoute)[], options?: CollectCanonicalRoutesOptions): Record<string, string> | null;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { NestedRouteForCli, PageRoute } from '@modern-js/types';
|
|
2
|
+
export declare function toTanstackPath(pathname: string): string;
|
|
3
|
+
export declare function resolveFileNoExt(inputNoExtPath: string): Promise<string | null>;
|
|
4
|
+
export declare function quote(str: string): string;
|
|
5
|
+
export declare function normalizeRelativeImport(p: string): string;
|
|
6
|
+
export declare function pickModernLoaderModule(route: NestedRouteForCli | PageRoute): {
|
|
7
|
+
loaderPath: string;
|
|
8
|
+
inline: boolean;
|
|
9
|
+
} | null;
|
|
10
|
+
export declare function pickRouteSearchContractModules(route: NestedRouteForCli | PageRoute): {
|
|
11
|
+
validateSearchPath: string | null;
|
|
12
|
+
loaderDepsPath: string | null;
|
|
13
|
+
};
|
|
14
|
+
export declare function isPathlessLayout(route: NestedRouteForCli | PageRoute): boolean;
|
|
15
|
+
export declare function isIndexRoute(route: NestedRouteForCli | PageRoute): boolean;
|
|
16
|
+
export declare function createRouteStaticDataSnippet(opts: {
|
|
17
|
+
modernRouteId?: string;
|
|
18
|
+
loaderName?: string | null;
|
|
19
|
+
actionName?: string | null;
|
|
20
|
+
}): string | null;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AppToolsContext } from '@modern-js/app-tools';
|
|
2
|
+
import type { NestedRouteForCli, PageRoute } from '@modern-js/types';
|
|
3
|
+
export declare function generateTanstackRouterTypesSourceForEntry(opts: {
|
|
4
|
+
appContext: AppToolsContext;
|
|
5
|
+
entryName: string;
|
|
6
|
+
generatedDirName?: string;
|
|
7
|
+
routes: (NestedRouteForCli | PageRoute)[];
|
|
8
|
+
}): Promise<{
|
|
9
|
+
routerGenTs: string;
|
|
10
|
+
}>;
|
|
@@ -1,31 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
/**
|
|
5
|
-
* Whether a leading `:lang`/`:locale`/`:language` route param may be
|
|
6
|
-
* treated as an i18n locale prefix. This MUST only be enabled when
|
|
7
|
-
* `@modern-js/plugin-i18n` is actually installed: the emitted
|
|
8
|
-
* `declare module '@modern-js/plugin-i18n/runtime'` augmentation breaks
|
|
9
|
-
* typechecking (TS2664) for apps that hand-roll a `/:lang/` param without
|
|
10
|
-
* the plugin. Routes carrying `modernCanonicalPath` metadata are always
|
|
11
|
-
* honored — only plugin-i18n produces them.
|
|
12
|
-
*/
|
|
13
|
-
localeParamHeuristic?: boolean;
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* Derive the canonical (language-agnostic) route map for an entry: the
|
|
17
|
-
* leading locale param is stripped and localized physical variants (routes
|
|
18
|
-
* carrying `modernCanonicalPath` metadata from `@modern-js/plugin-i18n`)
|
|
19
|
-
* collapse to their canonical pattern. Returns `null` when the entry has no
|
|
20
|
-
* i18n routing surface (no locale param and no localized variants), so plain
|
|
21
|
-
* TanStack apps never get a `@modern-js/plugin-i18n` module augmentation.
|
|
22
|
-
*/
|
|
23
|
-
export declare function collectCanonicalRoutesForEntry(routes: (NestedRouteForCli | PageRoute)[], options?: CollectCanonicalRoutesOptions): Record<string, string> | null;
|
|
24
|
-
export declare function generateTanstackRouterTypesSourceForEntry(opts: {
|
|
25
|
-
appContext: AppToolsContext;
|
|
26
|
-
entryName: string;
|
|
27
|
-
generatedDirName?: string;
|
|
28
|
-
routes: (NestedRouteForCli | PageRoute)[];
|
|
29
|
-
}): Promise<{
|
|
30
|
-
routerGenTs: string;
|
|
31
|
-
}>;
|
|
1
|
+
export type { CollectCanonicalRoutesOptions } from './tanstackTypes/canonicalRoutes';
|
|
2
|
+
export { collectCanonicalRoutesForEntry } from './tanstackTypes/canonicalRoutes';
|
|
3
|
+
export { generateTanstackRouterTypesSourceForEntry } from './tanstackTypes/source';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isSegmentPrefix(pathname: string, base: string): boolean;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type AnyRouter } from '@tanstack/react-router';
|
|
2
|
+
export type WindowWithTanstackSsr = Window & {
|
|
3
|
+
$_TSR?: unknown;
|
|
4
|
+
};
|
|
5
|
+
export type RouterHydrationRecord = {
|
|
6
|
+
error?: unknown;
|
|
7
|
+
promise: Promise<unknown>;
|
|
8
|
+
status: 'pending' | 'fulfilled' | 'rejected';
|
|
9
|
+
};
|
|
10
|
+
export declare const routerHydrationRecords: WeakMap<AnyRouter, RouterHydrationRecord>;
|
|
11
|
+
export declare function getCachedRouteModule(routeId: string): unknown;
|
|
12
|
+
export declare function preloadHydratedRouteComponents(router: AnyRouter): Promise<void>;
|
|
13
|
+
export declare function hydrateTanstackRouter(router: AnyRouter): Promise<unknown>;
|
|
14
|
+
export declare function getTanstackSsrHydrationRecord(router: AnyRouter): RouterHydrationRecord;
|
|
15
|
+
export declare function getTanstackSsrHydrationPromise(router: AnyRouter): Promise<unknown>;
|
|
16
|
+
export declare function hasTanstackSsrHydrationRecord(router: AnyRouter): boolean;
|
|
17
|
+
export declare function ModernRouterClient({ router }: {
|
|
18
|
+
router: AnyRouter;
|
|
19
|
+
}): import("react").FunctionComponentElement<import("@tanstack/react-router").RouterProps<AnyRouter, Record<string, any>>>;
|
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
|
-
type
|
|
3
|
-
export type SubmitOptions
|
|
4
|
-
|
|
5
|
-
method?: string;
|
|
6
|
-
encType?: string;
|
|
7
|
-
};
|
|
2
|
+
import type { SubmitOptions, SubmitTarget } from './formData';
|
|
3
|
+
export type { SubmitOptions } from './formData';
|
|
4
|
+
export { RouteActionResponseError } from './submitAction';
|
|
8
5
|
export type FetcherState = 'idle' | 'submitting' | 'loading';
|
|
9
|
-
export declare class RouteActionResponseError<TData = unknown> extends Error {
|
|
10
|
-
readonly response: Response;
|
|
11
|
-
readonly data: TData;
|
|
12
|
-
constructor(response: Response, data: TData);
|
|
13
|
-
}
|
|
14
6
|
export type FormProps = Omit<React.FormHTMLAttributes<HTMLFormElement>, 'onSubmit' | 'action'> & {
|
|
15
7
|
action?: string;
|
|
16
8
|
onSubmit?: React.FormEventHandler<HTMLFormElement>;
|
|
@@ -26,4 +18,3 @@ export type Fetcher = {
|
|
|
26
18
|
submit: (target: SubmitTarget, options?: FetcherSubmitOptions) => Promise<void>;
|
|
27
19
|
};
|
|
28
20
|
export declare function useFetcher(): Fetcher;
|
|
29
|
-
export {};
|