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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/dist/cjs/cli/artifacts.js +157 -0
  2. package/dist/cjs/cli/index.js +8 -79
  3. package/dist/cjs/cli/tanstackTypes/canonicalRoutes.js +113 -0
  4. package/dist/cjs/cli/tanstackTypes/shared.js +123 -0
  5. package/dist/cjs/cli/tanstackTypes/source.js +255 -0
  6. package/dist/cjs/cli/tanstackTypes.js +4 -350
  7. package/dist/cjs/runtime/blockingSubscribe.js +57 -0
  8. package/dist/cjs/runtime/{pluginCore.js → clientBasepath.js} +12 -19
  9. package/dist/cjs/runtime/clientHydration.js +118 -0
  10. package/dist/cjs/runtime/dataMutation.js +11 -176
  11. package/dist/cjs/runtime/formData.js +116 -0
  12. package/dist/cjs/runtime/loaderBridge.js +7 -11
  13. package/dist/cjs/runtime/plugin.js +21 -125
  14. package/dist/cjs/runtime/plugin.node.js +45 -125
  15. package/dist/cjs/runtime/pluginShared.js +87 -0
  16. package/dist/cjs/runtime/prefetchLink.js +15 -2
  17. package/dist/cjs/runtime/register.js +3 -16
  18. package/dist/cjs/runtime/routeTree/components.js +102 -0
  19. package/dist/cjs/runtime/routeTree/construction.js +152 -0
  20. package/dist/cjs/runtime/routeTree/index.js +47 -0
  21. package/dist/cjs/runtime/routeTree/loaders.js +158 -0
  22. package/dist/cjs/runtime/routeTree/paths.js +57 -0
  23. package/dist/cjs/runtime/routeTree/staticData.js +63 -0
  24. package/dist/cjs/runtime/routeTree/tanstackRoutes.js +57 -0
  25. package/dist/cjs/runtime/routeTree/types.js +18 -0
  26. package/dist/cjs/runtime/routeTree.js +7 -320
  27. package/dist/cjs/runtime/router.js +15 -2
  28. package/dist/cjs/runtime/rsc/CompositeComponent.js +18 -13
  29. package/dist/cjs/runtime/rsc/ReplayableStream.js +0 -4
  30. package/dist/cjs/runtime/rsc/RscNodeRenderer.js +5 -16
  31. package/dist/cjs/runtime/rsc/client.js +8 -25
  32. package/dist/cjs/runtime/rsc/flightSerialization.js +132 -0
  33. package/dist/cjs/runtime/rsc/payloadErrors.js +99 -0
  34. package/dist/cjs/runtime/rsc/payloadFetch.js +105 -0
  35. package/dist/cjs/runtime/rsc/payloadRouter.js +21 -142
  36. package/dist/cjs/runtime/rsc/payloadRoutes.js +94 -0
  37. package/dist/cjs/runtime/rsc/payloadStorage.js +58 -0
  38. package/dist/cjs/runtime/rsc/server.js +14 -18
  39. package/dist/cjs/runtime/rsc/shared.js +68 -0
  40. package/dist/cjs/runtime/rsc/slotUsageSanitizer.js +1 -0
  41. package/dist/cjs/runtime/rsc/treeGetter.js +72 -0
  42. package/dist/cjs/runtime/shared/isAbsoluteUrl.js +47 -0
  43. package/dist/cjs/runtime/ssrManagedTags.js +103 -0
  44. package/dist/cjs/runtime/ssrPreload.js +89 -0
  45. package/dist/cjs/runtime/ssrTypes.js +18 -0
  46. package/dist/cjs/runtime/state.js +1 -1
  47. package/dist/cjs/runtime/submitAction.js +161 -0
  48. package/dist/cjs/runtime/utils.js +49 -86
  49. package/dist/esm/cli/artifacts.mjs +103 -0
  50. package/dist/esm/cli/index.mjs +8 -82
  51. package/dist/esm/cli/tanstackTypes/canonicalRoutes.mjs +75 -0
  52. package/dist/esm/cli/tanstackTypes/shared.mjs +61 -0
  53. package/dist/esm/cli/tanstackTypes/source.mjs +207 -0
  54. package/dist/esm/cli/tanstackTypes.mjs +2 -339
  55. package/dist/esm/runtime/blockingSubscribe.mjs +19 -0
  56. package/dist/esm/runtime/clientBasepath.mjs +10 -0
  57. package/dist/esm/runtime/clientHydration.mjs +71 -0
  58. package/dist/esm/runtime/dataMutation.mjs +2 -167
  59. package/dist/esm/runtime/formData.mjs +63 -0
  60. package/dist/esm/runtime/loaderBridge.mjs +5 -9
  61. package/dist/esm/runtime/plugin.mjs +14 -118
  62. package/dist/esm/runtime/plugin.node.mjs +41 -121
  63. package/dist/esm/runtime/pluginShared.mjs +40 -0
  64. package/dist/esm/runtime/prefetchLink.mjs +18 -5
  65. package/dist/esm/runtime/register.mjs +1 -14
  66. package/dist/esm/runtime/routeTree/components.mjs +55 -0
  67. package/dist/esm/runtime/routeTree/construction.mjs +111 -0
  68. package/dist/esm/runtime/routeTree/index.mjs +2 -0
  69. package/dist/esm/runtime/routeTree/loaders.mjs +117 -0
  70. package/dist/esm/runtime/routeTree/paths.mjs +16 -0
  71. package/dist/esm/runtime/routeTree/staticData.mjs +22 -0
  72. package/dist/esm/runtime/routeTree/tanstackRoutes.mjs +13 -0
  73. package/dist/esm/runtime/routeTree/types.mjs +0 -0
  74. package/dist/esm/runtime/routeTree.mjs +1 -318
  75. package/dist/esm/runtime/router.mjs +16 -2
  76. package/dist/esm/runtime/rsc/CompositeComponent.mjs +18 -13
  77. package/dist/esm/runtime/rsc/ReplayableStream.mjs +1 -1
  78. package/dist/esm/runtime/rsc/RscNodeRenderer.mjs +4 -15
  79. package/dist/esm/runtime/rsc/client.mjs +6 -26
  80. package/dist/esm/runtime/rsc/flightSerialization.mjs +88 -0
  81. package/dist/esm/runtime/rsc/payloadErrors.mjs +49 -0
  82. package/dist/esm/runtime/rsc/payloadFetch.mjs +55 -0
  83. package/dist/esm/runtime/rsc/payloadRouter.mjs +12 -133
  84. package/dist/esm/runtime/rsc/payloadRoutes.mjs +50 -0
  85. package/dist/esm/runtime/rsc/payloadStorage.mjs +14 -0
  86. package/dist/esm/runtime/rsc/server.mjs +17 -21
  87. package/dist/esm/runtime/rsc/shared.mjs +21 -0
  88. package/dist/esm/runtime/rsc/slotUsageSanitizer.mjs +1 -0
  89. package/dist/esm/runtime/rsc/treeGetter.mjs +34 -0
  90. package/dist/esm/runtime/shared/isAbsoluteUrl.mjs +9 -0
  91. package/dist/esm/runtime/ssrManagedTags.mjs +53 -0
  92. package/dist/esm/runtime/ssrPreload.mjs +51 -0
  93. package/dist/esm/runtime/ssrTypes.mjs +0 -0
  94. package/dist/esm/runtime/state.mjs +1 -1
  95. package/dist/esm/runtime/submitAction.mjs +120 -0
  96. package/dist/esm/runtime/utils.mjs +47 -75
  97. package/dist/esm-node/cli/artifacts.mjs +104 -0
  98. package/dist/esm-node/cli/index.mjs +8 -82
  99. package/dist/esm-node/cli/tanstackTypes/canonicalRoutes.mjs +76 -0
  100. package/dist/esm-node/cli/tanstackTypes/shared.mjs +62 -0
  101. package/dist/esm-node/cli/tanstackTypes/source.mjs +208 -0
  102. package/dist/esm-node/cli/tanstackTypes.mjs +2 -339
  103. package/dist/esm-node/runtime/blockingSubscribe.mjs +20 -0
  104. package/dist/esm-node/runtime/clientBasepath.mjs +11 -0
  105. package/dist/esm-node/runtime/clientHydration.mjs +72 -0
  106. package/dist/esm-node/runtime/dataMutation.mjs +2 -167
  107. package/dist/esm-node/runtime/formData.mjs +64 -0
  108. package/dist/esm-node/runtime/loaderBridge.mjs +5 -9
  109. package/dist/esm-node/runtime/plugin.mjs +14 -118
  110. package/dist/esm-node/runtime/plugin.node.mjs +41 -121
  111. package/dist/esm-node/runtime/pluginShared.mjs +41 -0
  112. package/dist/esm-node/runtime/prefetchLink.mjs +18 -5
  113. package/dist/esm-node/runtime/register.mjs +1 -14
  114. package/dist/esm-node/runtime/routeTree/components.mjs +56 -0
  115. package/dist/esm-node/runtime/routeTree/construction.mjs +112 -0
  116. package/dist/esm-node/runtime/routeTree/index.mjs +3 -0
  117. package/dist/esm-node/runtime/routeTree/loaders.mjs +118 -0
  118. package/dist/esm-node/runtime/routeTree/paths.mjs +17 -0
  119. package/dist/esm-node/runtime/routeTree/staticData.mjs +23 -0
  120. package/dist/esm-node/runtime/routeTree/tanstackRoutes.mjs +14 -0
  121. package/dist/esm-node/runtime/routeTree/types.mjs +1 -0
  122. package/dist/esm-node/runtime/routeTree.mjs +1 -318
  123. package/dist/esm-node/runtime/router.mjs +16 -2
  124. package/dist/esm-node/runtime/rsc/CompositeComponent.mjs +18 -13
  125. package/dist/esm-node/runtime/rsc/ReplayableStream.mjs +1 -1
  126. package/dist/esm-node/runtime/rsc/RscNodeRenderer.mjs +4 -15
  127. package/dist/esm-node/runtime/rsc/client.mjs +6 -26
  128. package/dist/esm-node/runtime/rsc/flightSerialization.mjs +89 -0
  129. package/dist/esm-node/runtime/rsc/payloadErrors.mjs +50 -0
  130. package/dist/esm-node/runtime/rsc/payloadFetch.mjs +56 -0
  131. package/dist/esm-node/runtime/rsc/payloadRouter.mjs +12 -133
  132. package/dist/esm-node/runtime/rsc/payloadRoutes.mjs +51 -0
  133. package/dist/esm-node/runtime/rsc/payloadStorage.mjs +15 -0
  134. package/dist/esm-node/runtime/rsc/server.mjs +17 -21
  135. package/dist/esm-node/runtime/rsc/shared.mjs +22 -0
  136. package/dist/esm-node/runtime/rsc/slotUsageSanitizer.mjs +1 -0
  137. package/dist/esm-node/runtime/rsc/treeGetter.mjs +35 -0
  138. package/dist/esm-node/runtime/shared/isAbsoluteUrl.mjs +10 -0
  139. package/dist/esm-node/runtime/ssrManagedTags.mjs +54 -0
  140. package/dist/esm-node/runtime/ssrPreload.mjs +52 -0
  141. package/dist/esm-node/runtime/ssrTypes.mjs +1 -0
  142. package/dist/esm-node/runtime/state.mjs +1 -1
  143. package/dist/esm-node/runtime/submitAction.mjs +121 -0
  144. package/dist/esm-node/runtime/utils.mjs +47 -75
  145. package/dist/types/cli/artifacts.d.ts +33 -0
  146. package/dist/types/cli/index.d.ts +2 -22
  147. package/dist/types/cli/tanstackTypes/canonicalRoutes.d.ts +22 -0
  148. package/dist/types/cli/tanstackTypes/shared.d.ts +20 -0
  149. package/dist/types/cli/tanstackTypes/source.d.ts +12 -0
  150. package/dist/types/cli/tanstackTypes.d.ts +3 -31
  151. package/dist/types/runtime/blockingSubscribe.d.ts +1 -0
  152. package/dist/types/runtime/clientBasepath.d.ts +1 -0
  153. package/dist/types/runtime/clientHydration.d.ts +10 -0
  154. package/dist/types/runtime/dataMutation.d.ts +3 -12
  155. package/dist/types/runtime/formData.d.ts +24 -0
  156. package/dist/types/runtime/loaderBridge.d.ts +2 -1
  157. package/dist/types/runtime/plugin.d.ts +1 -1
  158. package/dist/types/runtime/plugin.node.d.ts +1 -1
  159. package/dist/types/runtime/pluginShared.d.ts +38 -0
  160. package/dist/types/runtime/register.d.ts +10 -9
  161. package/dist/types/runtime/routeTree/components.d.ts +7 -0
  162. package/dist/types/runtime/routeTree/construction.d.ts +5 -0
  163. package/dist/types/runtime/routeTree/index.d.ts +2 -0
  164. package/dist/types/runtime/routeTree/loaders.d.ts +4 -0
  165. package/dist/types/runtime/routeTree/paths.d.ts +3 -0
  166. package/dist/types/runtime/routeTree/staticData.d.ts +19 -0
  167. package/dist/types/runtime/routeTree/tanstackRoutes.d.ts +4 -0
  168. package/dist/types/runtime/routeTree/types.d.ts +76 -0
  169. package/dist/types/runtime/routeTree.d.ts +1 -9
  170. package/dist/types/runtime/router.d.ts +6 -7
  171. package/dist/types/runtime/rsc/CompositeComponent.d.ts +1 -2
  172. package/dist/types/runtime/rsc/ReplayableStream.d.ts +3 -2
  173. package/dist/types/runtime/rsc/RscNodeRenderer.d.ts +2 -3
  174. package/dist/types/runtime/rsc/SlotContext.d.ts +2 -1
  175. package/dist/types/runtime/rsc/client.d.ts +2 -0
  176. package/dist/types/runtime/rsc/flightSerialization.d.ts +3 -0
  177. package/dist/types/runtime/rsc/payloadErrors.d.ts +6 -0
  178. package/dist/types/runtime/rsc/payloadFetch.d.ts +8 -0
  179. package/dist/types/runtime/rsc/payloadRouter.d.ts +2 -10
  180. package/dist/types/runtime/rsc/payloadRoutes.d.ts +40 -0
  181. package/dist/types/runtime/rsc/payloadStorage.d.ts +5 -0
  182. package/dist/types/runtime/rsc/shared.d.ts +18 -0
  183. package/dist/types/runtime/rsc/treeGetter.d.ts +1 -0
  184. package/dist/types/runtime/shared/isAbsoluteUrl.d.ts +1 -0
  185. package/dist/types/runtime/ssrManagedTags.d.ts +7 -0
  186. package/dist/types/runtime/ssrPreload.d.ts +2 -0
  187. package/dist/types/runtime/ssrTypes.d.ts +44 -0
  188. package/dist/types/runtime/state.d.ts +1 -1
  189. package/dist/types/runtime/submitAction.d.ts +14 -0
  190. package/dist/types/runtime/types.d.ts +4 -10
  191. package/dist/types/runtime/utils.d.ts +4 -24
  192. package/package.json +37 -17
  193. package/rstest.config.mts +23 -0
  194. package/src/cli/artifacts.ts +255 -0
  195. package/src/cli/index.ts +7 -185
  196. package/src/cli/tanstackTypes/canonicalRoutes.ts +157 -0
  197. package/src/cli/tanstackTypes/shared.ts +113 -0
  198. package/src/cli/tanstackTypes/source.ts +414 -0
  199. package/src/cli/tanstackTypes.ts +4 -647
  200. package/src/runtime/blockingSubscribe.ts +48 -0
  201. package/src/runtime/clientBasepath.ts +12 -0
  202. package/src/runtime/clientHydration.ts +149 -0
  203. package/src/runtime/dataMutation.tsx +9 -306
  204. package/src/runtime/formData.ts +153 -0
  205. package/src/runtime/loaderBridge.ts +11 -12
  206. package/src/runtime/plugin.node.tsx +76 -291
  207. package/src/runtime/plugin.tsx +21 -257
  208. package/src/runtime/pluginShared.ts +112 -0
  209. package/src/runtime/prefetchLink.tsx +78 -15
  210. package/src/runtime/register.ts +10 -42
  211. package/src/runtime/routeTree/components.ts +130 -0
  212. package/src/runtime/routeTree/construction.ts +238 -0
  213. package/src/runtime/routeTree/index.ts +7 -0
  214. package/src/runtime/routeTree/loaders.ts +232 -0
  215. package/src/runtime/routeTree/paths.ts +36 -0
  216. package/src/runtime/routeTree/staticData.ts +66 -0
  217. package/src/runtime/routeTree/tanstackRoutes.ts +36 -0
  218. package/src/runtime/routeTree/types.ts +87 -0
  219. package/src/runtime/routeTree.ts +5 -750
  220. package/src/runtime/router.ts +35 -7
  221. package/src/runtime/rsc/CompositeComponent.tsx +29 -20
  222. package/src/runtime/rsc/ReplayableStream.ts +2 -2
  223. package/src/runtime/rsc/RscNodeRenderer.tsx +9 -27
  224. package/src/runtime/rsc/SlotContext.tsx +1 -1
  225. package/src/runtime/rsc/client.tsx +12 -40
  226. package/src/runtime/rsc/flightSerialization.ts +158 -0
  227. package/src/runtime/rsc/payloadErrors.ts +73 -0
  228. package/src/runtime/rsc/payloadFetch.ts +92 -0
  229. package/src/runtime/rsc/payloadRouter.ts +29 -234
  230. package/src/runtime/rsc/payloadRoutes.ts +122 -0
  231. package/src/runtime/rsc/payloadStorage.ts +35 -0
  232. package/src/runtime/rsc/server.tsx +20 -29
  233. package/src/runtime/rsc/shared.ts +70 -0
  234. package/src/runtime/rsc/slotUsageSanitizer.ts +4 -0
  235. package/src/runtime/rsc/treeGetter.tsx +52 -0
  236. package/src/runtime/shared/isAbsoluteUrl.ts +8 -0
  237. package/src/runtime/ssrManagedTags.ts +107 -0
  238. package/src/runtime/ssrPreload.ts +125 -0
  239. package/src/runtime/ssrTypes.ts +51 -0
  240. package/src/runtime/state.ts +9 -3
  241. package/src/runtime/submitAction.ts +201 -0
  242. package/src/runtime/types.ts +4 -18
  243. package/src/runtime/utils.tsx +76 -110
  244. package/src/types/react-server-dom-rspack.d.ts +56 -0
  245. package/tests/castRatchet.test.ts +85 -0
  246. package/tests/realm-isolation.test.ts +114 -0
  247. package/tests/router/cli.test.ts +7 -0
  248. package/tests/router/clientHydration.test.tsx +61 -0
  249. package/tests/router/dataMutation.test.tsx +59 -0
  250. package/tests/router/fixtures/legacyRuntimeRouter.ts +10 -0
  251. package/tests/router/fixtures/router-gen.golden.txt +71 -0
  252. package/tests/router/fixtures/router-gen.oxlint.json +5 -0
  253. package/tests/router/flightSerialization.roundtrip.test.tsx +137 -0
  254. package/tests/router/generateRouteArtifacts.test.ts +106 -0
  255. package/tests/router/hooks.test.ts +14 -0
  256. package/tests/router/loaderBridge.test.ts +21 -0
  257. package/tests/router/prefetchLink.test.tsx +106 -59
  258. package/tests/router/prefetchLinkPreload.test.tsx +85 -0
  259. package/tests/router/register.test.ts +1 -39
  260. package/tests/router/routeTree.test.ts +51 -11
  261. package/tests/router/routerCompatibility.test.ts +245 -0
  262. package/tests/router/rsc.test.tsx +189 -0
  263. package/tests/router/rscPayloadRouterMatrix.test.ts +197 -0
  264. package/tests/router/slotUsageSanitizer.test.ts +23 -0
  265. package/tests/router/ssrPreload.test.ts +30 -0
  266. package/tests/router/tanstackTypes.test.ts +298 -1
  267. package/dist/esm/runtime/pluginCore.mjs +0 -14
  268. package/dist/esm-node/runtime/pluginCore.mjs +0 -15
  269. package/dist/types/runtime/pluginCore.d.ts +0 -21
  270. package/src/runtime/pluginCore.ts +0 -48
