@bleedingdev/modern-js-plugin-tanstack 3.5.0-ultramodern.3 → 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 (230) 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 +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 +45 -125
  15. package/dist/cjs/runtime/pluginShared.js +90 -0
  16. package/dist/cjs/runtime/prefetchLink.js +15 -2
  17. package/dist/cjs/runtime/routeTree/components.js +102 -0
  18. package/dist/cjs/runtime/routeTree/construction.js +152 -0
  19. package/dist/cjs/runtime/routeTree/index.js +47 -0
  20. package/dist/cjs/runtime/routeTree/loaders.js +158 -0
  21. package/dist/cjs/runtime/routeTree/paths.js +57 -0
  22. package/dist/cjs/runtime/routeTree/staticData.js +63 -0
  23. package/dist/cjs/runtime/routeTree/tanstackRoutes.js +57 -0
  24. package/dist/cjs/runtime/routeTree/types.js +18 -0
  25. package/dist/cjs/runtime/routeTree.js +7 -320
  26. package/dist/cjs/runtime/rsc/CompositeComponent.js +18 -13
  27. package/dist/cjs/runtime/rsc/RscNodeRenderer.js +5 -16
  28. package/dist/cjs/runtime/rsc/client.js +8 -25
  29. package/dist/cjs/runtime/rsc/flightSerialization.js +132 -0
  30. package/dist/cjs/runtime/rsc/payloadErrors.js +99 -0
  31. package/dist/cjs/runtime/rsc/payloadFetch.js +117 -0
  32. package/dist/cjs/runtime/rsc/payloadRouter.js +21 -142
  33. package/dist/cjs/runtime/rsc/payloadRoutes.js +106 -0
  34. package/dist/cjs/runtime/rsc/payloadStorage.js +58 -0
  35. package/dist/cjs/runtime/rsc/server.js +14 -18
  36. package/dist/cjs/runtime/rsc/shared.js +71 -0
  37. package/dist/cjs/runtime/rsc/treeGetter.js +72 -0
  38. package/dist/cjs/runtime/ssrManagedTags.js +103 -0
  39. package/dist/cjs/runtime/ssrPreload.js +89 -0
  40. package/dist/cjs/runtime/ssrTypes.js +18 -0
  41. package/dist/cjs/runtime/submitAction.js +161 -0
  42. package/dist/cjs/runtime/utils.js +49 -86
  43. package/dist/esm/cli/artifacts.mjs +103 -0
  44. package/dist/esm/cli/index.mjs +4 -78
  45. package/dist/esm/cli/tanstackTypes/canonicalRoutes.mjs +75 -0
  46. package/dist/esm/cli/tanstackTypes/shared.mjs +68 -0
  47. package/dist/esm/cli/tanstackTypes/source.mjs +203 -0
  48. package/dist/esm/cli/tanstackTypes.mjs +2 -339
  49. package/dist/esm/runtime/blockingSubscribe.mjs +19 -0
  50. package/dist/esm/runtime/clientBasepath.mjs +10 -0
  51. package/dist/esm/runtime/clientHydration.mjs +70 -0
  52. package/dist/esm/runtime/dataMutation.mjs +2 -167
  53. package/dist/esm/runtime/formData.mjs +63 -0
  54. package/dist/esm/runtime/loaderBridge.mjs +4 -1
  55. package/dist/esm/runtime/plugin.mjs +14 -118
  56. package/dist/esm/runtime/plugin.node.mjs +41 -121
  57. package/dist/esm/runtime/pluginShared.mjs +40 -0
  58. package/dist/esm/runtime/prefetchLink.mjs +18 -5
  59. package/dist/esm/runtime/routeTree/components.mjs +55 -0
  60. package/dist/esm/runtime/routeTree/construction.mjs +111 -0
  61. package/dist/esm/runtime/routeTree/index.mjs +2 -0
  62. package/dist/esm/runtime/routeTree/loaders.mjs +117 -0
  63. package/dist/esm/runtime/routeTree/paths.mjs +16 -0
  64. package/dist/esm/runtime/routeTree/staticData.mjs +22 -0
  65. package/dist/esm/runtime/routeTree/tanstackRoutes.mjs +13 -0
  66. package/dist/esm/runtime/routeTree/types.mjs +0 -0
  67. package/dist/esm/runtime/routeTree.mjs +1 -318
  68. package/dist/esm/runtime/rsc/CompositeComponent.mjs +18 -13
  69. package/dist/esm/runtime/rsc/RscNodeRenderer.mjs +4 -15
  70. package/dist/esm/runtime/rsc/client.mjs +6 -26
  71. package/dist/esm/runtime/rsc/flightSerialization.mjs +88 -0
  72. package/dist/esm/runtime/rsc/payloadErrors.mjs +49 -0
  73. package/dist/esm/runtime/rsc/payloadFetch.mjs +61 -0
  74. package/dist/esm/runtime/rsc/payloadRouter.mjs +12 -133
  75. package/dist/esm/runtime/rsc/payloadRoutes.mjs +50 -0
  76. package/dist/esm/runtime/rsc/payloadStorage.mjs +14 -0
  77. package/dist/esm/runtime/rsc/server.mjs +17 -21
  78. package/dist/esm/runtime/rsc/shared.mjs +21 -0
  79. package/dist/esm/runtime/rsc/treeGetter.mjs +34 -0
  80. package/dist/esm/runtime/ssrManagedTags.mjs +53 -0
  81. package/dist/esm/runtime/ssrPreload.mjs +51 -0
  82. package/dist/esm/runtime/ssrTypes.mjs +0 -0
  83. package/dist/esm/runtime/submitAction.mjs +120 -0
  84. package/dist/esm/runtime/utils.mjs +47 -75
  85. package/dist/esm-node/cli/artifacts.mjs +104 -0
  86. package/dist/esm-node/cli/index.mjs +4 -78
  87. package/dist/esm-node/cli/tanstackTypes/canonicalRoutes.mjs +76 -0
  88. package/dist/esm-node/cli/tanstackTypes/shared.mjs +69 -0
  89. package/dist/esm-node/cli/tanstackTypes/source.mjs +204 -0
  90. package/dist/esm-node/cli/tanstackTypes.mjs +2 -339
  91. package/dist/esm-node/runtime/blockingSubscribe.mjs +20 -0
  92. package/dist/esm-node/runtime/clientBasepath.mjs +11 -0
  93. package/dist/esm-node/runtime/clientHydration.mjs +71 -0
  94. package/dist/esm-node/runtime/dataMutation.mjs +2 -167
  95. package/dist/esm-node/runtime/formData.mjs +64 -0
  96. package/dist/esm-node/runtime/loaderBridge.mjs +4 -1
  97. package/dist/esm-node/runtime/plugin.mjs +14 -118
  98. package/dist/esm-node/runtime/plugin.node.mjs +41 -121
  99. package/dist/esm-node/runtime/pluginShared.mjs +41 -0
  100. package/dist/esm-node/runtime/prefetchLink.mjs +18 -5
  101. package/dist/esm-node/runtime/routeTree/components.mjs +56 -0
  102. package/dist/esm-node/runtime/routeTree/construction.mjs +112 -0
  103. package/dist/esm-node/runtime/routeTree/index.mjs +3 -0
  104. package/dist/esm-node/runtime/routeTree/loaders.mjs +118 -0
  105. package/dist/esm-node/runtime/routeTree/paths.mjs +17 -0
  106. package/dist/esm-node/runtime/routeTree/staticData.mjs +23 -0
  107. package/dist/esm-node/runtime/routeTree/tanstackRoutes.mjs +14 -0
  108. package/dist/esm-node/runtime/routeTree/types.mjs +1 -0
  109. package/dist/esm-node/runtime/routeTree.mjs +1 -318
  110. package/dist/esm-node/runtime/rsc/CompositeComponent.mjs +18 -13
  111. package/dist/esm-node/runtime/rsc/RscNodeRenderer.mjs +4 -15
  112. package/dist/esm-node/runtime/rsc/client.mjs +6 -26
  113. package/dist/esm-node/runtime/rsc/flightSerialization.mjs +89 -0
  114. package/dist/esm-node/runtime/rsc/payloadErrors.mjs +50 -0
  115. package/dist/esm-node/runtime/rsc/payloadFetch.mjs +62 -0
  116. package/dist/esm-node/runtime/rsc/payloadRouter.mjs +12 -133
  117. package/dist/esm-node/runtime/rsc/payloadRoutes.mjs +51 -0
  118. package/dist/esm-node/runtime/rsc/payloadStorage.mjs +15 -0
  119. package/dist/esm-node/runtime/rsc/server.mjs +17 -21
  120. package/dist/esm-node/runtime/rsc/shared.mjs +22 -0
  121. package/dist/esm-node/runtime/rsc/treeGetter.mjs +35 -0
  122. package/dist/esm-node/runtime/ssrManagedTags.mjs +54 -0
  123. package/dist/esm-node/runtime/ssrPreload.mjs +52 -0
  124. package/dist/esm-node/runtime/ssrTypes.mjs +1 -0
  125. package/dist/esm-node/runtime/submitAction.mjs +121 -0
  126. package/dist/esm-node/runtime/utils.mjs +47 -75
  127. package/dist/types/cli/artifacts.d.ts +33 -0
  128. package/dist/types/cli/index.d.ts +2 -22
  129. package/dist/types/cli/tanstackTypes/canonicalRoutes.d.ts +22 -0
  130. package/dist/types/cli/tanstackTypes/shared.d.ts +20 -0
  131. package/dist/types/cli/tanstackTypes/source.d.ts +10 -0
  132. package/dist/types/cli/tanstackTypes.d.ts +3 -31
  133. package/dist/types/runtime/blockingSubscribe.d.ts +3 -0
  134. package/dist/types/runtime/clientBasepath.d.ts +1 -0
  135. package/dist/types/runtime/clientHydration.d.ts +19 -0
  136. package/dist/types/runtime/dataMutation.d.ts +3 -12
  137. package/dist/types/runtime/formData.d.ts +23 -0
  138. package/dist/types/runtime/plugin.d.ts +1 -1
  139. package/dist/types/runtime/plugin.node.d.ts +1 -1
  140. package/dist/types/runtime/pluginShared.d.ts +39 -0
  141. package/dist/types/runtime/routeTree/components.d.ts +7 -0
  142. package/dist/types/runtime/routeTree/construction.d.ts +5 -0
  143. package/dist/types/runtime/routeTree/index.d.ts +2 -0
  144. package/dist/types/runtime/routeTree/loaders.d.ts +4 -0
  145. package/dist/types/runtime/routeTree/paths.d.ts +3 -0
  146. package/dist/types/runtime/routeTree/staticData.d.ts +19 -0
  147. package/dist/types/runtime/routeTree/tanstackRoutes.d.ts +4 -0
  148. package/dist/types/runtime/routeTree/types.d.ts +75 -0
  149. package/dist/types/runtime/routeTree.d.ts +1 -9
  150. package/dist/types/runtime/rsc/CompositeComponent.d.ts +1 -2
  151. package/dist/types/runtime/rsc/RscNodeRenderer.d.ts +2 -3
  152. package/dist/types/runtime/rsc/client.d.ts +2 -0
  153. package/dist/types/runtime/rsc/flightSerialization.d.ts +3 -0
  154. package/dist/types/runtime/rsc/payloadErrors.d.ts +6 -0
  155. package/dist/types/runtime/rsc/payloadFetch.d.ts +10 -0
  156. package/dist/types/runtime/rsc/payloadRouter.d.ts +2 -10
  157. package/dist/types/runtime/rsc/payloadRoutes.d.ts +43 -0
  158. package/dist/types/runtime/rsc/payloadStorage.d.ts +5 -0
  159. package/dist/types/runtime/rsc/shared.d.ts +19 -0
  160. package/dist/types/runtime/rsc/treeGetter.d.ts +1 -0
  161. package/dist/types/runtime/ssrManagedTags.d.ts +7 -0
  162. package/dist/types/runtime/ssrPreload.d.ts +2 -0
  163. package/dist/types/runtime/ssrTypes.d.ts +43 -0
  164. package/dist/types/runtime/state.d.ts +1 -1
  165. package/dist/types/runtime/submitAction.d.ts +14 -0
  166. package/dist/types/runtime/types.d.ts +4 -9
  167. package/dist/types/runtime/utils.d.ts +4 -24
  168. package/package.json +30 -8
  169. package/rstest.config.mts +3 -0
  170. package/src/cli/artifacts.ts +255 -0
  171. package/src/cli/index.ts +7 -185
  172. package/src/cli/tanstackTypes/canonicalRoutes.ts +157 -0
  173. package/src/cli/tanstackTypes/shared.ts +119 -0
  174. package/src/cli/tanstackTypes/source.ts +405 -0
  175. package/src/cli/tanstackTypes.ts +4 -647
  176. package/src/runtime/blockingSubscribe.ts +48 -0
  177. package/src/runtime/clientBasepath.ts +12 -0
  178. package/src/runtime/clientHydration.ts +151 -0
  179. package/src/runtime/dataMutation.tsx +9 -306
  180. package/src/runtime/formData.ts +153 -0
  181. package/src/runtime/loaderBridge.ts +8 -3
  182. package/src/runtime/plugin.node.tsx +76 -291
  183. package/src/runtime/plugin.tsx +21 -257
  184. package/src/runtime/pluginShared.ts +112 -0
  185. package/src/runtime/prefetchLink.tsx +78 -15
  186. package/src/runtime/routeTree/components.ts +130 -0
  187. package/src/runtime/routeTree/construction.ts +238 -0
  188. package/src/runtime/routeTree/index.ts +7 -0
  189. package/src/runtime/routeTree/loaders.ts +232 -0
  190. package/src/runtime/routeTree/paths.ts +36 -0
  191. package/src/runtime/routeTree/staticData.ts +66 -0
  192. package/src/runtime/routeTree/tanstackRoutes.ts +36 -0
  193. package/src/runtime/routeTree/types.ts +87 -0
  194. package/src/runtime/routeTree.ts +5 -750
  195. package/src/runtime/rsc/CompositeComponent.tsx +29 -20
  196. package/src/runtime/rsc/RscNodeRenderer.tsx +9 -27
  197. package/src/runtime/rsc/client.tsx +12 -40
  198. package/src/runtime/rsc/flightSerialization.ts +158 -0
  199. package/src/runtime/rsc/payloadErrors.ts +73 -0
  200. package/src/runtime/rsc/payloadFetch.ts +97 -0
  201. package/src/runtime/rsc/payloadRouter.ts +29 -234
  202. package/src/runtime/rsc/payloadRoutes.ts +122 -0
  203. package/src/runtime/rsc/payloadStorage.ts +35 -0
  204. package/src/runtime/rsc/server.tsx +20 -29
  205. package/src/runtime/rsc/shared.ts +70 -0
  206. package/src/runtime/rsc/treeGetter.tsx +52 -0
  207. package/src/runtime/ssrManagedTags.ts +107 -0
  208. package/src/runtime/ssrPreload.ts +125 -0
  209. package/src/runtime/ssrTypes.ts +51 -0
  210. package/src/runtime/state.ts +4 -2
  211. package/src/runtime/submitAction.ts +194 -0
  212. package/src/runtime/types.ts +6 -13
  213. package/src/runtime/utils.tsx +76 -110
  214. package/src/types/react-server-dom-rspack.d.ts +56 -0
  215. package/tests/castRatchet.test.ts +85 -0
  216. package/tests/router/cli.test.ts +7 -0
  217. package/tests/router/dataMutation.test.tsx +59 -0
  218. package/tests/router/fixtures/router-gen.golden.txt +72 -0
  219. package/tests/router/generateRouteArtifacts.test.ts +106 -0
  220. package/tests/router/loaderBridge.test.ts +21 -0
  221. package/tests/router/prefetchLink.test.tsx +106 -59
  222. package/tests/router/prefetchLinkPreload.test.tsx +85 -0
  223. package/tests/router/routeTree.test.ts +46 -11
  224. package/tests/router/rsc.test.tsx +189 -0
  225. package/tests/router/ssrPreload.test.ts +30 -0
  226. package/tests/router/tanstackTypes.test.ts +254 -1
  227. package/dist/esm/runtime/pluginCore.mjs +0 -14
  228. package/dist/esm-node/runtime/pluginCore.mjs +0 -15
  229. package/dist/types/runtime/pluginCore.d.ts +0 -21
  230. package/src/runtime/pluginCore.ts +0 -48
