@bleedingdev/modern-js-plugin-tanstack 3.5.0-ultramodern.9 → 3.5.0-ultramodern.91

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 (270) hide show
  1. package/dist/cjs/cli/artifacts.js +157 -0
  2. package/dist/cjs/cli/index.js +8 -79
  3. package/dist/cjs/cli/tanstackTypes/canonicalRoutes.js +113 -0
  4. package/dist/cjs/cli/tanstackTypes/shared.js +123 -0
  5. package/dist/cjs/cli/tanstackTypes/source.js +255 -0
  6. package/dist/cjs/cli/tanstackTypes.js +4 -350
  7. package/dist/cjs/runtime/blockingSubscribe.js +57 -0
  8. package/dist/cjs/runtime/{pluginCore.js → clientBasepath.js} +12 -19
  9. package/dist/cjs/runtime/clientHydration.js +118 -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 +7 -11
  13. package/dist/cjs/runtime/plugin.js +21 -125
  14. package/dist/cjs/runtime/plugin.node.js +45 -125
  15. package/dist/cjs/runtime/pluginShared.js +87 -0
  16. package/dist/cjs/runtime/prefetchLink.js +15 -2
  17. package/dist/cjs/runtime/register.js +3 -16
  18. package/dist/cjs/runtime/routeTree/components.js +102 -0
  19. package/dist/cjs/runtime/routeTree/construction.js +152 -0
  20. package/dist/cjs/runtime/routeTree/index.js +47 -0
  21. package/dist/cjs/runtime/routeTree/loaders.js +158 -0
  22. package/dist/cjs/runtime/routeTree/paths.js +57 -0
  23. package/dist/cjs/runtime/routeTree/staticData.js +63 -0
  24. package/dist/cjs/runtime/routeTree/tanstackRoutes.js +57 -0
  25. package/dist/cjs/runtime/routeTree/types.js +18 -0
  26. package/dist/cjs/runtime/routeTree.js +7 -320
  27. package/dist/cjs/runtime/router.js +15 -2
  28. package/dist/cjs/runtime/rsc/CompositeComponent.js +18 -13
  29. package/dist/cjs/runtime/rsc/ReplayableStream.js +0 -4
  30. package/dist/cjs/runtime/rsc/RscNodeRenderer.js +5 -16
  31. package/dist/cjs/runtime/rsc/client.js +8 -25
  32. package/dist/cjs/runtime/rsc/flightSerialization.js +132 -0
  33. package/dist/cjs/runtime/rsc/payloadErrors.js +99 -0
  34. package/dist/cjs/runtime/rsc/payloadFetch.js +105 -0
  35. package/dist/cjs/runtime/rsc/payloadRouter.js +21 -142
  36. package/dist/cjs/runtime/rsc/payloadRoutes.js +94 -0
  37. package/dist/cjs/runtime/rsc/payloadStorage.js +58 -0
  38. package/dist/cjs/runtime/rsc/server.js +14 -18
  39. package/dist/cjs/runtime/rsc/shared.js +68 -0
  40. package/dist/cjs/runtime/rsc/slotUsageSanitizer.js +1 -0
  41. package/dist/cjs/runtime/rsc/treeGetter.js +72 -0
  42. package/dist/cjs/runtime/shared/isAbsoluteUrl.js +47 -0
  43. package/dist/cjs/runtime/ssrManagedTags.js +103 -0
  44. package/dist/cjs/runtime/ssrPreload.js +89 -0
  45. package/dist/cjs/runtime/ssrTypes.js +18 -0
  46. package/dist/cjs/runtime/state.js +1 -1
  47. package/dist/cjs/runtime/submitAction.js +161 -0
  48. package/dist/cjs/runtime/utils.js +49 -86
  49. package/dist/esm/cli/artifacts.mjs +103 -0
  50. package/dist/esm/cli/index.mjs +8 -82
  51. package/dist/esm/cli/tanstackTypes/canonicalRoutes.mjs +75 -0
  52. package/dist/esm/cli/tanstackTypes/shared.mjs +61 -0
  53. package/dist/esm/cli/tanstackTypes/source.mjs +207 -0
  54. package/dist/esm/cli/tanstackTypes.mjs +2 -339
  55. package/dist/esm/runtime/blockingSubscribe.mjs +19 -0
  56. package/dist/esm/runtime/clientBasepath.mjs +10 -0
  57. package/dist/esm/runtime/clientHydration.mjs +71 -0
  58. package/dist/esm/runtime/dataMutation.mjs +2 -167
  59. package/dist/esm/runtime/formData.mjs +63 -0
  60. package/dist/esm/runtime/loaderBridge.mjs +5 -9
  61. package/dist/esm/runtime/plugin.mjs +14 -118
  62. package/dist/esm/runtime/plugin.node.mjs +41 -121
  63. package/dist/esm/runtime/pluginShared.mjs +40 -0
  64. package/dist/esm/runtime/prefetchLink.mjs +18 -5
  65. package/dist/esm/runtime/register.mjs +1 -14
  66. package/dist/esm/runtime/routeTree/components.mjs +55 -0
  67. package/dist/esm/runtime/routeTree/construction.mjs +111 -0
  68. package/dist/esm/runtime/routeTree/index.mjs +2 -0
  69. package/dist/esm/runtime/routeTree/loaders.mjs +117 -0
  70. package/dist/esm/runtime/routeTree/paths.mjs +16 -0
  71. package/dist/esm/runtime/routeTree/staticData.mjs +22 -0
  72. package/dist/esm/runtime/routeTree/tanstackRoutes.mjs +13 -0
  73. package/dist/esm/runtime/routeTree/types.mjs +0 -0
  74. package/dist/esm/runtime/routeTree.mjs +1 -318
  75. package/dist/esm/runtime/router.mjs +16 -2
  76. package/dist/esm/runtime/rsc/CompositeComponent.mjs +18 -13
  77. package/dist/esm/runtime/rsc/ReplayableStream.mjs +1 -1
  78. package/dist/esm/runtime/rsc/RscNodeRenderer.mjs +4 -15
  79. package/dist/esm/runtime/rsc/client.mjs +6 -26
  80. package/dist/esm/runtime/rsc/flightSerialization.mjs +88 -0
  81. package/dist/esm/runtime/rsc/payloadErrors.mjs +49 -0
  82. package/dist/esm/runtime/rsc/payloadFetch.mjs +55 -0
  83. package/dist/esm/runtime/rsc/payloadRouter.mjs +12 -133
  84. package/dist/esm/runtime/rsc/payloadRoutes.mjs +50 -0
  85. package/dist/esm/runtime/rsc/payloadStorage.mjs +14 -0
  86. package/dist/esm/runtime/rsc/server.mjs +17 -21
  87. package/dist/esm/runtime/rsc/shared.mjs +21 -0
  88. package/dist/esm/runtime/rsc/slotUsageSanitizer.mjs +1 -0
  89. package/dist/esm/runtime/rsc/treeGetter.mjs +34 -0
  90. package/dist/esm/runtime/shared/isAbsoluteUrl.mjs +9 -0
  91. package/dist/esm/runtime/ssrManagedTags.mjs +53 -0
  92. package/dist/esm/runtime/ssrPreload.mjs +51 -0
  93. package/dist/esm/runtime/ssrTypes.mjs +0 -0
  94. package/dist/esm/runtime/state.mjs +1 -1
  95. package/dist/esm/runtime/submitAction.mjs +120 -0
  96. package/dist/esm/runtime/utils.mjs +47 -75
  97. package/dist/esm-node/cli/artifacts.mjs +104 -0
  98. package/dist/esm-node/cli/index.mjs +8 -82
  99. package/dist/esm-node/cli/tanstackTypes/canonicalRoutes.mjs +76 -0
  100. package/dist/esm-node/cli/tanstackTypes/shared.mjs +62 -0
  101. package/dist/esm-node/cli/tanstackTypes/source.mjs +208 -0
  102. package/dist/esm-node/cli/tanstackTypes.mjs +2 -339
  103. package/dist/esm-node/runtime/blockingSubscribe.mjs +20 -0
  104. package/dist/esm-node/runtime/clientBasepath.mjs +11 -0
  105. package/dist/esm-node/runtime/clientHydration.mjs +72 -0
  106. package/dist/esm-node/runtime/dataMutation.mjs +2 -167
  107. package/dist/esm-node/runtime/formData.mjs +64 -0
  108. package/dist/esm-node/runtime/loaderBridge.mjs +5 -9
  109. package/dist/esm-node/runtime/plugin.mjs +14 -118
  110. package/dist/esm-node/runtime/plugin.node.mjs +41 -121
  111. package/dist/esm-node/runtime/pluginShared.mjs +41 -0
  112. package/dist/esm-node/runtime/prefetchLink.mjs +18 -5
  113. package/dist/esm-node/runtime/register.mjs +1 -14
  114. package/dist/esm-node/runtime/routeTree/components.mjs +56 -0
  115. package/dist/esm-node/runtime/routeTree/construction.mjs +112 -0
  116. package/dist/esm-node/runtime/routeTree/index.mjs +3 -0
  117. package/dist/esm-node/runtime/routeTree/loaders.mjs +118 -0
  118. package/dist/esm-node/runtime/routeTree/paths.mjs +17 -0
  119. package/dist/esm-node/runtime/routeTree/staticData.mjs +23 -0
  120. package/dist/esm-node/runtime/routeTree/tanstackRoutes.mjs +14 -0
  121. package/dist/esm-node/runtime/routeTree/types.mjs +1 -0
  122. package/dist/esm-node/runtime/routeTree.mjs +1 -318
  123. package/dist/esm-node/runtime/router.mjs +16 -2
  124. package/dist/esm-node/runtime/rsc/CompositeComponent.mjs +18 -13
  125. package/dist/esm-node/runtime/rsc/ReplayableStream.mjs +1 -1
  126. package/dist/esm-node/runtime/rsc/RscNodeRenderer.mjs +4 -15
  127. package/dist/esm-node/runtime/rsc/client.mjs +6 -26
  128. package/dist/esm-node/runtime/rsc/flightSerialization.mjs +89 -0
  129. package/dist/esm-node/runtime/rsc/payloadErrors.mjs +50 -0
  130. package/dist/esm-node/runtime/rsc/payloadFetch.mjs +56 -0
  131. package/dist/esm-node/runtime/rsc/payloadRouter.mjs +12 -133
  132. package/dist/esm-node/runtime/rsc/payloadRoutes.mjs +51 -0
  133. package/dist/esm-node/runtime/rsc/payloadStorage.mjs +15 -0
  134. package/dist/esm-node/runtime/rsc/server.mjs +17 -21
  135. package/dist/esm-node/runtime/rsc/shared.mjs +22 -0
  136. package/dist/esm-node/runtime/rsc/slotUsageSanitizer.mjs +1 -0
  137. package/dist/esm-node/runtime/rsc/treeGetter.mjs +35 -0
  138. package/dist/esm-node/runtime/shared/isAbsoluteUrl.mjs +10 -0
  139. package/dist/esm-node/runtime/ssrManagedTags.mjs +54 -0
  140. package/dist/esm-node/runtime/ssrPreload.mjs +52 -0
  141. package/dist/esm-node/runtime/ssrTypes.mjs +1 -0
  142. package/dist/esm-node/runtime/state.mjs +1 -1
  143. package/dist/esm-node/runtime/submitAction.mjs +121 -0
  144. package/dist/esm-node/runtime/utils.mjs +47 -75
  145. package/dist/types/cli/artifacts.d.ts +33 -0
  146. package/dist/types/cli/index.d.ts +2 -22
  147. package/dist/types/cli/tanstackTypes/canonicalRoutes.d.ts +22 -0
  148. package/dist/types/cli/tanstackTypes/shared.d.ts +20 -0
  149. package/dist/types/cli/tanstackTypes/source.d.ts +12 -0
  150. package/dist/types/cli/tanstackTypes.d.ts +3 -31
  151. package/dist/types/runtime/blockingSubscribe.d.ts +1 -0
  152. package/dist/types/runtime/clientBasepath.d.ts +1 -0
  153. package/dist/types/runtime/clientHydration.d.ts +10 -0
  154. package/dist/types/runtime/dataMutation.d.ts +3 -12
  155. package/dist/types/runtime/formData.d.ts +24 -0
  156. package/dist/types/runtime/loaderBridge.d.ts +2 -1
  157. package/dist/types/runtime/plugin.d.ts +1 -1
  158. package/dist/types/runtime/plugin.node.d.ts +1 -1
  159. package/dist/types/runtime/pluginShared.d.ts +38 -0
  160. package/dist/types/runtime/register.d.ts +10 -9
  161. package/dist/types/runtime/routeTree/components.d.ts +7 -0
  162. package/dist/types/runtime/routeTree/construction.d.ts +5 -0
  163. package/dist/types/runtime/routeTree/index.d.ts +2 -0
  164. package/dist/types/runtime/routeTree/loaders.d.ts +4 -0
  165. package/dist/types/runtime/routeTree/paths.d.ts +3 -0
  166. package/dist/types/runtime/routeTree/staticData.d.ts +19 -0
  167. package/dist/types/runtime/routeTree/tanstackRoutes.d.ts +4 -0
  168. package/dist/types/runtime/routeTree/types.d.ts +76 -0
  169. package/dist/types/runtime/routeTree.d.ts +1 -9
  170. package/dist/types/runtime/router.d.ts +6 -7
  171. package/dist/types/runtime/rsc/CompositeComponent.d.ts +1 -2
  172. package/dist/types/runtime/rsc/ReplayableStream.d.ts +3 -2
  173. package/dist/types/runtime/rsc/RscNodeRenderer.d.ts +2 -3
  174. package/dist/types/runtime/rsc/SlotContext.d.ts +2 -1
  175. package/dist/types/runtime/rsc/client.d.ts +2 -0
  176. package/dist/types/runtime/rsc/flightSerialization.d.ts +3 -0
  177. package/dist/types/runtime/rsc/payloadErrors.d.ts +6 -0
  178. package/dist/types/runtime/rsc/payloadFetch.d.ts +8 -0
  179. package/dist/types/runtime/rsc/payloadRouter.d.ts +2 -10
  180. package/dist/types/runtime/rsc/payloadRoutes.d.ts +40 -0
  181. package/dist/types/runtime/rsc/payloadStorage.d.ts +5 -0
  182. package/dist/types/runtime/rsc/shared.d.ts +18 -0
  183. package/dist/types/runtime/rsc/treeGetter.d.ts +1 -0
  184. package/dist/types/runtime/shared/isAbsoluteUrl.d.ts +1 -0
  185. package/dist/types/runtime/ssrManagedTags.d.ts +7 -0
  186. package/dist/types/runtime/ssrPreload.d.ts +2 -0
  187. package/dist/types/runtime/ssrTypes.d.ts +44 -0
  188. package/dist/types/runtime/state.d.ts +1 -1
  189. package/dist/types/runtime/submitAction.d.ts +14 -0
  190. package/dist/types/runtime/types.d.ts +4 -10
  191. package/dist/types/runtime/utils.d.ts +4 -24
  192. package/package.json +37 -17
  193. package/rstest.config.mts +23 -0
  194. package/src/cli/artifacts.ts +255 -0
  195. package/src/cli/index.ts +7 -185
  196. package/src/cli/tanstackTypes/canonicalRoutes.ts +157 -0
  197. package/src/cli/tanstackTypes/shared.ts +113 -0
  198. package/src/cli/tanstackTypes/source.ts +414 -0
  199. package/src/cli/tanstackTypes.ts +4 -647
  200. package/src/runtime/blockingSubscribe.ts +48 -0
  201. package/src/runtime/clientBasepath.ts +12 -0
  202. package/src/runtime/clientHydration.ts +149 -0
  203. package/src/runtime/dataMutation.tsx +9 -306
  204. package/src/runtime/formData.ts +153 -0
  205. package/src/runtime/loaderBridge.ts +11 -12
  206. package/src/runtime/plugin.node.tsx +76 -291
  207. package/src/runtime/plugin.tsx +21 -257
  208. package/src/runtime/pluginShared.ts +112 -0
  209. package/src/runtime/prefetchLink.tsx +78 -15
  210. package/src/runtime/register.ts +10 -42
  211. package/src/runtime/routeTree/components.ts +130 -0
  212. package/src/runtime/routeTree/construction.ts +238 -0
  213. package/src/runtime/routeTree/index.ts +7 -0
  214. package/src/runtime/routeTree/loaders.ts +232 -0
  215. package/src/runtime/routeTree/paths.ts +36 -0
  216. package/src/runtime/routeTree/staticData.ts +66 -0
  217. package/src/runtime/routeTree/tanstackRoutes.ts +36 -0
  218. package/src/runtime/routeTree/types.ts +87 -0
  219. package/src/runtime/routeTree.ts +5 -750
  220. package/src/runtime/router.ts +35 -7
  221. package/src/runtime/rsc/CompositeComponent.tsx +29 -20
  222. package/src/runtime/rsc/ReplayableStream.ts +2 -2
  223. package/src/runtime/rsc/RscNodeRenderer.tsx +9 -27
  224. package/src/runtime/rsc/SlotContext.tsx +1 -1
  225. package/src/runtime/rsc/client.tsx +12 -40
  226. package/src/runtime/rsc/flightSerialization.ts +158 -0
  227. package/src/runtime/rsc/payloadErrors.ts +73 -0
  228. package/src/runtime/rsc/payloadFetch.ts +92 -0
  229. package/src/runtime/rsc/payloadRouter.ts +29 -234
  230. package/src/runtime/rsc/payloadRoutes.ts +122 -0
  231. package/src/runtime/rsc/payloadStorage.ts +35 -0
  232. package/src/runtime/rsc/server.tsx +20 -29
  233. package/src/runtime/rsc/shared.ts +70 -0
  234. package/src/runtime/rsc/slotUsageSanitizer.ts +4 -0
  235. package/src/runtime/rsc/treeGetter.tsx +52 -0
  236. package/src/runtime/shared/isAbsoluteUrl.ts +8 -0
  237. package/src/runtime/ssrManagedTags.ts +107 -0
  238. package/src/runtime/ssrPreload.ts +125 -0
  239. package/src/runtime/ssrTypes.ts +51 -0
  240. package/src/runtime/state.ts +9 -3
  241. package/src/runtime/submitAction.ts +201 -0
  242. package/src/runtime/types.ts +4 -18
  243. package/src/runtime/utils.tsx +76 -110
  244. package/src/types/react-server-dom-rspack.d.ts +56 -0
  245. package/tests/castRatchet.test.ts +85 -0
  246. package/tests/realm-isolation.test.ts +114 -0
  247. package/tests/router/cli.test.ts +7 -0
  248. package/tests/router/clientHydration.test.tsx +61 -0
  249. package/tests/router/dataMutation.test.tsx +59 -0
  250. package/tests/router/fixtures/legacyRuntimeRouter.ts +10 -0
  251. package/tests/router/fixtures/router-gen.golden.txt +71 -0
  252. package/tests/router/fixtures/router-gen.oxlint.json +5 -0
  253. package/tests/router/flightSerialization.roundtrip.test.tsx +137 -0
  254. package/tests/router/generateRouteArtifacts.test.ts +106 -0
  255. package/tests/router/hooks.test.ts +14 -0
  256. package/tests/router/loaderBridge.test.ts +21 -0
  257. package/tests/router/prefetchLink.test.tsx +106 -59
  258. package/tests/router/prefetchLinkPreload.test.tsx +85 -0
  259. package/tests/router/register.test.ts +1 -39
  260. package/tests/router/routeTree.test.ts +51 -11
  261. package/tests/router/routerCompatibility.test.ts +245 -0
  262. package/tests/router/rsc.test.tsx +189 -0
  263. package/tests/router/rscPayloadRouterMatrix.test.ts +197 -0
  264. package/tests/router/slotUsageSanitizer.test.ts +23 -0
  265. package/tests/router/ssrPreload.test.ts +30 -0
  266. package/tests/router/tanstackTypes.test.ts +298 -1
  267. package/dist/esm/runtime/pluginCore.mjs +0 -14
  268. package/dist/esm-node/runtime/pluginCore.mjs +0 -15
  269. package/dist/types/runtime/pluginCore.d.ts +0 -21
  270. package/src/runtime/pluginCore.ts +0 -48
