@bleedingdev/modern-js-runtime 3.2.0-ultramodern.12 → 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 (330) hide show
  1. package/dist/cjs/boundary-debugger/index.js +307 -0
  2. package/dist/cjs/cache/index.js +9 -5
  3. package/dist/cjs/cli/alias.js +9 -5
  4. package/dist/cjs/cli/code.js +9 -5
  5. package/dist/cjs/cli/constants.js +20 -16
  6. package/dist/cjs/cli/entry.js +9 -5
  7. package/dist/cjs/cli/index.js +20 -5
  8. package/dist/cjs/cli/ssr/index.js +14 -20
  9. package/dist/cjs/cli/ssr/loadable-bundler-plugin.js +9 -5
  10. package/dist/cjs/cli/ssr/mode.js +12 -8
  11. package/dist/cjs/cli/template.js +9 -5
  12. package/dist/cjs/cli/template.server.js +10 -5
  13. package/dist/cjs/common.js +14 -10
  14. package/dist/cjs/core/browser/hydrate.js +9 -5
  15. package/dist/cjs/core/browser/index.js +9 -5
  16. package/dist/cjs/core/browser/withCallback.js +9 -5
  17. package/dist/cjs/core/compat/hooks.js +14 -10
  18. package/dist/cjs/core/compat/index.js +9 -5
  19. package/dist/cjs/core/compat/requestContext.js +13 -9
  20. package/dist/cjs/core/config.js +12 -8
  21. package/dist/cjs/core/constants.js +15 -10
  22. package/dist/cjs/core/context/extensions.js +69 -0
  23. package/dist/cjs/core/context/helmetContext.js +54 -0
  24. package/dist/cjs/core/context/index.js +74 -5
  25. package/dist/cjs/core/context/monitors/default.js +12 -8
  26. package/dist/cjs/core/context/monitors/index.js +9 -5
  27. package/dist/cjs/core/context/monitors/index.server.js +9 -5
  28. package/dist/cjs/core/context/request/index.js +12 -8
  29. package/dist/cjs/core/context/request/index.server.js +9 -5
  30. package/dist/cjs/core/context/response/index.js +15 -11
  31. package/dist/cjs/core/context/response/index.server.js +9 -5
  32. package/dist/cjs/core/context/runtime.js +9 -5
  33. package/dist/cjs/core/context/serverPayload/index.js +13 -9
  34. package/dist/cjs/core/context/serverPayload/index.server.js +9 -5
  35. package/dist/cjs/core/index.js +9 -5
  36. package/dist/cjs/core/plugin/index.js +9 -5
  37. package/dist/cjs/core/react/index.js +9 -5
  38. package/dist/cjs/core/react/wrapper.js +21 -9
  39. package/dist/cjs/core/server/constants.js +15 -11
  40. package/dist/cjs/core/server/federatedCss.js +51 -0
  41. package/dist/cjs/core/server/helmet.js +18 -7
  42. package/dist/cjs/core/server/index.js +9 -5
  43. package/dist/cjs/core/server/react/index.js +9 -5
  44. package/dist/cjs/core/server/react/no-ssr-cache/index.js +9 -5
  45. package/dist/cjs/core/server/react/nossr/index.js +9 -5
  46. package/dist/cjs/core/server/requestHandler.js +51 -34
  47. package/dist/cjs/core/server/routerCleanup.js +110 -0
  48. package/dist/cjs/core/server/scriptOrder.js +134 -0
  49. package/dist/cjs/core/server/server.js +9 -5
  50. package/dist/cjs/core/server/shared.js +12 -8
  51. package/dist/cjs/core/server/stream/afterTemplate.js +16 -16
  52. package/dist/cjs/core/server/stream/beforeTemplate.js +22 -25
  53. package/dist/cjs/core/server/stream/beforeTemplate.worker.js +102 -0
  54. package/dist/cjs/core/server/stream/createReadableStream.js +16 -7
  55. package/dist/cjs/core/server/stream/createReadableStream.worker.js +13 -7
  56. package/dist/cjs/core/server/stream/deferredScript.js +13 -6
  57. package/dist/cjs/core/server/stream/index.js +9 -5
  58. package/dist/cjs/core/server/stream/shared.js +12 -6
  59. package/dist/cjs/core/server/stream/template.js +9 -5
  60. package/dist/cjs/core/server/string/index.js +19 -14
  61. package/dist/cjs/core/server/string/loadable.js +56 -15
  62. package/dist/cjs/core/server/string/ssrData.js +10 -6
  63. package/dist/cjs/core/server/tracer.js +13 -9
  64. package/dist/cjs/core/server/utils.js +40 -13
  65. package/dist/cjs/document/Body.js +9 -5
  66. package/dist/cjs/document/Comment.js +9 -5
  67. package/dist/cjs/document/DocumentContext.js +9 -5
  68. package/dist/cjs/document/DocumentStructureContext.js +9 -5
  69. package/dist/cjs/document/Head.js +9 -5
  70. package/dist/cjs/document/Html.js +9 -5
  71. package/dist/cjs/document/Links.js +9 -5
  72. package/dist/cjs/document/Root.js +9 -5
  73. package/dist/cjs/document/Script.js +9 -5
  74. package/dist/cjs/document/Scripts.js +9 -5
  75. package/dist/cjs/document/Style.js +9 -5
  76. package/dist/cjs/document/Title.js +9 -5
  77. package/dist/cjs/document/cli/index.js +12 -6
  78. package/dist/cjs/document/constants.js +9 -5
  79. package/dist/cjs/document/index.js +9 -5
  80. package/dist/cjs/exports/config-routes.js +12 -8
  81. package/dist/cjs/exports/head.js +271 -10
  82. package/dist/cjs/exports/loadable.js +51 -12
  83. package/dist/cjs/exports/tanstack-router.js +50 -58
  84. package/dist/cjs/index.js +9 -5
  85. package/dist/cjs/internal.js +9 -5
  86. package/dist/cjs/module-federation/index.js +178 -0
  87. package/dist/cjs/react-server.js +9 -5
  88. package/dist/cjs/router/cli/code/getClientRoutes/getRoutes.js +9 -5
  89. package/dist/cjs/router/cli/code/getClientRoutes/index.js +9 -5
  90. package/dist/cjs/router/cli/code/getClientRoutes/utils.js +9 -5
  91. package/dist/cjs/router/cli/code/index.js +10 -52
  92. package/dist/cjs/router/cli/code/inspect.js +9 -5
  93. package/dist/cjs/router/cli/code/makeLegalIdentifier.js +12 -8
  94. package/dist/cjs/router/cli/code/nestedRoutes.js +9 -5
  95. package/dist/cjs/router/cli/code/templates.js +10 -13
  96. package/dist/cjs/router/cli/code/utils.js +9 -5
  97. package/dist/cjs/router/cli/config-routes/converter.js +9 -5
  98. package/dist/cjs/router/cli/config-routes/parseRouteConfig.js +9 -5
  99. package/dist/cjs/router/cli/constants.js +23 -19
  100. package/dist/cjs/router/cli/entry.js +9 -5
  101. package/dist/cjs/router/cli/handler.js +10 -6
  102. package/dist/cjs/router/cli/index.js +11 -28
  103. package/dist/cjs/router/index.js +9 -5
  104. package/dist/cjs/router/internal.js +12 -8
  105. package/dist/cjs/router/runtime/CSSLinks.js +9 -5
  106. package/dist/cjs/router/runtime/DefaultNotFound.js +9 -5
  107. package/dist/cjs/router/runtime/DeferredDataScripts.js +12 -8
  108. package/dist/cjs/router/runtime/DeferredDataScripts.node.js +25 -9
  109. package/dist/cjs/router/runtime/PrefetchLink.js +161 -26
  110. package/dist/cjs/router/runtime/constants.js +9 -5
  111. package/dist/cjs/router/runtime/hooks.js +9 -5
  112. package/dist/cjs/router/runtime/index.js +15 -10
  113. package/dist/cjs/router/runtime/internal.js +29 -18
  114. package/dist/cjs/router/runtime/lifecycle.js +38 -19
  115. package/dist/cjs/router/runtime/plugin.js +11 -14
  116. package/dist/cjs/router/runtime/plugin.node.js +11 -12
  117. package/dist/cjs/router/runtime/provider.js +107 -0
  118. package/dist/cjs/router/runtime/routerHelper.js +9 -5
  119. package/dist/cjs/router/runtime/rsc-router.js +9 -5
  120. package/dist/cjs/router/runtime/rsc.js +9 -5
  121. package/dist/cjs/router/runtime/server.js +9 -5
  122. package/dist/cjs/router/runtime/utils.js +44 -14
  123. package/dist/cjs/router/runtime/withRouter.js +9 -5
  124. package/dist/cjs/rsc/client.js +12 -8
  125. package/dist/cjs/rsc/server.js +9 -5
  126. package/dist/cjs/rsc/server.worker.js +62 -0
  127. package/dist/esm/boundary-debugger/index.mjs +267 -0
  128. package/dist/esm/cli/index.mjs +4 -2
  129. package/dist/esm/cli/ssr/index.mjs +5 -15
  130. package/dist/esm/cli/template.server.mjs +1 -0
  131. package/dist/esm/core/context/extensions.mjs +28 -0
  132. package/dist/esm/core/context/helmetContext.mjs +13 -0
  133. package/dist/esm/core/context/index.mjs +5 -0
  134. package/dist/esm/core/react/wrapper.mjs +12 -4
  135. package/dist/esm/core/server/federatedCss.mjs +13 -0
  136. package/dist/esm/core/server/helmet.mjs +6 -2
  137. package/dist/esm/core/server/requestHandler.mjs +43 -30
  138. package/dist/esm/core/server/routerCleanup.mjs +66 -0
  139. package/dist/esm/core/server/scriptOrder.mjs +84 -0
  140. package/dist/esm/core/server/stream/afterTemplate.mjs +7 -11
  141. package/dist/esm/core/server/stream/beforeTemplate.mjs +14 -11
  142. package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +64 -0
  143. package/dist/esm/core/server/stream/createReadableStream.mjs +7 -2
  144. package/dist/esm/core/server/stream/createReadableStream.worker.mjs +4 -2
  145. package/dist/esm/core/server/stream/deferredScript.mjs +4 -1
  146. package/dist/esm/core/server/stream/shared.mjs +3 -1
  147. package/dist/esm/core/server/string/index.mjs +12 -10
  148. package/dist/esm/core/server/string/loadable.mjs +43 -9
  149. package/dist/esm/core/server/string/ssrData.mjs +2 -2
  150. package/dist/esm/core/server/utils.mjs +31 -8
  151. package/dist/esm/document/cli/index.mjs +3 -1
  152. package/dist/esm/exports/head.mjs +255 -4
  153. package/dist/esm/exports/loadable.mjs +26 -3
  154. package/dist/esm/exports/tanstack-router.mjs +30 -3
  155. package/dist/esm/module-federation/index.mjs +109 -0
  156. package/dist/esm/router/cli/code/index.mjs +1 -47
  157. package/dist/esm/router/cli/code/templates.mjs +1 -8
  158. package/dist/esm/router/cli/handler.mjs +1 -1
  159. package/dist/esm/router/cli/index.mjs +3 -24
  160. package/dist/esm/router/runtime/DeferredDataScripts.node.mjs +16 -4
  161. package/dist/esm/router/runtime/PrefetchLink.mjs +152 -21
  162. package/dist/esm/router/runtime/internal.mjs +16 -15
  163. package/dist/esm/router/runtime/lifecycle.mjs +22 -13
  164. package/dist/esm/router/runtime/plugin.mjs +4 -11
  165. package/dist/esm/router/runtime/plugin.node.mjs +4 -9
  166. package/dist/esm/router/runtime/provider.mjs +57 -0
  167. package/dist/esm/router/runtime/utils.mjs +35 -9
  168. package/dist/esm/rsc/server.worker.mjs +1 -0
  169. package/dist/esm-node/boundary-debugger/index.mjs +268 -0
  170. package/dist/esm-node/cli/index.mjs +4 -2
  171. package/dist/esm-node/cli/ssr/index.mjs +5 -15
  172. package/dist/esm-node/cli/template.server.mjs +1 -0
  173. package/dist/esm-node/core/context/extensions.mjs +29 -0
  174. package/dist/esm-node/core/context/helmetContext.mjs +14 -0
  175. package/dist/esm-node/core/context/index.mjs +5 -0
  176. package/dist/esm-node/core/react/wrapper.mjs +12 -4
  177. package/dist/esm-node/core/server/federatedCss.mjs +14 -0
  178. package/dist/esm-node/core/server/helmet.mjs +6 -2
  179. package/dist/esm-node/core/server/requestHandler.mjs +43 -30
  180. package/dist/esm-node/core/server/routerCleanup.mjs +67 -0
  181. package/dist/esm-node/core/server/scriptOrder.mjs +85 -0
  182. package/dist/esm-node/core/server/stream/afterTemplate.mjs +7 -11
  183. package/dist/esm-node/core/server/stream/beforeTemplate.mjs +14 -11
  184. package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +65 -0
  185. package/dist/esm-node/core/server/stream/createReadableStream.mjs +7 -2
  186. package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +4 -2
  187. package/dist/esm-node/core/server/stream/deferredScript.mjs +4 -1
  188. package/dist/esm-node/core/server/stream/shared.mjs +3 -1
  189. package/dist/esm-node/core/server/string/index.mjs +12 -10
  190. package/dist/esm-node/core/server/string/loadable.mjs +43 -9
  191. package/dist/esm-node/core/server/string/ssrData.mjs +2 -2
  192. package/dist/esm-node/core/server/utils.mjs +31 -8
  193. package/dist/esm-node/document/cli/index.mjs +3 -1
  194. package/dist/esm-node/exports/head.mjs +255 -4
  195. package/dist/esm-node/exports/loadable.mjs +26 -3
  196. package/dist/esm-node/exports/tanstack-router.mjs +30 -3
  197. package/dist/esm-node/module-federation/index.mjs +110 -0
  198. package/dist/esm-node/router/cli/code/index.mjs +1 -47
  199. package/dist/esm-node/router/cli/code/templates.mjs +1 -8
  200. package/dist/esm-node/router/cli/handler.mjs +1 -1
  201. package/dist/esm-node/router/cli/index.mjs +3 -24
  202. package/dist/esm-node/router/runtime/DeferredDataScripts.node.mjs +16 -4
  203. package/dist/esm-node/router/runtime/PrefetchLink.mjs +152 -21
  204. package/dist/esm-node/router/runtime/internal.mjs +16 -15
  205. package/dist/esm-node/router/runtime/lifecycle.mjs +22 -13
  206. package/dist/esm-node/router/runtime/plugin.mjs +4 -11
  207. package/dist/esm-node/router/runtime/plugin.node.mjs +4 -9
  208. package/dist/esm-node/router/runtime/provider.mjs +58 -0
  209. package/dist/esm-node/router/runtime/utils.mjs +35 -9
  210. package/dist/esm-node/rsc/server.worker.mjs +2 -0
  211. package/dist/types/boundary-debugger/index.d.ts +28 -0
  212. package/dist/types/cli/entry.d.ts +2 -2
  213. package/dist/types/cli/index.d.ts +3 -1
  214. package/dist/types/core/context/extensions.d.ts +37 -0
  215. package/dist/types/core/context/helmetContext.d.ts +10 -0
  216. package/dist/types/core/context/index.d.ts +6 -0
  217. package/dist/types/core/context/response/index.server.d.ts +4 -1
  218. package/dist/types/core/context/runtime.d.ts +1 -7
  219. package/dist/types/core/plugin/index.d.ts +1 -1
  220. package/dist/types/core/server/federatedCss.d.ts +5 -0
  221. package/dist/types/core/server/helmet.d.ts +5 -3
  222. package/dist/types/core/server/routerCleanup.d.ts +28 -0
  223. package/dist/types/core/server/scriptOrder.d.ts +25 -0
  224. package/dist/types/core/server/stream/beforeTemplate.d.ts +1 -0
  225. package/dist/types/core/server/stream/beforeTemplate.worker.d.ts +10 -0
  226. package/dist/types/core/server/stream/shared.d.ts +8 -0
  227. package/dist/types/core/server/string/loadable.d.ts +5 -0
  228. package/dist/types/core/server/utils.d.ts +12 -1
  229. package/dist/types/document/constants.d.ts +3 -1
  230. package/dist/types/exports/head.d.ts +10 -3
  231. package/dist/types/exports/loadable.d.ts +8 -1
  232. package/dist/types/exports/tanstack-router.d.ts +88 -5
  233. package/dist/types/module-federation/index.d.ts +65 -0
  234. package/dist/types/router/cli/code/index.d.ts +1 -3
  235. package/dist/types/router/cli/code/utils.d.ts +1 -1
  236. package/dist/types/router/cli/entry.d.ts +1 -1
  237. package/dist/types/router/cli/handler.d.ts +0 -3
  238. package/dist/types/router/runtime/PrefetchLink.d.ts +5 -1
  239. package/dist/types/router/runtime/internal.d.ts +1 -0
  240. package/dist/types/router/runtime/lifecycle.d.ts +2 -0
  241. package/dist/types/router/runtime/plugin.d.ts +1 -1
  242. package/dist/types/router/runtime/plugin.node.d.ts +1 -1
  243. package/dist/types/router/runtime/provider.d.ts +61 -0
  244. package/dist/types/rsc/server.worker.d.ts +1 -0
  245. package/package.json +37 -27
  246. package/rstest.config.mts +2 -4
  247. package/dist/cjs/router/cli/code/tanstackTypes.js +0 -378
  248. package/dist/cjs/router/runtime/tanstack/basepathRewrite.js +0 -62
  249. package/dist/cjs/router/runtime/tanstack/dataMutation.js +0 -345
  250. package/dist/cjs/router/runtime/tanstack/plugin.js +0 -239
  251. package/dist/cjs/router/runtime/tanstack/plugin.node.js +0 -278
  252. package/dist/cjs/router/runtime/tanstack/prefetchLink.js +0 -55
  253. package/dist/cjs/router/runtime/tanstack/routeTree.js +0 -469
  254. package/dist/cjs/router/runtime/tanstack/rsc/ClientSlot.js +0 -53
  255. package/dist/cjs/router/runtime/tanstack/rsc/CompositeComponent.js +0 -75
  256. package/dist/cjs/router/runtime/tanstack/rsc/ReplayableStream.js +0 -141
  257. package/dist/cjs/router/runtime/tanstack/rsc/RscNodeRenderer.js +0 -65
  258. package/dist/cjs/router/runtime/tanstack/rsc/SlotContext.js +0 -54
  259. package/dist/cjs/router/runtime/tanstack/rsc/client.js +0 -93
  260. package/dist/cjs/router/runtime/tanstack/rsc/createRscProxy.js +0 -141
  261. package/dist/cjs/router/runtime/tanstack/rsc/index.js +0 -42
  262. package/dist/cjs/router/runtime/tanstack/rsc/server.js +0 -246
  263. package/dist/cjs/router/runtime/tanstack/rsc/slotUsageSanitizer.js +0 -65
  264. package/dist/cjs/router/runtime/tanstack/rsc/symbols.js +0 -72
  265. package/dist/cjs/ssr/index.node.js +0 -121
  266. package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +0 -84
  267. package/dist/cjs/ssr/serverRender/renderToString/entry.js +0 -195
  268. package/dist/cjs/ssr/serverRender/types.js +0 -36
  269. package/dist/esm/router/cli/code/tanstackTypes.mjs +0 -331
  270. package/dist/esm/router/runtime/tanstack/basepathRewrite.mjs +0 -28
  271. package/dist/esm/router/runtime/tanstack/dataMutation.mjs +0 -305
  272. package/dist/esm/router/runtime/tanstack/plugin.mjs +0 -205
  273. package/dist/esm/router/runtime/tanstack/plugin.node.mjs +0 -244
  274. package/dist/esm/router/runtime/tanstack/prefetchLink.mjs +0 -18
  275. package/dist/esm/router/runtime/tanstack/routeTree.mjs +0 -429
  276. package/dist/esm/router/runtime/tanstack/rsc/ClientSlot.mjs +0 -19
  277. package/dist/esm/router/runtime/tanstack/rsc/CompositeComponent.mjs +0 -41
  278. package/dist/esm/router/runtime/tanstack/rsc/ReplayableStream.mjs +0 -104
  279. package/dist/esm/router/runtime/tanstack/rsc/RscNodeRenderer.mjs +0 -31
  280. package/dist/esm/router/runtime/tanstack/rsc/SlotContext.mjs +0 -17
  281. package/dist/esm/router/runtime/tanstack/rsc/client.mjs +0 -53
  282. package/dist/esm/router/runtime/tanstack/rsc/createRscProxy.mjs +0 -107
  283. package/dist/esm/router/runtime/tanstack/rsc/index.mjs +0 -1
  284. package/dist/esm/router/runtime/tanstack/rsc/server.mjs +0 -200
  285. package/dist/esm/router/runtime/tanstack/rsc/slotUsageSanitizer.mjs +0 -31
  286. package/dist/esm/router/runtime/tanstack/rsc/symbols.mjs +0 -17
  287. package/dist/esm/ssr/index.node.mjs +0 -44
  288. package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.mjs +0 -50
  289. package/dist/esm/ssr/serverRender/renderToString/entry.mjs +0 -148
  290. package/dist/esm/ssr/serverRender/types.mjs +0 -1
  291. package/dist/esm-node/router/cli/code/tanstackTypes.mjs +0 -332
  292. package/dist/esm-node/router/runtime/tanstack/basepathRewrite.mjs +0 -29
  293. package/dist/esm-node/router/runtime/tanstack/dataMutation.mjs +0 -306
  294. package/dist/esm-node/router/runtime/tanstack/plugin.mjs +0 -206
  295. package/dist/esm-node/router/runtime/tanstack/plugin.node.mjs +0 -245
  296. package/dist/esm-node/router/runtime/tanstack/prefetchLink.mjs +0 -19
  297. package/dist/esm-node/router/runtime/tanstack/routeTree.mjs +0 -430
  298. package/dist/esm-node/router/runtime/tanstack/rsc/ClientSlot.mjs +0 -20
  299. package/dist/esm-node/router/runtime/tanstack/rsc/CompositeComponent.mjs +0 -42
  300. package/dist/esm-node/router/runtime/tanstack/rsc/ReplayableStream.mjs +0 -105
  301. package/dist/esm-node/router/runtime/tanstack/rsc/RscNodeRenderer.mjs +0 -32
  302. package/dist/esm-node/router/runtime/tanstack/rsc/SlotContext.mjs +0 -18
  303. package/dist/esm-node/router/runtime/tanstack/rsc/client.mjs +0 -54
  304. package/dist/esm-node/router/runtime/tanstack/rsc/createRscProxy.mjs +0 -108
  305. package/dist/esm-node/router/runtime/tanstack/rsc/index.mjs +0 -2
  306. package/dist/esm-node/router/runtime/tanstack/rsc/server.mjs +0 -201
  307. package/dist/esm-node/router/runtime/tanstack/rsc/slotUsageSanitizer.mjs +0 -32
  308. package/dist/esm-node/router/runtime/tanstack/rsc/symbols.mjs +0 -18
  309. package/dist/esm-node/ssr/index.node.mjs +0 -45
  310. package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.mjs +0 -51
  311. package/dist/esm-node/ssr/serverRender/renderToString/entry.mjs +0 -149
  312. package/dist/esm-node/ssr/serverRender/types.mjs +0 -2
  313. package/dist/types/router/cli/code/tanstackTypes.d.ts +0 -10
  314. package/dist/types/router/runtime/tanstack/basepathRewrite.d.ts +0 -8
  315. package/dist/types/router/runtime/tanstack/dataMutation.d.ts +0 -29
  316. package/dist/types/router/runtime/tanstack/plugin.d.ts +0 -6
  317. package/dist/types/router/runtime/tanstack/plugin.node.d.ts +0 -6
  318. package/dist/types/router/runtime/tanstack/prefetchLink.d.ts +0 -11
  319. package/dist/types/router/runtime/tanstack/routeTree.d.ts +0 -8
  320. package/dist/types/router/runtime/tanstack/rsc/ClientSlot.d.ts +0 -5
  321. package/dist/types/router/runtime/tanstack/rsc/CompositeComponent.d.ts +0 -3
  322. package/dist/types/router/runtime/tanstack/rsc/ReplayableStream.d.ts +0 -24
  323. package/dist/types/router/runtime/tanstack/rsc/RscNodeRenderer.d.ts +0 -5
  324. package/dist/types/router/runtime/tanstack/rsc/SlotContext.d.ts +0 -11
  325. package/dist/types/router/runtime/tanstack/rsc/client.d.ts +0 -11
  326. package/dist/types/router/runtime/tanstack/rsc/createRscProxy.d.ts +0 -7
  327. package/dist/types/router/runtime/tanstack/rsc/index.d.ts +0 -2
  328. package/dist/types/router/runtime/tanstack/rsc/server.d.ts +0 -14
  329. package/dist/types/router/runtime/tanstack/rsc/slotUsageSanitizer.d.ts +0 -2
  330. package/dist/types/router/runtime/tanstack/rsc/symbols.d.ts +0 -46
