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

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