@@ -1,7 +1,7 @@
1
1
  import "node:module";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { InternalRuntimeContext, getGlobalEnableRsc } from "@modern-js/runtime/context";
4
- import { createRequestContext, storage } from "@modern-js/runtime-utils/node";
4
+ import { createRequestContext } from "@modern-js/runtime-utils/node";
5
5
  import { time } from "@modern-js/runtime-utils/time";
6
6
  import { LOADER_REPORTER_NAME } from "@modern-js/utils/universal/constants";
7
7
  import { RouterProvider, createMemoryHistory, createRouter } from "@tanstack/react-router";
@@ -10,138 +10,43 @@ import { createModernBasepathRewrite } from "./basepathRewrite.mjs";
10
10
  import { routerProviderRegistryHooks } from "./hooks.mjs";
11
11
  import { wrapTanstackSsrHydrationBoundary } from "./hydrationBoundary.mjs";
12
12
  import { applyRouterServerPrepareResult, createRouterServerSnapshot, getRouterRuntimeState } from "./lifecycle.mjs";
13
- import { getFinalRouteConfig, getMergedRouterConfig } from "./pluginCore.mjs";
13
+ import { createTanstackRouteObjects, getTanstackRouteConfig, joinBasename } from "./pluginShared.mjs";
14
14
  import { createRouteTreeFromRouteObjects, getModernRouteIdsFromMatches } from "./routeTree.mjs";
