@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.
@@ -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
- if (isRSCNavigation) await (0, external_ssrManagedTags_js_namespaceObject.waitForRouterSerialization)(serverRouter);
173
- (0, payloadStorage_js_namespaceObject.setTanstackRscServerPayload)((0, payloadRouter_js_namespaceObject.createTanstackRscServerPayload)(serverRouter, {
174
- omitClientLoaderData: isRSCNavigation
175
- }));
176
- }
177
- const ssrScriptTags = serverRouter.serverSsr?.takeBufferedScripts?.();
178
- const hydrationScripts = (0, external_ssrManagedTags_js_namespaceObject.routerManagedTagsToHtml)(ssrScriptTags);
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
@@ -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 = __webpack_require__(267);
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, waitForRouterSerialization } from "./ssrManagedTags.mjs";
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
- if (isRSCNavigation) await waitForRouterSerialization(serverRouter);
140
- setTanstackRscServerPayload(createTanstackRscServerPayload(serverRouter, {
141
- omitClientLoaderData: isRSCNavigation
142
- }));
143
- }
144
- const ssrScriptTags = serverRouter.serverSsr?.takeBufferedScripts?.();
145
- const hydrationScripts = routerManagedTagsToHtml(ssrScriptTags);
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, waitForRouterSerialization };
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 = __webpack_require__("@modern-js/runtime/cli?667f");
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, waitForRouterSerialization } from "./ssrManagedTags.mjs";
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
- if (isRSCNavigation) await waitForRouterSerialization(serverRouter);
141
- setTanstackRscServerPayload(createTanstackRscServerPayload(serverRouter, {
142
- omitClientLoaderData: isRSCNavigation
143
- }));
144
- }
145
- const ssrScriptTags = serverRouter.serverSsr?.takeBufferedScripts?.();
146
- const hydrationScripts = routerManagedTagsToHtml(ssrScriptTags);
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, waitForRouterSerialization };
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.12",
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.12",
98
- "@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.9.0-ultramodern.12",
99
- "@modern-js/runtime-extensions": "npm:@bleedingdev/modern-js-runtime-extensions@3.9.0-ultramodern.12",
100
- "@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.9.0-ultramodern.12",
101
- "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.9.0-ultramodern.12",
102
- "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.9.0-ultramodern.12",
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.33",
105
- "@tanstack/router-core": "1.171.28"
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.12",
109
- "@modern-js/runtime": "3.9.0-ultramodern.12",
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.12",
121
- "@modern-js/runtime": "npm:@bleedingdev/modern-js-runtime@3.9.0-ultramodern.12",
122
- "@modern-js/server-utils": "npm:@bleedingdev/modern-js-server-utils@3.9.0-ultramodern.12",
123
- "@rslib/core": "1.0.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.2",
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.4.1",
129
- "@types/react": "^19.2.18",
130
- "@types/react-dom": "^19.2.7",
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.2.8",
133
- "react-dom": "^19.2.8",
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 ssrScriptTags = serverRouter.serverSsr?.takeBufferedScripts?.();
265
- const hydrationScripts = routerManagedTagsToHtml(ssrScriptTags);
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, '&amp;').replace(/"/g, '&quot;');
28
11
  }
@@ -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.navigate({ to: '/en/search', search: { q: 'tractor' } });
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.navigate({ to: '/cs/zdroje/a%2Fb' });
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.navigate({ to: '/settings' });
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
- await router.navigate({ to: '/cs/produkty/a/b', search: { q: 'tractor' }, hash: 'files' });
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.navigate({ to: '/cs/missing/path' });
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.navigate({ to: '/outside/cs' });
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__ };