@bleedingdev/modern-js-runtime 3.2.0-ultramodern.120 → 3.2.0-ultramodern.121

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 (203) hide show
  1. package/dist/cjs/boundary-debugger/index.js +4 -0
  2. package/dist/cjs/cli/index.js +11 -0
  3. package/dist/cjs/{router/runtime/tanstack/rsc/ClientSlot.js → core/context/extensions.js} +33 -21
  4. package/dist/cjs/{router/runtime/tanstack/rsc/SlotContext.js → core/context/helmetContext.js} +16 -20
  5. package/dist/cjs/core/context/index.js +65 -0
  6. package/dist/cjs/core/react/wrapper.js +6 -4
  7. package/dist/cjs/core/server/helmet.js +2 -1
  8. package/dist/cjs/core/server/requestHandler.js +42 -29
  9. package/dist/cjs/core/server/routerCleanup.js +110 -0
  10. package/dist/cjs/core/server/scriptOrder.js +75 -4
  11. package/dist/cjs/core/server/stream/afterTemplate.js +6 -18
  12. package/dist/cjs/core/server/stream/deferredScript.js +4 -1
  13. package/dist/cjs/core/server/string/index.js +1 -7
  14. package/dist/cjs/core/server/string/loadable.js +13 -40
  15. package/dist/cjs/core/server/string/ssrData.js +1 -1
  16. package/dist/cjs/core/server/utils.js +31 -8
  17. package/dist/cjs/exports/head.js +135 -74
  18. package/dist/cjs/exports/tanstack-router.js +36 -305
  19. package/dist/cjs/module-federation/index.js +178 -0
  20. package/dist/cjs/router/cli/code/index.js +1 -47
  21. package/dist/cjs/router/cli/code/templates.js +1 -14
  22. package/dist/cjs/router/cli/handler.js +1 -1
  23. package/dist/cjs/router/cli/index.js +2 -23
  24. package/dist/cjs/router/runtime/DeferredDataScripts.node.js +16 -4
  25. package/dist/cjs/router/runtime/PrefetchLink.js +2 -3
  26. package/dist/cjs/router/runtime/internal.js +20 -13
  27. package/dist/cjs/router/runtime/lifecycle.js +37 -22
  28. package/dist/cjs/router/runtime/plugin.js +2 -9
  29. package/dist/cjs/router/runtime/plugin.node.js +2 -7
  30. package/dist/cjs/router/runtime/provider.js +107 -0
  31. package/dist/cjs/router/runtime/utils.js +35 -9
  32. package/dist/esm/boundary-debugger/index.mjs +4 -0
  33. package/dist/esm/cli/index.mjs +4 -2
  34. package/dist/esm/core/context/extensions.mjs +28 -0
  35. package/dist/esm/core/context/helmetContext.mjs +13 -0
  36. package/dist/esm/core/context/index.mjs +5 -0
  37. package/dist/esm/core/react/wrapper.mjs +6 -4
  38. package/dist/esm/core/server/helmet.mjs +2 -1
  39. package/dist/esm/core/server/requestHandler.mjs +43 -30
  40. package/dist/esm/core/server/routerCleanup.mjs +66 -0
  41. package/dist/esm/core/server/scriptOrder.mjs +60 -1
  42. package/dist/esm/core/server/stream/afterTemplate.mjs +8 -20
  43. package/dist/esm/core/server/stream/deferredScript.mjs +4 -1
  44. package/dist/esm/core/server/string/index.mjs +3 -9
  45. package/dist/esm/core/server/string/loadable.mjs +11 -38
  46. package/dist/esm/core/server/string/ssrData.mjs +2 -2
  47. package/dist/esm/core/server/utils.mjs +31 -8
  48. package/dist/esm/exports/head.mjs +135 -74
  49. package/dist/esm/exports/tanstack-router.mjs +30 -4
  50. package/dist/esm/module-federation/index.mjs +109 -0
  51. package/dist/esm/router/cli/code/index.mjs +1 -47
  52. package/dist/esm/router/cli/code/templates.mjs +1 -14
  53. package/dist/esm/router/cli/handler.mjs +1 -1
  54. package/dist/esm/router/cli/index.mjs +3 -24
  55. package/dist/esm/router/runtime/DeferredDataScripts.node.mjs +16 -4
  56. package/dist/esm/router/runtime/PrefetchLink.mjs +2 -3
  57. package/dist/esm/router/runtime/internal.mjs +16 -15
  58. package/dist/esm/router/runtime/lifecycle.mjs +22 -13
  59. package/dist/esm/router/runtime/plugin.mjs +4 -11
  60. package/dist/esm/router/runtime/plugin.node.mjs +4 -9
  61. package/dist/esm/router/runtime/provider.mjs +57 -0
  62. package/dist/esm/router/runtime/utils.mjs +35 -9
  63. package/dist/esm-node/boundary-debugger/index.mjs +4 -0
  64. package/dist/esm-node/cli/index.mjs +4 -2
  65. package/dist/esm-node/core/context/extensions.mjs +29 -0
  66. package/dist/esm-node/core/context/helmetContext.mjs +14 -0
  67. package/dist/esm-node/core/context/index.mjs +5 -0
  68. package/dist/esm-node/core/react/wrapper.mjs +6 -4
  69. package/dist/esm-node/core/server/helmet.mjs +2 -1
  70. package/dist/esm-node/core/server/requestHandler.mjs +43 -30
  71. package/dist/esm-node/core/server/routerCleanup.mjs +67 -0
  72. package/dist/esm-node/core/server/scriptOrder.mjs +60 -1
  73. package/dist/esm-node/core/server/stream/afterTemplate.mjs +8 -20
  74. package/dist/esm-node/core/server/stream/deferredScript.mjs +4 -1
  75. package/dist/esm-node/core/server/string/index.mjs +3 -9
  76. package/dist/esm-node/core/server/string/loadable.mjs +11 -38
  77. package/dist/esm-node/core/server/string/ssrData.mjs +2 -2
  78. package/dist/esm-node/core/server/utils.mjs +31 -8
  79. package/dist/esm-node/exports/head.mjs +135 -74
  80. package/dist/esm-node/exports/tanstack-router.mjs +30 -4
  81. package/dist/esm-node/module-federation/index.mjs +110 -0
  82. package/dist/esm-node/router/cli/code/index.mjs +1 -47
  83. package/dist/esm-node/router/cli/code/templates.mjs +1 -14
  84. package/dist/esm-node/router/cli/handler.mjs +1 -1
  85. package/dist/esm-node/router/cli/index.mjs +3 -24
  86. package/dist/esm-node/router/runtime/DeferredDataScripts.node.mjs +16 -4
  87. package/dist/esm-node/router/runtime/PrefetchLink.mjs +2 -3
  88. package/dist/esm-node/router/runtime/internal.mjs +16 -15
  89. package/dist/esm-node/router/runtime/lifecycle.mjs +22 -13
  90. package/dist/esm-node/router/runtime/plugin.mjs +4 -11
  91. package/dist/esm-node/router/runtime/plugin.node.mjs +4 -9
  92. package/dist/esm-node/router/runtime/provider.mjs +58 -0
  93. package/dist/esm-node/router/runtime/utils.mjs +35 -9
  94. package/dist/types/cli/index.d.ts +3 -1
  95. package/dist/types/core/context/extensions.d.ts +37 -0
  96. package/dist/types/core/context/helmetContext.d.ts +10 -0
  97. package/dist/types/core/context/index.d.ts +6 -0
  98. package/dist/types/core/context/runtime.d.ts +1 -11
  99. package/dist/types/core/server/routerCleanup.d.ts +28 -0
  100. package/dist/types/core/server/scriptOrder.d.ts +24 -0
  101. package/dist/types/core/server/string/loadable.d.ts +1 -7
  102. package/dist/types/core/server/utils.d.ts +1 -0
  103. package/dist/types/exports/tanstack-router.d.ts +88 -7
  104. package/dist/types/module-federation/index.d.ts +65 -0
  105. package/dist/types/router/cli/code/index.d.ts +1 -3
  106. package/dist/types/router/cli/handler.d.ts +0 -3
  107. package/dist/types/router/runtime/internal.d.ts +1 -0
  108. package/dist/types/router/runtime/lifecycle.d.ts +2 -0
  109. package/dist/types/router/runtime/plugin.d.ts +1 -1
  110. package/dist/types/router/runtime/plugin.node.d.ts +1 -1
  111. package/dist/types/router/runtime/provider.d.ts +61 -0
  112. package/package.json +15 -11
  113. package/rstest.config.mts +2 -4
  114. package/dist/cjs/router/cli/code/tanstackTypes.js +0 -447
  115. package/dist/cjs/router/runtime/tanstack/basepathRewrite.js +0 -66
  116. package/dist/cjs/router/runtime/tanstack/dataMutation.js +0 -349
  117. package/dist/cjs/router/runtime/tanstack/hydrationBoundary.js +0 -48
  118. package/dist/cjs/router/runtime/tanstack/outlet.js +0 -58
  119. package/dist/cjs/router/runtime/tanstack/plugin.js +0 -342
  120. package/dist/cjs/router/runtime/tanstack/plugin.node.js +0 -272
  121. package/dist/cjs/router/runtime/tanstack/prefetchLink.js +0 -59
  122. package/dist/cjs/router/runtime/tanstack/routeTree.js +0 -525
  123. package/dist/cjs/router/runtime/tanstack/rsc/CompositeComponent.js +0 -79
  124. package/dist/cjs/router/runtime/tanstack/rsc/ReplayableStream.js +0 -146
  125. package/dist/cjs/router/runtime/tanstack/rsc/RscNodeRenderer.js +0 -69
  126. package/dist/cjs/router/runtime/tanstack/rsc/client.js +0 -97
  127. package/dist/cjs/router/runtime/tanstack/rsc/createRscProxy.js +0 -145
  128. package/dist/cjs/router/runtime/tanstack/rsc/index.js +0 -46
  129. package/dist/cjs/router/runtime/tanstack/rsc/server.js +0 -250
  130. package/dist/cjs/router/runtime/tanstack/rsc/slotUsageSanitizer.js +0 -69
  131. package/dist/cjs/router/runtime/tanstack/rsc/symbols.js +0 -77
  132. package/dist/cjs/ssr/index.node.js +0 -125
  133. package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +0 -88
  134. package/dist/cjs/ssr/serverRender/renderToString/entry.js +0 -200
  135. package/dist/cjs/ssr/serverRender/types.js +0 -40
  136. package/dist/esm/router/cli/code/tanstackTypes.mjs +0 -396
  137. package/dist/esm/router/runtime/tanstack/basepathRewrite.mjs +0 -28
  138. package/dist/esm/router/runtime/tanstack/dataMutation.mjs +0 -305
  139. package/dist/esm/router/runtime/tanstack/hydrationBoundary.mjs +0 -10
  140. package/dist/esm/router/runtime/tanstack/outlet.mjs +0 -17
  141. package/dist/esm/router/runtime/tanstack/plugin.mjs +0 -304
  142. package/dist/esm/router/runtime/tanstack/plugin.node.mjs +0 -234
  143. package/dist/esm/router/runtime/tanstack/prefetchLink.mjs +0 -18
  144. package/dist/esm/router/runtime/tanstack/routeTree.mjs +0 -481
  145. package/dist/esm/router/runtime/tanstack/rsc/ClientSlot.mjs +0 -19
  146. package/dist/esm/router/runtime/tanstack/rsc/CompositeComponent.mjs +0 -41
  147. package/dist/esm/router/runtime/tanstack/rsc/ReplayableStream.mjs +0 -104
  148. package/dist/esm/router/runtime/tanstack/rsc/RscNodeRenderer.mjs +0 -31
  149. package/dist/esm/router/runtime/tanstack/rsc/SlotContext.mjs +0 -17
  150. package/dist/esm/router/runtime/tanstack/rsc/client.mjs +0 -53
  151. package/dist/esm/router/runtime/tanstack/rsc/createRscProxy.mjs +0 -107
  152. package/dist/esm/router/runtime/tanstack/rsc/index.mjs +0 -1
  153. package/dist/esm/router/runtime/tanstack/rsc/server.mjs +0 -200
  154. package/dist/esm/router/runtime/tanstack/rsc/slotUsageSanitizer.mjs +0 -31
  155. package/dist/esm/router/runtime/tanstack/rsc/symbols.mjs +0 -17
  156. package/dist/esm/ssr/index.node.mjs +0 -44
  157. package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.mjs +0 -50
  158. package/dist/esm/ssr/serverRender/renderToString/entry.mjs +0 -151
  159. package/dist/esm/ssr/serverRender/types.mjs +0 -1
  160. package/dist/esm-node/router/cli/code/tanstackTypes.mjs +0 -397
  161. package/dist/esm-node/router/runtime/tanstack/basepathRewrite.mjs +0 -29
  162. package/dist/esm-node/router/runtime/tanstack/dataMutation.mjs +0 -306
  163. package/dist/esm-node/router/runtime/tanstack/hydrationBoundary.mjs +0 -11
  164. package/dist/esm-node/router/runtime/tanstack/outlet.mjs +0 -18
  165. package/dist/esm-node/router/runtime/tanstack/plugin.mjs +0 -305
  166. package/dist/esm-node/router/runtime/tanstack/plugin.node.mjs +0 -235
  167. package/dist/esm-node/router/runtime/tanstack/prefetchLink.mjs +0 -19
  168. package/dist/esm-node/router/runtime/tanstack/routeTree.mjs +0 -482
  169. package/dist/esm-node/router/runtime/tanstack/rsc/ClientSlot.mjs +0 -20
  170. package/dist/esm-node/router/runtime/tanstack/rsc/CompositeComponent.mjs +0 -42
  171. package/dist/esm-node/router/runtime/tanstack/rsc/ReplayableStream.mjs +0 -105
  172. package/dist/esm-node/router/runtime/tanstack/rsc/RscNodeRenderer.mjs +0 -32
  173. package/dist/esm-node/router/runtime/tanstack/rsc/SlotContext.mjs +0 -18
  174. package/dist/esm-node/router/runtime/tanstack/rsc/client.mjs +0 -54
  175. package/dist/esm-node/router/runtime/tanstack/rsc/createRscProxy.mjs +0 -108
  176. package/dist/esm-node/router/runtime/tanstack/rsc/index.mjs +0 -2
  177. package/dist/esm-node/router/runtime/tanstack/rsc/server.mjs +0 -201
  178. package/dist/esm-node/router/runtime/tanstack/rsc/slotUsageSanitizer.mjs +0 -32
  179. package/dist/esm-node/router/runtime/tanstack/rsc/symbols.mjs +0 -18
  180. package/dist/esm-node/ssr/index.node.mjs +0 -45
  181. package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.mjs +0 -51
  182. package/dist/esm-node/ssr/serverRender/renderToString/entry.mjs +0 -152
  183. package/dist/esm-node/ssr/serverRender/types.mjs +0 -2
  184. package/dist/types/router/cli/code/tanstackTypes.d.ts +0 -10
  185. package/dist/types/router/runtime/tanstack/basepathRewrite.d.ts +0 -8
  186. package/dist/types/router/runtime/tanstack/dataMutation.d.ts +0 -29
  187. package/dist/types/router/runtime/tanstack/hydrationBoundary.d.ts +0 -2
  188. package/dist/types/router/runtime/tanstack/outlet.d.ts +0 -2
  189. package/dist/types/router/runtime/tanstack/plugin.d.ts +0 -6
  190. package/dist/types/router/runtime/tanstack/plugin.node.d.ts +0 -6
  191. package/dist/types/router/runtime/tanstack/prefetchLink.d.ts +0 -11
  192. package/dist/types/router/runtime/tanstack/routeTree.d.ts +0 -8
  193. package/dist/types/router/runtime/tanstack/rsc/ClientSlot.d.ts +0 -5
  194. package/dist/types/router/runtime/tanstack/rsc/CompositeComponent.d.ts +0 -3
  195. package/dist/types/router/runtime/tanstack/rsc/ReplayableStream.d.ts +0 -24
  196. package/dist/types/router/runtime/tanstack/rsc/RscNodeRenderer.d.ts +0 -5
  197. package/dist/types/router/runtime/tanstack/rsc/SlotContext.d.ts +0 -11
  198. package/dist/types/router/runtime/tanstack/rsc/client.d.ts +0 -11
  199. package/dist/types/router/runtime/tanstack/rsc/createRscProxy.d.ts +0 -7
  200. package/dist/types/router/runtime/tanstack/rsc/index.d.ts +0 -2
  201. package/dist/types/router/runtime/tanstack/rsc/server.d.ts +0 -14
  202. package/dist/types/router/runtime/tanstack/rsc/slotUsageSanitizer.d.ts +0 -2
  203. package/dist/types/router/runtime/tanstack/rsc/symbols.d.ts +0 -46
