@bleedingdev/modern-js-runtime 3.2.0-ultramodern.10 → 3.2.0-ultramodern.101

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.
Files changed (97) hide show
  1. package/dist/cjs/boundary-debugger/index.js +299 -0
  2. package/dist/cjs/cli/ssr/index.js +5 -15
  3. package/dist/cjs/cli/template.server.js +1 -0
  4. package/dist/cjs/core/react/wrapper.js +9 -3
  5. package/dist/cjs/core/server/federatedCss.js +47 -0
  6. package/dist/cjs/core/server/helmet.js +8 -2
  7. package/dist/cjs/core/server/scriptOrder.js +59 -0
  8. package/dist/cjs/core/server/stream/afterTemplate.js +13 -5
  9. package/dist/cjs/core/server/stream/beforeTemplate.js +13 -20
  10. package/dist/cjs/core/server/stream/beforeTemplate.worker.js +98 -0
  11. package/dist/cjs/core/server/stream/createReadableStream.js +7 -2
  12. package/dist/cjs/core/server/stream/createReadableStream.worker.js +4 -2
  13. package/dist/cjs/core/server/stream/shared.js +3 -1
  14. package/dist/cjs/core/server/string/index.js +16 -9
  15. package/dist/cjs/core/server/string/loadable.js +74 -10
  16. package/dist/cjs/exports/head.js +196 -5
  17. package/dist/cjs/exports/loadable.js +34 -4
  18. package/dist/cjs/exports/tanstack-router.js +311 -54
  19. package/dist/cjs/router/cli/code/tanstackTypes.js +116 -51
  20. package/dist/cjs/router/cli/code/templates.js +15 -9
  21. package/dist/cjs/router/runtime/tanstack/hydrationBoundary.js +44 -0
  22. package/dist/cjs/router/runtime/tanstack/outlet.js +54 -0
  23. package/dist/cjs/router/runtime/tanstack/plugin.js +190 -88
  24. package/dist/cjs/router/runtime/tanstack/plugin.node.js +4 -14
  25. package/dist/cjs/router/runtime/tanstack/routeTree.js +64 -12
  26. package/dist/cjs/rsc/server.worker.js +58 -0
  27. package/dist/cjs/ssr/serverRender/renderToString/entry.js +9 -8
  28. package/dist/esm/boundary-debugger/index.mjs +263 -0
  29. package/dist/esm/cli/ssr/index.mjs +5 -15
  30. package/dist/esm/cli/template.server.mjs +1 -0
  31. package/dist/esm/core/react/wrapper.mjs +9 -3
  32. package/dist/esm/core/server/federatedCss.mjs +13 -0
  33. package/dist/esm/core/server/helmet.mjs +5 -2
  34. package/dist/esm/core/server/scriptOrder.mjs +25 -0
  35. package/dist/esm/core/server/stream/afterTemplate.mjs +14 -6
  36. package/dist/esm/core/server/stream/beforeTemplate.mjs +14 -11
  37. package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +64 -0
  38. package/dist/esm/core/server/stream/createReadableStream.mjs +7 -2
  39. package/dist/esm/core/server/stream/createReadableStream.worker.mjs +4 -2
  40. package/dist/esm/core/server/stream/shared.mjs +3 -1
  41. package/dist/esm/core/server/string/index.mjs +17 -9
  42. package/dist/esm/core/server/string/loadable.mjs +70 -9
  43. package/dist/esm/exports/head.mjs +189 -4
  44. package/dist/esm/exports/loadable.mjs +20 -3
  45. package/dist/esm/exports/tanstack-router.mjs +2 -1
  46. package/dist/esm/router/cli/code/tanstackTypes.mjs +116 -51
  47. package/dist/esm/router/cli/code/templates.mjs +15 -9
  48. package/dist/esm/router/runtime/tanstack/hydrationBoundary.mjs +10 -0
  49. package/dist/esm/router/runtime/tanstack/outlet.mjs +17 -0
  50. package/dist/esm/router/runtime/tanstack/plugin.mjs +193 -91
  51. package/dist/esm/router/runtime/tanstack/plugin.node.mjs +5 -15
  52. package/dist/esm/router/runtime/tanstack/routeTree.mjs +65 -13
  53. package/dist/esm/rsc/server.worker.mjs +1 -0
  54. package/dist/esm/ssr/serverRender/renderToString/entry.mjs +9 -6
  55. package/dist/esm-node/boundary-debugger/index.mjs +264 -0
  56. package/dist/esm-node/cli/ssr/index.mjs +5 -15
  57. package/dist/esm-node/cli/template.server.mjs +1 -0
  58. package/dist/esm-node/core/react/wrapper.mjs +9 -3
  59. package/dist/esm-node/core/server/federatedCss.mjs +14 -0
  60. package/dist/esm-node/core/server/helmet.mjs +5 -2
  61. package/dist/esm-node/core/server/scriptOrder.mjs +26 -0
  62. package/dist/esm-node/core/server/stream/afterTemplate.mjs +14 -6
  63. package/dist/esm-node/core/server/stream/beforeTemplate.mjs +14 -11
  64. package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +65 -0
  65. package/dist/esm-node/core/server/stream/createReadableStream.mjs +7 -2
  66. package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +4 -2
  67. package/dist/esm-node/core/server/stream/shared.mjs +3 -1
  68. package/dist/esm-node/core/server/string/index.mjs +17 -9
  69. package/dist/esm-node/core/server/string/loadable.mjs +70 -9
  70. package/dist/esm-node/exports/head.mjs +189 -4
  71. package/dist/esm-node/exports/loadable.mjs +20 -3
  72. package/dist/esm-node/exports/tanstack-router.mjs +2 -1
  73. package/dist/esm-node/router/cli/code/tanstackTypes.mjs +116 -51
  74. package/dist/esm-node/router/cli/code/templates.mjs +15 -9
  75. package/dist/esm-node/router/runtime/tanstack/hydrationBoundary.mjs +11 -0
  76. package/dist/esm-node/router/runtime/tanstack/outlet.mjs +18 -0
  77. package/dist/esm-node/router/runtime/tanstack/plugin.mjs +193 -91
  78. package/dist/esm-node/router/runtime/tanstack/plugin.node.mjs +5 -15
  79. package/dist/esm-node/router/runtime/tanstack/routeTree.mjs +65 -13
  80. package/dist/esm-node/rsc/server.worker.mjs +2 -0
  81. package/dist/esm-node/ssr/serverRender/renderToString/entry.mjs +9 -6
  82. package/dist/types/boundary-debugger/index.d.ts +28 -0
  83. package/dist/types/core/context/runtime.d.ts +4 -0
  84. package/dist/types/core/server/federatedCss.d.ts +5 -0
  85. package/dist/types/core/server/helmet.d.ts +5 -3
  86. package/dist/types/core/server/scriptOrder.d.ts +1 -0
  87. package/dist/types/core/server/stream/beforeTemplate.d.ts +1 -0
  88. package/dist/types/core/server/stream/beforeTemplate.worker.d.ts +10 -0
  89. package/dist/types/core/server/stream/shared.d.ts +8 -0
  90. package/dist/types/core/server/string/loadable.d.ts +11 -0
  91. package/dist/types/exports/head.d.ts +10 -3
  92. package/dist/types/exports/loadable.d.ts +8 -1
  93. package/dist/types/exports/tanstack-router.d.ts +3 -1
  94. package/dist/types/router/runtime/tanstack/hydrationBoundary.d.ts +2 -0
  95. package/dist/types/router/runtime/tanstack/outlet.d.ts +2 -0
  96. package/dist/types/rsc/server.worker.d.ts +1 -0
  97. package/package.json +24 -18