@@ -4,6 +4,21 @@ import { useEffect, useMemo, useRef } from "react";
4
4
  import { ROUTER_DATA_JSON_ID } from "../../core/constants.mjs";
5
5
  import { modernInline, runWindowFnStr } from "./constants.mjs";
6
6
  import { serializeErrors } from "./utils.mjs";
7
+ function toDeferredErrorInfo(error) {
8
+ if ('production' === process.env.NODE_ENV) return {
9
+ message: 'Unexpected Server Error'
10
+ };
11
+ if (error && 'object' == typeof error) {
12
+ const maybeMessage = error.message;
13
+ return {
14
+ message: 'string' == typeof maybeMessage ? maybeMessage : String(maybeMessage ?? error),
15
+ stack: error.stack
16
+ };
17
+ }
18
+ return {
19
+ message: String(error)
20
+ };
21
+ }
7
22
  const DeferredDataScripts = (props)=>{
8
23
  const staticContext = props?.context;
9
24
  const useJsonScript = props?.useJsonScript;
@@ -39,10 +54,7 @@ const DeferredDataScripts = (props)=>{
39
54
  {
40
55
  const trackedPromise = deferredData.data[key];
41
56
  if (void 0 !== trackedPromise._error) {
42
- const error = {
43
- message: trackedPromise._error.message,
44
- stack: 'production' !== process.env.NODE_ENV ? trackedPromise._error.stack : void 0
45
- };
57
+ const error = toDeferredErrorInfo(trackedPromise._error);
46
58
  return {
47
59
  key,
48
60
  routerDataFnName: 'p',
@@ -10,45 +10,141 @@ function composeEventHandlers(theirHandler, ourHandler) {
10
10
  };
11
11
  }
12
12
  const ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
13
- function usePrefetchBehavior(prefetch, theirElementProps) {
14
- const [maybePrefetch, setMaybePrefetch] = react.useState(false);
13
+ const DEFAULT_PREFETCH_BEHAVIOR = 'render';
14
+ const INTENT_DELAY = 100;
15
+ const VIEWPORT_ROOT_MARGIN = '200px';
16
+ const MAX_CONCURRENT_WARMUPS = 4;
17
+ const WARMUP_TTL = 30000;
18
+ const SLOW_EFFECTIVE_TYPES = new Set([
19
+ 'slow-2g',
20
+ '2g'
21
+ ]);
22
+ const warmupCache = new Map();
23
+ const warmupQueue = [];
24
+ let activeWarmups = 0;
25
+ const getWarmupTimestamp = ()=>performance.now();
26
+ const getConnection = ()=>{
27
+ const nav = globalThis.navigator;
28
+ return nav?.connection || nav?.mozConnection || nav?.webkitConnection;
29
+ };
30
+ const shouldWarmupOnCurrentNetwork = ()=>{
31
+ const connection = getConnection();
32
+ if (connection?.saveData) return false;
33
+ if ('string' == typeof connection?.effectiveType && SLOW_EFFECTIVE_TYPES.has(connection.effectiveType)) return false;
34
+ return true;
35
+ };
36
+ const pruneWarmupCache = (now = getWarmupTimestamp())=>{
37
+ for (const [key, timestamp] of warmupCache)if (now - timestamp > WARMUP_TTL) warmupCache.delete(key);
38
+ };
39
+ const runNextWarmup = ()=>{
40
+ while(activeWarmups < MAX_CONCURRENT_WARMUPS && warmupQueue.length > 0){
41
+ const task = warmupQueue.shift();
42
+ if (task.cancelled) continue;
43
+ activeWarmups += 1;
44
+ task.run().catch((error)=>{
45
+ console.error(error);
46
+ warmupCache.delete(task.key);
47
+ }).finally(()=>{
48
+ activeWarmups -= 1;
49
+ runNextWarmup();
50
+ });
51
+ }
52
+ };
53
+ const scheduleWarmup = (key, run)=>{
54
+ if (!shouldWarmupOnCurrentNetwork()) return ()=>{};
55
+ pruneWarmupCache();
56
+ if (warmupCache.has(key)) return ()=>{};
57
+ warmupCache.set(key, getWarmupTimestamp());
58
+ const task = {
59
+ key,
60
+ run,
61
+ cancelled: false
62
+ };
63
+ warmupQueue.push(task);
64
+ runNextWarmup();
65
+ return ()=>{
66
+ task.cancelled = true;
67
+ };
68
+ };
69
+ const setRef = (ref, value)=>{
70
+ if (!ref) return;
71
+ if ('function' == typeof ref) return void ref(value);
72
+ try {
73
+ ref.current = value;
74
+ } catch {}
75
+ };
76
+ const isDataWarmupEnabled = (route)=>{
77
+ const handle = route.handle;
78
+ return handle?.navigationWarmup?.data !== false;
79
+ };
80
+ function usePrefetchBehavior(prefetch, preload, theirElementProps) {
81
+ const [maybeWarmup, setMaybeWarmup] = react.useState(false);
15
82
  const [shouldPrefetch, setShouldPrefetch] = react.useState(false);
83
+ const [shouldPreload, setShouldPreload] = react.useState(false);
84
+ const [viewportElement, setViewportElement] = react.useState(null);
16
85
  const { onFocus, onBlur, onMouseEnter, onMouseLeave, onTouchStart } = theirElementProps;
17
86
  react.useEffect(()=>{
18
87
  if ('render' === prefetch) setShouldPrefetch(true);
88
+ if ('render' === preload) setShouldPreload(true);
19
89
  }, [
20
- prefetch
90
+ prefetch,
91
+ preload
21
92
  ]);
22
93
  const setIntent = ()=>{
23
- if ('intent' === prefetch) setMaybePrefetch(true);
94
+ if ('intent' === prefetch || 'intent' === preload) setMaybeWarmup(true);
24
95
  };
25
96
  const cancelIntent = ()=>{
26
- if ('intent' === prefetch) {
27
- setMaybePrefetch(false);
97
+ if ('intent' === prefetch || 'intent' === preload) {
98
+ setMaybeWarmup(false);
28
99
  setShouldPrefetch(false);
100
+ setShouldPreload(false);
29
101
  }
30
102
  };
31
103
  react.useEffect(()=>{
32
- if (maybePrefetch) {
104
+ if (maybeWarmup) {
33
105
  const id = setTimeout(()=>{
34
- setShouldPrefetch(true);
35
- }, 100);
106
+ if ('intent' === prefetch) setShouldPrefetch(true);
107
+ if ('intent' === preload) setShouldPreload(true);
108
+ }, INTENT_DELAY);
36
109
  return ()=>{
37
110
  clearTimeout(id);
38
111
  };
39
112
  }
40
113
  }, [
41
- maybePrefetch
114
+ maybeWarmup,
115
+ prefetch,
116
+ preload
117
+ ]);
118
+ react.useEffect(()=>{
119
+ if (!viewportElement || 'viewport' !== prefetch && 'viewport' !== preload || "u" < typeof IntersectionObserver) return;
120
+ const observer = new IntersectionObserver((entries)=>{
121
+ if (!entries.some((entry)=>entry.isIntersecting)) return;
122
+ if ('viewport' === prefetch) setShouldPrefetch(true);
123
+ if ('viewport' === preload) setShouldPreload(true);
124
+ observer.disconnect();
125
+ }, {
126
+ rootMargin: VIEWPORT_ROOT_MARGIN
127
+ });
128
+ observer.observe(viewportElement);
129
+ return ()=>{
130
+ observer.disconnect();
131
+ };
132
+ }, [
133
+ prefetch,
134
+ preload,
135
+ viewportElement
42
136
  ]);
43
137
  return [
44
138
  shouldPrefetch,
139
+ shouldPreload,
45
140
  {
46
141
  onFocus: composeEventHandlers(onFocus, setIntent),
47
142
  onBlur: composeEventHandlers(onBlur, cancelIntent),
48
143
  onMouseEnter: composeEventHandlers(onMouseEnter, setIntent),
49
144
  onMouseLeave: composeEventHandlers(onMouseLeave, cancelIntent),
50
145
  onTouchStart: composeEventHandlers(onTouchStart, setIntent)
51
- }
146
+ },
147
+ setViewportElement
52
148
  ];
53
149
  }
54
150
  async function loadRouteModule(route, routeAssets) {
@@ -83,14 +179,34 @@ const getDataHref = (route, pathname, basename)=>{
83
179
  const url = getRequestUrl(path, id);
84
180
  return createDataHref(url.toString());
85
181
  };
86
- const PrefetchPageLinks = ({ path })=>{
182
+ const PrefetchPageLinks = ({ path, includeData })=>{
87
183
  const { pathname } = path;
88
184
  const context = useContext(InternalRuntimeContext);
89
185
  const { routeManifest, routes } = context;
90
186
  const { routeAssets } = routeManifest || {};
91
- const matches = Array.isArray(routes) ? matchRoutes(routes, pathname) : [];
92
- if (Array.isArray(matches) && routeAssets) matches?.forEach((match)=>loadRouteModule(match.route, routeAssets));
93
- if (!window._SSR_DATA) return null;
187
+ const allowNetworkWarmup = shouldWarmupOnCurrentNetwork();
188
+ const matches = useMemo(()=>Array.isArray(routes) ? matchRoutes(routes, pathname) : [], [
189
+ pathname,
190
+ routes
191
+ ]);
192
+ react.useEffect(()=>{
193
+ if (!allowNetworkWarmup || !Array.isArray(matches) || !routeAssets || !__webpack_chunk_load__) return;
194
+ const cancellations = matches.map((match)=>{
195
+ const routeId = match.route.id;
196
+ const routeAsset = routeId ? routeAssets[routeId] : void 0;
197
+ const chunkIds = routeAsset?.chunkIds;
198
+ if (!routeId || !Array.isArray(chunkIds) || 0 === chunkIds.length) return ()=>{};
199
+ return scheduleWarmup(`route-module:${routeId}:${chunkIds.join(',')}`, ()=>loadRouteModule(match.route, routeAssets));
200
+ });
201
+ return ()=>{
202
+ cancellations.forEach((cancel)=>cancel());
203
+ };
204
+ }, [
205
+ allowNetworkWarmup,
206
+ matches,
207
+ routeAssets
208
+ ]);
209
+ if (!allowNetworkWarmup || !includeData || !window._SSR_DATA) return null;
94
210
  return /*#__PURE__*/ jsx(PrefetchDataLinks, {
95
211
  matches: matches,
96
212
  path: path,
@@ -102,7 +218,7 @@ const PrefetchDataLinks = ({ matches, path, routeManifest })=>{
102
218
  const currentMatches = useMatches();
103
219
  const basename = useHref('/');
104
220
  const dataHrefs = useMemo(()=>matches?.filter((match, index)=>{
105
- if (!match.route.loader || 'function' != typeof match.route.loader || 0 === match.route.loader.length) return false;
221
+ if (!isDataWarmupEnabled(match.route) || !match.route.loader || 'function' != typeof match.route.loader || 0 === match.route.loader.length) return false;
106
222
  if (match.route.shouldRevalidate) {
107
223
  const currentUrl = new URL(location.pathname + location.search + location.hash, window.origin);
108
224
  const nextUrl = new URL(pathname + search + hash, window.origin);
@@ -129,20 +245,35 @@ const PrefetchDataLinks = ({ matches, path, routeManifest })=>{
129
245
  children: dataHrefs
130
246
  });
131
247
  };
132
- const createPrefetchLink = (Link)=>/*#__PURE__*/ react.forwardRef(({ to, prefetch = 'none', ...props }, forwardedRef)=>{
248
+ const normalizePreloadBehavior = (preload, prefetch)=>{
249
+ if (false === preload || 'none' === preload) return 'none';
250
+ if (void 0 !== preload) return preload;
251
+ if ('none' === prefetch) return 'none';
252
+ return prefetch;
253
+ };
254
+ const createPrefetchLink = (Link)=>/*#__PURE__*/ react.forwardRef(({ to, prefetch = DEFAULT_PREFETCH_BEHAVIOR, preload, ...props }, forwardedRef)=>{
133
255
  const isAbsolute = 'string' == typeof to && ABSOLUTE_URL_REGEX.test(to);
134
- const [shouldPrefetch, prefetchHandlers] = usePrefetchBehavior(prefetch, props);
256
+ const resolvedPreload = normalizePreloadBehavior(preload, prefetch);
257
+ const [shouldPrefetch, shouldPreload, prefetchHandlers, setViewportElement] = usePrefetchBehavior(prefetch, resolvedPreload, props);
258
+ const setAnchorRef = react.useCallback((element)=>{
259
+ setViewportElement(element);
260
+ setRef(forwardedRef, element);
261
+ }, [
262
+ forwardedRef,
263
+ setViewportElement
264
+ ]);
135
265
  const resolvedPath = useResolvedPath(to);
136
266
  return /*#__PURE__*/ jsxs(Fragment, {
137
267
  children: [
138
268
  /*#__PURE__*/ jsx(Link, {
139
- ref: forwardedRef,
269
+ ref: setAnchorRef,
140
270
  to: to,
141
271
  ...props,
142
272
  ...prefetchHandlers
143
273
  }),
144
- shouldPrefetch && __webpack_chunk_load__ && !isAbsolute ? /*#__PURE__*/ jsx(PrefetchPageLinks, {
145
- path: resolvedPath
274
+ (shouldPrefetch || shouldPreload) && !isAbsolute ? /*#__PURE__*/ jsx(PrefetchPageLinks, {
275
+ path: resolvedPath,
276
+ includeData: shouldPrefetch
146
277
  }) : null
147
278
  ]
148
279
  });
@@ -1,25 +1,26 @@
1
1
  import { merge } from "@modern-js/runtime-utils/merge";
2
- import { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter } from "./hooks.mjs";
3
- import { modifyRoutes as external_plugin_mjs_modifyRoutes, routerPlugin } from "./plugin.mjs";
4
- import { tanstackRouterPlugin } from "./tanstack/plugin.mjs";
2
+ import { modifyRoutes, routerPlugin } from "./plugin.mjs";
3
+ import { registerRouterProvider, reportUnsupportedProviderRegistryHooks, resolveRouterProvider, routerProviderRegistryHooks } from "./provider.mjs";
4
+ registerRouterProvider('react-router', routerPlugin, {
5
+ isDefault: true
6
+ });
5
7
  const internal_routerPlugin = (userConfig = {})=>({
6
8
  name: '@modern-js/plugin-router',
7
- registryHooks: {
8
- onAfterCreateRouter: onAfterCreateRouter,
9
- onAfterHydrateRouter: onAfterHydrateRouter,
10
- onBeforeCreateRouter: onBeforeCreateRouter,
11
- modifyRoutes: modifyRoutes,
12
- onBeforeCreateRoutes: onBeforeCreateRoutes,
13
- onBeforeHydrateRouter: onBeforeHydrateRouter
14
- },
9
+ registryHooks: routerProviderRegistryHooks,
15
10
  setup: (api)=>{
16
11
  const mergedConfig = merge(api.getRuntimeConfig().router || {}, userConfig);
17
- const framework = mergedConfig.framework || 'react-router';
18
- const pluginFactory = 'tanstack' === framework ? tanstackRouterPlugin : routerPlugin;
19
- pluginFactory(userConfig).setup?.(api);
12
+ const pluginFactory = resolveRouterProvider(mergedConfig.framework, {
13
+ localDefault: {
14
+ name: 'react-router',
15
+ factory: routerPlugin
16
+ }
17
+ });
18
+ const providerPlugin = pluginFactory(userConfig);
19
+ reportUnsupportedProviderRegistryHooks(providerPlugin);
20
+ providerPlugin.setup?.(api);
20
21
  }
21
22
  });
22
23
  const internal = internal_routerPlugin;
23
24
  export { renderRoutes } from "./utils.mjs";
24
25
  export default internal;
25
- export { external_plugin_mjs_modifyRoutes as modifyRoutes, internal_routerPlugin as routerPlugin };
26
+ export { internal_routerPlugin as routerPlugin, modifyRoutes, registerRouterProvider, resolveRouterProvider };
@@ -1,3 +1,12 @@
1
+ import { createRuntimeContextExtension } from "../../core/context/extensions.mjs";
2
+ const routerRuntimeStateExtension = createRuntimeContextExtension('@modern-js/runtime:router-runtime-state');
3
+ const routerServerSnapshotExtension = createRuntimeContextExtension('@modern-js/runtime:router-server-snapshot');
4
+ function getRouterRuntimeState(runtimeContext) {
5
+ return routerRuntimeStateExtension.get(runtimeContext);
6
+ }
7
+ function getRouterServerSnapshot(runtimeContext) {
8
+ return routerServerSnapshotExtension.get(runtimeContext);
9
+ }
1
10
  function toHydrationScripts(state) {
2
11
  if (state.hydrationScripts?.length) return state.hydrationScripts;
3
12
  return state.hydrationScript ? [
@@ -61,12 +70,8 @@ function createRouterRuntimeState(state) {
61
70
  }
62
71
  function applyRouterRuntimeState(runtimeContext, state) {
63
72
  const normalized = createRouterRuntimeState(state);
64
- runtimeContext.routerFramework = normalized.framework;
65
- runtimeContext.routerInstance = normalized.instance;
66
- runtimeContext.routerHydrationScript = normalized.hydrationScript;
67
- runtimeContext.routerMatchedRouteIds = normalized.matchedRouteIds;
68
- runtimeContext.routerRuntime = normalized;
69
- if (normalized.serverSnapshot) runtimeContext.routerServerSnapshot = normalized.serverSnapshot;
73
+ routerRuntimeStateExtension.set(runtimeContext, normalized);
74
+ if (normalized.serverSnapshot) routerServerSnapshotExtension.set(runtimeContext, normalized.serverSnapshot);
70
75
  return runtimeContext;
71
76
  }
72
77
  function applyRouterServerPrepareResult(runtimeContext, result) {
@@ -79,18 +84,22 @@ function applyRouterServerPrepareResult(runtimeContext, result) {
79
84
  return runtimeContext;
80
85
  }
81
86
  function getRouterHydrationScripts(runtimeContext) {
82
- return runtimeContext.routerServerSnapshot?.hydrationScripts ?? toHydrationScripts({
83
- hydrationScript: runtimeContext.routerServerSnapshot?.hydrationScript
84
- }) ?? runtimeContext.routerRuntime?.hydrationScripts ?? toHydrationScripts({
85
- hydrationScript: runtimeContext.routerRuntime?.hydrationScript ?? runtimeContext.routerHydrationScript
87
+ const serverSnapshot = getRouterServerSnapshot(runtimeContext);
88
+ const runtimeState = getRouterRuntimeState(runtimeContext);
89
+ return serverSnapshot?.hydrationScripts ?? toHydrationScripts({
90
+ hydrationScript: serverSnapshot?.hydrationScript
91
+ }) ?? runtimeState?.hydrationScripts ?? toHydrationScripts({
92
+ hydrationScript: runtimeState?.hydrationScript
86
93
  }) ?? [];
87
94
  }
88
95
  function getRouterMatchedRouteIds(runtimeContext) {
89
- return runtimeContext.routerServerSnapshot?.matchedRouteIds ?? getMatchedRouteIdsFromMatches(runtimeContext.routerServerSnapshot?.matches) ?? runtimeContext.routerRuntime?.matchedRouteIds ?? getMatchedRouteIdsFromMatches(runtimeContext.routerRuntime?.matches) ?? runtimeContext.routerMatchedRouteIds;
96
+ const serverSnapshot = getRouterServerSnapshot(runtimeContext);
97
+ const runtimeState = getRouterRuntimeState(runtimeContext);
98
+ return serverSnapshot?.matchedRouteIds ?? getMatchedRouteIdsFromMatches(serverSnapshot?.matches) ?? runtimeState?.matchedRouteIds ?? getMatchedRouteIdsFromMatches(runtimeState?.matches);
90
99
  }
91
100
  async function cleanupRouterRuntimeState(runtimeContext) {
92
101
  try {
93
- await runtimeContext.routerRuntime?.cleanup?.();
102
+ await getRouterRuntimeState(runtimeContext)?.cleanup?.();
94
103
  } catch {}
95
104
  }
96
- export { applyRouterRuntimeState, applyRouterServerPrepareResult, cleanupRouterRuntimeState, createRouterRuntimeState, createRouterServerSnapshot, getRouterHydrationScripts, getRouterMatchedRouteIds };
105
+ export { applyRouterRuntimeState, applyRouterServerPrepareResult, cleanupRouterRuntimeState, createRouterRuntimeState, createRouterServerSnapshot, getRouterHydrationScripts, getRouterMatchedRouteIds, getRouterRuntimeState, getRouterServerSnapshot };
@@ -4,15 +4,15 @@ import { RouterProvider, createBrowserRouter, createHashRouter, createRoutesFrom
4
4
  import { normalizePathname } from "@modern-js/runtime-utils/url";
5
5
  import * as __rspack_external_react from "react";
6
6
  import { InternalRuntimeContext, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
7
- import { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter } from "./hooks.mjs";
8
7
  import { applyRouterRuntimeState } from "./lifecycle.mjs";
8
+ import { routerProviderRegistryHooks } from "./provider.mjs";
9
9
  import { createClientRouterFromPayload } from "./rsc-router.mjs";
10
10
  import { createRouteObjectsFromConfig, deserializeErrors, renderRoutes, urlJoin } from "./utils.mjs";
11
11
  let finalRouteConfig = {
12
12
  routes: []
13
13
  };
14
14
  let beforeCreateRouter = true;
15
- function plugin_modifyRoutes(modifyFunction) {
15
+ function modifyRoutes(modifyFunction) {
16
16
  if (beforeCreateRouter) {
17
17
  const { routes: originRoutes } = finalRouteConfig;
18
18
  const newRoutes = modifyFunction(originRoutes);
@@ -21,14 +21,7 @@ function plugin_modifyRoutes(modifyFunction) {
21
21
  }
22
22
  const routerPlugin = (userConfig = {})=>({
23
23
  name: '@modern-js/plugin-router',
24
- registryHooks: {
25
- onAfterCreateRouter: onAfterCreateRouter,
26
- onAfterHydrateRouter: onAfterHydrateRouter,
27
- onBeforeCreateRouter: onBeforeCreateRouter,
28
- modifyRoutes: modifyRoutes,
29
- onBeforeCreateRoutes: onBeforeCreateRoutes,
30
- onBeforeHydrateRouter: onBeforeHydrateRouter
31
- },
24
+ registryHooks: routerProviderRegistryHooks,
32
25
  setup: (api)=>{
33
26
  const routesContainer = {
34
27
  current: []
@@ -216,4 +209,4 @@ function useRouterCreation(props, options) {
216
209
  getBlockNavState
217
210
  ]);
218
211
  }
219
- export { beforeCreateRouter, finalRouteConfig, plugin_modifyRoutes as modifyRoutes, routerPlugin };
212
+ export { beforeCreateRouter, finalRouteConfig, modifyRoutes, routerPlugin };
@@ -8,8 +8,8 @@ import { useContext } from "react";
8
8
  import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
9
9
  import { setServerPayload } from "../../core/context/serverPayload/index.server.mjs";
10
10
  import DeferredDataScripts_node from "./DeferredDataScripts.node.mjs";
11
- import { modifyRoutes, onAfterCreateRouter, onBeforeCreateRouter, onBeforeCreateRoutes } from "./hooks.mjs";
12
11
  import { applyRouterRuntimeState, createRouterServerSnapshot } from "./lifecycle.mjs";
12
+ import { routerProviderRegistryHooks } from "./provider.mjs";
13
13
  import { RSCStaticRouter, createServerPayload, handleRSCRedirect, prepareRSCRoutes } from "./rsc-router.mjs";
14
14
  import { createRouteObjectsFromConfig, renderRoutes, urlJoin } from "./utils.mjs";
15
15
  function createRemixRequest(request) {
@@ -42,12 +42,7 @@ function createReactRouterServerSnapshot(routerContext, basename) {
42
42
  }
43
43
  const routerPlugin = (userConfig = {})=>({
44
44
  name: '@modern-js/plugin-router',
45
- registryHooks: {
46
- onAfterCreateRouter: onAfterCreateRouter,
47
- onBeforeCreateRouter: onBeforeCreateRouter,
48
- modifyRoutes: modifyRoutes,
49
- onBeforeCreateRoutes: onBeforeCreateRoutes
50
- },
45
+ registryHooks: routerProviderRegistryHooks,
51
46
  setup: (api)=>{
52
47
  let finalRouteConfig = {};
53
48
  api.onBeforeRender(async (context, interrupt)=>{
@@ -175,5 +170,5 @@ const routerPlugin = (userConfig = {})=>({
175
170
  });
176
171
  }
177
172
  });
178
- const plugin_node_modifyRoutes = ()=>{};
179
- export { plugin_node_modifyRoutes as modifyRoutes, routerPlugin };
173
+ const modifyRoutes = ()=>{};
174
+ export { modifyRoutes, routerPlugin };
@@ -0,0 +1,57 @@
1
+ import { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter } from "./hooks.mjs";
2
+ const routerProviderRegistryHooks = {
3
+ modifyRoutes: modifyRoutes,
4
+ onBeforeCreateRoutes: onBeforeCreateRoutes,
5
+ onBeforeCreateRouter: onBeforeCreateRouter,
6
+ onAfterCreateRouter: onAfterCreateRouter,
7
+ onBeforeHydrateRouter: onBeforeHydrateRouter,
8
+ onAfterHydrateRouter: onAfterHydrateRouter
9
+ };
10
+ function reportUnsupportedProviderRegistryHooks(providerPlugin) {
11
+ const unsupportedHookNames = Object.keys(providerPlugin.registryHooks ?? {}).filter((hookName)=>!(hookName in routerProviderRegistryHooks));
12
+ if (unsupportedHookNames.length > 0) console.warn(`[@modern-js/runtime] The router provider "${providerPlugin.name}" declares registry hooks outside the router hook contract: ${unsupportedHookNames.join(', ')}. These hooks are not registered when the provider is resolved through \`runtime.router.framework\` — declare them on a separate runtime plugin instead.`);
13
+ return unsupportedHookNames;
14
+ }
15
+ const REGISTRY_SLOT = Symbol.for('@modern-js/runtime:router-providers:v2');
16
+ function getRegistry() {
17
+ const host = globalThis;
18
+ host[REGISTRY_SLOT] ??= {
19
+ providers: new Map(),
20
+ warnedDuplicates: new Set()
21
+ };
22
+ host[REGISTRY_SLOT].warnedDuplicates ??= new Set();
23
+ return host[REGISTRY_SLOT];
24
+ }
25
+ function registerRouterProvider(name, factory, options = {}) {
26
+ const registry = getRegistry();
27
+ const existing = registry.providers.get(name);
28
+ if (void 0 !== existing) {
29
+ if (existing !== factory && !registry.warnedDuplicates.has(name)) {
30
+ registry.warnedDuplicates.add(name);
31
+ console.warn(`[@modern-js/runtime] The router provider "${name}" was registered more than once with different module instances; keeping the first registration. This usually means two copies of the providing plugin were bundled — for Module Federation, add the provider runtime (e.g. '@modern-js/plugin-tanstack/runtime') to the shared modules of both the host and the remote to deduplicate it.`);
32
+ }
33
+ return;
34
+ }
35
+ if (true !== options.isDefault) {
36
+ if (void 0 !== registry.nonDefaultProvider && registry.nonDefaultProvider !== name) throw new Error(`[@modern-js/runtime] Cannot register router provider "${name}": the competing router provider "${registry.nonDefaultProvider}" is already registered. Only one non-default router provider may be installed at a time — remove one of the router plugins.`);
37
+ registry.nonDefaultProvider = name;
38
+ } else registry.defaultProvider = name;
39
+ registry.providers.set(name, factory);
40
+ }
41
+ function resolveRouterProvider(framework, options = {}) {
42
+ const registry = getRegistry();
43
+ const name = framework || registry.defaultProvider || options.localDefault?.name;
44
+ if (void 0 === name) throw new Error('[@modern-js/runtime] No default router provider is registered. This is a bug in the runtime setup.');
45
+ if (void 0 !== options.localDefault && name === options.localDefault.name) return options.localDefault.factory;
46
+ const factory = registry.providers.get(name);
47
+ if (void 0 !== factory) return factory;
48
+ if ('tanstack' === name) throw new Error("[@modern-js/runtime] `runtime.router.framework` is set to \"tanstack\", but no TanStack router provider is registered. Install @modern-js/plugin-tanstack, add `tanstackRouterPlugin()` to the `plugins` array in modern.config.ts, and make sure '@modern-js/plugin-tanstack/runtime' is imported (e.g. in modern.runtime.ts).");
49
+ throw new Error(`[@modern-js/runtime] Unknown router framework "${name}". Registered providers: ${[
50
+ ...registry.providers.keys()
51
+ ].join(', ') || '(none)'}. Install and register the plugin that provides this router framework.`);
52
+ }
53
+ function unsafe_resetRouterProvidersForTesting() {
54
+ const host = globalThis;
55
+ delete host[REGISTRY_SLOT];
56
+ }
57
+ export { registerRouterProvider, reportUnsupportedProviderRegistryHooks, resolveRouterProvider, routerProviderRegistryHooks, unsafe_resetRouterProvidersForTesting };
@@ -98,7 +98,10 @@ function getRouteObjects(routes, { globalApp, ssrMode, props }) {
98
98
  }
99
99
  routeObjects.push({
100
100
  path: '*',
101
- element: /*#__PURE__*/ jsx(DefaultNotFound, {})
101
+ element: /*#__PURE__*/ jsx(DefaultNotFound, {}),
102
+ loader: ()=>new Response('404', {
103
+ status: 404
104
+ })
102
105
  });
103
106
  return routeObjects;
104
107
  }
@@ -147,17 +150,40 @@ function serializeErrors(errors) {
147
150
  if (!errors) return null;
148
151
  const entries = Object.entries(errors);
149
152
  const serialized = {};
150
- for (const [key, val] of entries)if (isRouteErrorResponse(val)) serialized[key] = {
151
- ...val,
152
- __type: 'RouteErrorResponse'
153
+ for (const [key, val] of entries)if (isRouteErrorResponse(val)) serialized[key] = serializeRouteErrorResponse(val);
154
+ else if (val instanceof Error) serialized[key] = serializeError(val);
155
+ else serialized[key] = val;
156
+ return serialized;
157
+ }
158
+ function shouldRedactServerError() {
159
+ return 'development' !== process.env.NODE_ENV && 'test' !== process.env.NODE_ENV;
160
+ }
161
+ function serializeError(error) {
162
+ if (shouldRedactServerError()) return {
163
+ message: 'Unexpected Server Error',
164
+ stack: void 0,
165
+ __type: 'Error'
153
166
  };
154
- else if (val instanceof Error) serialized[key] = {
155
- message: val.message,
156
- stack: val.stack,
167
+ return {
168
+ message: error.message,
169
+ stack: error.stack,
157
170
  __type: 'Error'
158
171
  };
159
- else serialized[key] = val;
160
- return serialized;
172
+ }
173
+ function serializeRouteErrorResponse(error) {
174
+ if (!isRouteErrorResponse(error)) return error;
175
+ if (error.status >= 500 && shouldRedactServerError()) return {
176
+ status: error.status,
177
+ statusText: 'Internal Server Error',
178
+ data: 'Unexpected Server Error',
179
+ __type: 'RouteErrorResponse'
180
+ };
181
+ return {
182
+ status: error.status,
183
+ statusText: error.statusText,
184
+ data: error.data,
185
+ __type: 'RouteErrorResponse'
186
+ };
161
187
  }
162
188
  function deserializeErrors(errors) {
163
189
  if (!errors) return null;
@@ -0,0 +1 @@
1
+ export * from "@modern-js/render/rsc-worker";