@@ -1,305 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { useRouter } from "@tanstack/react-router";
3
- import { useCallback, useRef, useState } from "react";
4
- class RouteActionResponseError extends Error {
5
- constructor(response, data){
6
- super(`Route action failed with status ${response.status}`);
7
- this.name = 'RouteActionResponseError';
8
- this.response = response;
9
- this.data = data;
10
- }
11
- }
12
- function formDataToUrlSearchParams(formData) {
13
- const searchParams = new URLSearchParams();
14
- formData.forEach((value, key)=>{
15
- if ('string' == typeof value) searchParams.append(key, value);
16
- });
17
- return searchParams;
18
- }
19
- function formDataToTextPlain(formData) {
20
- return Array.from(formData.entries()).map(([key, value])=>`${key}=${String(value)}`).join('\n');
21
- }
22
- function toFormData(target) {
23
- if (target instanceof HTMLFormElement) return new FormData(target);
24
- if (target instanceof FormData) return target;
25
- if (target instanceof URLSearchParams) {
26
- const formData = new FormData();
27
- target.forEach((value, key)=>{
28
- formData.append(key, value);
29
- });
30
- return formData;
31
- }
32
- const formData = new FormData();
33
- Object.entries(target).forEach(([key, value])=>{
34
- if (null == value) return;
35
- formData.append(key, String(value));
36
- });
37
- return formData;
38
- }
39
- function getSubmitter(event) {
40
- const nativeEvent = event.nativeEvent;
41
- const submitter = nativeEvent?.submitter;
42
- if (submitter instanceof HTMLButtonElement || submitter instanceof HTMLInputElement) return submitter;
43
- return null;
44
- }
45
- function createFormDataFromSubmit({ form, submitter }) {
46
- if (submitter) try {
47
- return new FormData(form, submitter);
48
- } catch {}
49
- return new FormData(form);
50
- }
51
- function resolveSubmitOptionsFromForm({ form, submitter, action, method, encType }) {
52
- const resolvedAction = submitter?.getAttribute('formaction') || action || form.getAttribute('action') || '.';
53
- const resolvedMethod = (submitter?.getAttribute('formmethod') || method || form.getAttribute('method') || 'get').toLowerCase();
54
- const resolvedEncType = submitter?.getAttribute('formenctype') || encType || form.getAttribute('enctype') || 'application/x-www-form-urlencoded';
55
- return {
56
- action: resolvedAction,
57
- method: resolvedMethod,
58
- encType: resolvedEncType
59
- };
60
- }
61
- function resolveRouteHandlers(router, actionTo) {
62
- const builtLocation = router.buildLocation({
63
- to: actionTo
64
- });
65
- const href = router.getParsedLocationHref(builtLocation);
66
- const matchedRoutes = router.getMatchedRoutes(builtLocation.pathname);
67
- const routeStaticData = matchedRoutes.foundRoute?.options?.staticData;
68
- const action = routeStaticData?.modernRouteAction;
69
- const loader = routeStaticData?.modernRouteLoader;
70
- return {
71
- action,
72
- loader,
73
- href,
74
- params: matchedRoutes.routeParams || {}
75
- };
76
- }
77
- function isRedirectResponse(value) {
78
- if (!(value instanceof Response)) return false;
79
- return [
80
- 301,
81
- 302,
82
- 303,
83
- 307,
84
- 308
85
- ].includes(value.status);
86
- }
87
- async function parseResponseData(response) {
88
- if (204 === response.status) return null;
89
- const contentType = response.headers.get('Content-Type') || '';
90
- if (contentType.includes('application/json')) return response.json();
91
- return response.text();
92
- }
93
- async function parseResponseResultOrThrow(response) {
94
- const parsed = await parseResponseData(response);
95
- if (!response.ok) throw new RouteActionResponseError(response, parsed);
96
- return parsed;
97
- }
98
- async function submitRouteAction({ router, target, options = {}, isFetcher = false, onInvalidateStart }) {
99
- const method = (options.method || 'post').toLowerCase();
100
- const encType = options.encType || 'application/x-www-form-urlencoded';
101
- const actionTo = options.action || '.';
102
- const formData = toFormData(target);
103
- const resolved = resolveRouteHandlers(router, actionTo);
104
- if ('get' === method) {
105
- const search = formDataToUrlSearchParams(formData).toString();
106
- const requestUrl = new URL(resolved.href, window.location.origin);
107
- requestUrl.search = search;
108
- if (isFetcher && resolved.loader) {
109
- const result = await resolved.loader({
110
- request: new Request(requestUrl, {
111
- method: 'GET'
112
- }),
113
- params: resolved.params
114
- });
115
- if (result instanceof Response) {
116
- const redirectTo = result.headers.get('X-Modernjs-Redirect') || result.headers.get('Location');
117
- if (redirectTo || isRedirectResponse(result)) {
118
- await router.navigate({
119
- to: redirectTo || '/'
120
- });
121
- return parseResponseData(result);
122
- }
123
- return parseResponseResultOrThrow(result);
124
- }
125
- return result;
126
- }
127
- await router.navigate({
128
- href: search ? `${resolved.href}?${search}` : resolved.href
129
- });
130
- return;
131
- }
132
- if (!resolved.action) throw new Error(`No route action found for "${actionTo}"`);
133
- const headers = new Headers();
134
- let body = null;
135
- if (encType.includes('application/json')) {
136
- headers.set('Content-Type', 'application/json');
137
- body = JSON.stringify(Object.fromEntries(formDataToUrlSearchParams(formData).entries()));
138
- } else if (encType.includes('text/plain')) {
139
- headers.set('Content-Type', 'text/plain;charset=UTF-8');
140
- body = formDataToTextPlain(formData);
141
- } else if (encType.includes('application/x-www-form-urlencoded')) {
142
- headers.set('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8');
143
- body = formDataToUrlSearchParams(formData);
144
- } else body = formData;
145
- const request = new Request(new URL(resolved.href, window.location.origin), {
146
- method: method.toUpperCase(),
147
- headers,
148
- body
149
- });
150
- const result = await resolved.action({
151
- request,
152
- params: resolved.params
153
- });
154
- if (result instanceof Response) {
155
- const redirectTo = result.headers.get('X-Modernjs-Redirect') || result.headers.get('Location');
156
- if (redirectTo || isRedirectResponse(result)) {
157
- await router.navigate({
158
- to: redirectTo || '/'
159
- });
160
- return parseResponseData(result);
161
- }
162
- const parsed = isFetcher ? await parseResponseResultOrThrow(result) : await parseResponseData(result);
163
- onInvalidateStart?.();
164
- await router.invalidate();
165
- return parsed;
166
- }
167
- onInvalidateStart?.();
168
- await router.invalidate();
169
- return result;
170
- }
171
- function Form({ action, method = 'get', encType, reloadDocument, onSubmit, ...rest }) {
172
- const router = useRouter();
173
- const handleSubmit = useCallback(async (event)=>{
174
- onSubmit?.(event);
175
- if (event.defaultPrevented || reloadDocument) return;
176
- event.preventDefault();
177
- const submitter = getSubmitter(event);
178
- const formData = createFormDataFromSubmit({
179
- form: event.currentTarget,
180
- submitter
181
- });
182
- const normalizedOptions = resolveSubmitOptionsFromForm({
183
- form: event.currentTarget,
184
- submitter,
185
- action,
186
- method,
187
- encType
188
- });
189
- await submitRouteAction({
190
- router,
191
- target: formData,
192
- options: normalizedOptions
193
- });
194
- }, [
195
- action,
196
- encType,
197
- method,
198
- onSubmit,
199
- reloadDocument,
200
- router
201
- ]);
202
- return /*#__PURE__*/ jsx("form", {
203
- ...rest,
204
- action: action,
205
- method: method,
206
- encType: encType,
207
- onSubmit: handleSubmit
208
- });
209
- }
210
- function useFetcher() {
211
- const router = useRouter();
212
- const [state, setState] = useState('idle');
213
- const [data, setData] = useState(void 0);
214
- const [error, setError] = useState(void 0);
215
- const requestStatesRef = useRef(new Map());
216
- const requestIdRef = useRef(0);
217
- const syncStateFromRequests = useCallback(()=>{
218
- let hasSubmitting = false;
219
- let hasLoading = false;
220
- requestStatesRef.current.forEach((requestState)=>{
221
- if ('submitting' === requestState) hasSubmitting = true;
222
- else if ('loading' === requestState) hasLoading = true;
223
- });
224
- if (hasSubmitting) return void setState('submitting');
225
- if (hasLoading) return void setState('loading');
226
- setState('idle');
227
- }, []);
228
- const setRequestState = useCallback((requestId, requestState)=>{
229
- requestStatesRef.current.set(requestId, requestState);
230
- syncStateFromRequests();
231
- }, [
232
- syncStateFromRequests
233
- ]);
234
- const clearRequestState = useCallback((requestId)=>{
235
- requestStatesRef.current.delete(requestId);
236
- syncStateFromRequests();
237
- }, [
238
- syncStateFromRequests
239
- ]);
240
- const submit = useCallback(async (target, options)=>{
241
- setError(void 0);
242
- const requestId = ++requestIdRef.current;
243
- const normalizedMethod = (options?.method || 'post').toLowerCase();
244
- const isLoaderSubmit = 'get' === normalizedMethod;
245
- setRequestState(requestId, isLoaderSubmit ? 'loading' : 'submitting');
246
- try {
247
- const result = await submitRouteAction({
248
- router,
249
- target,
250
- options,
251
- isFetcher: true,
252
- onInvalidateStart: ()=>{
253
- if (!isLoaderSubmit) setRequestState(requestId, 'loading');
254
- }
255
- });
256
- setData(result);
257
- } catch (err) {
258
- setError(err);
259
- throw err;
260
- } finally{
261
- clearRequestState(requestId);
262
- }
263
- }, [
264
- clearRequestState,
265
- router,
266
- setRequestState
267
- ]);
268
- const FetcherForm = useCallback(({ action, method = 'get', encType, reloadDocument, onSubmit, ...rest })=>{
269
- const handleSubmit = async (event)=>{
270
- onSubmit?.(event);
271
- if (event.defaultPrevented || reloadDocument) return;
272
- event.preventDefault();
273
- const submitter = getSubmitter(event);
274
- const formData = createFormDataFromSubmit({
275
- form: event.currentTarget,
276
- submitter
277
- });
278
- const normalizedOptions = resolveSubmitOptionsFromForm({
279
- form: event.currentTarget,
280
- submitter,
281
- action,
282
- method,
283
- encType
284
- });
285
- await submit(formData, normalizedOptions);
286
- };
287
- return /*#__PURE__*/ jsx("form", {
288
- ...rest,
289
- action: action,
290
- method: method,
291
- encType: encType,
292
- onSubmit: handleSubmit
293
- });
294
- }, [
295
- submit
296
- ]);
297
- return {
298
- state,
299
- data,
300
- error,
301
- Form: FetcherForm,
302
- submit
303
- };
304
- }
305
- export { Form, RouteActionResponseError, useFetcher };
@@ -1,10 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { Suspense } from "react";
3
- function wrapTanstackSsrHydrationBoundary(routerContent, shouldWrap) {
4
- if (shouldWrap) return /*#__PURE__*/ jsx(Suspense, {
5
- fallback: null,
6
- children: routerContent
7
- });
8
- return routerContent;
9
- }
10
- export { wrapTanstackSsrHydrationBoundary };
@@ -1,17 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { Outlet } from "@tanstack/react-router";
3
- import { createElement, memo } from "react";
4
- const outlet_Outlet = /*#__PURE__*/ memo(function() {
5
- return /*#__PURE__*/ jsx(Outlet, {});
6
- });
7
- function withModernRouteMatchContext(component, _routeId) {
8
- if (null == component) return component;
9
- const Component = component;
10
- const WrappedRouteComponent = (props)=>/*#__PURE__*/ createElement(Component, props);
11
- const preloadable = component;
12
- if ('function' == typeof preloadable.load) WrappedRouteComponent.load = preloadable.load.bind(preloadable);
13
- if ('function' == typeof preloadable.preload) WrappedRouteComponent.preload = preloadable.preload.bind(preloadable);
14
- else if ('function' == typeof preloadable.load) WrappedRouteComponent.preload = WrappedRouteComponent.load;
15
- return WrappedRouteComponent;
16
- }
17
- export { outlet_Outlet as Outlet, withModernRouteMatchContext };
@@ -1,304 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { merge } from "@modern-js/runtime-utils/merge";
3
- import { normalizePathname } from "@modern-js/runtime-utils/url";
4
- import { RouterProvider, createBrowserHistory, createHashHistory, createRouter, useLocation, useMatches, useNavigate, useRouter } from "@tanstack/react-router";
5
- import { hydrate } from "@tanstack/react-router/ssr/client";
6
- import { useContext, useMemo } from "react";
7
- import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalLayoutApp, getGlobalRoutes } from "../../../core/context/index.mjs";
8
- import { onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeHydrateRouter } from "../hooks.mjs";
9
- import { applyRouterRuntimeState } from "../lifecycle.mjs";
10
- import { createRouteObjectsFromConfig, urlJoin } from "../utils.mjs";
11
- import { createModernBasepathRewrite } from "./basepathRewrite.mjs";
12
- import { wrapTanstackSsrHydrationBoundary } from "./hydrationBoundary.mjs";
13
- import { withModernRouteMatchContext } from "./outlet.mjs";
14
- import { Link } from "./prefetchLink.mjs";
15
- import { createRouteTreeFromRouteObjects } from "./routeTree.mjs";
16
- import { getTanstackRscSerializationAdapters } from "./rsc/client.mjs";
17
- const BLOCKING_SUBSCRIBE_SYMBOL = Symbol.for('@modern-js/plugin-runtime:tanstack-blocking-subscribe');
18
- const BLOCKING_STATE_SYMBOL = Symbol.for('@modern-js/plugin-runtime:tanstack-blocking-state');
19
- function normalizeBase(b) {
20
- if (b.length > 1 && b.endsWith('/')) return b.slice(0, -1);
21
- return b || '/';
22
- }
23
- function isSegmentPrefix(pathname, base) {
24
- const b = normalizeBase(base);
25
- const p = pathname || '/';
26
- return p === b || p.startsWith(`${b}/`);
27
- }
28
- function wrapRouterSubscribeWithBlockState(router, getBlockNavState) {
29
- if (!router || 'object' != typeof router) return;
30
- const target = router;
31
- target[BLOCKING_STATE_SYMBOL] = getBlockNavState;
32
- if (target[BLOCKING_SUBSCRIBE_SYMBOL] || 'function' != typeof target.subscribe) return;
33
- const originSubscribe = target.subscribe.bind(target);
34
- target.subscribe = (eventType, listener)=>{
35
- const wrappedListener = (...args)=>{
36
- const blockRoute = target[BLOCKING_STATE_SYMBOL]?.() || false;
37
- if (blockRoute) return;
38
- return listener(...args);
39
- };
40
- return originSubscribe(eventType, wrappedListener);
41
- };
42
- target[BLOCKING_SUBSCRIBE_SYMBOL] = true;
43
- }
44
- const routerHydrationRecords = new WeakMap();
45
- const routeModulesKey = '_routeModules';
46
- function pickRouteModuleComponent(routeModule, seen = new Set()) {
47
- if ('function' == typeof routeModule || routeModule && 'object' == typeof routeModule && '$$typeof' in routeModule) return routeModule;
48
- if (!routeModule || 'object' != typeof routeModule) return;
49
- if (seen.has(routeModule)) return;
50
- seen.add(routeModule);
51
- const module = routeModule;
52
- for (const candidate of [
53
- module.default,
54
- module.Component
55
- ]){
56
- const component = pickRouteModuleComponent(candidate, seen);
57
- if (component) return component;
58
- }
59
- }
60
- function getCachedRouteModule(routeId) {
61
- if ("u" < typeof window) return;
62
- return window[routeModulesKey]?.[routeId];
63
- }
64
- function preloadHydratedRouteComponents(router) {
65
- const preloadableRouter = router;
66
- const routesById = preloadableRouter.routesById || {};
67
- const matches = preloadableRouter.stores.matches.get();
68
- return Promise.all(matches.map((match)=>{
69
- if (void 0 === match.routeId || '' === match.routeId) return;
70
- const route = routesById[match.routeId];
71
- const component = route?.options?.component;
72
- const preload = component?.load || component?.preload;
73
- if ('function' != typeof preload) return;
74
- return Promise.resolve(preload.call(component)).then((routeModule)=>{
75
- const modernRouteId = route?.options?.staticData?.modernRouteId;
76
- const cachedRouteModule = 'string' == typeof modernRouteId && '' !== modernRouteId ? getCachedRouteModule(modernRouteId) : void 0;
77
- const resolvedComponent = pickRouteModuleComponent(cachedRouteModule ?? routeModule);
78
- if (void 0 !== resolvedComponent && 'string' == typeof modernRouteId && '' !== modernRouteId) route.options.component = withModernRouteMatchContext(resolvedComponent, modernRouteId);
79
- });
80
- })).then(()=>void 0);
81
- }
82
- function getTanstackSsrHydrationRecord(router) {
83
- const existingHydrationRecord = routerHydrationRecords.get(router);
84
- if (void 0 !== existingHydrationRecord) return existingHydrationRecord;
85
- const hydrationRecord = {
86
- promise: Promise.resolve(),
87
- status: 'pending'
88
- };
89
- routerHydrationRecords.set(router, hydrationRecord);
90
- try {
91
- hydrationRecord.promise = hydrate(router).then((value)=>preloadHydratedRouteComponents(router).then(()=>value)).then((value)=>{
92
- hydrationRecord.status = 'fulfilled';
93
- return value;
94
- }, (error)=>{
95
- hydrationRecord.status = 'rejected';
96
- hydrationRecord.error = error;
97
- throw error;
98
- });
99
- } catch (error) {
100
- hydrationRecord.status = 'rejected';
101
- hydrationRecord.error = error;
102
- hydrationRecord.promise = Promise.reject(error);
103
- hydrationRecord.promise.catch(()=>{});
104
- }
105
- return hydrationRecord;
106
- }
107
- function getTanstackSsrHydrationPromise(router) {
108
- return getTanstackSsrHydrationRecord(router).promise;
109
- }
110
- function hasTanstackSsrHydrationRecord(router) {
111
- return routerHydrationRecords.has(router);
112
- }
113
- function ModernRouterClient({ router }) {
114
- const hydrationRecord = getTanstackSsrHydrationRecord(router);
115
- if ('rejected' === hydrationRecord.status) throw hydrationRecord.error;
116
- return /*#__PURE__*/ jsx(RouterProvider, {
117
- router: router
118
- });
119
- }
120
- function stripSyntheticNotFoundRoute(routes) {
121
- return routes.filter((route)=>!('*' === route.path && !route.id && !route.loader)).map((route)=>{
122
- if (!route.children?.length) return route;
123
- return {
124
- ...route,
125
- children: stripSyntheticNotFoundRoute(route.children)
126
- };
127
- });
128
- }
129
- const tanstackRouterPlugin = (userConfig = {})=>({
130
- name: '@modern-js/plugin-router-tanstack',
131
- registryHooks: {
132
- onAfterCreateRouter: onAfterCreateRouter,
133
- onAfterHydrateRouter: onAfterHydrateRouter,
134
- onBeforeCreateRouter: onBeforeCreateRouter,
135
- onBeforeHydrateRouter: onBeforeHydrateRouter
136
- },
137
- setup: (api)=>{
138
- const hooks = api.getHooks();
139
- let cachedRouteObjects;
140
- let cachedRouteTree = null;
141
- let cachedRouter = null;
142
- let cachedRouterBasepath = null;
143
- const getMergedConfig = ()=>{
144
- const pluginConfig = api.getRuntimeConfig();
145
- return merge(pluginConfig.router || {}, userConfig);
146
- };
147
- const getRouteObjects = ()=>{
148
- if (void 0 !== cachedRouteObjects) return cachedRouteObjects;
149
- const mergedConfig = getMergedConfig();
150
- const { routesConfig, createRoutes } = mergedConfig;
151
- const finalRouteConfig = {
152
- routes: getGlobalRoutes(),
153
- globalApp: getGlobalLayoutApp(),
154
- ...routesConfig
155
- };
156
- const routeObjects = createRoutes ? createRoutes() : createRouteObjectsFromConfig({
157
- routesConfig: finalRouteConfig
158
- }) || [];
159
- const normalizedRouteObjects = createRoutes ? routeObjects : stripSyntheticNotFoundRoute(routeObjects);
160
- cachedRouteObjects = hooks.modifyRoutes.call(normalizedRouteObjects);
161
- return cachedRouteObjects;
162
- };
163
- const getRouteTree = ()=>{
164
- if (cachedRouteTree) return cachedRouteTree;
165
- const routeObjects = getRouteObjects();
166
- if (!routeObjects.length) return null;
167
- cachedRouteTree = createRouteTreeFromRouteObjects(routeObjects);
168
- return cachedRouteTree;
169
- };
170
- const selectBasePath = (pathname)=>{
171
- const { serverBase = [] } = getMergedConfig();
172
- const match = serverBase.find((baseUrl)=>isSegmentPrefix(pathname, baseUrl));
173
- return match || '/';
174
- };
175
- const getClientBasename = (runtimeContext)=>{
176
- const { basename = '' } = getMergedConfig();
177
- const baseUrl = selectBasePath(location.pathname).replace(/^\/*/, '/');
178
- return '/' === baseUrl ? urlJoin(baseUrl, runtimeContext._internalRouterBaseName || basename || '') : baseUrl;
179
- };
180
- const getRouter = (runtimeContext, _basename)=>{
181
- const routeTree = getRouteTree();
182
- if (!routeTree) return null;
183
- const lifecycleContext = {
184
- framework: 'tanstack',
185
- phase: 'client-create',
186
- routes: getRouteObjects(),
187
- runtimeContext,
188
- basename: _basename
189
- };
190
- hooks.onBeforeCreateRouter.call(lifecycleContext);
191
- if (cachedRouter && cachedRouterBasepath === _basename) {
192
- wrapRouterSubscribeWithBlockState(cachedRouter, runtimeContext.unstable_getBlockNavState);
193
- hooks.onAfterCreateRouter.call({
194
- ...lifecycleContext,
195
- router: cachedRouter,
196
- runtimeContext
197
- });
198
- return cachedRouter;
199
- }
200
- const mergedConfig = getMergedConfig();
201
- const { supportHtml5History = true } = mergedConfig;
202
- const history = supportHtml5History ? createBrowserHistory() : createHashHistory();
203
- const rewrite = createModernBasepathRewrite(_basename);
204
- const serializationAdapters = getGlobalEnableRsc() ? getTanstackRscSerializationAdapters() : void 0;
205
- cachedRouter = createRouter({
206
- routeTree,
207
- basepath: '/',
208
- rewrite,
209
- history,
210
- context: {},
211
- ...serializationAdapters ? {
212
- serializationAdapters
213
- } : {}
214
- });
215
- cachedRouterBasepath = _basename;
216
- wrapRouterSubscribeWithBlockState(cachedRouter, runtimeContext.unstable_getBlockNavState);
217
- hooks.onAfterCreateRouter.call({
218
- ...lifecycleContext,
219
- router: cachedRouter,
220
- runtimeContext
221
- });
222
- return cachedRouter;
223
- };
224
- api.onBeforeRender((context)=>{
225
- const mergedConfig = getMergedConfig();
226
- if ("u" > typeof window && void 0 !== window._SSR_DATA && mergedConfig.unstable_reloadOnURLMismatch) {
227
- const { ssrContext } = context;
228
- const currentPathname = normalizePathname(window.location.pathname);
229
- const initialPathname = 'string' == typeof ssrContext?.request?.pathname ? normalizePathname(ssrContext.request.pathname) : void 0;
230
- if (void 0 !== initialPathname && '' !== initialPathname && initialPathname !== currentPathname) {
231
- const errorMsg = `The initial URL ${initialPathname} and the URL ${currentPathname} to be hydrated do not match, reload.`;
232
- console.error(errorMsg);
233
- window.location.reload();
234
- }
235
- }
236
- context.router = {
237
- Link: Link,
238
- useMatches: useMatches,
239
- useLocation: useLocation,
240
- useNavigate: useNavigate,
241
- useRouter: useRouter
242
- };
243
- const hasSSRBootstrap = "u" > typeof window && Boolean(window.$_TSR);
244
- if (hasSSRBootstrap && getRouteObjects().length > 0) {
245
- const runtimeContext = context;
246
- const router = getRouter(runtimeContext, getClientBasename(runtimeContext));
247
- if (null != router) return getTanstackSsrHydrationPromise(router).then(()=>void 0);
248
- }
249
- });
250
- api.wrapRoot((App)=>{
251
- if (0 === getRouteObjects().length) return App;
252
- const RouterWrapper = ()=>{
253
- const runtimeContext = useContext(InternalRuntimeContext);
254
- const _basename = getClientBasename(runtimeContext);
255
- const routeTree = useMemo(()=>getRouteTree(), []);
256
- if (!routeTree) return App ? /*#__PURE__*/ jsx(App, {}) : null;
257
- const router = useMemo(()=>getRouter(runtimeContext, _basename), [
258
- _basename,
259
- routeTree,
260
- runtimeContext
261
- ]);
262
- if (!router) return App ? /*#__PURE__*/ jsx(App, {}) : null;
263
- const runtimeState = applyRouterRuntimeState(runtimeContext, {
264
- framework: 'tanstack',
265
- basename: _basename,
266
- instance: router
267
- });
268
- const lifecycleContext = {
269
- framework: 'tanstack',
270
- phase: 'client-create',
271
- routes: getRouteObjects(),
272
- runtimeContext: runtimeState,
273
- basename: _basename,
274
- router
275
- };
276
- const hasSSRBootstrap = "u" > typeof window && (Boolean(window.$_TSR) || hasTanstackSsrHydrationRecord(router));
277
- const needsRouterClient = hasSSRBootstrap;
278
- if (needsRouterClient) hooks.onBeforeHydrateRouter.call({
279
- ...lifecycleContext,
280
- phase: 'hydrate',
281
- router,
282
- runtimeContext: runtimeState
283
- });
284
- const RouterContent = needsRouterClient ? /*#__PURE__*/ jsx(ModernRouterClient, {
285
- router: router
286
- }) : /*#__PURE__*/ jsx(RouterProvider, {
287
- router: router
288
- });
289
- const HydratableRouterContent = wrapTanstackSsrHydrationBoundary(RouterContent, hasSSRBootstrap);
290
- if (needsRouterClient) hooks.onAfterHydrateRouter.call({
291
- ...lifecycleContext,
292
- phase: 'hydrate',
293
- router,
294
- runtimeContext: runtimeState
295
- });
296
- return App ? /*#__PURE__*/ jsx(App, {
297
- children: HydratableRouterContent
298
- }) : HydratableRouterContent;
299
- };
300
- return RouterWrapper;
301
- });
302
- }
303
- });
304
- export { tanstackRouterPlugin };