@@ -1,319 +1,2 @@
1
1
  import "node:module";
2
- import { DefaultNotFound } from "@modern-js/runtime/context";
3
- import { createRootRoute, createRoute, notFound, rootRouteId } from "@tanstack/react-router";
4
- import { createElement } from "react";
5
- import { isRedirectResponse, isResponse, isTanstackRedirect, throwTanstackRedirect } from "./loaderBridge.mjs";
6
- import { withModernRouteMatchContext } from "./outlet.mjs";
7
- import { isTanstackRscPayloadNavigationEnabled, loadTanstackRscRouteData } from "./rsc/payloadRouter.mjs";
8
- function createTanstackRoute(options) {
9
- return createRoute(options);
10
- }
11
- function createTanstackRootRoute(options) {
12
- return createRootRoute(options);
13
- }
14
- function wrapRouteComponentWithModernContext(route, component, routeId) {
15
- const routeMatchId = routeId || route.id;
16
- if (component && routeMatchId) route.options.component = withModernRouteMatchContext(component, routeMatchId);
17
- }
18
- function toTanstackPath(pathname) {
19
- return pathname.split('/').map((segment)=>{
20
- if (!segment) return segment;
21
- if ('*' === segment) return '$';
22
- if (segment.startsWith(':')) {
23
- const name = segment.slice(1);
24
- if (name.endsWith('?')) return `{-$${name.slice(0, -1)}}`;
25
- return `$${name}`;
26
- }
27
- return segment;
28
- }).join('/');
29
- }
30
- function isModernDeferredData(value) {
31
- if (!value || 'object' != typeof value) return false;
32
- const deferred = value;
33
- return true === deferred.__modern_deferred && Boolean(deferred.data) && 'object' == typeof deferred.data && !Array.isArray(deferred.data);
34
- }
35
- function normalizeModernLoaderResult(result) {
36
- return isModernDeferredData(result) ? result.data : result;
37
- }
38
- function normalizeModernLoaderResponse(result) {
39
- if (isResponse(result)) {
40
- if (isRedirectResponse(result)) {
41
- const location = result.headers.get('Location') || '/';
42
- throwTanstackRedirect(location);
43
- }
44
- if (404 === result.status) throw notFound();
45
- }
46
- return normalizeModernLoaderResult(result);
47
- }
48
- function pickRouteModuleComponent(routeModule, seen = new Set()) {
49
- if ('function' == typeof routeModule || routeModule && 'object' == typeof routeModule && '$$typeof' in routeModule) return routeModule;
50
- if (!routeModule || 'object' != typeof routeModule) return;
51
- if (seen.has(routeModule)) return;
52
- seen.add(routeModule);
53
- const module = routeModule;
54
- for (const candidate of [
55
- module.default,
56
- module.Component
57
- ]){
58
- const component = pickRouteModuleComponent(candidate, seen);
59
- if (component) return component;
60
- }
61
- }
62
- function createServerLazyImportComponent(lazyImport, fallbackComponent) {
63
- if ("u" > typeof document) return fallbackComponent;
64
- let resolvedComponent;
65
- let pendingLoad;
66
- const load = async ()=>{
67
- if (resolvedComponent) return resolvedComponent;
68
- const routeModule = await lazyImport();
69
- const component = pickRouteModuleComponent(routeModule);
70
- if (component) resolvedComponent = component;
71
- return resolvedComponent;
72
- };
73
- const Component = (props)=>{
74
- if (resolvedComponent) return createElement(resolvedComponent, props);
75
- pendingLoad ||= load();
76
- throw pendingLoad;
77
- };
78
- Component.load = load;
79
- Component.preload = load;
80
- return Component;
81
- }
82
- function createModernRequest(input, signal) {
83
- return new Request(input, {
84
- signal
85
- });
86
- }
87
- function getModernUrlFromLoaderContext(ctx) {
88
- const href = 'string' == typeof ctx?.location ? ctx.location : ctx?.location?.publicHref || ctx?.location?.href || ctx?.location?.url?.href || '/';
89
- const baseRequest = ctx?.context?.request instanceof Request ? ctx.context.request : void 0;
90
- const baseUrl = baseRequest?.url || ("u" > typeof window ? window.origin : 'http://localhost');
91
- return new URL(href || '/', baseUrl);
92
- }
93
- function rememberRouteLocation(state, ctx) {
94
- state.currentUrl = getModernUrlFromLoaderContext(ctx);
95
- state.currentParams = ctx?.params || {};
96
- }
97
- function createModernShouldReload(shouldRevalidate, state) {
98
- if ('function' != typeof shouldRevalidate) return;
99
- const revalidate = shouldRevalidate;
100
- return (ctx)=>{
101
- const nextUrl = getModernUrlFromLoaderContext(ctx);
102
- const nextParams = ctx?.params || {};
103
- const result = revalidate({
104
- currentUrl: state.currentUrl || nextUrl,
105
- currentParams: state.currentParams || nextParams,
106
- nextUrl,
107
- nextParams,
108
- defaultShouldRevalidate: void 0
109
- });
110
- state.currentUrl = nextUrl;
111
- state.currentParams = nextParams;
112
- return 'boolean' == typeof result ? result : void 0;
113
- };
114
- }
115
- function isRouteObjectPathlessLayout(route) {
116
- return !route.path && !route.index;
117
- }
118
- function isRouteObjectSplatRoute(route) {
119
- return 'string' == typeof route.path && route.path.includes('*');
120
- }
121
- function mapParamsForRouteObjectLoader({ route, params }) {
122
- if (isRouteObjectSplatRoute(route)) {
123
- const { _splat, ...rest } = params;
124
- if (void 0 !== _splat) return {
125
- ...rest,
126
- '*': _splat
127
- };
128
- return rest;
129
- }
130
- return params;
131
- }
132
- function wrapRouteObjectLoader(route, revalidationState, options = {}) {
133
- const modernRoute = route;
134
- const routeLoader = modernRoute.loader;
135
- if ('function' != typeof routeLoader) return;
136
- return async (ctx)=>{
137
- try {
138
- if (revalidationState) rememberRouteLocation(revalidationState, ctx);
139
- if ('function' == typeof modernRoute.lazyImport) try {
140
- await modernRoute.lazyImport();
141
- } catch {}
142
- const signal = ctx?.abortController?.signal || ctx?.signal || new AbortController().signal;
143
- const baseRequest = ctx?.context?.request instanceof Request ? ctx.context.request : void 0;
144
- const href = 'string' == typeof ctx?.location ? ctx.location : ctx?.location?.publicHref || ctx?.location?.href || ctx?.location?.url?.href || '';
145
- const request = void 0 !== baseRequest ? new Request(baseRequest, {
146
- signal
147
- }) : createModernRequest(href, signal);
148
- const params = mapParamsForRouteObjectLoader({
149
- route,
150
- params: ctx.params || {}
151
- });
152
- const loadModernData = async ()=>{
153
- const result = await routeLoader({
154
- request,
155
- params,
156
- context: ctx?.context?.requestContext
157
- });
158
- return normalizeModernLoaderResponse(result);
159
- };
160
- if (options.rscPayloadRouter && isTanstackRscPayloadNavigationEnabled()) return loadTanstackRscRouteData({
161
- hasClientLoader: modernRoute.hasClientLoader || void 0 !== modernRoute.clientData,
162
- loadClientData: loadModernData,
163
- request,
164
- routeId: ctx.route?.id
165
- });
166
- return loadModernData();
167
- } catch (err) {
168
- if (isResponse(err)) {
169
- if (isTanstackRedirect(err)) throw err;
170
- if (isRedirectResponse(err)) {
171
- const location = err.headers.get('Location') || '/';
172
- throwTanstackRedirect(location);
173
- }
174
- if (404 === err.status) throw notFound();
175
- }
176
- throw err;
177
- }
178
- };
179
- }
180
- function toRouteComponent(routeObject) {
181
- const route = routeObject;
182
- const lazyImport = 'function' == typeof route.lazyImport ? route.lazyImport : void 0;
183
- const fallbackComponent = route.Component ? route.Component : route.element ? ()=>route.element : void 0;
184
- if (lazyImport && fallbackComponent) return createServerLazyImportComponent(lazyImport, fallbackComponent);
185
- if (route.Component) return route.Component;
186
- const element = route.element;
187
- if (element) return ()=>element;
188
- }
189
- function toErrorComponent(routeObject) {
190
- const route = routeObject;
191
- if (route.ErrorBoundary) return route.ErrorBoundary;
192
- if (route.errorElement) return ()=>route.errorElement;
193
- }
194
- function toPendingComponent(routeObject) {
195
- const route = routeObject;
196
- return route.HydrateFallback || route.pendingComponent || void 0;
197
- }
198
- function mergeModernRouteHandle(route) {
199
- const config = route.config;
200
- const handle = {
201
- ...route.handle,
202
- ...config && 'object' == typeof config ? config.handle : {}
203
- };
204
- return Object.keys(handle).length > 0 ? handle : void 0;
205
- }
206
- function createRouteStaticData(opts) {
207
- const staticData = {};
208
- if (opts.modernRouteId) staticData.modernRouteId = opts.modernRouteId;
209
- if (opts.modernRouteAction) staticData.modernRouteAction = opts.modernRouteAction;
210
- if (opts.modernRouteHandle) staticData.modernRouteHandle = opts.modernRouteHandle;
211
- if (opts.modernRouteHasAction) staticData.modernRouteHasAction = true;
212
- if (opts.modernRouteHasClientLoader) staticData.modernRouteHasClientLoader = true;
213
- if (opts.modernRouteHasLoader) staticData.modernRouteHasLoader = true;
214
- if (opts.modernRouteIsClientComponent) staticData.modernRouteIsClientComponent = true;
215
- if (opts.modernRouteLoader) staticData.modernRouteLoader = opts.modernRouteLoader;
216
- if (opts.modernRouteShouldRevalidate) staticData.modernRouteShouldRevalidate = opts.modernRouteShouldRevalidate;
217
- return Object.keys(staticData).length > 0 ? staticData : void 0;
218
- }
219
- function createRouteFromRouteObject(opts) {
220
- const { options = {}, parent, routeObject } = opts;
221
- const modernRouteObject = routeObject;
222
- const revalidationState = {};
223
- const shouldRevalidate = modernRouteObject.shouldRevalidate;
224
- const shouldReload = createModernShouldReload(shouldRevalidate, revalidationState);
225
- const stableFallbackId = routeObject.id || modernRouteObject.file || routeObject.path || 'pathless';
226
- const component = toRouteComponent(routeObject);
227
- const base = {
228
- getParentRoute: ()=>parent,
229
- component,
230
- pendingComponent: toPendingComponent(routeObject),
231
- errorComponent: toErrorComponent(routeObject),
232
- validateSearch: modernRouteObject.validateSearch,
233
- loaderDeps: modernRouteObject.loaderDeps,
234
- staticData: createRouteStaticData({
235
- modernRouteId: routeObject.id,
236
- modernRouteAction: modernRouteObject.action,
237
- modernRouteHandle: mergeModernRouteHandle(modernRouteObject),
238
- modernRouteHasAction: modernRouteObject.hasAction || Boolean(modernRouteObject.action),
239
- modernRouteHasClientLoader: modernRouteObject.hasClientLoader || void 0 !== modernRouteObject.clientData,
240
- modernRouteHasLoader: modernRouteObject.hasLoader || 'function' == typeof modernRouteObject.loader,
241
- modernRouteIsClientComponent: modernRouteObject.isClientComponent,
242
- modernRouteLoader: modernRouteObject.loader,
243
- modernRouteShouldRevalidate: shouldRevalidate
244
- }),
245
- loader: wrapRouteObjectLoader(routeObject, revalidationState, options)
246
- };
247
- if (modernRouteObject.inValidSSRRoute) base.ssr = false;
248
- if (shouldReload) base.shouldReload = shouldReload;
249
- if (isRouteObjectPathlessLayout(routeObject)) base.id = stableFallbackId;
250
- else base.path = routeObject.index ? '/' : toTanstackPath(routeObject.path || '');
251
- const route = createTanstackRoute(base);
252
- wrapRouteComponentWithModernContext(route, component, routeObject.id);
253
- const children = routeObject.children;
254
- if (children && children.length > 0) {
255
- const childRoutes = children.map((child)=>createRouteFromRouteObject({
256
- options,
257
- parent: route,
258
- routeObject: child
259
- }));
260
- route.addChildren(childRoutes);
261
- }
262
- return route;
263
- }
264
- function getRootLikeRouteObject(routes) {
265
- return routes.find((route)=>'/' === route.path && !route.index);
266
- }
267
- function createRouteTreeFromRouteObjects(routes, options = {}) {
268
- const rootLikeRoute = getRootLikeRouteObject(routes);
269
- const rootRevalidationState = {};
270
- const rootShouldRevalidate = rootLikeRoute?.shouldRevalidate;
271
- const rootShouldReload = createModernShouldReload(rootShouldRevalidate, rootRevalidationState);
272
- const rootComponent = rootLikeRoute ? toRouteComponent(rootLikeRoute) : void 0;
273
- const rootRouteOptions = {
274
- component: rootComponent,
275
- pendingComponent: rootLikeRoute ? toPendingComponent(rootLikeRoute) : void 0,
276
- errorComponent: rootLikeRoute ? toErrorComponent(rootLikeRoute) : void 0,
277
- validateSearch: rootLikeRoute?.validateSearch,
278
- loaderDeps: rootLikeRoute?.loaderDeps,
279
- notFoundComponent: DefaultNotFound,
280
- staticData: createRouteStaticData({
281
- modernRouteId: rootLikeRoute?.id,
282
- modernRouteAction: rootLikeRoute?.action,
283
- modernRouteHandle: rootLikeRoute ? mergeModernRouteHandle(rootLikeRoute) : void 0,
284
- modernRouteHasAction: rootLikeRoute?.hasAction || Boolean(rootLikeRoute?.action),
285
- modernRouteHasClientLoader: rootLikeRoute?.hasClientLoader || void 0 !== rootLikeRoute?.clientData,
286
- modernRouteHasLoader: rootLikeRoute?.hasLoader || 'function' == typeof rootLikeRoute?.loader,
287
- modernRouteIsClientComponent: rootLikeRoute?.isClientComponent,
288
- modernRouteLoader: rootLikeRoute?.loader,
289
- modernRouteShouldRevalidate: rootShouldRevalidate
290
- }),
291
- loader: rootLikeRoute ? wrapRouteObjectLoader(rootLikeRoute, rootRevalidationState, options) : void 0
292
- };
293
- if (rootShouldReload) rootRouteOptions.shouldReload = rootShouldReload;
294
- if (rootLikeRoute?.inValidSSRRoute) rootRouteOptions.ssr = false;
295
- const rootRoute = createTanstackRootRoute(rootRouteOptions);
296
- if (rootComponent) rootRoute.options.component = withModernRouteMatchContext(rootComponent, rootRouteId);
297
- const topLevel = rootLikeRoute ? [
298
- ...rootLikeRoute.children || [],
299
- ...routes.filter((route)=>route !== rootLikeRoute)
300
- ] : routes;
301
- const childRoutes = topLevel.map((routeObject)=>createRouteFromRouteObject({
302
- options,
303
- parent: rootRoute,
304
- routeObject
305
- }));
306
- rootRoute.addChildren(childRoutes);
307
- return rootRoute;
308
- }
309
- function getModernRouteIdsFromMatches(router) {
310
- const matches = router.state.matches || [];
311
- const routesById = router.routesById;
312
- const ids = matches.map((match)=>{
313
- const normalizedMatch = match;
314
- const routeId = 'string' == typeof normalizedMatch.routeId ? normalizedMatch.routeId : void 0;
315
- return normalizedMatch.route?.options?.staticData?.modernRouteId ?? (routeId ? routesById?.[routeId]?.options?.staticData?.modernRouteId : void 0);
316
- }).filter((id)=>'string' == typeof id);
317
- return Array.from(new Set(ids));
318
- }
319
- export { createRouteTreeFromRouteObjects, getModernRouteIdsFromMatches };
2
+ export { createRouteTreeFromRouteObjects, getModernRouteIdsFromMatches, pickRouteModuleComponent } from "./routeTree/index.mjs";
@@ -3,22 +3,27 @@ import "node:module";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { Suspense } from "react";
5
5
  import { SlotProvider } from "./SlotContext.mjs";