@@ -37,6 +37,9 @@ const external_hooks_js_namespaceObject = require("../hooks.js");
37
37
  const external_lifecycle_js_namespaceObject = require("../lifecycle.js");
38
38
  const external_utils_js_namespaceObject = require("../utils.js");
39
39
  const external_basepathRewrite_js_namespaceObject = require("./basepathRewrite.js");
40
+ const external_hydrationBoundary_js_namespaceObject = require("./hydrationBoundary.js");
41
+ const external_outlet_js_namespaceObject = require("./outlet.js");
42
+ const external_prefetchLink_js_namespaceObject = require("./prefetchLink.js");
40
43
  const external_routeTree_js_namespaceObject = require("./routeTree.js");
41
44
  const client_js_namespaceObject = require("./rsc/client.js");
42
45
  const BLOCKING_SUBSCRIBE_SYMBOL = Symbol.for('@modern-js/plugin-runtime:tanstack-blocking-subscribe');
@@ -66,6 +69,85 @@ function wrapRouterSubscribeWithBlockState(router, getBlockNavState) {
66
69
  };
67
70
  target[BLOCKING_SUBSCRIBE_SYMBOL] = true;
68
71
  }
72
+ const routerHydrationRecords = new WeakMap();
73
+ const routeModulesKey = '_routeModules';
74
+ function pickRouteModuleComponent(routeModule, seen = new Set()) {
75
+ if ('function' == typeof routeModule || routeModule && 'object' == typeof routeModule && '$$typeof' in routeModule) return routeModule;
76
+ if (!routeModule || 'object' != typeof routeModule) return;
77
+ if (seen.has(routeModule)) return;
78
+ seen.add(routeModule);
79
+ const module = routeModule;
80
+ for (const candidate of [
81
+ module.default,
82
+ module.Component
83
+ ]){
84
+ const component = pickRouteModuleComponent(candidate, seen);
85
+ if (component) return component;
86
+ }
87
+ }
88
+ function getCachedRouteModule(routeId) {
89
+ if ("u" < typeof window) return;
90
+ return window[routeModulesKey]?.[routeId];
91
+ }
92
+ async function preloadHydratedRouteComponents(router) {
93
+ const preloadableRouter = router;
94
+ const routesById = preloadableRouter.routesById || {};
95
+ const matches = preloadableRouter.stores.matches.get();
96
+ await Promise.all(matches.map((match)=>{
97
+ if (!match.routeId) return;
98
+ const route = routesById[match.routeId];
99
+ const component = route?.options?.component;
100
+ const preload = component?.load || component?.preload;
101
+ if ('function' != typeof preload) return;
102
+ return Promise.resolve(preload.call(component)).then((routeModule)=>{
103
+ const modernRouteId = route?.options?.staticData?.modernRouteId;
104
+ const resolvedComponent = pickRouteModuleComponent(modernRouteId && getCachedRouteModule(modernRouteId) || routeModule);
105
+ if (resolvedComponent && modernRouteId) route.options.component = (0, external_outlet_js_namespaceObject.withModernRouteMatchContext)(resolvedComponent, modernRouteId);
106
+ });
107
+ }));
108
+ }
109
+ function getTanstackSsrHydrationRecord(router) {
110
+ let hydrationRecord = routerHydrationRecords.get(router);
111
+ if (!hydrationRecord) {
112
+ hydrationRecord = {
113
+ promise: Promise.resolve(),
114
+ status: 'pending'
115
+ };
116
+ routerHydrationRecords.set(router, hydrationRecord);
117
+ try {
118
+ hydrationRecord.promise = (0, client_namespaceObject.hydrate)(router).then(async (value)=>{
119
+ await preloadHydratedRouteComponents(router);
120
+ return value;
121
+ }).then((value)=>{
122
+ hydrationRecord.status = 'fulfilled';
123
+ return value;
124
+ }, (error)=>{
125
+ hydrationRecord.status = 'rejected';
126
+ hydrationRecord.error = error;
127
+ throw error;
128
+ });
129
+ } catch (error) {
130
+ hydrationRecord.status = 'rejected';
131
+ hydrationRecord.error = error;
132
+ hydrationRecord.promise = Promise.reject(error);
133
+ hydrationRecord.promise.catch(()=>{});
134
+ }
135
+ }
136
+ return hydrationRecord;
137
+ }
138
+ function getTanstackSsrHydrationPromise(router) {
139
+ return getTanstackSsrHydrationRecord(router).promise;
140
+ }
141
+ function hasTanstackSsrHydrationRecord(router) {
142
+ return routerHydrationRecords.has(router);
143
+ }
144
+ function ModernRouterClient({ router }) {
145
+ const hydrationRecord = getTanstackSsrHydrationRecord(router);
146
+ if ('rejected' === hydrationRecord.status) throw hydrationRecord.error;
147
+ return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(react_router_namespaceObject.RouterProvider, {
148
+ router: router
149
+ });
150
+ }
69
151
  function stripSyntheticNotFoundRoute(routes) {
70
152
  return routes.filter((route)=>!('*' === route.path && !route.id && !route.loader)).map((route)=>{
71
153
  if (!route.children?.length) return route;
@@ -84,9 +166,94 @@ const tanstackRouterPlugin = (userConfig = {})=>({
84
166
  onBeforeHydrateRouter: external_hooks_js_namespaceObject.onBeforeHydrateRouter
85
167
  },
86
168
  setup: (api)=>{
87
- api.onBeforeRender((context)=>{
169
+ const hooks = api.getHooks();
170
+ let cachedRouteObjects;
171
+ let cachedRouteTree = null;
172
+ let cachedRouter = null;
173
+ let cachedRouterBasepath = null;
174
+ const getMergedConfig = ()=>{
88
175
  const pluginConfig = api.getRuntimeConfig();
89
- const mergedConfig = (0, merge_namespaceObject.merge)(pluginConfig.router || {}, userConfig);
176
+ return (0, merge_namespaceObject.merge)(pluginConfig.router || {}, userConfig);
177
+ };
178
+ const getRouteObjects = ()=>{
179
+ if (void 0 !== cachedRouteObjects) return cachedRouteObjects;
180
+ const mergedConfig = getMergedConfig();
181
+ const { routesConfig, createRoutes } = mergedConfig;
182
+ const finalRouteConfig = {
183
+ routes: (0, index_js_namespaceObject.getGlobalRoutes)(),
184
+ globalApp: (0, index_js_namespaceObject.getGlobalLayoutApp)(),
185
+ ...routesConfig
186
+ };
187
+ const routeObjects = createRoutes ? createRoutes() : (0, external_utils_js_namespaceObject.createRouteObjectsFromConfig)({
188
+ routesConfig: finalRouteConfig
189
+ }) || [];
190
+ const normalizedRouteObjects = createRoutes ? routeObjects : stripSyntheticNotFoundRoute(routeObjects);
191
+ cachedRouteObjects = hooks.modifyRoutes.call(normalizedRouteObjects);
192
+ return cachedRouteObjects;
193
+ };
194
+ const getRouteTree = ()=>{
195
+ if (cachedRouteTree) return cachedRouteTree;
196
+ const routeObjects = getRouteObjects();
197
+ if (!routeObjects.length) return null;
198
+ cachedRouteTree = (0, external_routeTree_js_namespaceObject.createRouteTreeFromRouteObjects)(routeObjects);
199
+ return cachedRouteTree;
200
+ };
201
+ const selectBasePath = (pathname)=>{
202
+ const { serverBase = [] } = getMergedConfig();
203
+ const match = serverBase.find((baseUrl)=>isSegmentPrefix(pathname, baseUrl));
204
+ return match || '/';
205
+ };
206
+ const getClientBasename = (runtimeContext)=>{
207
+ const { basename = '' } = getMergedConfig();
208
+ const baseUrl = selectBasePath(location.pathname).replace(/^\/*/, '/');
209
+ return '/' === baseUrl ? (0, external_utils_js_namespaceObject.urlJoin)(baseUrl, runtimeContext._internalRouterBaseName || basename || '') : baseUrl;
210
+ };
211
+ const getRouter = (runtimeContext, _basename)=>{
212
+ const routeTree = getRouteTree();
213
+ if (!routeTree) return null;
214
+ const lifecycleContext = {
215
+ framework: 'tanstack',
216
+ phase: 'client-create',
217
+ routes: getRouteObjects(),
218
+ runtimeContext,
219
+ basename: _basename
220
+ };
221
+ hooks.onBeforeCreateRouter.call(lifecycleContext);
222
+ if (cachedRouter && cachedRouterBasepath === _basename) {
223
+ wrapRouterSubscribeWithBlockState(cachedRouter, runtimeContext.unstable_getBlockNavState);
224
+ hooks.onAfterCreateRouter.call({
225
+ ...lifecycleContext,
226
+ router: cachedRouter,
227
+ runtimeContext
228
+ });
229
+ return cachedRouter;
230
+ }
231
+ const mergedConfig = getMergedConfig();
232
+ const { supportHtml5History = true } = mergedConfig;
233
+ const history = supportHtml5History ? (0, react_router_namespaceObject.createBrowserHistory)() : (0, react_router_namespaceObject.createHashHistory)();
234
+ const rewrite = (0, external_basepathRewrite_js_namespaceObject.createModernBasepathRewrite)(_basename);
235
+ const serializationAdapters = (0, index_js_namespaceObject.getGlobalEnableRsc)() ? (0, client_js_namespaceObject.getTanstackRscSerializationAdapters)() : void 0;
236
+ cachedRouter = (0, react_router_namespaceObject.createRouter)({
237
+ routeTree,
238
+ basepath: '/',
239
+ rewrite,
240
+ history,
241
+ context: {},
242
+ ...serializationAdapters ? {
243
+ serializationAdapters
244
+ } : {}
245
+ });
246
+ cachedRouterBasepath = _basename;
247
+ wrapRouterSubscribeWithBlockState(cachedRouter, runtimeContext.unstable_getBlockNavState);
248
+ hooks.onAfterCreateRouter.call({
249
+ ...lifecycleContext,
250
+ router: cachedRouter,
251
+ runtimeContext
252
+ });
253
+ return cachedRouter;
254
+ };
255
+ api.onBeforeRender(async (context)=>{
256
+ const mergedConfig = getMergedConfig();
90
257
  if ("u" > typeof window && window._SSR_DATA && mergedConfig.unstable_reloadOnURLMismatch) {
91
258
  const { ssrContext } = context;
92
259
  const currentPathname = (0, url_namespaceObject.normalizePathname)(window.location.pathname);
@@ -98,96 +265,32 @@ const tanstackRouterPlugin = (userConfig = {})=>({
98
265
  }
99
266
  }
100
267
  context.router = {
268
+ Link: external_prefetchLink_js_namespaceObject.Link,
101
269
  useMatches: react_router_namespaceObject.useMatches,
102
270
  useLocation: react_router_namespaceObject.useLocation,
103
271
  useNavigate: react_router_namespaceObject.useNavigate,
104
272
  useRouter: react_router_namespaceObject.useRouter
105
273
  };
274
+ const hasSSRBootstrap = "u" > typeof window && Boolean(window.$_TSR);
275
+ if (hasSSRBootstrap && getRouteObjects().length) {
276
+ const runtimeContext = context;
277
+ const router = getRouter(runtimeContext, getClientBasename(runtimeContext));
278
+ if (router) await getTanstackSsrHydrationPromise(router);
279
+ }
106
280
  });
107
281
  api.wrapRoot((App)=>{
108
- const mergedConfig = (0, merge_namespaceObject.merge)(api.getRuntimeConfig().router || {}, userConfig);
109
- const { serverBase = [], supportHtml5History = true, basename = '', routesConfig, createRoutes } = mergedConfig;
110
- const finalRouteConfig = {
111
- routes: (0, index_js_namespaceObject.getGlobalRoutes)(),
112
- globalApp: (0, index_js_namespaceObject.getGlobalLayoutApp)(),
113
- ...routesConfig
114
- };
115
- if (!finalRouteConfig.routes && !createRoutes) return App;
116
- const hooks = api.getHooks();
117
- let cachedRouteObjects;
118
- const getRouteObjects = ()=>{
119
- if (void 0 !== cachedRouteObjects) return cachedRouteObjects;
120
- const routeObjects = createRoutes ? createRoutes() : (0, external_utils_js_namespaceObject.createRouteObjectsFromConfig)({
121
- routesConfig: finalRouteConfig
122
- }) || [];
123
- const normalizedRouteObjects = createRoutes ? routeObjects : stripSyntheticNotFoundRoute(routeObjects);
124
- cachedRouteObjects = hooks.modifyRoutes.call(normalizedRouteObjects);
125
- return cachedRouteObjects;
126
- };
127
- const selectBasePath = (pathname)=>{
128
- const match = serverBase.find((baseUrl)=>isSegmentPrefix(pathname, baseUrl));
129
- return match || '/';
130
- };
131
- let cachedRouteTree = null;
132
- let cachedRouter = null;
133
- let cachedRouterBasepath = null;
282
+ if (!getRouteObjects().length) return App;
134
283
  const RouterWrapper = ()=>{
135
284
  const runtimeContext = (0, external_react_namespaceObject.useContext)(index_js_namespaceObject.InternalRuntimeContext);
136
- const baseUrl = selectBasePath(location.pathname).replace(/^\/*/, '/');
137
- const _basename = '/' === baseUrl ? (0, external_utils_js_namespaceObject.urlJoin)(baseUrl, runtimeContext._internalRouterBaseName || basename || '') : baseUrl;
138
- const routeTree = (0, external_react_namespaceObject.useMemo)(()=>{
139
- if (cachedRouteTree) return cachedRouteTree;
140
- const routeObjects = getRouteObjects();
141
- if (!routeObjects.length) return null;
142
- cachedRouteTree = (0, external_routeTree_js_namespaceObject.createRouteTreeFromRouteObjects)(routeObjects);
143
- return cachedRouteTree;
144
- }, []);
285
+ const _basename = getClientBasename(runtimeContext);
286
+ const routeTree = (0, external_react_namespaceObject.useMemo)(()=>getRouteTree(), []);
145
287
  if (!routeTree) return App ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(App, {}) : null;
146
- const router = (0, external_react_namespaceObject.useMemo)(()=>{
147
- const lifecycleContext = {
148
- framework: 'tanstack',
149
- phase: 'client-create',
150
- routes: getRouteObjects(),
151
- runtimeContext,
152
- basename: _basename
153
- };
154
- hooks.onBeforeCreateRouter.call(lifecycleContext);
155
- if (cachedRouter && cachedRouterBasepath === _basename) {
156
- wrapRouterSubscribeWithBlockState(cachedRouter, runtimeContext.unstable_getBlockNavState);
157
- hooks.onAfterCreateRouter.call({
158
- ...lifecycleContext,
159
- router: cachedRouter,
160
- runtimeContext
161
- });
162
- return cachedRouter;
163
- }
164
- const history = supportHtml5History ? (0, react_router_namespaceObject.createBrowserHistory)() : (0, react_router_namespaceObject.createHashHistory)();
165
- const rewrite = (0, external_basepathRewrite_js_namespaceObject.createModernBasepathRewrite)(_basename);
166
- const serializationAdapters = (0, index_js_namespaceObject.getGlobalEnableRsc)() ? (0, client_js_namespaceObject.getTanstackRscSerializationAdapters)() : void 0;
167
- cachedRouter = (0, react_router_namespaceObject.createRouter)({
168
- routeTree,
169
- basepath: '/',
170
- rewrite,
171
- history,
172
- context: {},
173
- ...serializationAdapters ? {
174
- serializationAdapters
175
- } : {}
176
- });
177
- cachedRouterBasepath = _basename;
178
- wrapRouterSubscribeWithBlockState(cachedRouter, runtimeContext.unstable_getBlockNavState);
179
- hooks.onAfterCreateRouter.call({
180
- ...lifecycleContext,
181
- router: cachedRouter,
182
- runtimeContext
183
- });
184
- return cachedRouter;
185
- }, [
288
+ const router = (0, external_react_namespaceObject.useMemo)(()=>getRouter(runtimeContext, _basename), [
186
289
  _basename,
187
290
  routeTree,
188
- supportHtml5History,
189
291
  runtimeContext
190
292
  ]);
293
+ if (!router) return App ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(App, {}) : null;
191
294
  const runtimeState = (0, external_lifecycle_js_namespaceObject.applyRouterRuntimeState)(runtimeContext, {
192
295
  framework: 'tanstack',
193
296
  basename: _basename,
@@ -201,30 +304,29 @@ const tanstackRouterPlugin = (userConfig = {})=>({
201
304
  basename: _basename,
202
305
  router
203
306
  };
204
- const hasSSRBootstrap = "u" > typeof window && Boolean(window.$_TSR);
205
- if (hasSSRBootstrap) hooks.onBeforeHydrateRouter.call({
307
+ const hasSSRBootstrap = "u" > typeof window && (Boolean(window.$_TSR) || hasTanstackSsrHydrationRecord(router));
308
+ const needsRouterClient = hasSSRBootstrap;
309
+ if (needsRouterClient) hooks.onBeforeHydrateRouter.call({
206
310
  ...lifecycleContext,
207
311
  phase: 'hydrate',
208
312
  router,
209
313
  runtimeContext: runtimeState
210
314
  });
211
- const RouterContent = hasSSRBootstrap ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_react_namespaceObject.Suspense, {
212
- fallback: null,
213
- children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(client_namespaceObject.RouterClient, {
214
- router: router
215
- })
315
+ const RouterContent = needsRouterClient ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(ModernRouterClient, {
316
+ router: router
216
317
  }) : /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(react_router_namespaceObject.RouterProvider, {
217
318
  router: router
218
319
  });
219
- if (hasSSRBootstrap) hooks.onAfterHydrateRouter.call({
320
+ const HydratableRouterContent = (0, external_hydrationBoundary_js_namespaceObject.wrapTanstackSsrHydrationBoundary)(RouterContent, hasSSRBootstrap);
321
+ if (needsRouterClient) hooks.onAfterHydrateRouter.call({
220
322
  ...lifecycleContext,
221
323
  phase: 'hydrate',
222
324
  router,
223
325
  runtimeContext: runtimeState
224
326
  });
225
327
  return App ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(App, {
226
- children: RouterContent
227
- }) : RouterContent;
328
+ children: HydratableRouterContent
329
+ }) : HydratableRouterContent;
228
330
  };
229
331
  return RouterWrapper;
230
332
  });
@@ -38,6 +38,7 @@ const index_js_namespaceObject = require("../../../core/context/index.js");
38
38
  const external_lifecycle_js_namespaceObject = require("../lifecycle.js");
39
39
  const external_utils_js_namespaceObject = require("../utils.js");
40
40
  const external_basepathRewrite_js_namespaceObject = require("./basepathRewrite.js");
41
+ const external_hydrationBoundary_js_namespaceObject = require("./hydrationBoundary.js");
41
42
  const external_routeTree_js_namespaceObject = require("./routeTree.js");
42
43
  function isPreloadableRouteComponent(component) {
43
44
  if (!component || 'function' != typeof component) return false;
@@ -65,13 +66,6 @@ async function preloadMatchedRouteComponents(tanstackRouter) {
65
66
  ]);
66
67
  }));
67
68
  }
68
- async function waitForRouterSerialization(tanstackRouter) {
69
- const serverSsr = tanstackRouter.serverSsr;
70
- if (!serverSsr || 'function' != typeof serverSsr.onSerializationFinished || serverSsr.isSerializationFinished?.()) return;
71
- await new Promise((resolve)=>{
72
- serverSsr.onSerializationFinished?.(resolve);
73
- });
74
- }
75
69
  function htmlEscapeAttr(value) {
76
70
  return value.replace(/&/g, '&amp;').replace(/"/g, '&quot;');
77
71
  }
@@ -217,7 +211,6 @@ const tanstackRouterPlugin = (userConfig = {})=>({
217
211
  await preloadMatchedRouteComponents(serverRouter);
218
212
  context.ssrContext?.response.status(tanstackRouter.state.statusCode);
219
213
  await serverRouter.serverSsr?.dehydrate?.();
220
- await waitForRouterSerialization(serverRouter);
221
214
  const ssrScriptTags = serverRouter.serverSsr?.takeBufferedScripts?.();
222
215
  const hydrationScripts = routerManagedTagsToHtml(ssrScriptTags);
223
216
  const matchedRouteIds = (0, external_routeTree_js_namespaceObject.getModernRouteIdsFromMatches)(serverRouter);
@@ -255,12 +248,9 @@ const tanstackRouterPlugin = (userConfig = {})=>({
255
248
  if (!router) return App ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(App, {
256
249
  ...props
257
250
  }) : null;
258
- const routerWrapper = /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_react_namespaceObject.Suspense, {
259
- fallback: null,
260
- children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(react_router_namespaceObject.RouterProvider, {
261
- router: router
262
- })
263
- });
251
+ const routerWrapper = (0, external_hydrationBoundary_js_namespaceObject.wrapTanstackSsrHydrationBoundary)(/*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(react_router_namespaceObject.RouterProvider, {
252
+ router: router
253
+ }), true);
264
254
  return App ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(App, {
265
255
  children: routerWrapper
266
256
  }) : routerWrapper;
@@ -29,13 +29,19 @@ __webpack_require__.d(__webpack_exports__, {
29
29
  getModernRouteIdsFromMatches: ()=>getModernRouteIdsFromMatches
30
30
  });
31
31
  const react_router_namespaceObject = require("@tanstack/react-router");
32
+ const external_react_namespaceObject = require("react");
32
33
  const external_DefaultNotFound_js_namespaceObject = require("../DefaultNotFound.js");
34
+ const external_outlet_js_namespaceObject = require("./outlet.js");
33
35
  function createTanstackRoute(options) {
34
36
  return (0, react_router_namespaceObject.createRoute)(options);
35
37
  }
36
38
  function createTanstackRootRoute(options) {
37
39
  return (0, react_router_namespaceObject.createRootRoute)(options);
38
40
  }
41
+ function wrapRouteComponentWithModernContext(route, component, routeId) {
42
+ const routeMatchId = routeId || route.id;
43
+ if (component && routeMatchId) route.options.component = (0, external_outlet_js_namespaceObject.withModernRouteMatchContext)(component, routeMatchId);
44
+ }
39
45
  function toTanstackPath(pathname) {
40
46
  return pathname.split('/').map((segment)=>{
41
47
  if (!segment) return segment;
@@ -73,6 +79,40 @@ function isModernDeferredData(value) {
73
79
  function normalizeModernLoaderResult(result) {
74
80
  return isModernDeferredData(result) ? result.data : result;
75
81
  }
82
+ function pickRouteModuleComponent(routeModule, seen = new Set()) {
83
+ if ('function' == typeof routeModule || routeModule && 'object' == typeof routeModule && '$$typeof' in routeModule) return routeModule;
84
+ if (!routeModule || 'object' != typeof routeModule) return;
85
+ if (seen.has(routeModule)) return;
86
+ seen.add(routeModule);
87
+ const module = routeModule;
88
+ for (const candidate of [
89
+ module.default,
90
+ module.Component
91
+ ]){
92
+ const component = pickRouteModuleComponent(candidate, seen);
93
+ if (component) return component;
94
+ }
95
+ }
96
+ function createServerLazyImportComponent(lazyImport, fallbackComponent) {
97
+ if ("u" > typeof document) return fallbackComponent;
98
+ let resolvedComponent;
99
+ let pendingLoad;
100
+ const load = async ()=>{
101
+ if (resolvedComponent) return resolvedComponent;
102
+ const routeModule = await lazyImport();
103
+ const component = pickRouteModuleComponent(routeModule);
104
+ if (component) resolvedComponent = component;
105
+ return resolvedComponent;
106
+ };
107
+ const Component = (props)=>{
108
+ if (resolvedComponent) return (0, external_react_namespaceObject.createElement)(resolvedComponent, props);
109
+ pendingLoad ||= load();
110
+ throw pendingLoad;
111
+ };
112
+ Component.load = load;
113
+ Component.preload = load;
114
+ return Component;
115
+ }
76
116
  function throwTanstackRedirect(location) {
77
117
  const target = location || '/';
78
118
  try {
@@ -141,7 +181,7 @@ function wrapModernLoader(modernRoute, modernLoader, revalidationState) {
141
181
  const signal = ctx?.abortController?.signal || ctx?.signal || new AbortController().signal;
142
182
  const baseRequest = ctx?.context?.request instanceof Request ? ctx.context.request : void 0;
143
183
  const href = 'string' == typeof ctx?.location ? ctx.location : ctx?.location?.publicHref || ctx?.location?.href || ctx?.location?.url?.href || '';
144
- const request = baseRequest ? new Request(baseRequest, {
184
+ const request = void 0 !== baseRequest ? new Request(baseRequest, {
145
185
  signal
146
186
  }) : createModernRequest(href, signal);
147
187
  const params = mapParamsForModernLoader({
@@ -204,7 +244,7 @@ function wrapRouteObjectLoader(route, revalidationState) {
204
244
  const signal = ctx?.abortController?.signal || ctx?.signal || new AbortController().signal;
205
245
  const baseRequest = ctx?.context?.request instanceof Request ? ctx.context.request : void 0;
206
246
  const href = 'string' == typeof ctx?.location ? ctx.location : ctx?.location?.publicHref || ctx?.location?.href || ctx?.location?.url?.href || '';
207
- const request = baseRequest ? new Request(baseRequest, {
247
+ const request = void 0 !== baseRequest ? new Request(baseRequest, {
208
248
  signal
209
249
  }) : createModernRequest(href, signal);
210
250
  const params = mapParamsForRouteObjectLoader({
@@ -239,10 +279,18 @@ function wrapRouteObjectLoader(route, revalidationState) {
239
279
  }
240
280
  function toRouteComponent(routeObject) {
241
281
  const route = routeObject;
282
+ const lazyImport = 'function' == typeof route.lazyImport ? route.lazyImport : void 0;
283
+ const fallbackComponent = route.Component ? route.Component : route.element ? ()=>route.element : void 0;
284
+ if (lazyImport && fallbackComponent) return createServerLazyImportComponent(lazyImport, fallbackComponent);
242
285
  if (route.Component) return route.Component;
243
286
  const element = route.element;
244
287
  if (element) return ()=>element;
245
288
  }
289
+ function toModernRouteComponent(route) {
290
+ const component = route.component || void 0;
291
+ if ('function' == typeof route.lazyImport && component) return createServerLazyImportComponent(route.lazyImport, component);
292
+ return component;
293
+ }
246
294
  function toErrorComponent(routeObject) {
247
295
  const route = routeObject;
248
296
  if (route.ErrorBoundary) return route.ErrorBoundary;
@@ -280,12 +328,12 @@ function createRouteFromRouteObject(opts) {
280
328
  const shouldRevalidate = modernRouteObject.shouldRevalidate;
281
329
  const shouldReload = createModernShouldReload(shouldRevalidate, revalidationState);
282
330
  const stableFallbackId = routeObject.id || modernRouteObject.file || routeObject.path || 'pathless';
331
+ const component = toRouteComponent(routeObject);
283
332
  const base = {
284
333
  getParentRoute: ()=>parent,
285
- component: toRouteComponent(routeObject),
334
+ component,
286
335
  pendingComponent: toPendingComponent(routeObject),
287
336
  errorComponent: toErrorComponent(routeObject),
288
- wrapInSuspense: true,
289
337
  staticData: createRouteStaticData({
290
338
  modernRouteId: routeObject.id,
291
339
  modernRouteAction: modernRouteObject.action,
@@ -304,6 +352,7 @@ function createRouteFromRouteObject(opts) {
304
352
  if (isRouteObjectPathlessLayout(routeObject)) base.id = stableFallbackId;
305
353
  else base.path = routeObject.index ? '/' : toTanstackPath(routeObject.path || '');
306
354
  const route = createTanstackRoute(base);
355
+ wrapRouteComponentWithModernContext(route, component, routeObject.id);
307
356
  const children = routeObject.children;
308
357
  if (children && children.length > 0) {
309
358
  const childRoutes = children.map((child)=>createRouteFromRouteObject({
@@ -322,7 +371,7 @@ function createRouteFromModernRoute(opts) {
322
371
  const stableFallbackId = modernId || route._component || route.filename || route.data || ('function' == typeof route.loader ? route.id : void 0);
323
372
  const pendingComponent = route.loading || route.pendingComponent;
324
373
  const errorComponent = route.error || route.errorComponent;
325
- const component = route.component;
374
+ const component = toModernRouteComponent(route);
326
375
  const modernLoader = route.loader;
327
376
  const modernAction = route.action;
328
377
  const modernShouldRevalidate = route.shouldRevalidate;
@@ -334,7 +383,6 @@ function createRouteFromModernRoute(opts) {
334
383
  component: component || void 0,
335
384
  pendingComponent: pendingComponent || void 0,
336
385
  errorComponent: errorComponent || void 0,
337
- wrapInSuspense: true,
338
386
  staticData: createRouteStaticData({
339
387
  modernRouteId: modernId,
340
388
  modernRouteAction: modernAction,
@@ -356,6 +404,7 @@ function createRouteFromModernRoute(opts) {
356
404
  base.path = isIndexRoute ? '/' : toTanstackPath(rawPath || '');
357
405
  }
358
406
  const tanstackRoute = createTanstackRoute(base);
407
+ wrapRouteComponentWithModernContext(tanstackRoute, component, modernId);
359
408
  const children = route.children;
360
409
  if (children && children.length > 0) {
361
410
  const childRoutes = children.map((child)=>createRouteFromModernRoute({
@@ -368,7 +417,7 @@ function createRouteFromModernRoute(opts) {
368
417
  }
369
418
  function createRouteTreeFromModernRoutes(routes) {
370
419
  const rootModern = routes.find((r)=>r && 'nested' === r.type && r.isRoot);
371
- const rootComponent = rootModern?.component;
420
+ const rootComponent = rootModern ? toModernRouteComponent(rootModern) : void 0;
372
421
  const pendingComponent = rootModern?.loading;
373
422
  const errorComponent = rootModern?.error;
374
423
  const rootLoader = rootModern?.loader;
@@ -381,7 +430,6 @@ function createRouteTreeFromModernRoutes(routes) {
381
430
  component: rootComponent || void 0,
382
431
  pendingComponent: pendingComponent || void 0,
383
432
  errorComponent: errorComponent || void 0,
384
- wrapInSuspense: true,
385
433
  notFoundComponent: external_DefaultNotFound_js_namespaceObject.DefaultNotFound,
386
434
  staticData: createRouteStaticData({
387
435
  modernRouteId: rootModernId,
@@ -399,6 +447,7 @@ function createRouteTreeFromModernRoutes(routes) {
399
447
  if (rootShouldReload) rootRouteOptions.shouldReload = rootShouldReload;
400
448
  if (rootModern?.inValidSSRRoute) rootRouteOptions.ssr = false;
401
449
  const rootRoute = createTanstackRootRoute(rootRouteOptions);
450
+ if (rootComponent) rootRoute.options.component = (0, external_outlet_js_namespaceObject.withModernRouteMatchContext)(rootComponent, react_router_namespaceObject.rootRouteId);
402
451
  const topLevel = rootModern ? rootModern.children || [] : routes;
403
452
  const childRoutes = topLevel.map((child)=>createRouteFromModernRoute({
404
453
  parent: rootRoute,
@@ -415,11 +464,11 @@ function createRouteTreeFromRouteObjects(routes) {
415
464
  const rootRevalidationState = {};
416
465
  const rootShouldRevalidate = rootLikeRoute?.shouldRevalidate;
417
466
  const rootShouldReload = createModernShouldReload(rootShouldRevalidate, rootRevalidationState);
467
+ const rootComponent = rootLikeRoute ? toRouteComponent(rootLikeRoute) : void 0;
418
468
  const rootRouteOptions = {
419
- component: rootLikeRoute ? toRouteComponent(rootLikeRoute) : void 0,
469
+ component: rootComponent,
420
470
  pendingComponent: rootLikeRoute ? toPendingComponent(rootLikeRoute) : void 0,
421
471
  errorComponent: rootLikeRoute ? toErrorComponent(rootLikeRoute) : void 0,
422
- wrapInSuspense: true,
423
472
  notFoundComponent: external_DefaultNotFound_js_namespaceObject.DefaultNotFound,
424
473
  staticData: createRouteStaticData({
425
474
  modernRouteId: rootLikeRoute?.id,
@@ -437,6 +486,7 @@ function createRouteTreeFromRouteObjects(routes) {
437
486
  if (rootShouldReload) rootRouteOptions.shouldReload = rootShouldReload;
438
487
  if (rootLikeRoute?.inValidSSRRoute) rootRouteOptions.ssr = false;
439
488
  const rootRoute = createTanstackRootRoute(rootRouteOptions);
489
+ if (rootComponent) rootRoute.options.component = (0, external_outlet_js_namespaceObject.withModernRouteMatchContext)(rootComponent, react_router_namespaceObject.rootRouteId);
440
490
  const topLevel = rootLikeRoute ? [
441
491
  ...rootLikeRoute.children || [],
442
492
  ...routes.filter((route)=>route !== rootLikeRoute)
@@ -450,9 +500,11 @@ function createRouteTreeFromRouteObjects(routes) {
450
500
  }
451
501
  function getModernRouteIdsFromMatches(router) {
452
502
  const matches = router.state.matches || [];
503
+ const routesById = router.routesById;
453
504
  const ids = matches.map((match)=>{
454
- const route = match.route;
455
- return route?.options?.staticData?.modernRouteId;
505
+ const normalizedMatch = match;
506
+ const routeId = 'string' == typeof normalizedMatch.routeId ? normalizedMatch.routeId : void 0;
507
+ return normalizedMatch.route?.options?.staticData?.modernRouteId ?? (routeId ? routesById?.[routeId]?.options?.staticData?.modernRouteId : void 0);
456
508
  }).filter((id)=>'string' == typeof id);
457
509
  return Array.from(new Set(ids));
458
510
  }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __webpack_modules__ = {
3
+ "@modern-js/render/rsc-worker" (module) {
4
+ module.exports = require("@modern-js/render/rsc-worker");
5
+ }
6
+ };
7
+ var __webpack_module_cache__ = {};
8
+ function __webpack_require__(moduleId) {
9
+ var cachedModule = __webpack_module_cache__[moduleId];
10
+ if (void 0 !== cachedModule) return cachedModule.exports;
11
+ var module = __webpack_module_cache__[moduleId] = {
12
+ exports: {}
13
+ };
14
+ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
15
+ return module.exports;
16
+ }
17
+ (()=>{
18
+ __webpack_require__.n = (module)=>{
19
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
20
+ __webpack_require__.d(getter, {
21
+ a: getter
22
+ });
23
+ return getter;
24
+ };
25
+ })();
26
+ (()=>{
27
+ __webpack_require__.d = (exports1, definition)=>{
28
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
29
+ enumerable: true,
30
+ get: definition[key]
31
+ });
32
+ };
33
+ })();
34
+ (()=>{
35
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
36
+ })();
37
+ (()=>{
38
+ __webpack_require__.r = (exports1)=>{
39
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
40
+ value: 'Module'
41
+ });
42
+ Object.defineProperty(exports1, '__esModule', {
43
+ value: true
44
+ });
45
+ };
46
+ })();
47
+ var __webpack_exports__ = {};
48
+ (()=>{
49
+ __webpack_require__.r(__webpack_exports__);
50
+ var _modern_js_render_rsc_worker__rspack_import_0 = __webpack_require__("@modern-js/render/rsc-worker");
51
+ var __rspack_reexport = {};
52
+ for(const __rspack_import_key in _modern_js_render_rsc_worker__rspack_import_0)if ("default" !== __rspack_import_key) __rspack_reexport[__rspack_import_key] = ()=>_modern_js_render_rsc_worker__rspack_import_0[__rspack_import_key];
53
+ __webpack_require__.d(__webpack_exports__, __rspack_reexport);
54
+ })();
55
+ for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
56
+ Object.defineProperty(exports, '__esModule', {
57
+ value: true
58
+ });