@@ -1,173 +1,8 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { useRouter } from "@tanstack/react-router";
3
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
- }
4
+ import { createFormDataFromSubmit, getSubmitter, resolveSubmitOptionsFromForm } from "./formData.mjs";
5
+ import { RouteActionResponseError, submitRouteAction } from "./submitAction.mjs";
171
6
  function Form({ action, method = 'get', encType, reloadDocument, onSubmit, ...rest }) {
172
7
  const router = useRouter();
173
8
  const handleSubmit = useCallback(async (event)=>{
@@ -0,0 +1,63 @@
1
+ function formDataToUrlSearchParams(formData) {
2
+ const searchParams = new URLSearchParams();
3
+ formData.forEach((value, key)=>{
4
+ if ('string' == typeof value) searchParams.append(key, value);
5
+ });
6
+ return searchParams;
7
+ }
8
+ function formDataToTextPlain(formData) {
9
+ return Array.from(formData.entries()).map(([key, value])=>`${key}=${String(value)}`).join('\n');
10
+ }
11
+ function toFormData(target) {
12
+ if (target instanceof HTMLFormElement) return new FormData(target);
13
+ if (target instanceof FormData) return target;
14
+ if (target instanceof URLSearchParams) {
15
+ const formData = new FormData();
16
+ target.forEach((value, key)=>{
17
+ formData.append(key, value);
18
+ });
19
+ return formData;
20
+ }
21
+ const formData = new FormData();
22
+ Object.entries(target).forEach(([key, value])=>{
23
+ if (null == value) return;
24
+ formData.append(key, String(value));
25
+ });
26
+ return formData;
27
+ }
28
+ function getSubmitter(event) {
29
+ const nativeEvent = event.nativeEvent;
30
+ const submitter = nativeEvent?.submitter;
31
+ if (submitter instanceof HTMLButtonElement || submitter instanceof HTMLInputElement) return submitter;
32
+ return null;
33
+ }
34
+ function appendSubmitterValue(formData, form, submitter) {
35
+ if (submitter.form !== form || submitter.disabled) return;
36
+ if (submitter instanceof HTMLInputElement && 'image' === submitter.type) {
37
+ const namePrefix = submitter.name ? `${submitter.name}.` : '';
38
+ formData.append(`${namePrefix}x`, '0');
39
+ formData.append(`${namePrefix}y`, '0');
40
+ return;
41
+ }
42
+ if (!submitter.name || 'button' === submitter.type || 'reset' === submitter.type) return;
43
+ formData.append(submitter.name, submitter.value);
44
+ }
45
+ function createFormDataFromSubmit({ form, submitter }) {
46
+ if (submitter) try {
47
+ return new FormData(form, submitter);
48
+ } catch {}
49
+ const formData = new FormData(form);
50
+ if (submitter) appendSubmitterValue(formData, form, submitter);
51
+ return formData;
52
+ }
53
+ function resolveSubmitOptionsFromForm({ form, submitter, action, method, encType }) {
54
+ const resolvedAction = submitter?.getAttribute('formaction') || action || form.getAttribute('action') || '.';
55
+ const resolvedMethod = (submitter?.getAttribute('formmethod') || method || form.getAttribute('method') || 'get').toLowerCase();
56
+ const resolvedEncType = submitter?.getAttribute('formenctype') || encType || form.getAttribute('enctype') || 'application/x-www-form-urlencoded';
57
+ return {
58
+ action: resolvedAction,
59
+ method: resolvedMethod,
60
+ encType: resolvedEncType
61
+ };
62
+ }
63
+ export { createFormDataFromSubmit, formDataToTextPlain, formDataToUrlSearchParams, getSubmitter, resolveSubmitOptionsFromForm, toFormData };
@@ -1,4 +1,5 @@
1
1
  import { notFound, redirect } from "@tanstack/react-router";
2
+ import { isAbsoluteUrl } from "./shared/isAbsoluteUrl.mjs";
2
3
  function isResponse(value) {
3
4
  const record = value;
4
5
  return null != record && 'object' == typeof record && 'number' == typeof record.status && 'object' == typeof record.headers;
@@ -16,14 +17,6 @@ function isRedirectResponse(res) {
16
17
  function isTanstackRedirect(value) {
17
18
  return isResponse(value) && 'object' == typeof value.options;
18
19
  }
19
- function isAbsoluteUrl(value) {
20
- try {
21
- new URL(value);
22
- return true;
23
- } catch {
24
- return false;
25
- }
26
- }
27
20
  function throwTanstackRedirect(location) {
28
21
  const target = location || '/';
29
22
  if (isAbsoluteUrl(target)) throw redirect({
@@ -95,7 +88,10 @@ function modernLoaderToTanstack(opts, modernLoader) {
95
88
  const signal = getLoaderSignal(ctx);
96
89
  const baseRequest = ctx?.context?.request instanceof Request ? ctx.context.request : void 0;
97
90
  const href = getLoaderHref(ctx);
98
- const request = void 0 !== baseRequest ? new Request(baseRequest, {
91
+ const request = void 0 !== baseRequest && '' !== href ? new Request(new URL(href, baseRequest.url).href, {
92
+ headers: baseRequest.headers,
93
+ signal
94
+ }) : void 0 !== baseRequest ? new Request(baseRequest, {
99
95
  signal
100
96
  }) : new Request(href, {
101
97
  signal
@@ -4,123 +4,18 @@ import { normalizePathname } from "@modern-js/runtime-utils/url";
4
4
  import { RouterProvider, createBrowserHistory, createHashHistory, createRouter, useLocation, useNavigate, useRouter } from "@tanstack/react-router";
5
5
  import { useContext, useMemo } from "react";
6
6
  import { createModernBasepathRewrite } from "./basepathRewrite.mjs";
7
+ import { wrapRouterSubscribeWithBlockState } from "./blockingSubscribe.mjs";
8
+ import { isSegmentPrefix } from "./clientBasepath.mjs";
9
+ import { ModernRouterClient, getTanstackSsrHydrationPromise, hasTanstackSsrHydrationRecord } from "./clientHydration.mjs";
7
10
  import { routerProviderRegistryHooks } from "./hooks.mjs";
8
11
  import { wrapTanstackSsrHydrationBoundary } from "./hydrationBoundary.mjs";
9
12
  import { applyRouterRuntimeState } from "./lifecycle.mjs";
10
- import { withModernRouteMatchContext } from "./outlet.mjs";
11
- import { getFinalRouteConfig, getMergedRouterConfig } from "./pluginCore.mjs";
13
+ import { createTanstackRouteObjects, getMergedRouterConfig, getTanstackRouteConfig, joinBasename } from "./pluginShared.mjs";
12
14
  import { Link } from "./prefetchLink.mjs";
13
15
  import { useMatches } from "./routeHooks.mjs";
14
16
  import { createRouteTreeFromRouteObjects } from "./routeTree.mjs";
15
17
  import { getTanstackRscSerializationAdapters } from "./rsc/client.mjs";
16
18
  import { getModernTanstackRouterFastDefaults } from "./types.mjs";
17
- import { createRouteObjectsFromConfig, urlJoin } from "./utils.mjs";
18
- const BLOCKING_SUBSCRIBE_SYMBOL = Symbol.for('@modern-js/plugin-tanstack:blocking-subscribe');
19
- const BLOCKING_STATE_SYMBOL = Symbol.for('@modern-js/plugin-tanstack:blocking-state');
20
- function normalizeBase(b) {
21
- if (b.length > 1 && b.endsWith('/')) return b.slice(0, -1);
22
- return b || '/';
23
- }
24
- function isSegmentPrefix(pathname, base) {
25
- const b = normalizeBase(base);
26
- const p = pathname || '/';
27
- return p === b || p.startsWith(`${b}/`);
28
- }
29
- function wrapRouterSubscribeWithBlockState(router, getBlockNavState) {
30
- if (!router || 'object' != typeof router) return;
31
- const target = router;
32
- target[BLOCKING_STATE_SYMBOL] = getBlockNavState;
33
- if (target[BLOCKING_SUBSCRIBE_SYMBOL] || 'function' != typeof target.subscribe) return;
34
- const originSubscribe = target.subscribe.bind(target);
35
- target.subscribe = (eventType, listener)=>{
36
- const wrappedListener = (...args)=>{
37
- const blockRoute = target[BLOCKING_STATE_SYMBOL]?.() || false;
38
- if (blockRoute) return;
39
- return listener(...args);
40
- };
41
- return originSubscribe(eventType, wrappedListener);
42
- };
43
- target[BLOCKING_SUBSCRIBE_SYMBOL] = true;
44
- }
45
- const routerHydrationRecords = new WeakMap();
46
- const routeModulesKey = '_routeModules';
47
- function pickRouteModuleComponent(routeModule, seen = new Set()) {
48
- if ('function' == typeof routeModule || routeModule && 'object' == typeof routeModule && '$$typeof' in routeModule) return routeModule;
49
- if (!routeModule || 'object' != typeof routeModule) return;
50
- if (seen.has(routeModule)) return;
51
- seen.add(routeModule);
52
- const module = routeModule;
53
- for (const candidate of [
54
- module.default,
55
- module.Component
56
- ]){
57
- const component = pickRouteModuleComponent(candidate, seen);
58
- if (component) return component;
59
- }
60
- }
61
- function getCachedRouteModule(routeId) {
62
- if ("u" < typeof window) return;
63
- return window[routeModulesKey]?.[routeId];
64
- }
65
- function preloadHydratedRouteComponents(router) {
66
- const preloadableRouter = router;
67
- const routesById = preloadableRouter.routesById || {};
68
- const matches = preloadableRouter.stores.matches.get();
69
- return Promise.all(matches.map((match)=>{
70
- if (void 0 === match.routeId || '' === match.routeId) return;
71
- const route = routesById[match.routeId];
72
- const component = route?.options?.component;
73
- const preload = component?.load || component?.preload;
74
- if ('function' != typeof preload) return;
75
- return Promise.resolve(preload.call(component)).then((routeModule)=>{
76
- const modernRouteId = route?.options?.staticData?.modernRouteId;
77
- const cachedRouteModule = 'string' == typeof modernRouteId && '' !== modernRouteId ? getCachedRouteModule(modernRouteId) : void 0;
78
- const resolvedComponent = pickRouteModuleComponent(cachedRouteModule ?? routeModule);
79
- if (void 0 !== resolvedComponent && 'string' == typeof modernRouteId && '' !== modernRouteId) route.options.component = withModernRouteMatchContext(resolvedComponent, modernRouteId);
80
- });
81
- })).then(()=>void 0);
82
- }
83
- function hydrateTanstackRouter(router) {
84
- return import("@tanstack/react-router/ssr/client").then(({ hydrate })=>hydrate(router));
85
- }
86
- function getTanstackSsrHydrationRecord(router) {
87
- const existingHydrationRecord = routerHydrationRecords.get(router);
88
- if (void 0 !== existingHydrationRecord) return existingHydrationRecord;
89
- const hydrationRecord = {
90
- promise: Promise.resolve(),
91
- status: 'pending'
92
- };
93
- routerHydrationRecords.set(router, hydrationRecord);
94
- try {
95
- hydrationRecord.promise = hydrateTanstackRouter(router).then((value)=>preloadHydratedRouteComponents(router).then(()=>value)).then((value)=>{
96
- hydrationRecord.status = 'fulfilled';
97
- return value;
98
- }, (error)=>{
99
- hydrationRecord.status = 'rejected';
100
- hydrationRecord.error = error;
101
- throw error;
102
- });
103
- } catch (error) {
104
- hydrationRecord.status = 'rejected';
105
- hydrationRecord.error = error;
106
- hydrationRecord.promise = Promise.reject(error);
107
- hydrationRecord.promise.catch(()=>{});
108
- }
109
- return hydrationRecord;
110
- }
111
- function getTanstackSsrHydrationPromise(router) {
112
- return getTanstackSsrHydrationRecord(router).promise;
113
- }
114
- function hasTanstackSsrHydrationRecord(router) {
115
- return routerHydrationRecords.has(router);
116
- }
117
- function ModernRouterClient({ router }) {
118
- const hydrationRecord = getTanstackSsrHydrationRecord(router);
119
- if ('rejected' === hydrationRecord.status) throw hydrationRecord.error;
120
- return /*#__PURE__*/ jsx(RouterProvider, {
121
- router: router
122
- });
123
- }
124
19
  const tanstackRouterPlugin = (userConfig = {})=>{
125
20
  const plugin = {
126
21
  name: '@modern-js/plugin-router-tanstack',
@@ -134,13 +29,10 @@ const tanstackRouterPlugin = (userConfig = {})=>{
134
29
  const getMergedConfig = ()=>getMergedRouterConfig(api, userConfig);
135
30
  const getRouteObjects = ()=>{
136
31
  if (void 0 !== cachedRouteObjects) return cachedRouteObjects;
137
- const mergedConfig = getMergedConfig();
138
- const { createRoutes } = mergedConfig;
139
- const finalRouteConfig = getFinalRouteConfig(mergedConfig);
140
- const routeObjects = createRoutes ? createRoutes() : createRouteObjectsFromConfig({
141
- routesConfig: finalRouteConfig
142
- }) || [];
143
- cachedRouteObjects = hooks.modifyRoutes.call(routeObjects);
32
+ cachedRouteObjects = createTanstackRouteObjects({
33
+ hooks,
34
+ routeConfig: getTanstackRouteConfig(api, userConfig)
35
+ });
144
36
  return cachedRouteObjects;
145
37
  };
146
38
  const getRouteTree = ()=>{
@@ -160,7 +52,7 @@ const tanstackRouterPlugin = (userConfig = {})=>{
160
52
  const getClientBasename = (runtimeContext)=>{
161
53
  const { basename = '' } = getMergedConfig();
162
54
  const baseUrl = selectBasePath(location.pathname).replace(/^\/*/, '/');
163
- return '/' === baseUrl ? urlJoin(baseUrl, runtimeContext._internalRouterBaseName || basename || '') : baseUrl;
55
+ return '/' === baseUrl ? joinBasename(baseUrl, runtimeContext._internalRouterBaseName || basename || '') : baseUrl;
164
56
  };
165
57
  const getRouter = (runtimeContext, _basename)=>{
166
58
  const routeTree = getRouteTree();
@@ -187,8 +79,12 @@ const tanstackRouterPlugin = (userConfig = {})=>{
187
79
  const history = supportHtml5History ? createBrowserHistory() : createHashHistory();
188
80
  const rewrite = createModernBasepathRewrite(_basename);
189
81
  const serializationAdapters = getGlobalEnableRsc() ? getTanstackRscSerializationAdapters() : void 0;
82
+ const routerFastDefaults = getModernTanstackRouterFastDefaults(mergedConfig);
190
83
  cachedRouter = createRouter({
191
- ...getModernTanstackRouterFastDefaults(mergedConfig),
84
+ ...routerFastDefaults,
85
+ ...serializationAdapters ? {
86
+ defaultStructuralSharing: false
87
+ } : {},
192
88
  routeTree,
193
89
  basepath: '/',
194
90
  rewrite,