6
- import { RSC_PROXY_GET_TREE, RSC_PROXY_PATH } from "./symbols.mjs";
7
- function EmptyFallback() {
8
- return null;
9
- }
10
- function selectTreePath(tree, path) {
11
- let current = tree;
12
- for (const key of path){
13
- if (null === current || 'object' != typeof current) return null;
14
- current = current[key];
6
+ import { EmptyFallback, renderSelectedTree } from "./shared.mjs";
7
+ import { RSC_PROXY_GET_TREE, SERVER_COMPONENT_STREAM } from "./symbols.mjs";
8
+ import { createTreeGetterFromFlightStream } from "./treeGetter.mjs";
9
+ const rawServerValueGetters = new WeakMap();
10
+ function getRawServerTreeGetter(src) {
11
+ if (!src || 'object' != typeof src && 'function' != typeof src) return;
12
+ const source = src;
13
+ const stream = source[SERVER_COMPONENT_STREAM];
14
+ if ('function' != typeof stream?.createReplayStream) return;
15
+ let getTree = rawServerValueGetters.get(src);
16
+ if (!getTree) {
17
+ getTree = createTreeGetterFromFlightStream(stream.createReplayStream());
18
+ rawServerValueGetters.set(src, getTree);
15
19
  }
16
- return current;
20
+ return getTree;
17
21
  }
18
22
  function CompositeInner({ slotProps, src, strict }) {
19
- const getTree = src[RSC_PROXY_GET_TREE];
20
- if (!getTree) throw new Error('CompositeComponent src must come from createCompositeComponent().');
21
- const tree = selectTreePath(getTree(), src[RSC_PROXY_PATH] || []);
23
+ const tree = renderSelectedTree(src, {
24
+ getTree: src[RSC_PROXY_GET_TREE] || getRawServerTreeGetter(src),
25
+ missingTreeError: 'CompositeComponent src must come from createCompositeComponent().'
26
+ });
22
27
  return /*#__PURE__*/ jsx(SlotProvider, {
23
28
  implementations: slotProps,
24
29
  strict: strict,
@@ -2,23 +2,12 @@ import "node:module";
2
2
  "use client";
3
3
  import { Fragment, jsx } from "react/jsx-runtime";
4
4
  import { Suspense } from "react";
5
- import { RSC_PROXY_GET_TREE, RSC_PROXY_PATH } from "./symbols.mjs";
6
- function EmptyFallback() {
7
- return null;
8
- }
9
- function selectTreePath(tree, path) {
10
- let current = tree;
11
- for (const key of path){
12
- if (null === current || 'object' != typeof current) return null;
13
- current = current[key];
14
- }
15
- return current;
16
- }
5
+ import { EmptyFallback, renderSelectedTree } from "./shared.mjs";
17
6
  function RscNodeRenderInner({ data }) {
18
- const getTree = data[RSC_PROXY_GET_TREE];
19
- if (!getTree) throw new Error('Renderable RSC is missing its decoded tree getter.');
20
7
  return /*#__PURE__*/ jsx(Fragment, {
21
- children: selectTreePath(getTree(), data[RSC_PROXY_PATH] || [])
8
+ children: renderSelectedTree(data, {
9
+ missingTreeError: 'Renderable RSC is missing its decoded tree getter.'
10
+ })
22
11
  });
23
12
  }
24
13
  function RscNodeRenderer({ data }) {
@@ -1,41 +1,21 @@
1
1
  import "node:module";
2
2
  "use client";
3
3
  import { createSerializationAdapter } from "@tanstack/react-router";
4
- import { use } from "react";
4
+ import { createTreeGetterFromFlightStream } from "./treeGetter.mjs";
5
5
  import { createRscProxy } from "./createRscProxy.mjs";
6
- let modernRscClientRuntimePromise;
7
- function loadModernRscClientRuntime() {
8
- modernRscClientRuntimePromise ??= import("@modern-js/runtime/rsc/client").then((runtime)=>{
9
- runtime.setServerCallback(runtime.callServer);
10
- return runtime;
11
- });
12
- return modernRscClientRuntimePromise;
13
- }
14
- function createTreeGetter(stream) {
15
- let ready = false;
16
- let tree;
17
- const treePromise = loadModernRscClientRuntime().then((runtime)=>runtime.createFromReadableStream(stream, {
18
- callServer: runtime.callServer
19
- })).then((value)=>{
20
- tree = value;
21
- ready = true;
22
- return value;
23
- });
24
- return ()=>{
25
- if (ready) return tree;
26
- return use(treePromise);
27
- };
28
- }
29
6
  function createFromFlightStream(serialized) {
30
7
  const streamWrapper = {
31
8
  createReplayStream: ()=>serialized.stream
32
9
  };
33
- return createRscProxy(createTreeGetter(serialized.stream), {
10
+ return createRscProxy(createTreeGetterFromFlightStream(serialized.stream), {
34
11
  renderable: 'renderable' === serialized.kind,
35
12
  slotUsagesStream: serialized.slotUsagesStream,
36
13
  stream: streamWrapper
37
14
  });
38
15
  }
16
+ function createTanstackRscValueFromFlight(serialized) {
17
+ return createFromFlightStream(serialized);
18
+ }
39
19
  const adapter = createSerializationAdapter({
40
20
  key: '$MODERN_TANSTACK_RSC',
41
21
  test: (_value)=>false,
@@ -51,4 +31,4 @@ function getTanstackRscSerializationAdapters() {
51
31
  }
52
32
  const rscSerializationAdapter = getTanstackRscSerializationAdapters;
53
33
  export { CompositeComponent } from "./CompositeComponent.mjs";
54
- export { getTanstackRscSerializationAdapters, rscSerializationAdapter };
34
+ export { createTanstackRscValueFromFlight, getTanstackRscSerializationAdapters, rscSerializationAdapter };
@@ -0,0 +1,89 @@
1
+ import "node:module";
2
+ import { TANSTACK_RSC_FLIGHT_VALUE, isSerializedTanstackRscFlightValue } from "./shared.mjs";
3
+ import { RSC_SLOT_USAGES_STREAM, SERVER_COMPONENT_STREAM, isRenderableServerComponent, isServerComponent } from "./symbols.mjs";
4
+ function isPlainObject(value) {
5
+ if (!value || 'object' != typeof value) return false;
6
+ const prototype = Object.getPrototypeOf(value);
7
+ return prototype === Object.prototype || null === prototype;
8
+ }
9
+ function serializeTanstackRscFlightValues(value, seen = new WeakMap()) {
10
+ if (isServerComponent(value)) {
11
+ const streamWrapper = value[SERVER_COMPONENT_STREAM];
12
+ if (!streamWrapper) throw new Error('Cannot serialize TanStack RSC without a Flight stream.');
13
+ const kind = isRenderableServerComponent(value) ? 'renderable' : 'composite';
14
+ const slotUsagesStream = 'development' === process.env.NODE_ENV && 'composite' === kind ? value[RSC_SLOT_USAGES_STREAM] : void 0;
15
+ return {
16
+ [TANSTACK_RSC_FLIGHT_VALUE]: true,
17
+ kind,
18
+ stream: streamWrapper.createReplayStream(),
19
+ ...slotUsagesStream ? {
20
+ slotUsagesStream
21
+ } : {}
22
+ };
23
+ }
24
+ if (!value || 'object' != typeof value) return value;
25
+ if (seen.has(value)) return seen.get(value);
26
+ if (value instanceof Map) {
27
+ const result = new Map();
28
+ seen.set(value, result);
29
+ for (const [key, item] of value)result.set(serializeTanstackRscFlightValues(key, seen), serializeTanstackRscFlightValues(item, seen));
30
+ return result;
31
+ }
32
+ if (value instanceof Set) {
33
+ const result = new Set();
34
+ seen.set(value, result);
35
+ for (const item of value)result.add(serializeTanstackRscFlightValues(item, seen));
36
+ return result;
37
+ }
38
+ if (Array.isArray(value)) {
39
+ const result = [];
40
+ seen.set(value, result);
41
+ for (const item of value)result.push(serializeTanstackRscFlightValues(item, seen));
42
+ return result;
43
+ }
44
+ if (!isPlainObject(value)) return value;
45
+ const result = {};
46
+ seen.set(value, result);
47
+ for (const [key, item] of Object.entries(value))result[key] = serializeTanstackRscFlightValues(item, seen);
48
+ return result;
49
+ }
50
+ async function reviveTanstackRscFlightValues(value, seen = new WeakMap()) {
51
+ let reviver;
52
+ const getReviver = async ()=>{
53
+ if (!reviver) {
54
+ const client = await import("./client.mjs");
55
+ reviver = client.createTanstackRscValueFromFlight;
56
+ }
57
+ return reviver;
58
+ };
59
+ const visit = async (current)=>{
60
+ if (isSerializedTanstackRscFlightValue(current)) return (await getReviver())(current);
61
+ if (!current || 'object' != typeof current) return current;
62
+ if (seen.has(current)) return seen.get(current);
63
+ if (current instanceof Map) {
64
+ const result = new Map();
65
+ seen.set(current, result);
66
+ for (const [key, item] of current)result.set(await visit(key), await visit(item));
67
+ return result;
68
+ }
69
+ if (current instanceof Set) {
70
+ const result = new Set();
71
+ seen.set(current, result);
72
+ for (const item of current)result.add(await visit(item));
73
+ return result;
74
+ }
75
+ if (Array.isArray(current)) {
76
+ const result = [];
77
+ seen.set(current, result);
78
+ for (const item of current)result.push(await visit(item));
79
+ return result;
80
+ }
81
+ if (!isPlainObject(current)) return current;
82
+ const result = {};
83
+ seen.set(current, result);
84
+ for (const [key, item] of Object.entries(current))result[key] = await visit(item);
85
+ return result;
86
+ };
87
+ return visit(value);
88
+ }
89
+ export { isPlainObject, reviveTanstackRscFlightValues, serializeTanstackRscFlightValues };
@@ -0,0 +1,50 @@
1
+ import "node:module";
2
+ import { isRouteErrorResponse } from "@modern-js/runtime-utils/router";
3
+ function shouldRedactServerError(status = 500) {
4
+ return status >= 500 && 'development' !== process.env.NODE_ENV && 'test' !== process.env.NODE_ENV;
5
+ }
6
+ function serializePayloadError(error) {
7
+ if (isRouteErrorResponse(error)) {
8
+ if (shouldRedactServerError(error.status)) return {
9
+ status: error.status,
10
+ statusText: 'Internal Server Error',
11
+ data: 'Unexpected Server Error',
12
+ __type: 'RouteErrorResponse'
13
+ };
14
+ return {
15
+ ...error,
16
+ __type: 'RouteErrorResponse'
17
+ };
18
+ }
19
+ if (error instanceof Error) {
20
+ if (shouldRedactServerError()) return {
21
+ message: 'Unexpected Server Error',
22
+ stack: void 0,
23
+ __type: 'Error'
24
+ };
25
+ return {
26
+ message: error.message,
27
+ stack: error.stack,
28
+ __type: 'Error',
29
+ ...'Error' !== error.name ? {
30
+ __subType: error.name
31
+ } : {}
32
+ };
33
+ }
34
+ if (shouldRedactServerError()) return {
35
+ message: 'Unexpected Server Error',
36
+ stack: void 0,
37
+ __type: 'Error'
38
+ };
39
+ return error;
40
+ }
41
+ function isSerializedNotFound(value) {
42
+ return Boolean(value) && 'object' == typeof value && true === value.isNotFound;
43
+ }
44
+ function toRouteErrors(payload) {
45
+ return payload.errors && 'object' == typeof payload.errors ? payload.errors : {};
46
+ }
47
+ function toRouteLoaderData(payload) {
48
+ return payload.loaderData && 'object' == typeof payload.loaderData ? payload.loaderData : {};
49
+ }
50
+ export { isSerializedNotFound, serializePayloadError, shouldRedactServerError, toRouteErrors, toRouteLoaderData };
@@ -0,0 +1,62 @@
1
+ import "node:module";
2
+ import { notFound, redirect } from "@tanstack/react-router";
3
+ import { reviveTanstackRscFlightValues } from "./flightSerialization.mjs";
4
+ const payloadFetchCache = new Map();
5
+ let payloadDecoder;
6
+ async function decodePayload(stream) {
7
+ if (payloadDecoder) return reviveTanstackRscFlightValues(await payloadDecoder(stream));
8
+ const runtime = await import("@modern-js/runtime/rsc/client");
9
+ return reviveTanstackRscFlightValues(await runtime.createFromReadableStream(stream));
10
+ }
11
+ function isServerPayload(value) {
12
+ return Boolean(value) && 'object' == typeof value && 'render' === value.type && Array.isArray(value.routes);
13
+ }
14
+ function createPayloadFetchKey(request) {
15
+ return JSON.stringify([
16
+ request.url,
17
+ [
18
+ ...request.headers.entries()
19
+ ].sort(([left], [right])=>left.localeCompare(right))
20
+ ]);
21
+ }
22
+ function isAbsoluteUrl(value) {
23
+ try {
24
+ new URL(value);
25
+ return true;
26
+ } catch {
27
+ return false;
28
+ }
29
+ }
30
+ async function fetchTanstackRscPayload(request) {
31
+ const headers = new Headers(request.headers);
32
+ headers.set('x-rsc-tree', 'true');
33
+ const response = await fetch(request.url, {
34
+ credentials: 'same-origin',
35
+ headers,
36
+ method: 'GET',
37
+ signal: request.signal
38
+ });
39
+ const redirectLocation = response.headers.get('X-Modernjs-Redirect');
40
+ if (redirectLocation) {
41
+ if (isAbsoluteUrl(redirectLocation)) throw redirect({
42
+ headers: response.headers,
43
+ href: redirectLocation,
44
+ statusCode: response.status
45
+ });
46
+ throw redirect({
47
+ headers: response.headers,
48
+ statusCode: response.status,
49
+ to: redirectLocation || '/'
50
+ });
51
+ }
52
+ if (404 === response.status && !response.body) throw notFound();
53
+ if (!response.body) throw new Error('TanStack RSC payload response body is null.');
54
+ const payload = await decodePayload(response.body);
55
+ if (!isServerPayload(payload)) throw new Error('Unexpected TanStack RSC payload type.');
56
+ return payload;
57
+ }
58
+ function __setTanstackRscPayloadDecoderForTests(decoder) {
59
+ payloadDecoder = decoder;
60
+ payloadFetchCache.clear();
61
+ }
62
+ export { __setTanstackRscPayloadDecoderForTests, createPayloadFetchKey, decodePayload, fetchTanstackRscPayload, isAbsoluteUrl, isServerPayload, payloadFetchCache };