15
15
  import { createTanstackRscServerPayload, handleTanstackRscRedirect } from "./rsc/payloadRouter.mjs";
16
+ import { getTanstackRscRouter, setTanstackRscRouter, setTanstackRscServerPayload } from "./rsc/payloadStorage.mjs";
17
+ import { attachServerSsrUtils, collectRouterErrors, createGetSsrHref, routerManagedTagsToHtml, waitForRouterSerialization } from "./ssrManagedTags.mjs";
18
+ import { preloadMatchedRouteComponents } from "./ssrPreload.mjs";
16
19
  import { getModernTanstackRouterFastDefaults } from "./types.mjs";
17
- import { createRouteObjectsFromConfig, urlJoin } from "./utils.mjs";
18
- const setTanstackRscServerPayload = (payload)=>{
19
- const storageContext = storage.useContext?.();
20
- if (storageContext) storageContext.serverPayload = payload;
21
- };
22
- function isPromiseLike(value) {
23
- return Boolean(value && 'function' == typeof value.then);
24
- }
25
- function isPreloadableRouteComponent(component) {
26
- if (!component || 'function' != typeof component) return false;
27
- const preloadable = component;
28
- return 'function' == typeof preloadable.load || 'function' == typeof preloadable.preload;
29
- }
30
- function isReactLazyRouteComponent(component) {
31
- return null != component && 'object' == typeof component && 'function' == typeof component._init && '_payload' in component;
32
- }
33
- async function preloadReactLazyRouteComponent(component) {
34
- try {
35
- component._init?.(component._payload);
36
- } catch (thrown) {
37
- if (!isPromiseLike(thrown)) throw thrown;
38
- await thrown;
39
- component._init?.(component._payload);
40
- }
41
- }
42
- async function preloadRouteComponent(component) {
43
- if (isReactLazyRouteComponent(component)) return void await preloadReactLazyRouteComponent(component);
44
- if (!isPreloadableRouteComponent(component)) return;
45
- if ('function' == typeof component.load) return void await component.load({});
46
- await component.preload?.({});
47
- }
48
- async function preloadMatchedRouteComponents(tanstackRouter) {
49
- const matches = Array.isArray(tanstackRouter.state.matches) ? tanstackRouter.state.matches : [];
50
- const routesById = tanstackRouter.routesById || {};
51
- await Promise.all(matches.map(async (match)=>{
52
- const routeId = 'string' == typeof match.routeId ? match.routeId : 'string' == typeof match.route?.id ? match.route.id : void 0;
53
- const route = routeId ? routesById[routeId] : match.route;
54
- const options = route?.options;
55
- if (!options) return;
56
- await Promise.all([
57
- preloadRouteComponent(options.component),
58
- preloadRouteComponent(options.pendingComponent),
59
- preloadRouteComponent(options.errorComponent),
60
- preloadRouteComponent(options.notFoundComponent)
61
- ]);
62
- }));
63
- }
64
- async function waitForRouterSerialization(tanstackRouter) {
65
- const serverSsr = tanstackRouter.serverSsr;
66
- if (!serverSsr || 'function' != typeof serverSsr.onSerializationFinished || serverSsr.isSerializationFinished?.()) return;
67
- await new Promise((resolve)=>{
68
- serverSsr.onSerializationFinished?.(resolve);
69
- });
70
- }
71
- function htmlEscapeAttr(value) {
72
- return value.replace(/&/g, '&').replace(/"/g, '"');
73
- }
74
- function routerManagedTagToHtml(tag) {
75
- if (!tag || 'object' != typeof tag) return '';
76
- const managedTag = tag;
77
- if (!managedTag || "script" !== managedTag.tag) return '';
78
- const attrs = managedTag.attrs || {};
79
- const attrsStr = Object.entries(attrs).filter(([, v])=>null != v && false !== v).map(([k, v])=>{
80
- const name = 'className' === k ? 'class' : k;
81
- if (true === v) return name;
82
- return `${name}="${htmlEscapeAttr(String(v))}"`;
83
- }).join(' ');
84
- const open = attrsStr.length ? `<script ${attrsStr}>` : "<script>";
85
- const children = 'string' == typeof managedTag.children ? managedTag.children : '';
86
- return `${open}${children}</script>`;
87
- }
88
- function routerManagedTagsToHtml(tags) {
89
- const normalizedTags = Array.isArray(tags) ? tags : [
90
- tags
91
- ];
92
- return normalizedTags.map(routerManagedTagToHtml).filter(Boolean);
93
- }
94
- function createGetSsrHref(request) {
95
- const url = new URL(request.url);
96
- return `${url.pathname}${url.search}${url.hash}`;
97
- }
98
- function collectRouterErrors(tanstackRouter) {
99
- const state = tanstackRouter.state;
100
- const matches = Array.isArray(state.matches) ? state.matches : [];
101
- const errors = matches.reduce((acc, match)=>{
102
- if (!match.error) return acc;
103
- const routeId = 'string' == typeof match.routeId ? match.routeId : 'string' == typeof match.route?.id ? match.route.id : `match-${Object.keys(acc).length}`;
104
- acc[routeId] = match.error;
105
- return acc;
106
- }, {});
107
- return Object.keys(errors).length > 0 ? errors : void 0;
108
- }
109
- async function attachServerSsrUtils(router) {
110
- const { attachRouterServerSsrUtils } = await import("@tanstack/router-core/ssr/server");
111
- attachRouterServerSsrUtils({
112
- router,
113
- manifest: void 0
114
- });
115
- }
116
20
  const tanstackRouterPlugin = (userConfig = {})=>{
117
21
  const plugin = {
118
22
  name: '@modern-js/plugin-router-tanstack',
119
23
  registryHooks: routerProviderRegistryHooks,
120
24
  setup: (api)=>{
121
25
  api.onBeforeRender(async (context, interrupt)=>{
122
- const mergedConfig = getMergedRouterConfig(api, userConfig);
26
+ const routeConfig = getTanstackRouteConfig(api, userConfig);
27
+ const { mergedConfig } = routeConfig;
123
28
  const serializationAdapters = getGlobalEnableRsc() ? (await import("./rsc/server.mjs")).getTanstackRscSerializationAdapters() : void 0;
124
29
  const enableRsc = getGlobalEnableRsc();
125
- const { basename = '', createRoutes } = mergedConfig;
126
- const finalRouteConfig = getFinalRouteConfig(mergedConfig);
127
- if (!finalRouteConfig.routes && !createRoutes) return;
30
+ const { basename = '' } = mergedConfig;
31
+ if (!routeConfig.hasConfiguredRoutes) return;
128
32
  const hooks = api.getHooks();
129
33
  await hooks.onBeforeCreateRoutes.call(context);
130
- const routeObjects = createRoutes ? createRoutes() : createRouteObjectsFromConfig({
131
- routesConfig: finalRouteConfig,
34
+ const modifiedRouteObjects = createTanstackRouteObjects({
35
+ hooks,
36
+ routeConfig,
132
37
  ssrMode: context.ssrContext?.mode
133
- }) || [];
134
- const modifiedRouteObjects = hooks.modifyRoutes.call(routeObjects);
38
+ });
135
39
  if (!modifiedRouteObjects.length) return;
136
40
  const { request, nonce, baseUrl, loaderFailureMode = 'errorBoundary' } = context.ssrContext;
137
- const _basename = '/' === baseUrl ? urlJoin(baseUrl, basename || '') : baseUrl;
138
- const initialHref = createGetSsrHref(request.raw);
139
- const isRSCNavigation = enableRsc && 'true' === request.raw.headers.get('x-rsc-tree');
41
+ const _basename = '/' === baseUrl ? joinBasename(baseUrl, basename || '') : baseUrl;
42
+ const rawRequest = request.raw;
43
+ const initialHref = createGetSsrHref(rawRequest);
44
+ const isRSCNavigation = enableRsc && 'true' === rawRequest.headers.get('x-rsc-tree');
140
45
  const requestContext = createRequestContext(context.ssrContext?.loaderContext);
141
46
  const controller = new AbortController();
142
- const ssrRequest = new Request(request.raw.url, {
47
+ const ssrRequest = new Request(rawRequest.url, {
143
48
  method: 'GET',
144
- headers: request.raw.headers,
49
+ headers: rawRequest.headers,
145
50
  signal: controller.signal
146
51
  });
147
52
  const routerContext = {
@@ -169,7 +74,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
169
74
  history,
170
75
  basepath: '/',
171
76
  rewrite,
172
- origin: new URL(request.raw.url).origin,
77
+ origin: new URL(rawRequest.url).origin,
173
78
  ssr: {
174
79
  nonce
175
80
  },
@@ -179,6 +84,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
179
84
  } : {}
180
85
  });
181
86
  const serverRouter = tanstackRouter;
87
+ if (enableRsc) setTanstackRscRouter(serverRouter);
182
88
  await attachServerSsrUtils(serverRouter);
183
89
  const end = time();
184
90
  try {
@@ -198,19 +104,19 @@ const tanstackRouterPlugin = (userConfig = {})=>{
198
104
  }
199
105
  const routerErrors = collectRouterErrors(tanstackRouter);
200
106
  if (routerErrors && 'clientRender' === loaderFailureMode) {
201
- context.ssrContext?.response.status(200);
107
+ context.ssrContext?.response?.status(200);
202
108
  try {
203
109
  serverRouter.serverSsr?.cleanup?.();
204
110
  } catch {}
205
111
  throw Object.values(routerErrors)[0];
206
112
  }
207
113
  await preloadMatchedRouteComponents(serverRouter);
208
- context.ssrContext?.response.status(tanstackRouter.state.statusCode);
114
+ context.ssrContext?.response?.status(tanstackRouter.state.statusCode);
209
115
  await serverRouter.serverSsr?.dehydrate?.();
210
- if (isRSCNavigation) {
211
- await waitForRouterSerialization(serverRouter);
116
+ if (enableRsc) {
117
+ if (isRSCNavigation) await waitForRouterSerialization(serverRouter);
212
118
  setTanstackRscServerPayload(createTanstackRscServerPayload(serverRouter, {
213
- omitClientLoaderData: true
119
+ omitClientLoaderData: isRSCNavigation
214
120
  }));
215
121
  }
216
122
  const ssrScriptTags = serverRouter.serverSsr?.takeBufferedScripts?.();
@@ -244,7 +150,20 @@ const tanstackRouterPlugin = (userConfig = {})=>{
244
150
  });
245
151
  });
246
152
  api.wrapRoot((App)=>{
247
- const getRouteApp = ()=>(props)=>{
153
+ const getRouteApp = ()=>{
154
+ if (getGlobalEnableRsc()) return (props)=>{
155
+ const router = getTanstackRscRouter();
156
+ if (!router) return App ? /*#__PURE__*/ jsx(App, {
157
+ ...props
158
+ }) : null;
159
+ const routerWrapper = wrapTanstackSsrHydrationBoundary(/*#__PURE__*/ jsx(RouterProvider, {
160
+ router: router
161
+ }), true);
162
+ return App ? /*#__PURE__*/ jsx(App, {
163
+ children: routerWrapper
164
+ }) : routerWrapper;
165
+ };
166
+ return (props)=>{
248
167
  const context = useContext(InternalRuntimeContext);
249
168
  const router = getRouterRuntimeState(context)?.instance;
250
169
  if (!router) return App ? /*#__PURE__*/ jsx(App, {
@@ -257,6 +176,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
257
176
  children: routerWrapper
258
177
  }) : routerWrapper;
259
178
  };
179
+ };
260
180
  return getRouteApp();
261
181
  });
262
182
  }
@@ -0,0 +1,41 @@
1
+ import "node:module";
2
+ import { getGlobalLayoutApp, getGlobalRoutes } from "@modern-js/runtime/context";
3
+ import { merge } from "@modern-js/runtime-utils/merge";
4
+ import { createTanstackRouteObjectsFromConfig } from "./utils.mjs";
5
+ function getMergedRouterConfig(api, userConfig) {
6
+ const pluginConfig = api.getRuntimeConfig();
7
+ return merge(pluginConfig.router || {}, userConfig);
8
+ }
9
+ function getFinalRouteConfig(mergedConfig) {
10
+ return {
11
+ routes: getGlobalRoutes(),
12
+ globalApp: getGlobalLayoutApp(),
13
+ ...mergedConfig.routesConfig
14
+ };
15
+ }
16
+ function getTanstackRouteConfig(api, userConfig) {
17
+ const mergedConfig = getMergedRouterConfig(api, userConfig);
18
+ const finalRouteConfig = getFinalRouteConfig(mergedConfig);
19
+ return {
20
+ mergedConfig,
21
+ finalRouteConfig,
22
+ hasConfiguredRoutes: Boolean(finalRouteConfig.routes) || Boolean(mergedConfig.createRoutes)
23
+ };
24
+ }
25
+ function createTanstackRouteObjects({ hooks, routeConfig, ssrMode }) {
26
+ const { mergedConfig, finalRouteConfig } = routeConfig;
27
+ const routeObjects = mergedConfig.createRoutes ? mergedConfig.createRoutes() : createTanstackRouteObjectsFromConfig({
28
+ routesConfig: finalRouteConfig,
29
+ ssrMode
30
+ }) || [];
31
+ return hooks.modifyRoutes.call(routeObjects);
32
+ }
33
+ function joinBasename(baseUrl, basename) {
34
+ const base = baseUrl || '/';
35
+ const normalizedBase = base.startsWith('/') ? base : `/${base}`;
36
+ const trimmedBase = normalizedBase.length > 1 ? normalizedBase.replace(/\/+$/g, '') : normalizedBase;
37
+ const trimmedBasename = basename.replace(/^\/+|\/+$/g, '');
38
+ if (!trimmedBasename) return trimmedBase || '/';
39
+ return `${trimmedBase}/${trimmedBasename}`.replace(/\/{2,}/g, '/');
40
+ }
41
+ export { createTanstackRouteObjects, getMergedRouterConfig, getTanstackRouteConfig, joinBasename };
@@ -1,6 +1,6 @@
1
1
  import "node:module";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import { Link } from "@tanstack/react-router";
3
+ import { useLinkProps } from "@tanstack/react-router";
4
4
  function resolvePreloadFromPrefetch(prefetch, preload) {
5
5
  if (void 0 !== preload) return preload;
6
6
  if ('none' === prefetch) return false;
@@ -8,12 +8,25 @@ function resolvePreloadFromPrefetch(prefetch, preload) {
8
8
  return 'viewport';
9
9
  }
10
10
  const LinkComponentImpl = (props)=>{
11
- const { prefetch, preload, ...rest } = props;
12
- return /*#__PURE__*/ jsx(Link, {
11
+ const { prefetch, preload, 'aria-current': ariaCurrentProp, ref, children, ...rest } = props;
12
+ const hasAriaCurrentOverride = 'aria-current' in props;
13
+ const linkOptions = {
13
14
  ...rest,
14
15
  preload: resolvePreloadFromPrefetch(prefetch, preload)
16
+ };
17
+ const linkProps = useLinkProps(linkOptions, ref);
18
+ const { disabled: _disabled, type: _type, ...anchorProps } = linkProps;
19
+ if (hasAriaCurrentOverride) if (false === ariaCurrentProp || void 0 === ariaCurrentProp) delete anchorProps['aria-current'];
20
+ else anchorProps['aria-current'] = ariaCurrentProp;
21
+ const resolvedChildren = 'function' == typeof children ? children({
22
+ isActive: 'active' === anchorProps['data-status'],
23
+ isTransitioning: 'transitioning' === anchorProps['data-transitioning']
24
+ }) : children;
25
+ return /*#__PURE__*/ jsx("a", {
26
+ ...anchorProps,
27
+ children: resolvedChildren
15
28
  });
16
29
  };
17
- const prefetchLink_Link = LinkComponentImpl;
30
+ const Link = LinkComponentImpl;
18
31
  const NavLink = LinkComponentImpl;
19
- export { NavLink, prefetchLink_Link as Link };
32
+ export { Link, NavLink };
@@ -1,19 +1,6 @@
1
1
  import "node:module";
2
2
  import { registerRouterProvider } from "@modern-js/runtime/context";
3
- import { Form, RouteActionResponseError, useFetcher } from "./dataMutation.mjs";
4
- import { Outlet } from "./outlet.mjs";
5
3
  import { tanstackRouterPlugin } from "./plugin.mjs";
6
- import { Link, NavLink } from "./prefetchLink.mjs";
7
4
  const tanstackRouterProviderFactory = (userConfig)=>tanstackRouterPlugin(userConfig);
8
5
  registerRouterProvider('tanstack', tanstackRouterProviderFactory);
9
- const COMPAT_BINDINGS_SLOT = Symbol.for('@modern-js/plugin-tanstack:runtime-compat-bindings');
10
- const tanstackRouterCompatBindings = {
11
- Form: Form,
12
- Link: Link,
13
- NavLink: NavLink,
14
- Outlet: Outlet,
15
- RouteActionResponseError: RouteActionResponseError,
16
- useFetcher: useFetcher
17
- };
18
- globalThis[COMPAT_BINDINGS_SLOT] ??= tanstackRouterCompatBindings;
19
- export { tanstackRouterCompatBindings };
6
+ export { tanstackRouterProviderFactory };
@@ -0,0 +1,56 @@
1
+ import "node:module";
2
+ import { createElement } from "react";
3
+ function pickRouteModuleComponent(routeModule, seen = new Set()) {
4
+ if ('function' == typeof routeModule || routeModule && 'object' == typeof routeModule && '$$typeof' in routeModule) return routeModule;
5
+ if (!routeModule || 'object' != typeof routeModule) return;
6
+ if (seen.has(routeModule)) return;
7
+ seen.add(routeModule);
8
+ const module = routeModule;
9
+ for (const candidate of [
10
+ module.default,
11
+ module.Component
12
+ ]){
13
+ const component = pickRouteModuleComponent(candidate, seen);
14
+ if (component) return component;
15
+ }
16
+ }
17
+ function createServerLazyImportComponent(lazyImport, fallbackComponent) {
18
+ if ("u" > typeof document) return fallbackComponent;
19
+ let resolvedComponent;
20
+ let pendingLoad;
21
+ const load = async ()=>{
22
+ if (resolvedComponent) return resolvedComponent;
23
+ const routeModule = await lazyImport();
24
+ const component = pickRouteModuleComponent(routeModule);
25
+ if (component) resolvedComponent = component;
26
+ return resolvedComponent;
27
+ };
28
+ const Component = (props)=>{
29
+ if (resolvedComponent) return createElement(resolvedComponent, props);
30
+ pendingLoad ||= load();
31
+ throw pendingLoad;
32
+ };
33
+ Component.load = load;
34
+ Component.preload = load;
35
+ return Component;
36
+ }
37
+ function toRouteComponent(routeObject, options = {}) {
38
+ const route = routeObject;
39
+ const lazyImport = 'function' == typeof route.lazyImport ? route.lazyImport : void 0;
40
+ const routeComponent = route.Component || route.component;
41
+ const fallbackComponent = routeComponent ? routeComponent : route.element ? ()=>route.element : void 0;
42
+ if (lazyImport && fallbackComponent) return createServerLazyImportComponent(lazyImport, fallbackComponent);
43
+ if (routeComponent) return routeComponent;
44
+ const element = route.element;
45
+ if (element) return ()=>element;
46
+ }
47
+ function toErrorComponent(routeObject) {
48
+ const route = routeObject;
49
+ if (route.ErrorBoundary) return route.ErrorBoundary;
50
+ if (route.errorElement) return ()=>route.errorElement;
51
+ }
52
+ function toPendingComponent(routeObject) {
53
+ const route = routeObject;
54
+ return route.HydrateFallback || route.pendingComponent || void 0;
55
+ }
56
+ export { pickRouteModuleComponent, toErrorComponent, toPendingComponent, toRouteComponent };
@@ -0,0 +1,112 @@
1
+ import "node:module";
2
+ import { DefaultNotFound } from "@modern-js/runtime/context";
3
+ import { rootRouteId } from "@tanstack/react-router";
4
+ import { withModernRouteMatchContext } from "../outlet.mjs";
5
+ import { toErrorComponent, toPendingComponent, toRouteComponent } from "./components.mjs";
6
+ import { createModernShouldReload, wrapRouteObjectLoader } from "./loaders.mjs";
7
+ import { isRouteObjectPathlessLayout, toTanstackPath } from "./paths.mjs";
8
+ import { createRouteStaticData, mergeModernRouteHandle } from "./staticData.mjs";
9
+ import { createTanstackRootRoute, createTanstackRoute, wrapRouteComponentWithModernContext } from "./tanstackRoutes.mjs";
10
+ function createRouteFromRouteObject(opts) {
11
+ const { options = {}, parent, pathlessFallbackId = 'pathless', routeObject } = opts;
12
+ const modernRouteObject = routeObject;
13
+ const revalidationState = {};
14
+ const shouldRevalidate = modernRouteObject.shouldRevalidate;
15
+ const shouldReload = createModernShouldReload(shouldRevalidate, revalidationState);
16
+ const stableFallbackId = routeObject.id || modernRouteObject.file || pathlessFallbackId;
17
+ const component = toRouteComponent(routeObject, options);
18
+ const base = {
19
+ getParentRoute: ()=>parent,
20
+ component,
21
+ pendingComponent: toPendingComponent(routeObject),
22
+ errorComponent: toErrorComponent(routeObject),
23
+ validateSearch: modernRouteObject.validateSearch,
24
+ loaderDeps: modernRouteObject.loaderDeps,
25
+ staticData: createRouteStaticData({
26
+ modernRouteId: routeObject.id,
27
+ modernRouteAction: modernRouteObject.action,
28
+ modernRouteHandle: mergeModernRouteHandle(modernRouteObject),
29
+ modernRouteHasAction: modernRouteObject.hasAction || Boolean(modernRouteObject.action),
30
+ modernRouteHasClientLoader: modernRouteObject.hasClientLoader || void 0 !== modernRouteObject.clientData,
31
+ modernRouteHasLoader: modernRouteObject.hasLoader || 'function' == typeof modernRouteObject.loader,
32
+ modernRouteIsClientComponent: modernRouteObject.isClientComponent,
33
+ modernRouteLoader: modernRouteObject.loader,
34
+ modernRouteShouldRevalidate: shouldRevalidate
35
+ }),
36
+ loader: wrapRouteObjectLoader(routeObject, revalidationState, options)
37
+ };
38
+ if (modernRouteObject.inValidSSRRoute) base.ssr = false;
39
+ if (shouldReload) base.shouldReload = shouldReload;
40
+ if (isRouteObjectPathlessLayout(routeObject)) base.id = stableFallbackId;
41
+ else base.path = routeObject.index ? '/' : toTanstackPath(routeObject.path || '');
42
+ const route = createTanstackRoute(base);
43
+ wrapRouteComponentWithModernContext(route, component, routeObject.id);
44
+ const children = routeObject.children;
45
+ if (children && children.length > 0) {
46
+ const childRoutes = children.map((child, index)=>createRouteFromRouteObject({
47
+ options,
48
+ parent: route,
49
+ pathlessFallbackId: `pathless-${index}`,
50
+ routeObject: child
51
+ }));
52
+ route.addChildren(childRoutes);
53
+ }
54
+ return route;
55
+ }
56
+ function getRootLikeRouteObject(routes) {
57
+ return routes.find((route)=>'/' === route.path && !route.index);
58
+ }
59
+ function createRouteTreeFromRouteObjects(routes, options = {}) {
60
+ const rootLikeRoute = getRootLikeRouteObject(routes);
61
+ const rootRevalidationState = {};
62
+ const rootShouldRevalidate = rootLikeRoute?.shouldRevalidate;
63
+ const rootShouldReload = createModernShouldReload(rootShouldRevalidate, rootRevalidationState);
64
+ const rootComponent = rootLikeRoute ? toRouteComponent(rootLikeRoute) : void 0;
65
+ const rootRouteOptions = {
66
+ component: rootComponent,
67
+ pendingComponent: rootLikeRoute ? toPendingComponent(rootLikeRoute) : void 0,
68
+ errorComponent: rootLikeRoute ? toErrorComponent(rootLikeRoute) : void 0,
69
+ validateSearch: rootLikeRoute?.validateSearch,
70
+ loaderDeps: rootLikeRoute?.loaderDeps,
71
+ notFoundComponent: DefaultNotFound,
72
+ staticData: createRouteStaticData({
73
+ modernRouteId: rootLikeRoute?.id,
74
+ modernRouteAction: rootLikeRoute?.action,
75
+ modernRouteHandle: rootLikeRoute ? mergeModernRouteHandle(rootLikeRoute) : void 0,
76
+ modernRouteHasAction: rootLikeRoute?.hasAction || Boolean(rootLikeRoute?.action),
77
+ modernRouteHasClientLoader: rootLikeRoute?.hasClientLoader || void 0 !== rootLikeRoute?.clientData,
78
+ modernRouteHasLoader: rootLikeRoute?.hasLoader || 'function' == typeof rootLikeRoute?.loader,
79
+ modernRouteIsClientComponent: rootLikeRoute?.isClientComponent,
80
+ modernRouteLoader: rootLikeRoute?.loader,
81
+ modernRouteShouldRevalidate: rootShouldRevalidate
82
+ }),
83
+ loader: rootLikeRoute ? wrapRouteObjectLoader(rootLikeRoute, rootRevalidationState, options) : void 0
84
+ };
85
+ if (rootShouldReload) rootRouteOptions.shouldReload = rootShouldReload;
86
+ if (rootLikeRoute?.inValidSSRRoute) rootRouteOptions.ssr = false;
87
+ const rootRoute = createTanstackRootRoute(rootRouteOptions);
88
+ if (rootComponent) rootRoute.options.component = withModernRouteMatchContext(rootComponent, rootRouteId);
89
+ const topLevel = rootLikeRoute ? [
90
+ ...rootLikeRoute.children || [],
91
+ ...routes.filter((route)=>route !== rootLikeRoute)
92
+ ] : routes;
93
+ const childRoutes = topLevel.map((routeObject, index)=>createRouteFromRouteObject({
94
+ options,
95
+ parent: rootRoute,
96
+ pathlessFallbackId: `pathless-${index}`,
97
+ routeObject
98
+ }));
99
+ rootRoute.addChildren(childRoutes);
100
+ return rootRoute;
101
+ }
102
+ function getModernRouteIdsFromMatches(router) {
103
+ const matches = router.state.matches || [];
104
+ const routesById = router.routesById;
105
+ const ids = matches.map((match)=>{
106
+ const normalizedMatch = match;
107
+ const routeId = 'string' == typeof normalizedMatch.routeId ? normalizedMatch.routeId : void 0;
108
+ return normalizedMatch.route?.options?.staticData?.modernRouteId ?? (routeId ? routesById?.[routeId]?.options?.staticData?.modernRouteId : void 0);
109
+ }).filter((id)=>'string' == typeof id);
110
+ return Array.from(new Set(ids));
111
+ }
112
+ export { createRouteTreeFromRouteObjects, getModernRouteIdsFromMatches };
@@ -0,0 +1,3 @@
1
+ import "node:module";
2
+ export { pickRouteModuleComponent } from "./components.mjs";
3
+ export { createRouteTreeFromRouteObjects, getModernRouteIdsFromMatches } from "./construction.mjs";
@@ -0,0 +1,118 @@
1
+ import "node:module";
2
+ import { notFound } from "@tanstack/react-router";
3
+ import { isRedirectResponse, isResponse, isTanstackRedirect, throwTanstackRedirect } from "../loaderBridge.mjs";
4
+ import { isTanstackRscPayloadNavigationEnabled, loadTanstackRscRouteData } from "../rsc/payloadRouter.mjs";
5
+ function isModernDeferredData(value) {
6
+ if (!value || 'object' != typeof value) return false;
7
+ const deferred = value;
8
+ return true === deferred.__modern_deferred && Boolean(deferred.data) && 'object' == typeof deferred.data && !Array.isArray(deferred.data);
9
+ }
10
+ function normalizeModernLoaderResult(result) {
11
+ return isModernDeferredData(result) ? result.data : result;
12
+ }
13
+ function normalizeModernLoaderResponse(result) {
14
+ if (isResponse(result)) {
15
+ if (isRedirectResponse(result)) {
16
+ const location = result.headers.get('Location') || '/';
17
+ throwTanstackRedirect(location);
18
+ }
19
+ if (404 === result.status) throw notFound();
20
+ }
21
+ return normalizeModernLoaderResult(result);
22
+ }
23
+ function createModernRequest(input, signal) {
24
+ return new Request(input, {
25
+ signal
26
+ });
27
+ }
28
+ function getModernUrlFromLoaderContext(ctx) {
29
+ const href = 'string' == typeof ctx?.location ? ctx.location : ctx?.location?.publicHref || ctx?.location?.href || ctx?.location?.url?.href || '/';
30
+ const baseRequest = ctx?.context?.request instanceof Request ? ctx.context.request : void 0;
31
+ const baseUrl = baseRequest?.url || ("u" > typeof window ? window.origin : 'http://localhost');
32
+ return new URL(href || '/', baseUrl);
33
+ }
34
+ function rememberRouteLocation(state, ctx) {
35
+ state.currentUrl = getModernUrlFromLoaderContext(ctx);
36
+ state.currentParams = ctx?.params || {};
37
+ }
38
+ function createModernShouldReload(shouldRevalidate, state) {
39
+ if ('function' != typeof shouldRevalidate) return;
40
+ const revalidate = shouldRevalidate;
41
+ return (ctx)=>{
42
+ const nextUrl = getModernUrlFromLoaderContext(ctx);
43
+ const nextParams = ctx?.params || {};
44
+ const result = revalidate({
45
+ currentUrl: state.currentUrl || nextUrl,
46
+ currentParams: state.currentParams || nextParams,
47
+ nextUrl,
48
+ nextParams,
49
+ defaultShouldRevalidate: void 0
50
+ });
51
+ state.currentUrl = nextUrl;
52
+ state.currentParams = nextParams;
53
+ return 'boolean' == typeof result ? result : void 0;
54
+ };
55
+ }
56
+ function isRouteObjectSplatRoute(route) {
57
+ return 'string' == typeof route.path && route.path.includes('*');
58
+ }
59
+ function mapParamsForRouteObjectLoader({ route, params }) {
60
+ if (isRouteObjectSplatRoute(route)) {
61
+ const { _splat, ...rest } = params;
62
+ if (void 0 !== _splat) return {
63
+ ...rest,
64
+ '*': _splat
65
+ };
66
+ return rest;
67
+ }
68
+ return params;
69
+ }
70
+ function wrapRouteObjectLoader(route, revalidationState, options = {}) {
71
+ const modernRoute = route;
72
+ const routeLoader = modernRoute.loader;
73
+ if ('function' != typeof routeLoader) return;
74
+ return async (ctx)=>{
75
+ try {
76
+ if (revalidationState) rememberRouteLocation(revalidationState, ctx);
77
+ if ('function' == typeof modernRoute.lazyImport) try {
78
+ await modernRoute.lazyImport();
79
+ } catch {}
80
+ const signal = ctx?.abortController?.signal || ctx?.signal || new AbortController().signal;
81
+ const baseRequest = ctx?.context?.request instanceof Request ? ctx.context.request : void 0;
82
+ const href = 'string' == typeof ctx?.location ? ctx.location : ctx?.location?.publicHref || ctx?.location?.href || ctx?.location?.url?.href || '';
83
+ const request = void 0 !== baseRequest ? new Request(baseRequest, {
84
+ signal
85
+ }) : createModernRequest(href, signal);
86
+ const params = mapParamsForRouteObjectLoader({
87
+ route,
88
+ params: ctx.params || {}
89
+ });
90
+ const loadModernData = async ()=>{
91
+ const result = await routeLoader({
92
+ request,
93
+ params,
94
+ context: ctx?.context?.requestContext
95
+ });
96
+ return normalizeModernLoaderResponse(result);
97
+ };
98
+ if (options.rscPayloadRouter && isTanstackRscPayloadNavigationEnabled()) return loadTanstackRscRouteData({
99
+ hasClientLoader: modernRoute.hasClientLoader || void 0 !== modernRoute.clientData,
100
+ loadClientData: loadModernData,
101
+ request,
102
+ routeId: ctx.route?.id
103
+ });
104
+ return loadModernData();
105
+ } catch (err) {
106
+ if (isResponse(err)) {
107
+ if (isTanstackRedirect(err)) throw err;
108
+ if (isRedirectResponse(err)) {
109
+ const location = err.headers.get('Location') || '/';
110
+ throwTanstackRedirect(location);
111
+ }
112
+ if (404 === err.status) throw notFound();
113
+ }
114
+ throw err;
115
+ }
116
+ };
117
+ }
118
+ export { createModernShouldReload, wrapRouteObjectLoader };
@@ -0,0 +1,17 @@
1
+ import "node:module";
2
+ function toTanstackPath(pathname) {
3
+ return pathname.split('/').map((segment)=>{
4
+ if (!segment) return segment;
5
+ if ('*' === segment) return '$';
6
+ if (segment.startsWith(':')) {
7
+ const name = segment.slice(1);
8
+ if (name.endsWith('?')) return `{-$${name.slice(0, -1)}}`;
9
+ return `$${name}`;
10
+ }
11
+ return segment;
12
+ }).join('/');
13
+ }
14
+ function isRouteObjectPathlessLayout(route) {
15
+ return !route.path && !route.index;
16
+ }
17
+ export { isRouteObjectPathlessLayout, toTanstackPath };