@bleedingdev/modern-js-plugin-tanstack 3.5.0-ultramodern.30 → 3.5.0-ultramodern.31

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 (221) hide show
  1. package/dist/cjs/cli/artifacts.js +157 -0
  2. package/dist/cjs/cli/index.js +6 -103
  3. package/dist/cjs/cli/tanstackTypes/canonicalRoutes.js +113 -0
  4. package/dist/cjs/cli/tanstackTypes/shared.js +130 -0
  5. package/dist/cjs/cli/tanstackTypes/source.js +251 -0
  6. package/dist/cjs/cli/tanstackTypes.js +4 -350
  7. package/dist/cjs/runtime/blockingSubscribe.js +64 -0
  8. package/dist/cjs/runtime/{pluginCore.js → clientBasepath.js} +12 -19
  9. package/dist/cjs/runtime/clientHydration.js +129 -0
  10. package/dist/cjs/runtime/dataMutation.js +11 -176
  11. package/dist/cjs/runtime/formData.js +116 -0
  12. package/dist/cjs/runtime/loaderBridge.js +4 -1
  13. package/dist/cjs/runtime/plugin.js +21 -125
  14. package/dist/cjs/runtime/plugin.node.js +38 -119
  15. package/dist/cjs/runtime/pluginShared.js +90 -0
  16. package/dist/cjs/runtime/routeTree/components.js +102 -0
  17. package/dist/cjs/runtime/routeTree/construction.js +152 -0
  18. package/dist/cjs/runtime/routeTree/index.js +47 -0
  19. package/dist/cjs/runtime/routeTree/loaders.js +158 -0
  20. package/dist/cjs/runtime/routeTree/paths.js +57 -0
  21. package/dist/cjs/runtime/routeTree/staticData.js +63 -0
  22. package/dist/cjs/runtime/routeTree/tanstackRoutes.js +57 -0
  23. package/dist/cjs/runtime/routeTree/types.js +18 -0
  24. package/dist/cjs/runtime/routeTree.js +7 -320
  25. package/dist/cjs/runtime/rsc/CompositeComponent.js +18 -13
  26. package/dist/cjs/runtime/rsc/RscNodeRenderer.js +5 -16
  27. package/dist/cjs/runtime/rsc/client.js +8 -25
  28. package/dist/cjs/runtime/rsc/flightSerialization.js +132 -0
  29. package/dist/cjs/runtime/rsc/payloadErrors.js +99 -0
  30. package/dist/cjs/runtime/rsc/payloadFetch.js +117 -0
  31. package/dist/cjs/runtime/rsc/payloadRouter.js +21 -142
  32. package/dist/cjs/runtime/rsc/payloadRoutes.js +106 -0
  33. package/dist/cjs/runtime/rsc/payloadStorage.js +58 -0
  34. package/dist/cjs/runtime/rsc/server.js +14 -18
  35. package/dist/cjs/runtime/rsc/shared.js +71 -0
  36. package/dist/cjs/runtime/rsc/treeGetter.js +72 -0
  37. package/dist/cjs/runtime/ssrManagedTags.js +103 -0
  38. package/dist/cjs/runtime/ssrPreload.js +89 -0
  39. package/dist/cjs/runtime/ssrTypes.js +18 -0
  40. package/dist/cjs/runtime/submitAction.js +161 -0
  41. package/dist/cjs/runtime/utils.js +49 -86
  42. package/dist/esm/cli/artifacts.mjs +103 -0
  43. package/dist/esm/cli/index.mjs +4 -101
  44. package/dist/esm/cli/tanstackTypes/canonicalRoutes.mjs +75 -0
  45. package/dist/esm/cli/tanstackTypes/shared.mjs +68 -0
  46. package/dist/esm/cli/tanstackTypes/source.mjs +203 -0
  47. package/dist/esm/cli/tanstackTypes.mjs +2 -339
  48. package/dist/esm/runtime/blockingSubscribe.mjs +19 -0
  49. package/dist/esm/runtime/clientBasepath.mjs +10 -0
  50. package/dist/esm/runtime/clientHydration.mjs +70 -0
  51. package/dist/esm/runtime/dataMutation.mjs +2 -167
  52. package/dist/esm/runtime/formData.mjs +63 -0
  53. package/dist/esm/runtime/loaderBridge.mjs +4 -1
  54. package/dist/esm/runtime/plugin.mjs +14 -118
  55. package/dist/esm/runtime/plugin.node.mjs +33 -114
  56. package/dist/esm/runtime/pluginShared.mjs +40 -0
  57. package/dist/esm/runtime/routeTree/components.mjs +55 -0
  58. package/dist/esm/runtime/routeTree/construction.mjs +111 -0
  59. package/dist/esm/runtime/routeTree/index.mjs +2 -0
  60. package/dist/esm/runtime/routeTree/loaders.mjs +117 -0
  61. package/dist/esm/runtime/routeTree/paths.mjs +16 -0
  62. package/dist/esm/runtime/routeTree/staticData.mjs +22 -0
  63. package/dist/esm/runtime/routeTree/tanstackRoutes.mjs +13 -0
  64. package/dist/esm/runtime/routeTree/types.mjs +0 -0
  65. package/dist/esm/runtime/routeTree.mjs +1 -318
  66. package/dist/esm/runtime/rsc/CompositeComponent.mjs +18 -13
  67. package/dist/esm/runtime/rsc/RscNodeRenderer.mjs +4 -15
  68. package/dist/esm/runtime/rsc/client.mjs +6 -26
  69. package/dist/esm/runtime/rsc/flightSerialization.mjs +88 -0
  70. package/dist/esm/runtime/rsc/payloadErrors.mjs +49 -0
  71. package/dist/esm/runtime/rsc/payloadFetch.mjs +61 -0
  72. package/dist/esm/runtime/rsc/payloadRouter.mjs +12 -133
  73. package/dist/esm/runtime/rsc/payloadRoutes.mjs +50 -0
  74. package/dist/esm/runtime/rsc/payloadStorage.mjs +14 -0
  75. package/dist/esm/runtime/rsc/server.mjs +17 -21
  76. package/dist/esm/runtime/rsc/shared.mjs +21 -0
  77. package/dist/esm/runtime/rsc/treeGetter.mjs +34 -0
  78. package/dist/esm/runtime/ssrManagedTags.mjs +53 -0
  79. package/dist/esm/runtime/ssrPreload.mjs +51 -0
  80. package/dist/esm/runtime/ssrTypes.mjs +0 -0
  81. package/dist/esm/runtime/submitAction.mjs +120 -0
  82. package/dist/esm/runtime/utils.mjs +47 -75
  83. package/dist/esm-node/cli/artifacts.mjs +104 -0
  84. package/dist/esm-node/cli/index.mjs +4 -101
  85. package/dist/esm-node/cli/tanstackTypes/canonicalRoutes.mjs +76 -0
  86. package/dist/esm-node/cli/tanstackTypes/shared.mjs +69 -0
  87. package/dist/esm-node/cli/tanstackTypes/source.mjs +204 -0
  88. package/dist/esm-node/cli/tanstackTypes.mjs +2 -339
  89. package/dist/esm-node/runtime/blockingSubscribe.mjs +20 -0
  90. package/dist/esm-node/runtime/clientBasepath.mjs +11 -0
  91. package/dist/esm-node/runtime/clientHydration.mjs +71 -0
  92. package/dist/esm-node/runtime/dataMutation.mjs +2 -167
  93. package/dist/esm-node/runtime/formData.mjs +64 -0
  94. package/dist/esm-node/runtime/loaderBridge.mjs +4 -1
  95. package/dist/esm-node/runtime/plugin.mjs +14 -118
  96. package/dist/esm-node/runtime/plugin.node.mjs +33 -114
  97. package/dist/esm-node/runtime/pluginShared.mjs +41 -0
  98. package/dist/esm-node/runtime/routeTree/components.mjs +56 -0
  99. package/dist/esm-node/runtime/routeTree/construction.mjs +112 -0
  100. package/dist/esm-node/runtime/routeTree/index.mjs +3 -0
  101. package/dist/esm-node/runtime/routeTree/loaders.mjs +118 -0
  102. package/dist/esm-node/runtime/routeTree/paths.mjs +17 -0
  103. package/dist/esm-node/runtime/routeTree/staticData.mjs +23 -0
  104. package/dist/esm-node/runtime/routeTree/tanstackRoutes.mjs +14 -0
  105. package/dist/esm-node/runtime/routeTree/types.mjs +1 -0
  106. package/dist/esm-node/runtime/routeTree.mjs +1 -318
  107. package/dist/esm-node/runtime/rsc/CompositeComponent.mjs +18 -13
  108. package/dist/esm-node/runtime/rsc/RscNodeRenderer.mjs +4 -15
  109. package/dist/esm-node/runtime/rsc/client.mjs +6 -26
  110. package/dist/esm-node/runtime/rsc/flightSerialization.mjs +89 -0
  111. package/dist/esm-node/runtime/rsc/payloadErrors.mjs +50 -0
  112. package/dist/esm-node/runtime/rsc/payloadFetch.mjs +62 -0
  113. package/dist/esm-node/runtime/rsc/payloadRouter.mjs +12 -133
  114. package/dist/esm-node/runtime/rsc/payloadRoutes.mjs +51 -0
  115. package/dist/esm-node/runtime/rsc/payloadStorage.mjs +15 -0
  116. package/dist/esm-node/runtime/rsc/server.mjs +17 -21
  117. package/dist/esm-node/runtime/rsc/shared.mjs +22 -0
  118. package/dist/esm-node/runtime/rsc/treeGetter.mjs +35 -0
  119. package/dist/esm-node/runtime/ssrManagedTags.mjs +54 -0
  120. package/dist/esm-node/runtime/ssrPreload.mjs +52 -0
  121. package/dist/esm-node/runtime/ssrTypes.mjs +1 -0
  122. package/dist/esm-node/runtime/submitAction.mjs +121 -0
  123. package/dist/esm-node/runtime/utils.mjs +47 -75
  124. package/dist/types/cli/artifacts.d.ts +33 -0
  125. package/dist/types/cli/index.d.ts +2 -33
  126. package/dist/types/cli/tanstackTypes/canonicalRoutes.d.ts +22 -0
  127. package/dist/types/cli/tanstackTypes/shared.d.ts +20 -0
  128. package/dist/types/cli/tanstackTypes/source.d.ts +10 -0
  129. package/dist/types/cli/tanstackTypes.d.ts +3 -31
  130. package/dist/types/runtime/blockingSubscribe.d.ts +3 -0
  131. package/dist/types/runtime/clientBasepath.d.ts +1 -0
  132. package/dist/types/runtime/clientHydration.d.ts +19 -0
  133. package/dist/types/runtime/dataMutation.d.ts +3 -12
  134. package/dist/types/runtime/formData.d.ts +23 -0
  135. package/dist/types/runtime/plugin.d.ts +1 -1
  136. package/dist/types/runtime/plugin.node.d.ts +1 -1
  137. package/dist/types/runtime/{pluginCore.d.ts → pluginShared.d.ts} +14 -0
  138. package/dist/types/runtime/routeTree/components.d.ts +7 -0
  139. package/dist/types/runtime/routeTree/construction.d.ts +5 -0
  140. package/dist/types/runtime/routeTree/index.d.ts +2 -0
  141. package/dist/types/runtime/routeTree/loaders.d.ts +4 -0
  142. package/dist/types/runtime/routeTree/paths.d.ts +3 -0
  143. package/dist/types/runtime/routeTree/staticData.d.ts +19 -0
  144. package/dist/types/runtime/routeTree/tanstackRoutes.d.ts +4 -0
  145. package/dist/types/runtime/routeTree/types.d.ts +75 -0
  146. package/dist/types/runtime/routeTree.d.ts +1 -9
  147. package/dist/types/runtime/rsc/CompositeComponent.d.ts +1 -2
  148. package/dist/types/runtime/rsc/RscNodeRenderer.d.ts +2 -3
  149. package/dist/types/runtime/rsc/client.d.ts +2 -0
  150. package/dist/types/runtime/rsc/flightSerialization.d.ts +3 -0
  151. package/dist/types/runtime/rsc/payloadErrors.d.ts +6 -0
  152. package/dist/types/runtime/rsc/payloadFetch.d.ts +10 -0
  153. package/dist/types/runtime/rsc/payloadRouter.d.ts +2 -10
  154. package/dist/types/runtime/rsc/payloadRoutes.d.ts +43 -0
  155. package/dist/types/runtime/rsc/payloadStorage.d.ts +5 -0
  156. package/dist/types/runtime/rsc/shared.d.ts +19 -0
  157. package/dist/types/runtime/rsc/treeGetter.d.ts +1 -0
  158. package/dist/types/runtime/ssrManagedTags.d.ts +7 -0
  159. package/dist/types/runtime/ssrPreload.d.ts +2 -0
  160. package/dist/types/runtime/ssrTypes.d.ts +43 -0
  161. package/dist/types/runtime/state.d.ts +1 -1
  162. package/dist/types/runtime/submitAction.d.ts +14 -0
  163. package/dist/types/runtime/types.d.ts +3 -46
  164. package/dist/types/runtime/utils.d.ts +1 -22
  165. package/package.json +30 -9
  166. package/rstest.config.mts +1 -0
  167. package/src/cli/artifacts.ts +255 -0
  168. package/src/cli/index.ts +6 -246
  169. package/src/cli/tanstackTypes/canonicalRoutes.ts +157 -0
  170. package/src/cli/tanstackTypes/shared.ts +119 -0
  171. package/src/cli/tanstackTypes/source.ts +405 -0
  172. package/src/cli/tanstackTypes.ts +4 -647
  173. package/src/runtime/blockingSubscribe.ts +48 -0
  174. package/src/runtime/clientBasepath.ts +12 -0
  175. package/src/runtime/clientHydration.ts +151 -0
  176. package/src/runtime/dataMutation.tsx +9 -306
  177. package/src/runtime/formData.ts +153 -0
  178. package/src/runtime/loaderBridge.ts +8 -3
  179. package/src/runtime/plugin.node.tsx +60 -284
  180. package/src/runtime/plugin.tsx +21 -257
  181. package/src/runtime/pluginShared.ts +112 -0
  182. package/src/runtime/routeTree/components.ts +130 -0
  183. package/src/runtime/routeTree/construction.ts +238 -0
  184. package/src/runtime/routeTree/index.ts +7 -0
  185. package/src/runtime/routeTree/loaders.ts +232 -0
  186. package/src/runtime/routeTree/paths.ts +36 -0
  187. package/src/runtime/routeTree/staticData.ts +66 -0
  188. package/src/runtime/routeTree/tanstackRoutes.ts +36 -0
  189. package/src/runtime/routeTree/types.ts +87 -0
  190. package/src/runtime/routeTree.ts +5 -750
  191. package/src/runtime/rsc/CompositeComponent.tsx +29 -20
  192. package/src/runtime/rsc/RscNodeRenderer.tsx +9 -27
  193. package/src/runtime/rsc/client.tsx +12 -40
  194. package/src/runtime/rsc/flightSerialization.ts +158 -0
  195. package/src/runtime/rsc/payloadErrors.ts +73 -0
  196. package/src/runtime/rsc/payloadFetch.ts +97 -0
  197. package/src/runtime/rsc/payloadRouter.ts +29 -234
  198. package/src/runtime/rsc/payloadRoutes.ts +122 -0
  199. package/src/runtime/rsc/payloadStorage.ts +35 -0
  200. package/src/runtime/rsc/server.tsx +20 -29
  201. package/src/runtime/rsc/shared.ts +70 -0
  202. package/src/runtime/rsc/treeGetter.tsx +52 -0
  203. package/src/runtime/ssrManagedTags.ts +107 -0
  204. package/src/runtime/ssrPreload.ts +125 -0
  205. package/src/runtime/ssrTypes.ts +51 -0
  206. package/src/runtime/state.ts +4 -2
  207. package/src/runtime/submitAction.ts +194 -0
  208. package/src/runtime/types.ts +14 -51
  209. package/src/runtime/utils.tsx +72 -108
  210. package/src/types/react-server-dom-rspack.d.ts +56 -0
  211. package/tests/castRatchet.test.ts +85 -0
  212. package/tests/router/dataMutation.test.tsx +59 -0
  213. package/tests/router/fixtures/router-gen.golden.txt +72 -0
  214. package/tests/router/loaderBridge.test.ts +21 -0
  215. package/tests/router/routeTree.test.ts +46 -11
  216. package/tests/router/rsc.test.tsx +189 -0
  217. package/tests/router/ssrPreload.test.ts +30 -0
  218. package/tests/router/tanstackTypes.test.ts +254 -1
  219. package/dist/esm/runtime/pluginCore.mjs +0 -14
  220. package/dist/esm-node/runtime/pluginCore.mjs +0 -15
  221. package/src/runtime/pluginCore.ts +0 -56
