@bleedingdev/modern-js-plugin-tanstack 3.9.0-ultramodern.12 → 3.9.0-ultramodern.14
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/runtime/plugin.node.js +10 -10
- package/dist/cjs/runtime/ssrManagedTags.js +2 -12
- package/dist/esm/cli/index.mjs +1 -7
- package/dist/esm/runtime/plugin.node.mjs +11 -11
- package/dist/esm/runtime/ssrManagedTags.mjs +1 -8
- package/dist/esm-node/cli/index.mjs +1 -7
- package/dist/esm-node/runtime/plugin.node.mjs +11 -11
- package/dist/esm-node/runtime/ssrManagedTags.mjs +1 -8
- package/dist/types/runtime/ssrManagedTags.d.ts +0 -1
- package/dist/types/runtime/ssrTypes.d.ts +0 -7
- package/package.json +21 -21
- package/src/runtime/plugin.node.tsx +10 -12
- package/src/runtime/ssrManagedTags.ts +0 -17
- package/src/runtime/ssrTypes.ts +0 -7
- package/tests/router/clientNavigation.ts +13 -0
- package/tests/router/localisedIdentity.test.tsx +6 -2
- package/tests/router/routeHooks.test.ts +2 -1
- package/tests/router/serverPlugin.test.ts +5 -0
- package/tests/router/tanstackTypes.test.ts +4 -3
- package/dist/esm/rslib-runtime~1.mjs +0 -18
- package/dist/esm-node/rslib-runtime~0.mjs +0 -19
|
@@ -129,7 +129,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
129
129
|
disposed = true;
|
|
130
130
|
rawRequest.signal.removeEventListener('abort', onAbort);
|
|
131
131
|
controller.abort();
|
|
132
|
-
serverRouter.serverSsr?.cleanup
|
|
132
|
+
serverRouter.serverSsr?.cleanup();
|
|
133
133
|
};
|
|
134
134
|
(0, external_lifecycle_js_namespaceObject.applyRouterRuntimeState)(context, {
|
|
135
135
|
framework: 'tanstack',
|
|
@@ -167,15 +167,15 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
167
167
|
}
|
|
168
168
|
await (0, external_ssrPreload_js_namespaceObject.preloadMatchedRouteComponents)(serverRouter);
|
|
169
169
|
context.ssrContext?.response?.status(serverLoadResult.status);
|
|
170
|
-
await serverRouter.serverSsr?.dehydrate
|
|
171
|
-
if (enableRsc) {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
170
|
+
await serverRouter.serverSsr?.dehydrate();
|
|
171
|
+
if (enableRsc) (0, payloadStorage_js_namespaceObject.setTanstackRscServerPayload)((0, payloadRouter_js_namespaceObject.createTanstackRscServerPayload)(serverRouter, {
|
|
172
|
+
omitClientLoaderData: isRSCNavigation
|
|
173
|
+
}));
|
|
174
|
+
const initialScriptTags = serverRouter.serverSsr?.takeInitialHydrationScriptTags();
|
|
175
|
+
const hydrationScripts = initialScriptTags ? (0, external_ssrManagedTags_js_namespaceObject.routerManagedTagsToHtml)([
|
|
176
|
+
...initialScriptTags.before,
|
|
177
|
+
initialScriptTags.boundary
|
|
178
|
+
]) : [];
|
|
179
179
|
const matchedRouteIds = (0, index_js_namespaceObject.getModernRouteIdsFromMatches)(serverRouter);
|
|
180
180
|
const routerServerSnapshot = {
|
|
181
181
|
framework: 'tanstack',
|
|
@@ -27,13 +27,6 @@ var __webpack_require__ = {};
|
|
|
27
27
|
})();
|
|
28
28
|
var __webpack_exports__ = {};
|
|
29
29
|
__webpack_require__.r(__webpack_exports__);
|
|
30
|
-
async function waitForRouterSerialization(tanstackRouter) {
|
|
31
|
-
const serverSsr = tanstackRouter.serverSsr;
|
|
32
|
-
if (!serverSsr || 'function' != typeof serverSsr.onSerializationFinished || serverSsr.isSerializationFinished?.()) return;
|
|
33
|
-
await new Promise((resolve)=>{
|
|
34
|
-
serverSsr.onSerializationFinished?.(resolve);
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
30
|
function htmlEscapeAttr(value) {
|
|
38
31
|
return value.replace(/&/g, '&').replace(/"/g, '"');
|
|
39
32
|
}
|
|
@@ -83,20 +76,17 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
83
76
|
attachServerSsrUtils: ()=>attachServerSsrUtils,
|
|
84
77
|
collectRouterErrors: ()=>collectRouterErrors,
|
|
85
78
|
createGetSsrHref: ()=>createGetSsrHref,
|
|
86
|
-
routerManagedTagsToHtml: ()=>routerManagedTagsToHtml
|
|
87
|
-
waitForRouterSerialization: ()=>waitForRouterSerialization
|
|
79
|
+
routerManagedTagsToHtml: ()=>routerManagedTagsToHtml
|
|
88
80
|
});
|
|
89
81
|
exports.attachServerSsrUtils = __webpack_exports__.attachServerSsrUtils;
|
|
90
82
|
exports.collectRouterErrors = __webpack_exports__.collectRouterErrors;
|
|
91
83
|
exports.createGetSsrHref = __webpack_exports__.createGetSsrHref;
|
|
92
84
|
exports.routerManagedTagsToHtml = __webpack_exports__.routerManagedTagsToHtml;
|
|
93
|
-
exports.waitForRouterSerialization = __webpack_exports__.waitForRouterSerialization;
|
|
94
85
|
for(var __rspack_i in __webpack_exports__)if (-1 === [
|
|
95
86
|
"attachServerSsrUtils",
|
|
96
87
|
"collectRouterErrors",
|
|
97
88
|
"createGetSsrHref",
|
|
98
|
-
"routerManagedTagsToHtml"
|
|
99
|
-
"waitForRouterSerialization"
|
|
89
|
+
"routerManagedTagsToHtml"
|
|
100
90
|
].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
101
91
|
Object.defineProperty(exports, '__esModule', {
|
|
102
92
|
value: true
|
package/dist/esm/cli/index.mjs
CHANGED
|
@@ -2,19 +2,13 @@ import node_path from "node:path";
|
|
|
2
2
|
import { NESTED_ROUTE_SPEC_FILE, filterRoutesForServer } from "@modern-js/utils";
|
|
3
3
|
import { generateTanstackRouteArtifacts, writeTanstackRegisterFile, writeTanstackRouterTypesForEntries } from "./artifacts.mjs";
|
|
4
4
|
import { createTanstackRsbuildRouteSplittingProfile, resolveTanstackRouteCodeSplittingEnabled } from "./routeSplitting.mjs";
|
|
5
|
-
import { __webpack_require__ } from "../rslib-runtime~1.mjs";
|
|
6
|
-
__webpack_require__.add({
|
|
7
|
-
267 (module) {
|
|
8
|
-
module.exports = require("@modern-js/runtime/cli");
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
5
|
const DEFAULT_ROUTES_DIR = 'routes';
|
|
12
6
|
const DEFAULT_GENERATED_DIR_NAME = 'modern-tanstack';
|
|
13
7
|
const ENTRYPOINTS_KEY = '@modern-js/plugin-tanstack';
|
|
14
8
|
let runtimeRouterCli;
|
|
15
9
|
function getRuntimeRouterCli() {
|
|
16
10
|
if (runtimeRouterCli) return runtimeRouterCli;
|
|
17
|
-
const cli =
|
|
11
|
+
const cli = require("@modern-js/runtime/cli");
|
|
18
12
|
if (cli.handleGeneratorEntryCode && cli.getEntrypointRoutesDir && cli.getEntrypointRoutesOwner && cli.updateNestedRoutesSpec) {
|
|
19
13
|
runtimeRouterCli = cli;
|
|
20
14
|
return runtimeRouterCli;
|
|
@@ -15,7 +15,7 @@ import { Link } from "./prefetchLink.mjs";
|
|
|
15
15
|
import { createRouteTreeFromRouteObjects, getModernRouteIdsFromMatches } from "./routeTree/index.mjs";
|
|
16
16
|
import { createTanstackRscServerPayload, handleTanstackRscRedirect } from "./rsc/payloadRouter.mjs";
|
|
17
17
|
import { getTanstackRscRouter, setTanstackRscRouter, setTanstackRscServerPayload } from "./rsc/payloadStorage.mjs";
|
|
18
|
-
import { attachServerSsrUtils, collectRouterErrors, createGetSsrHref, routerManagedTagsToHtml
|
|
18
|
+
import { attachServerSsrUtils, collectRouterErrors, createGetSsrHref, routerManagedTagsToHtml } from "./ssrManagedTags.mjs";
|
|
19
19
|
import { preloadMatchedRouteComponents } from "./ssrPreload.mjs";
|
|
20
20
|
import { getModernTanstackRouterFastDefaults } from "./types.mjs";
|
|
21
21
|
const tanstackRouterPlugin = (userConfig = {})=>{
|
|
@@ -96,7 +96,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
96
96
|
disposed = true;
|
|
97
97
|
rawRequest.signal.removeEventListener('abort', onAbort);
|
|
98
98
|
controller.abort();
|
|
99
|
-
serverRouter.serverSsr?.cleanup
|
|
99
|
+
serverRouter.serverSsr?.cleanup();
|
|
100
100
|
};
|
|
101
101
|
applyRouterRuntimeState(context, {
|
|
102
102
|
framework: 'tanstack',
|
|
@@ -134,15 +134,15 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
134
134
|
}
|
|
135
135
|
await preloadMatchedRouteComponents(serverRouter);
|
|
136
136
|
context.ssrContext?.response?.status(serverLoadResult.status);
|
|
137
|
-
await serverRouter.serverSsr?.dehydrate
|
|
138
|
-
if (enableRsc) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
137
|
+
await serverRouter.serverSsr?.dehydrate();
|
|
138
|
+
if (enableRsc) setTanstackRscServerPayload(createTanstackRscServerPayload(serverRouter, {
|
|
139
|
+
omitClientLoaderData: isRSCNavigation
|
|
140
|
+
}));
|
|
141
|
+
const initialScriptTags = serverRouter.serverSsr?.takeInitialHydrationScriptTags();
|
|
142
|
+
const hydrationScripts = initialScriptTags ? routerManagedTagsToHtml([
|
|
143
|
+
...initialScriptTags.before,
|
|
144
|
+
initialScriptTags.boundary
|
|
145
|
+
]) : [];
|
|
146
146
|
const matchedRouteIds = getModernRouteIdsFromMatches(serverRouter);
|
|
147
147
|
const routerServerSnapshot = {
|
|
148
148
|
framework: 'tanstack',
|
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
async function waitForRouterSerialization(tanstackRouter) {
|
|
2
|
-
const serverSsr = tanstackRouter.serverSsr;
|
|
3
|
-
if (!serverSsr || 'function' != typeof serverSsr.onSerializationFinished || serverSsr.isSerializationFinished?.()) return;
|
|
4
|
-
await new Promise((resolve)=>{
|
|
5
|
-
serverSsr.onSerializationFinished?.(resolve);
|
|
6
|
-
});
|
|
7
|
-
}
|
|
8
1
|
function htmlEscapeAttr(value) {
|
|
9
2
|
return value.replace(/&/g, '&').replace(/"/g, '"');
|
|
10
3
|
}
|
|
@@ -50,4 +43,4 @@ async function attachServerSsrUtils(router) {
|
|
|
50
43
|
manifest: void 0
|
|
51
44
|
});
|
|
52
45
|
}
|
|
53
|
-
export { attachServerSsrUtils, collectRouterErrors, createGetSsrHref, routerManagedTagsToHtml
|
|
46
|
+
export { attachServerSsrUtils, collectRouterErrors, createGetSsrHref, routerManagedTagsToHtml };
|
|
@@ -3,24 +3,18 @@ import node_path from "node:path";
|
|
|
3
3
|
import { NESTED_ROUTE_SPEC_FILE, filterRoutesForServer } from "@modern-js/utils";
|
|
4
4
|
import { generateTanstackRouteArtifacts, writeTanstackRegisterFile, writeTanstackRouterTypesForEntries } from "./artifacts.mjs";
|
|
5
5
|
import { createTanstackRsbuildRouteSplittingProfile, resolveTanstackRouteCodeSplittingEnabled } from "./routeSplitting.mjs";
|
|
6
|
-
import { __webpack_require__ } from "../rslib-runtime~0.mjs";
|
|
7
6
|
import { fileURLToPath as __rspack_fileURLToPath } from "node:url";
|
|
8
7
|
import { dirname as __rspack_dirname } from "node:path";
|
|
9
8
|
var __rspack_import_meta_dirname__ = __rspack_dirname(__rspack_fileURLToPath(import.meta.url));
|
|
10
9
|
import { createRequire as __rspack_createRequire } from "node:module";
|
|
11
10
|
const __rspack_createRequire_require = __rspack_createRequire(import.meta.url);
|
|
12
|
-
__webpack_require__.add({
|
|
13
|
-
"@modern-js/runtime/cli?667f" (module) {
|
|
14
|
-
module.exports = __rspack_createRequire_require("@modern-js/runtime/cli");
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
11
|
const DEFAULT_ROUTES_DIR = 'routes';
|
|
18
12
|
const DEFAULT_GENERATED_DIR_NAME = 'modern-tanstack';
|
|
19
13
|
const ENTRYPOINTS_KEY = '@modern-js/plugin-tanstack';
|
|
20
14
|
let runtimeRouterCli;
|
|
21
15
|
function getRuntimeRouterCli() {
|
|
22
16
|
if (runtimeRouterCli) return runtimeRouterCli;
|
|
23
|
-
const cli =
|
|
17
|
+
const cli = __rspack_createRequire_require("@modern-js/runtime/cli");
|
|
24
18
|
if (cli.handleGeneratorEntryCode && cli.getEntrypointRoutesDir && cli.getEntrypointRoutesOwner && cli.updateNestedRoutesSpec) {
|
|
25
19
|
runtimeRouterCli = cli;
|
|
26
20
|
return runtimeRouterCli;
|
|
@@ -16,7 +16,7 @@ import { Link } from "./prefetchLink.mjs";
|
|
|
16
16
|
import { createRouteTreeFromRouteObjects, getModernRouteIdsFromMatches } from "./routeTree/index.mjs";
|
|
17
17
|
import { createTanstackRscServerPayload, handleTanstackRscRedirect } from "./rsc/payloadRouter.mjs";
|
|
18
18
|
import { getTanstackRscRouter, setTanstackRscRouter, setTanstackRscServerPayload } from "./rsc/payloadStorage.mjs";
|
|
19
|
-
import { attachServerSsrUtils, collectRouterErrors, createGetSsrHref, routerManagedTagsToHtml
|
|
19
|
+
import { attachServerSsrUtils, collectRouterErrors, createGetSsrHref, routerManagedTagsToHtml } from "./ssrManagedTags.mjs";
|
|
20
20
|
import { preloadMatchedRouteComponents } from "./ssrPreload.mjs";
|
|
21
21
|
import { getModernTanstackRouterFastDefaults } from "./types.mjs";
|
|
22
22
|
const tanstackRouterPlugin = (userConfig = {})=>{
|
|
@@ -97,7 +97,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
97
97
|
disposed = true;
|
|
98
98
|
rawRequest.signal.removeEventListener('abort', onAbort);
|
|
99
99
|
controller.abort();
|
|
100
|
-
serverRouter.serverSsr?.cleanup
|
|
100
|
+
serverRouter.serverSsr?.cleanup();
|
|
101
101
|
};
|
|
102
102
|
applyRouterRuntimeState(context, {
|
|
103
103
|
framework: 'tanstack',
|
|
@@ -135,15 +135,15 @@ const tanstackRouterPlugin = (userConfig = {})=>{
|
|
|
135
135
|
}
|
|
136
136
|
await preloadMatchedRouteComponents(serverRouter);
|
|
137
137
|
context.ssrContext?.response?.status(serverLoadResult.status);
|
|
138
|
-
await serverRouter.serverSsr?.dehydrate
|
|
139
|
-
if (enableRsc) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
138
|
+
await serverRouter.serverSsr?.dehydrate();
|
|
139
|
+
if (enableRsc) setTanstackRscServerPayload(createTanstackRscServerPayload(serverRouter, {
|
|
140
|
+
omitClientLoaderData: isRSCNavigation
|
|
141
|
+
}));
|
|
142
|
+
const initialScriptTags = serverRouter.serverSsr?.takeInitialHydrationScriptTags();
|
|
143
|
+
const hydrationScripts = initialScriptTags ? routerManagedTagsToHtml([
|
|
144
|
+
...initialScriptTags.before,
|
|
145
|
+
initialScriptTags.boundary
|
|
146
|
+
]) : [];
|
|
147
147
|
const matchedRouteIds = getModernRouteIdsFromMatches(serverRouter);
|
|
148
148
|
const routerServerSnapshot = {
|
|
149
149
|
framework: 'tanstack',
|
|
@@ -1,11 +1,4 @@
|
|
|
1
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
2
|
function htmlEscapeAttr(value) {
|
|
10
3
|
return value.replace(/&/g, '&').replace(/"/g, '"');
|
|
11
4
|
}
|
|
@@ -51,4 +44,4 @@ async function attachServerSsrUtils(router) {
|
|
|
51
44
|
manifest: void 0
|
|
52
45
|
});
|
|
53
46
|
}
|
|
54
|
-
export { attachServerSsrUtils, collectRouterErrors, createGetSsrHref, routerManagedTagsToHtml
|
|
47
|
+
export { attachServerSsrUtils, collectRouterErrors, createGetSsrHref, routerManagedTagsToHtml };
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { AnyRouter } from '@tanstack/react-router';
|
|
2
2
|
import type { TanstackRouterWithServerSsr } from './ssrTypes.js';
|
|
3
|
-
export declare function waitForRouterSerialization(tanstackRouter: TanstackRouterWithServerSsr): Promise<void>;
|
|
4
3
|
export declare function routerManagedTagsToHtml(tags: unknown): string[];
|
|
5
4
|
export declare function createGetSsrHref(request: Request): string;
|
|
6
5
|
export declare function collectRouterErrors(tanstackRouter: AnyRouter): Record<string, unknown> | undefined;
|
|
@@ -28,13 +28,6 @@ type RouterRouteWithOptions = {
|
|
|
28
28
|
};
|
|
29
29
|
export type TanstackRouterWithServerSsr = AnyRouter & {
|
|
30
30
|
routesById?: Record<string, RouterRouteWithOptions>;
|
|
31
|
-
serverSsr?: {
|
|
32
|
-
cleanup?: () => void;
|
|
33
|
-
dehydrate?: () => Promise<void> | void;
|
|
34
|
-
isSerializationFinished?: () => boolean;
|
|
35
|
-
onSerializationFinished?: (listener: () => void) => void;
|
|
36
|
-
takeBufferedScripts?: () => unknown;
|
|
37
|
-
};
|
|
38
31
|
state: AnyRouter['state'] & {
|
|
39
32
|
matches?: unknown;
|
|
40
33
|
};
|
package/package.json
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"modern.js",
|
|
19
19
|
"tanstack-router"
|
|
20
20
|
],
|
|
21
|
-
"version": "3.9.0-ultramodern.
|
|
21
|
+
"version": "3.9.0-ultramodern.14",
|
|
22
22
|
"engines": {
|
|
23
23
|
"node": ">=20"
|
|
24
24
|
},
|
|
@@ -94,19 +94,19 @@
|
|
|
94
94
|
}
|
|
95
95
|
},
|
|
96
96
|
"dependencies": {
|
|
97
|
-
"@modern-js/i18n-runtime-extensions": "npm:@bleedingdev/modern-js-i18n-runtime-extensions@3.9.0-ultramodern.
|
|
98
|
-
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.9.0-ultramodern.
|
|
99
|
-
"@modern-js/runtime-extensions": "npm:@bleedingdev/modern-js-runtime-extensions@3.9.0-ultramodern.
|
|
100
|
-
"@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.9.0-ultramodern.
|
|
101
|
-
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.0-ultramodern.
|
|
102
|
-
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.
|
|
97
|
+
"@modern-js/i18n-runtime-extensions": "npm:@bleedingdev/modern-js-i18n-runtime-extensions@3.9.0-ultramodern.14",
|
|
98
|
+
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.9.0-ultramodern.14",
|
|
99
|
+
"@modern-js/runtime-extensions": "npm:@bleedingdev/modern-js-runtime-extensions@3.9.0-ultramodern.14",
|
|
100
|
+
"@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.9.0-ultramodern.14",
|
|
101
|
+
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.0-ultramodern.14",
|
|
102
|
+
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.14",
|
|
103
103
|
"@swc/helpers": "^0.5.23",
|
|
104
|
-
"@tanstack/react-router": "1.170.
|
|
105
|
-
"@tanstack/router-core": "1.171.
|
|
104
|
+
"@tanstack/react-router": "1.170.39",
|
|
105
|
+
"@tanstack/router-core": "1.171.32"
|
|
106
106
|
},
|
|
107
107
|
"peerDependencies": {
|
|
108
|
-
"@modern-js/app-tools": "3.9.0-ultramodern.
|
|
109
|
-
"@modern-js/runtime": "3.9.0-ultramodern.
|
|
108
|
+
"@modern-js/app-tools": "3.9.0-ultramodern.14",
|
|
109
|
+
"@modern-js/runtime": "3.9.0-ultramodern.14",
|
|
110
110
|
"react": "^19.2.8",
|
|
111
111
|
"react-dom": "^19.2.8",
|
|
112
112
|
"react-server-dom-rspack": "0.1.0"
|
|
@@ -117,20 +117,20 @@
|
|
|
117
117
|
}
|
|
118
118
|
},
|
|
119
119
|
"devDependencies": {
|
|
120
|
-
"@modern-js/app-tools": "npm:@bleedingdev/modern-js-app-tools@3.9.0-ultramodern.
|
|
121
|
-
"@modern-js/runtime": "npm:@bleedingdev/modern-js-runtime@3.9.0-ultramodern.
|
|
122
|
-
"@modern-js/server-utils": "npm:@bleedingdev/modern-js-server-utils@3.9.0-ultramodern.
|
|
123
|
-
"@rslib/core": "1.0.
|
|
120
|
+
"@modern-js/app-tools": "npm:@bleedingdev/modern-js-app-tools@3.9.0-ultramodern.14",
|
|
121
|
+
"@modern-js/runtime": "npm:@bleedingdev/modern-js-runtime@3.9.0-ultramodern.14",
|
|
122
|
+
"@modern-js/server-utils": "npm:@bleedingdev/modern-js-server-utils@3.9.0-ultramodern.14",
|
|
123
|
+
"@rslib/core": "1.0.2",
|
|
124
124
|
"@scripts/rstest-config": "2.66.0",
|
|
125
|
-
"@tanstack/history": "1.162.
|
|
125
|
+
"@tanstack/history": "1.162.4",
|
|
126
126
|
"@testing-library/react": "^16.3.3",
|
|
127
127
|
"@tsconfig/strictest": "2.0.8",
|
|
128
|
-
"@types/node": "^26.
|
|
129
|
-
"@types/react": "^19.
|
|
130
|
-
"@types/react-dom": "^19.
|
|
128
|
+
"@types/node": "^26.6.2",
|
|
129
|
+
"@types/react": "^19.3.0",
|
|
130
|
+
"@types/react-dom": "^19.3.0",
|
|
131
131
|
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
|
132
|
-
"react": "^19.
|
|
133
|
-
"react-dom": "^19.
|
|
132
|
+
"react": "^19.3.0",
|
|
133
|
+
"react-dom": "^19.3.0",
|
|
134
134
|
"react-server-dom-rspack": "0.1.0"
|
|
135
135
|
},
|
|
136
136
|
"sideEffects": [
|
|
@@ -56,7 +56,6 @@ import {
|
|
|
56
56
|
collectRouterErrors,
|
|
57
57
|
createGetSsrHref,
|
|
58
58
|
routerManagedTagsToHtml,
|
|
59
|
-
waitForRouterSerialization,
|
|
60
59
|
} from './ssrManagedTags';
|
|
61
60
|
import { preloadMatchedRouteComponents } from './ssrPreload';
|
|
62
61
|
import type {
|
|
@@ -178,7 +177,7 @@ export const tanstackRouterPlugin = (
|
|
|
178
177
|
disposed = true;
|
|
179
178
|
rawRequest.signal.removeEventListener('abort', onAbort);
|
|
180
179
|
controller.abort();
|
|
181
|
-
serverRouter.serverSsr?.cleanup
|
|
180
|
+
serverRouter.serverSsr?.cleanup();
|
|
182
181
|
};
|
|
183
182
|
// Acquire the disposer before attachment: every subsequent failure,
|
|
184
183
|
// including partial attachment, has an owner. Successful preparation
|
|
@@ -244,16 +243,9 @@ export const tanstackRouterPlugin = (
|
|
|
244
243
|
| undefined
|
|
245
244
|
)?.status(serverLoadResult.status);
|
|
246
245
|
|
|
247
|
-
await serverRouter.serverSsr?.dehydrate
|
|
246
|
+
await serverRouter.serverSsr?.dehydrate();
|
|
248
247
|
|
|
249
248
|
if (enableRsc) {
|
|
250
|
-
if (isRSCNavigation) {
|
|
251
|
-
// RSC navigations consume the server payload directly. Normal HTML SSR
|
|
252
|
-
// emits the buffered bootstrap script below and must not wait here
|
|
253
|
-
// because Modern's non-streaming hook has not rendered the app yet.
|
|
254
|
-
await waitForRouterSerialization(serverRouter);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
249
|
setTanstackRscServerPayload(
|
|
258
250
|
createTanstackRscServerPayload(serverRouter, {
|
|
259
251
|
omitClientLoaderData: isRSCNavigation,
|
|
@@ -261,8 +253,14 @@ export const tanstackRouterPlugin = (
|
|
|
261
253
|
);
|
|
262
254
|
}
|
|
263
255
|
|
|
264
|
-
const
|
|
265
|
-
|
|
256
|
+
const initialScriptTags =
|
|
257
|
+
serverRouter.serverSsr?.takeInitialHydrationScriptTags();
|
|
258
|
+
const hydrationScripts = initialScriptTags
|
|
259
|
+
? routerManagedTagsToHtml([
|
|
260
|
+
...initialScriptTags.before,
|
|
261
|
+
initialScriptTags.boundary,
|
|
262
|
+
])
|
|
263
|
+
: [];
|
|
266
264
|
const matchedRouteIds = getModernRouteIdsFromMatches(serverRouter);
|
|
267
265
|
const routerServerSnapshot: InternalRouterServerSnapshot = {
|
|
268
266
|
framework: 'tanstack',
|
|
@@ -6,23 +6,6 @@ import type {
|
|
|
6
6
|
TanstackRouterWithServerSsr,
|
|
7
7
|
} from './ssrTypes';
|
|
8
8
|
|
|
9
|
-
export async function waitForRouterSerialization(
|
|
10
|
-
tanstackRouter: TanstackRouterWithServerSsr,
|
|
11
|
-
) {
|
|
12
|
-
const serverSsr = tanstackRouter.serverSsr;
|
|
13
|
-
if (
|
|
14
|
-
!serverSsr ||
|
|
15
|
-
typeof serverSsr.onSerializationFinished !== 'function' ||
|
|
16
|
-
serverSsr.isSerializationFinished?.()
|
|
17
|
-
) {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
await new Promise<void>(resolve => {
|
|
22
|
-
serverSsr.onSerializationFinished?.(resolve);
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
|
|
26
9
|
function htmlEscapeAttr(value: string) {
|
|
27
10
|
return value.replace(/&/g, '&').replace(/"/g, '"');
|
|
28
11
|
}
|
package/src/runtime/ssrTypes.ts
CHANGED
|
@@ -34,13 +34,6 @@ type RouterRouteWithOptions = {
|
|
|
34
34
|
|
|
35
35
|
export type TanstackRouterWithServerSsr = AnyRouter & {
|
|
36
36
|
routesById?: Record<string, RouterRouteWithOptions>;
|
|
37
|
-
serverSsr?: {
|
|
38
|
-
cleanup?: () => void;
|
|
39
|
-
dehydrate?: () => Promise<void> | void;
|
|
40
|
-
isSerializationFinished?: () => boolean;
|
|
41
|
-
onSerializationFinished?: (listener: () => void) => void;
|
|
42
|
-
takeBufferedScripts?: () => unknown;
|
|
43
|
-
};
|
|
44
37
|
state: AnyRouter['state'] & {
|
|
45
38
|
matches?: unknown;
|
|
46
39
|
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AnyRouter } from '@tanstack/react-router';
|
|
2
|
+
|
|
3
|
+
// Router-core navigates only on the client. Node tests perform the same
|
|
4
|
+
// transition a mounted RouterProvider runs: push the rewritten public URL,
|
|
5
|
+
// then load it.
|
|
6
|
+
export async function navigateOnClient(
|
|
7
|
+
router: AnyRouter,
|
|
8
|
+
options: Parameters<AnyRouter['buildLocation']>[0],
|
|
9
|
+
) {
|
|
10
|
+
router.history.push(router.buildLocation(options).publicHref);
|
|
11
|
+
router.updateLatestLocation();
|
|
12
|
+
await router.load();
|
|
13
|
+
}
|
|
@@ -12,6 +12,7 @@ import { renderToString } from 'react-dom/server';
|
|
|
12
12
|
import { createModernBasepathRewrite } from '../../src/runtime/basepathRewrite';
|
|
13
13
|
import { createRouteTreeFromRouteObjects } from '../../src/runtime/routeTree';
|
|
14
14
|
import { createTanstackRouteObjectsFromConfig } from '../../src/runtime/utils';
|
|
15
|
+
import { navigateOnClient } from './clientNavigation';
|
|
15
16
|
|
|
16
17
|
function SearchPage() {
|
|
17
18
|
const data = useLoaderData({ from: '/$lang/search' }) as { language: string };
|
|
@@ -80,14 +81,17 @@ test('localized URLs preserve native loader and params route identity in SSR and
|
|
|
80
81
|
);
|
|
81
82
|
expect(history.location.href).toBe('/base/cs/hledat?q=tractor#results');
|
|
82
83
|
|
|
83
|
-
await router
|
|
84
|
+
await navigateOnClient(router, {
|
|
85
|
+
to: '/en/search',
|
|
86
|
+
search: { q: 'tractor' },
|
|
87
|
+
});
|
|
84
88
|
expect(history.location.href).toBe('/base/en/find?q=tractor');
|
|
85
89
|
expect(router.state.matches.at(-1)?.routeId).toBe('/$lang/search');
|
|
86
90
|
expect(renderToString(createElement(RouterProvider, { router }))).toContain(
|
|
87
91
|
'search:en',
|
|
88
92
|
);
|
|
89
93
|
|
|
90
|
-
await router
|
|
94
|
+
await navigateOnClient(router, { to: '/cs/zdroje/a%2Fb' });
|
|
91
95
|
expect(history.location.href).toBe('/base/cs/zdroje/a%2Fb');
|
|
92
96
|
expect(router.state.matches.at(-1)?.routeId).toBe('/$lang/resources/$id');
|
|
93
97
|
expect(renderToString(createElement(RouterProvider, { router }))).toContain(
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
import React from 'react';
|
|
9
9
|
import { renderToString } from 'react-dom/server';
|
|
10
10
|
import { useMatches } from '../../src/runtime/routeHooks';
|
|
11
|
+
import { navigateOnClient } from './clientNavigation';
|
|
11
12
|
|
|
12
13
|
function MatchIds() {
|
|
13
14
|
const matches = useMatches();
|
|
@@ -41,7 +42,7 @@ test('updates whole match objects after navigation with the structural-sharing g
|
|
|
41
42
|
renderToString(React.createElement(RouterProvider, { router })),
|
|
42
43
|
).toContain('__root__');
|
|
43
44
|
|
|
44
|
-
await router
|
|
45
|
+
await navigateOnClient(router, { to: '/settings' });
|
|
45
46
|
|
|
46
47
|
expect(
|
|
47
48
|
renderToString(React.createElement(RouterProvider, { router })),
|
|
@@ -118,6 +118,11 @@ describe('tanstack server plugin router results', () => {
|
|
|
118
118
|
framework: 'tanstack',
|
|
119
119
|
statusCode: 200,
|
|
120
120
|
});
|
|
121
|
+
// Without the dehydrated router the client re-renders matched remotes
|
|
122
|
+
// from scratch instead of hydrating the server HTML.
|
|
123
|
+
expect(getRouterServerSnapshot(context)?.hydrationScripts).toEqual(
|
|
124
|
+
expect.arrayContaining([expect.stringContaining('$_TSR')]),
|
|
125
|
+
);
|
|
121
126
|
});
|
|
122
127
|
|
|
123
128
|
test('interrupts SSR with the router redirect response', async () => {
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
import { createModernBasepathRewrite } from '../../src/runtime/basepathRewrite';
|
|
15
15
|
import { createRouteTreeFromRouteObjects } from '../../src/runtime/routeTree';
|
|
16
16
|
import { createTanstackRouteObjectsFromConfig } from '../../src/runtime/utils';
|
|
17
|
+
import { navigateOnClient } from './clientNavigation';
|
|
17
18
|
|
|
18
19
|
const execFileAsync = promisify(execFile);
|
|
19
20
|
const strictestTsconfigPath = path.resolve(
|
|
@@ -330,7 +331,7 @@ describe('tanstack router type generation', () => {
|
|
|
330
331
|
import { router } from ${JSON.stringify(pathToFileURL(generated).href)};
|
|
331
332
|
import { createModernBasepathRewrite } from ${JSON.stringify(pathToFileURL(path.resolve(__dirname, '../../dist/esm/runtime/basepathRewrite.mjs')).href)};
|
|
332
333
|
router.update({ rewrite: createModernBasepathRewrite('/base', false, ${JSON.stringify(routes)}) });
|
|
333
|
-
|
|
334
|
+
router.history.push(router.buildLocation({ to: '/cs/produkty/a/b', search: { q: 'tractor' }, hash: 'files' }).publicHref); router.updateLatestLocation(); await router.load();
|
|
334
335
|
console.log(JSON.stringify({ ids: Object.keys(router.routesById).sort(), match: router.state.matches.at(-1).routeId, params: router.state.matches.at(-1).params, href: router.history.location.href }));
|
|
335
336
|
`,
|
|
336
337
|
]);
|
|
@@ -356,13 +357,13 @@ describe('tanstack router type generation', () => {
|
|
|
356
357
|
lang: 'cs',
|
|
357
358
|
_splat: 'a/b',
|
|
358
359
|
});
|
|
359
|
-
await runtime
|
|
360
|
+
await navigateOnClient(runtime, { to: '/cs/missing/path' });
|
|
360
361
|
expect(runtime.state.matches.at(-1)?.routeId).toBe('/$lang/$');
|
|
361
362
|
expect(runtime.state.matches.at(-1)?.params).toMatchObject({
|
|
362
363
|
lang: 'cs',
|
|
363
364
|
_splat: 'missing/path',
|
|
364
365
|
});
|
|
365
|
-
await runtime
|
|
366
|
+
await navigateOnClient(runtime, { to: '/outside/cs' });
|
|
366
367
|
expect(runtime.state.matches.at(-1)?.params).toEqual({ lang: 'cs' });
|
|
367
368
|
const canonicalRoutes = collectCanonicalRoutesForEntry(localized as any)!;
|
|
368
369
|
expect(Object.keys(canonicalRoutes)).toEqual(['/$', '/products/$']);
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
var __webpack_modules__ = {};
|
|
2
|
-
var __webpack_module_cache__ = {};
|
|
3
|
-
function __webpack_require__(moduleId) {
|
|
4
|
-
var cachedModule = __webpack_module_cache__[moduleId];
|
|
5
|
-
if (void 0 !== cachedModule) return cachedModule.exports;
|
|
6
|
-
var module = __webpack_module_cache__[moduleId] = {
|
|
7
|
-
exports: {}
|
|
8
|
-
};
|
|
9
|
-
__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
10
|
-
return module.exports;
|
|
11
|
-
}
|
|
12
|
-
__webpack_require__.m = __webpack_modules__;
|
|
13
|
-
(()=>{
|
|
14
|
-
__webpack_require__.add = function(modules) {
|
|
15
|
-
Object.assign(__webpack_require__.m, modules);
|
|
16
|
-
};
|
|
17
|
-
})();
|
|
18
|
-
export { __webpack_require__ };
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import "node:module";
|
|
2
|
-
var __webpack_modules__ = {};
|
|
3
|
-
var __webpack_module_cache__ = {};
|
|
4
|
-
function __webpack_require__(moduleId) {
|
|
5
|
-
var cachedModule = __webpack_module_cache__[moduleId];
|
|
6
|
-
if (void 0 !== cachedModule) return cachedModule.exports;
|
|
7
|
-
var module = __webpack_module_cache__[moduleId] = {
|
|
8
|
-
exports: {}
|
|
9
|
-
};
|
|
10
|
-
__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
11
|
-
return module.exports;
|
|
12
|
-
}
|
|
13
|
-
__webpack_require__.m = __webpack_modules__;
|
|
14
|
-
(()=>{
|
|
15
|
-
__webpack_require__.add = function(modules) {
|
|
16
|
-
Object.assign(__webpack_require__.m, modules);
|
|
17
|
-
};
|
|
18
|
-
})();
|
|
19
|
-
export { __webpack_require__ };
|