@@ -95,7 +95,10 @@ function modernLoaderToTanstack(opts, modernLoader) {
95
95
  const signal = getLoaderSignal(ctx);
96
96
  const baseRequest = ctx?.context?.request instanceof Request ? ctx.context.request : void 0;
97
97
  const href = getLoaderHref(ctx);
98
- const request = void 0 !== baseRequest ? new Request(baseRequest, {
98
+ const request = void 0 !== baseRequest && '' !== href ? new Request(new URL(href, baseRequest.url).href, {
99
+ headers: baseRequest.headers,
100
+ signal
101
+ }) : void 0 !== baseRequest ? new Request(baseRequest, {
99
102
  signal
100
103
  }) : new Request(href, {
101
104
  signal
@@ -4,123 +4,18 @@ import { normalizePathname } from "@modern-js/runtime-utils/url";
4
4
  import { RouterProvider, createBrowserHistory, createHashHistory, createRouter, useLocation, useNavigate, useRouter } from "@tanstack/react-router";
5
5
  import { useContext, useMemo } from "react";
6
6
  import { createModernBasepathRewrite } from "./basepathRewrite.mjs";
7
+ import { wrapRouterSubscribeWithBlockState } from "./blockingSubscribe.mjs";
8
+ import { isSegmentPrefix } from "./clientBasepath.mjs";
9
+ import { ModernRouterClient, getTanstackSsrHydrationPromise, hasTanstackSsrHydrationRecord } from "./clientHydration.mjs";
7
10
  import { routerProviderRegistryHooks } from "./hooks.mjs";
8
11
  import { wrapTanstackSsrHydrationBoundary } from "./hydrationBoundary.mjs";
9
12
  import { applyRouterRuntimeState } from "./lifecycle.mjs";
10
- import { withModernRouteMatchContext } from "./outlet.mjs";
11
- import { getFinalRouteConfig, getMergedRouterConfig } from "./pluginCore.mjs";
13
+ import { createTanstackRouteObjects, getMergedRouterConfig, getTanstackRouteConfig, joinBasename } from "./pluginShared.mjs";
12
14
  import { Link } from "./prefetchLink.mjs";
13
15
  import { useMatches } from "./routeHooks.mjs";
14
16
  import { createRouteTreeFromRouteObjects } from "./routeTree.mjs";
15
17
  import { getTanstackRscSerializationAdapters } from "./rsc/client.mjs";
16
18
  import { getModernTanstackRouterFastDefaults } from "./types.mjs";
17
- import { createRouteObjectsFromConfig, urlJoin } from "./utils.mjs";
18
- const BLOCKING_SUBSCRIBE_SYMBOL = Symbol.for('@modern-js/plugin-tanstack:blocking-subscribe');
19
- const BLOCKING_STATE_SYMBOL = Symbol.for('@modern-js/plugin-tanstack:blocking-state');
20
- function normalizeBase(b) {
21
- if (b.length > 1 && b.endsWith('/')) return b.slice(0, -1);
22
- return b || '/';
23
- }
24
- function isSegmentPrefix(pathname, base) {
25
- const b = normalizeBase(base);
26
- const p = pathname || '/';
27
- return p === b || p.startsWith(`${b}/`);
28
- }
29
- function wrapRouterSubscribeWithBlockState(router, getBlockNavState) {
30
- if (!router || 'object' != typeof router) return;
31
- const target = router;
32
- target[BLOCKING_STATE_SYMBOL] = getBlockNavState;
33
- if (target[BLOCKING_SUBSCRIBE_SYMBOL] || 'function' != typeof target.subscribe) return;
34
- const originSubscribe = target.subscribe.bind(target);
35
- target.subscribe = (eventType, listener)=>{
36
- const wrappedListener = (...args)=>{
37
- const blockRoute = target[BLOCKING_STATE_SYMBOL]?.() || false;
38
- if (blockRoute) return;
39
- return listener(...args);
40
- };
41
- return originSubscribe(eventType, wrappedListener);
42
- };
43
- target[BLOCKING_SUBSCRIBE_SYMBOL] = true;
44
- }
45
- const routerHydrationRecords = new WeakMap();
46
- const routeModulesKey = '_routeModules';
47
- function pickRouteModuleComponent(routeModule, seen = new Set()) {
48
- if ('function' == typeof routeModule || routeModule && 'object' == typeof routeModule && '$$typeof' in routeModule) return routeModule;
49
- if (!routeModule || 'object' != typeof routeModule) return;
50
- if (seen.has(routeModule)) return;
51
- seen.add(routeModule);
52
- const module = routeModule;
53
- for (const candidate of [
54
- module.default,
55
- module.Component
56
- ]){
57
- const component = pickRouteModuleComponent(candidate, seen);
58
- if (component) return component;
59
- }
60
- }
61
- function getCachedRouteModule(routeId) {
62
- if ("u" < typeof window) return;
63
- return window[routeModulesKey]?.[routeId];
64
- }
65
- function preloadHydratedRouteComponents(router) {
66
- const preloadableRouter = router;
67
- const routesById = preloadableRouter.routesById || {};
68
- const matches = preloadableRouter.stores.matches.get();
69
- return Promise.all(matches.map((match)=>{
70
- if (void 0 === match.routeId || '' === match.routeId) return;
71
- const route = routesById[match.routeId];
72
- const component = route?.options?.component;
73
- const preload = component?.load || component?.preload;
74
- if ('function' != typeof preload) return;
75
- return Promise.resolve(preload.call(component)).then((routeModule)=>{
76
- const modernRouteId = route?.options?.staticData?.modernRouteId;
77
- const cachedRouteModule = 'string' == typeof modernRouteId && '' !== modernRouteId ? getCachedRouteModule(modernRouteId) : void 0;
78
- const resolvedComponent = pickRouteModuleComponent(cachedRouteModule ?? routeModule);
79
- if (void 0 !== resolvedComponent && 'string' == typeof modernRouteId && '' !== modernRouteId) route.options.component = withModernRouteMatchContext(resolvedComponent, modernRouteId);
80
- });
81
- })).then(()=>void 0);
82
- }
83
- function hydrateTanstackRouter(router) {
84
- return import("@tanstack/react-router/ssr/client").then(({ hydrate })=>hydrate(router));
85
- }
86
- function getTanstackSsrHydrationRecord(router) {
87
- const existingHydrationRecord = routerHydrationRecords.get(router);
88
- if (void 0 !== existingHydrationRecord) return existingHydrationRecord;
89
- const hydrationRecord = {
90
- promise: Promise.resolve(),
91
- status: 'pending'
92
- };
93
- routerHydrationRecords.set(router, hydrationRecord);
94
- try {
95
- hydrationRecord.promise = hydrateTanstackRouter(router).then((value)=>preloadHydratedRouteComponents(router).then(()=>value)).then((value)=>{
96
- hydrationRecord.status = 'fulfilled';
97
- return value;
98
- }, (error)=>{
99
- hydrationRecord.status = 'rejected';
100
- hydrationRecord.error = error;
101
- throw error;
102
- });
103
- } catch (error) {
104
- hydrationRecord.status = 'rejected';
105
- hydrationRecord.error = error;
106
- hydrationRecord.promise = Promise.reject(error);
107
- hydrationRecord.promise.catch(()=>{});
108
- }
109
- return hydrationRecord;
110
- }
111
- function getTanstackSsrHydrationPromise(router) {
112
- return getTanstackSsrHydrationRecord(router).promise;
113
- }
114
- function hasTanstackSsrHydrationRecord(router) {
115
- return routerHydrationRecords.has(router);
116
- }
117
- function ModernRouterClient({ router }) {
118
- const hydrationRecord = getTanstackSsrHydrationRecord(router);
119
- if ('rejected' === hydrationRecord.status) throw hydrationRecord.error;
120
- return /*#__PURE__*/ jsx(RouterProvider, {
121
- router: router
122
- });
123
- }
124
19
  const tanstackRouterPlugin = (userConfig = {})=>{
125
20
  const plugin = {
126
21
  name: '@modern-js/plugin-router-tanstack',
@@ -134,13 +29,10 @@ const tanstackRouterPlugin = (userConfig = {})=>{
134
29
  const getMergedConfig = ()=>getMergedRouterConfig(api, userConfig);
135
30
  const getRouteObjects = ()=>{
136
31
  if (void 0 !== cachedRouteObjects) return cachedRouteObjects;
137
- const mergedConfig = getMergedConfig();
138
- const { createRoutes } = mergedConfig;
139
- const finalRouteConfig = getFinalRouteConfig(mergedConfig);
140
- const routeObjects = createRoutes ? createRoutes() : createRouteObjectsFromConfig({
141
- routesConfig: finalRouteConfig
142
- }) || [];
143
- cachedRouteObjects = hooks.modifyRoutes.call(routeObjects);
32
+ cachedRouteObjects = createTanstackRouteObjects({
33
+ hooks,
34
+ routeConfig: getTanstackRouteConfig(api, userConfig)
35
+ });
144
36
  return cachedRouteObjects;
145
37
  };
146
38
  const getRouteTree = ()=>{
@@ -160,7 +52,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
160
52
  const getClientBasename = (runtimeContext)=>{
161
53
  const { basename = '' } = getMergedConfig();
162
54
  const baseUrl = selectBasePath(location.pathname).replace(/^\/*/, '/');
163
- return '/' === baseUrl ? urlJoin(baseUrl, runtimeContext._internalRouterBaseName || basename || '') : baseUrl;
55
+ return '/' === baseUrl ? joinBasename(baseUrl, runtimeContext._internalRouterBaseName || basename || '') : baseUrl;
164
56
  };
165
57
  const getRouter = (runtimeContext, _basename)=>{
166
58
  const routeTree = getRouteTree();
@@ -187,8 +79,12 @@ const tanstackRouterPlugin = (userConfig = {})=>{
187
79
  const history = supportHtml5History ? createBrowserHistory() : createHashHistory();
188
80
  const rewrite = createModernBasepathRewrite(_basename);
189
81
  const serializationAdapters = getGlobalEnableRsc() ? getTanstackRscSerializationAdapters() : void 0;
82
+ const routerFastDefaults = getModernTanstackRouterFastDefaults(mergedConfig);
190
83
  cachedRouter = createRouter({
191
- ...getModernTanstackRouterFastDefaults(mergedConfig),
84
+ ...routerFastDefaults,
85
+ ...serializationAdapters ? {
86
+ defaultStructuralSharing: false
87
+ } : {},
192
88
  routeTree,
193
89
  basepath: '/',
194
90
  rewrite,
@@ -1,6 +1,6 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { InternalRuntimeContext, getGlobalEnableRsc } from "@modern-js/runtime/context";
3
- import { createRequestContext, storage } from "@modern-js/runtime-utils/node";
3
+ import { createRequestContext } from "@modern-js/runtime-utils/node";
4
4
  import { time } from "@modern-js/runtime-utils/time";
5
5
  import { LOADER_REPORTER_NAME } from "@modern-js/utils/universal/constants";
6
6
  import { RouterProvider, createMemoryHistory, createRouter } from "@tanstack/react-router";
@@ -9,131 +9,35 @@ import { createModernBasepathRewrite } from "./basepathRewrite.mjs";
9
9
  import { routerProviderRegistryHooks } from "./hooks.mjs";
10
10
  import { wrapTanstackSsrHydrationBoundary } from "./hydrationBoundary.mjs";
11
11
  import { applyRouterServerPrepareResult, createRouterServerSnapshot, getRouterRuntimeState } from "./lifecycle.mjs";
12
- import { getFinalRouteConfig, getMergedRouterConfig } from "./pluginCore.mjs";
12
+ import { createTanstackRouteObjects, getTanstackRouteConfig, joinBasename } from "./pluginShared.mjs";
13
13
  import { createRouteTreeFromRouteObjects, getModernRouteIdsFromMatches } from "./routeTree.mjs";
14
14
  import { createTanstackRscServerPayload, handleTanstackRscRedirect } from "./rsc/payloadRouter.mjs";
15
+ import { getTanstackRscRouter, setTanstackRscRouter, setTanstackRscServerPayload } from "./rsc/payloadStorage.mjs";
16
+ import { attachServerSsrUtils, collectRouterErrors, createGetSsrHref, routerManagedTagsToHtml, waitForRouterSerialization } from "./ssrManagedTags.mjs";
17
+ import { preloadMatchedRouteComponents } from "./ssrPreload.mjs";
15
18
  import { getModernTanstackRouterFastDefaults } from "./types.mjs";
16
- import { createRouteObjectsFromConfig, urlJoin } from "./utils.mjs";
17
- const setTanstackRscServerPayload = (payload)=>{
18
- const storageContext = storage.useContext?.();
19
- if (storageContext) storageContext.serverPayload = payload;
20
- };
21
- function isPromiseLike(value) {
22
- return Boolean(value && 'function' == typeof value.then);
23
- }
24
- function isPreloadableRouteComponent(component) {
25
- if (!component || 'function' != typeof component) return false;
26
- const preloadable = component;
27
- return 'function' == typeof preloadable.load || 'function' == typeof preloadable.preload;
28
- }
29
- function isReactLazyRouteComponent(component) {
30
- return null != component && 'object' == typeof component && 'function' == typeof component._init && '_payload' in component;
31
- }
32
- async function preloadReactLazyRouteComponent(component) {
33
- try {
34
- component._init?.(component._payload);
35
- } catch (thrown) {
36
- if (!isPromiseLike(thrown)) throw thrown;
37
- await thrown;
38
- component._init?.(component._payload);
39
- }
40
- }
41
- async function preloadRouteComponent(component) {
42
- if (isReactLazyRouteComponent(component)) return void await preloadReactLazyRouteComponent(component);
43
- if (!isPreloadableRouteComponent(component)) return;
44
- if ('function' == typeof component.load) return void await component.load({});
45
- await component.preload?.({});
46
- }
47
- async function preloadMatchedRouteComponents(tanstackRouter) {
48
- const matches = Array.isArray(tanstackRouter.state.matches) ? tanstackRouter.state.matches : [];
49
- const routesById = tanstackRouter.routesById || {};
50
- await Promise.all(matches.map(async (match)=>{
51
- const routeId = 'string' == typeof match.routeId ? match.routeId : 'string' == typeof match.route?.id ? match.route.id : void 0;
52
- const route = routeId ? routesById[routeId] : match.route;
53
- const options = route?.options;
54
- if (!options) return;
55
- await Promise.all([
56
- preloadRouteComponent(options.component),
57
- preloadRouteComponent(options.pendingComponent),
58
- preloadRouteComponent(options.errorComponent),
59
- preloadRouteComponent(options.notFoundComponent)
60
- ]);
61
- }));
62
- }
63
- async function waitForRouterSerialization(tanstackRouter) {
64
- const serverSsr = tanstackRouter.serverSsr;
65
- if (!serverSsr || 'function' != typeof serverSsr.onSerializationFinished || serverSsr.isSerializationFinished?.()) return;
66
- await new Promise((resolve)=>{
67
- serverSsr.onSerializationFinished?.(resolve);
68
- });
69
- }
70
- function htmlEscapeAttr(value) {
71
- return value.replace(/&/g, '&amp;').replace(/"/g, '&quot;');
72
- }
73
- function routerManagedTagToHtml(tag) {
74
- if (!tag || 'object' != typeof tag) return '';
75
- const managedTag = tag;
76
- if (!managedTag || "script" !== managedTag.tag) return '';
77
- const attrs = managedTag.attrs || {};
78
- const attrsStr = Object.entries(attrs).filter(([, v])=>null != v && false !== v).map(([k, v])=>{
79
- const name = 'className' === k ? 'class' : k;
80
- if (true === v) return name;
81
- return `${name}="${htmlEscapeAttr(String(v))}"`;
82
- }).join(' ');
83
- const open = attrsStr.length ? `<script ${attrsStr}>` : "<script>";
84
- const children = 'string' == typeof managedTag.children ? managedTag.children : '';
85
- return `${open}${children}</script>`;
86
- }
87
- function routerManagedTagsToHtml(tags) {
88
- const normalizedTags = Array.isArray(tags) ? tags : [
89
- tags
90
- ];
91
- return normalizedTags.map(routerManagedTagToHtml).filter(Boolean);
92
- }
93
- function createGetSsrHref(request) {
94
- const url = new URL(request.url);
95
- return `${url.pathname}${url.search}${url.hash}`;
96
- }
97
- function collectRouterErrors(tanstackRouter) {
98
- const state = tanstackRouter.state;
99
- const matches = Array.isArray(state.matches) ? state.matches : [];
100
- const errors = matches.reduce((acc, match)=>{
101
- if (!match.error) return acc;
102
- const routeId = 'string' == typeof match.routeId ? match.routeId : 'string' == typeof match.route?.id ? match.route.id : `match-${Object.keys(acc).length}`;
103
- acc[routeId] = match.error;
104
- return acc;
105
- }, {});
106
- return Object.keys(errors).length > 0 ? errors : void 0;
107
- }
108
- async function attachServerSsrUtils(router) {
109
- const { attachRouterServerSsrUtils } = await import("@tanstack/router-core/ssr/server");
110
- attachRouterServerSsrUtils({
111
- router,
112
- manifest: void 0
113
- });
114
- }
115
19
  const tanstackRouterPlugin = (userConfig = {})=>{
116
20
  const plugin = {
117
21
  name: '@modern-js/plugin-router-tanstack',
118
22
  registryHooks: routerProviderRegistryHooks,
119
23
  setup: (api)=>{
120
24
  api.onBeforeRender(async (context, interrupt)=>{
121
- const mergedConfig = getMergedRouterConfig(api, userConfig);
25
+ const routeConfig = getTanstackRouteConfig(api, userConfig);
26
+ const { mergedConfig } = routeConfig;
122
27
  const serializationAdapters = getGlobalEnableRsc() ? (await import("./rsc/server.mjs")).getTanstackRscSerializationAdapters() : void 0;
123
28
  const enableRsc = getGlobalEnableRsc();
124
- const { basename = '', createRoutes } = mergedConfig;
125
- const finalRouteConfig = getFinalRouteConfig(mergedConfig);
126
- if (!finalRouteConfig.routes && !createRoutes) return;
29
+ const { basename = '' } = mergedConfig;
30
+ if (!routeConfig.hasConfiguredRoutes) return;
127
31
  const hooks = api.getHooks();
128
32
  await hooks.onBeforeCreateRoutes.call(context);
129
- const routeObjects = createRoutes ? createRoutes() : createRouteObjectsFromConfig({
130
- routesConfig: finalRouteConfig,
33
+ const modifiedRouteObjects = createTanstackRouteObjects({
34
+ hooks,
35
+ routeConfig,
131
36
  ssrMode: context.ssrContext?.mode
132
- }) || [];
133
- const modifiedRouteObjects = hooks.modifyRoutes.call(routeObjects);
37
+ });
134
38
  if (!modifiedRouteObjects.length) return;
135
39
  const { request, nonce, baseUrl, loaderFailureMode = 'errorBoundary' } = context.ssrContext;
136
- const _basename = '/' === baseUrl ? urlJoin(baseUrl, basename || '') : baseUrl;
40
+ const _basename = '/' === baseUrl ? joinBasename(baseUrl, basename || '') : baseUrl;
137
41
  const rawRequest = request.raw;
138
42
  const initialHref = createGetSsrHref(rawRequest);
139
43
  const isRSCNavigation = enableRsc && 'true' === rawRequest.headers.get('x-rsc-tree');
@@ -179,6 +83,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
179
83
  } : {}
180
84
  });
181
85
  const serverRouter = tanstackRouter;
86
+ if (enableRsc) setTanstackRscRouter(serverRouter);
182
87
  await attachServerSsrUtils(serverRouter);
183
88
  const end = time();
184
89
  try {
@@ -207,10 +112,10 @@ const tanstackRouterPlugin = (userConfig = {})=>{
207
112
  await preloadMatchedRouteComponents(serverRouter);
208
113
  context.ssrContext?.response?.status(tanstackRouter.state.statusCode);
209
114
  await serverRouter.serverSsr?.dehydrate?.();
210
- if (isRSCNavigation) {
211
- await waitForRouterSerialization(serverRouter);
115
+ if (enableRsc) {
116
+ if (isRSCNavigation) await waitForRouterSerialization(serverRouter);
212
117
  setTanstackRscServerPayload(createTanstackRscServerPayload(serverRouter, {
213
- omitClientLoaderData: true
118
+ omitClientLoaderData: isRSCNavigation
214
119
  }));
215
120
  }
216
121
  const ssrScriptTags = serverRouter.serverSsr?.takeBufferedScripts?.();
@@ -244,7 +149,20 @@ const tanstackRouterPlugin = (userConfig = {})=>{
244
149
  });
245
150
  });
246
151
  api.wrapRoot((App)=>{
247
- const getRouteApp = ()=>(props)=>{
152
+ const getRouteApp = ()=>{
153
+ if (getGlobalEnableRsc()) return (props)=>{
154
+ const router = getTanstackRscRouter();
155
+ if (!router) return App ? /*#__PURE__*/ jsx(App, {
156
+ ...props
157
+ }) : null;
158
+ const routerWrapper = wrapTanstackSsrHydrationBoundary(/*#__PURE__*/ jsx(RouterProvider, {
159
+ router: router
160
+ }), true);
161
+ return App ? /*#__PURE__*/ jsx(App, {
162
+ children: routerWrapper
163
+ }) : routerWrapper;
164
+ };
165
+ return (props)=>{
248
166
  const context = useContext(InternalRuntimeContext);
249
167
  const router = getRouterRuntimeState(context)?.instance;
250
168
  if (!router) return App ? /*#__PURE__*/ jsx(App, {
@@ -257,6 +175,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
257
175
  children: routerWrapper
258
176
  }) : routerWrapper;
259
177
  };
178
+ };
260
179
  return getRouteApp();
261
180
  });
262
181
  }
@@ -0,0 +1,40 @@
1
+ import { getGlobalLayoutApp, getGlobalRoutes } from "@modern-js/runtime/context";
2
+ import { merge } from "@modern-js/runtime-utils/merge";
3
+ import { createTanstackRouteObjectsFromConfig } from "./utils.mjs";
4
+ function getMergedRouterConfig(api, userConfig) {
5
+ const pluginConfig = api.getRuntimeConfig();
6
+ return merge(pluginConfig.router || {}, userConfig);
7
+ }
8
+ function getFinalRouteConfig(mergedConfig) {
9
+ return {
10
+ routes: getGlobalRoutes(),
11
+ globalApp: getGlobalLayoutApp(),
12
+ ...mergedConfig.routesConfig
13
+ };
14
+ }
15
+ function getTanstackRouteConfig(api, userConfig) {
16
+ const mergedConfig = getMergedRouterConfig(api, userConfig);
17
+ const finalRouteConfig = getFinalRouteConfig(mergedConfig);
18
+ return {
19
+ mergedConfig,
20
+ finalRouteConfig,
21
+ hasConfiguredRoutes: Boolean(finalRouteConfig.routes) || Boolean(mergedConfig.createRoutes)
22
+ };
23
+ }
24
+ function createTanstackRouteObjects({ hooks, routeConfig, ssrMode }) {
25
+ const { mergedConfig, finalRouteConfig } = routeConfig;
26
+ const routeObjects = mergedConfig.createRoutes ? mergedConfig.createRoutes() : createTanstackRouteObjectsFromConfig({
27
+ routesConfig: finalRouteConfig,
28
+ ssrMode
29
+ }) || [];
30
+ return hooks.modifyRoutes.call(routeObjects);
31
+ }
32
+ function joinBasename(baseUrl, basename) {
33
+ const base = baseUrl || '/';
34
+ const normalizedBase = base.startsWith('/') ? base : `/${base}`;
35
+ const trimmedBase = normalizedBase.length > 1 ? normalizedBase.replace(/\/+$/g, '') : normalizedBase;
36
+ const trimmedBasename = basename.replace(/^\/+|\/+$/g, '');
37
+ if (!trimmedBasename) return trimmedBase || '/';
38
+ return `${trimmedBase}/${trimmedBasename}`.replace(/\/{2,}/g, '/');
39
+ }
40
+ export { createTanstackRouteObjects, getFinalRouteConfig, getMergedRouterConfig, getTanstackRouteConfig, joinBasename };
@@ -0,0 +1,55 @@
1
+ import { createElement } from "react";
2
+ function pickRouteModuleComponent(routeModule, seen = new Set()) {
3
+ if ('function' == typeof routeModule || routeModule && 'object' == typeof routeModule && '$$typeof' in routeModule) return routeModule;
4
+ if (!routeModule || 'object' != typeof routeModule) return;
5
+ if (seen.has(routeModule)) return;
6
+ seen.add(routeModule);
7
+ const module = routeModule;
8
+ for (const candidate of [
9
+ module.default,
10
+ module.Component
11
+ ]){
12
+ const component = pickRouteModuleComponent(candidate, seen);
13
+ if (component) return component;
14
+ }
15
+ }
16
+ function createServerLazyImportComponent(lazyImport, fallbackComponent) {
17
+ if ("u" > typeof document) return fallbackComponent;
18
+ let resolvedComponent;
19
+ let pendingLoad;
20
+ const load = async ()=>{
21
+ if (resolvedComponent) return resolvedComponent;
22
+ const routeModule = await lazyImport();
23
+ const component = pickRouteModuleComponent(routeModule);
24
+ if (component) resolvedComponent = component;
25
+ return resolvedComponent;
26
+ };
27
+ const Component = (props)=>{
28
+ if (resolvedComponent) return createElement(resolvedComponent, props);
29
+ pendingLoad ||= load();
30
+ throw pendingLoad;
31
+ };
32
+ Component.load = load;
33
+ Component.preload = load;
34
+ return Component;
35
+ }
36
+ function toRouteComponent(routeObject, options = {}) {
37
+ const route = routeObject;
38
+ const lazyImport = 'function' == typeof route.lazyImport ? route.lazyImport : void 0;
39
+ const routeComponent = route.Component || route.component;
40
+ const fallbackComponent = routeComponent ? routeComponent : route.element ? ()=>route.element : void 0;
41
+ if (lazyImport && fallbackComponent) return createServerLazyImportComponent(lazyImport, fallbackComponent);
42
+ if (routeComponent) return routeComponent;
43
+ const element = route.element;
44
+ if (element) return ()=>element;
45
+ }
46
+ function toErrorComponent(routeObject) {
47
+ const route = routeObject;
48
+ if (route.ErrorBoundary) return route.ErrorBoundary;
49
+ if (route.errorElement) return ()=>route.errorElement;
50
+ }
51
+ function toPendingComponent(routeObject) {
52
+ const route = routeObject;
53
+ return route.HydrateFallback || route.pendingComponent || void 0;
54
+ }
55
+ export { pickRouteModuleComponent, toErrorComponent, toPendingComponent, toRouteComponent };
@@ -0,0 +1,111 @@
1
+ import { DefaultNotFound } from "@modern-js/runtime/context";
2
+ import { rootRouteId } from "@tanstack/react-router";
3
+ import { withModernRouteMatchContext } from "../outlet.mjs";
4
+ import { toErrorComponent, toPendingComponent, toRouteComponent } from "./components.mjs";
5
+ import { createModernShouldReload, wrapRouteObjectLoader } from "./loaders.mjs";
6
+ import { isRouteObjectPathlessLayout, toTanstackPath } from "./paths.mjs";
7
+ import { createRouteStaticData, mergeModernRouteHandle } from "./staticData.mjs";
8
+ import { createTanstackRootRoute, createTanstackRoute, wrapRouteComponentWithModernContext } from "./tanstackRoutes.mjs";
9
+ function createRouteFromRouteObject(opts) {
10
+ const { options = {}, parent, pathlessFallbackId = 'pathless', routeObject } = opts;
11
+ const modernRouteObject = routeObject;
12
+ const revalidationState = {};
13
+ const shouldRevalidate = modernRouteObject.shouldRevalidate;
14
+ const shouldReload = createModernShouldReload(shouldRevalidate, revalidationState);
15
+ const stableFallbackId = routeObject.id || modernRouteObject.file || pathlessFallbackId;
16
+ const component = toRouteComponent(routeObject, options);
17
+ const base = {
18
+ getParentRoute: ()=>parent,
19
+ component,
20
+ pendingComponent: toPendingComponent(routeObject),
21
+ errorComponent: toErrorComponent(routeObject),
22
+ validateSearch: modernRouteObject.validateSearch,
23
+ loaderDeps: modernRouteObject.loaderDeps,
24
+ staticData: createRouteStaticData({
25
+ modernRouteId: routeObject.id,
26
+ modernRouteAction: modernRouteObject.action,
27
+ modernRouteHandle: mergeModernRouteHandle(modernRouteObject),
28
+ modernRouteHasAction: modernRouteObject.hasAction || Boolean(modernRouteObject.action),
29
+ modernRouteHasClientLoader: modernRouteObject.hasClientLoader || void 0 !== modernRouteObject.clientData,
30
+ modernRouteHasLoader: modernRouteObject.hasLoader || 'function' == typeof modernRouteObject.loader,
31
+ modernRouteIsClientComponent: modernRouteObject.isClientComponent,
32
+ modernRouteLoader: modernRouteObject.loader,
33
+ modernRouteShouldRevalidate: shouldRevalidate
34
+ }),
35
+ loader: wrapRouteObjectLoader(routeObject, revalidationState, options)
36
+ };
37
+ if (modernRouteObject.inValidSSRRoute) base.ssr = false;
38
+ if (shouldReload) base.shouldReload = shouldReload;
39
+ if (isRouteObjectPathlessLayout(routeObject)) base.id = stableFallbackId;
40
+ else base.path = routeObject.index ? '/' : toTanstackPath(routeObject.path || '');
41
+ const route = createTanstackRoute(base);
42
+ wrapRouteComponentWithModernContext(route, component, routeObject.id);
43
+ const children = routeObject.children;
44
+ if (children && children.length > 0) {
45
+ const childRoutes = children.map((child, index)=>createRouteFromRouteObject({
46
+ options,
47
+ parent: route,
48
+ pathlessFallbackId: `pathless-${index}`,
49
+ routeObject: child
50
+ }));
51
+ route.addChildren(childRoutes);
52
+ }
53
+ return route;
54
+ }
55
+ function getRootLikeRouteObject(routes) {
56
+ return routes.find((route)=>'/' === route.path && !route.index);
57
+ }
58
+ function createRouteTreeFromRouteObjects(routes, options = {}) {
59
+ const rootLikeRoute = getRootLikeRouteObject(routes);
60
+ const rootRevalidationState = {};
61
+ const rootShouldRevalidate = rootLikeRoute?.shouldRevalidate;
62
+ const rootShouldReload = createModernShouldReload(rootShouldRevalidate, rootRevalidationState);
63
+ const rootComponent = rootLikeRoute ? toRouteComponent(rootLikeRoute) : void 0;
64
+ const rootRouteOptions = {
65
+ component: rootComponent,
66
+ pendingComponent: rootLikeRoute ? toPendingComponent(rootLikeRoute) : void 0,
67
+ errorComponent: rootLikeRoute ? toErrorComponent(rootLikeRoute) : void 0,
68
+ validateSearch: rootLikeRoute?.validateSearch,
69
+ loaderDeps: rootLikeRoute?.loaderDeps,
70
+ notFoundComponent: DefaultNotFound,
71
+ staticData: createRouteStaticData({
72
+ modernRouteId: rootLikeRoute?.id,
73
+ modernRouteAction: rootLikeRoute?.action,
74
+ modernRouteHandle: rootLikeRoute ? mergeModernRouteHandle(rootLikeRoute) : void 0,
75
+ modernRouteHasAction: rootLikeRoute?.hasAction || Boolean(rootLikeRoute?.action),
76
+ modernRouteHasClientLoader: rootLikeRoute?.hasClientLoader || void 0 !== rootLikeRoute?.clientData,
77
+ modernRouteHasLoader: rootLikeRoute?.hasLoader || 'function' == typeof rootLikeRoute?.loader,
78
+ modernRouteIsClientComponent: rootLikeRoute?.isClientComponent,
79
+ modernRouteLoader: rootLikeRoute?.loader,
80
+ modernRouteShouldRevalidate: rootShouldRevalidate
81
+ }),
82
+ loader: rootLikeRoute ? wrapRouteObjectLoader(rootLikeRoute, rootRevalidationState, options) : void 0
83
+ };
84
+ if (rootShouldReload) rootRouteOptions.shouldReload = rootShouldReload;
85
+ if (rootLikeRoute?.inValidSSRRoute) rootRouteOptions.ssr = false;
86
+ const rootRoute = createTanstackRootRoute(rootRouteOptions);
87
+ if (rootComponent) rootRoute.options.component = withModernRouteMatchContext(rootComponent, rootRouteId);
88
+ const topLevel = rootLikeRoute ? [
89
+ ...rootLikeRoute.children || [],
90
+ ...routes.filter((route)=>route !== rootLikeRoute)
91
+ ] : routes;
92
+ const childRoutes = topLevel.map((routeObject, index)=>createRouteFromRouteObject({
93
+ options,
94
+ parent: rootRoute,
95
+ pathlessFallbackId: `pathless-${index}`,
96
+ routeObject
97
+ }));
98
+ rootRoute.addChildren(childRoutes);
99
+ return rootRoute;
100
+ }
101
+ function getModernRouteIdsFromMatches(router) {
102
+ const matches = router.state.matches || [];
103
+ const routesById = router.routesById;
104
+ const ids = matches.map((match)=>{
105
+ const normalizedMatch = match;
106
+ const routeId = 'string' == typeof normalizedMatch.routeId ? normalizedMatch.routeId : void 0;
107
+ return normalizedMatch.route?.options?.staticData?.modernRouteId ?? (routeId ? routesById?.[routeId]?.options?.staticData?.modernRouteId : void 0);
108
+ }).filter((id)=>'string' == typeof id);
109
+ return Array.from(new Set(ids));
110
+ }
111
+ export { createRouteTreeFromRouteObjects, getModernRouteIdsFromMatches };
@@ -0,0 +1,2 @@
1
+ export { pickRouteModuleComponent } from "./components.mjs";
2
+ export { createRouteTreeFromRouteObjects, getModernRouteIdsFromMatches } from "./construction.mjs";