@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
@@ -0,0 +1,85 @@
1
+ import "node:module";
2
+ import { getRouterMatchedRouteIds } from "../../router/runtime/lifecycle.mjs";
3
+ import { CHUNK_JS_PLACEHOLDER } from "./constants.mjs";
4
+ import { safeReplace } from "./utils.mjs";
5
+ function getScriptTags(template) {
6
+ const scriptRegExp = /<script\b[^>]*\bsrc=(["'])(.*?)\1[^>]*><\/script>/g;
7
+ return Array.from(template.matchAll(scriptRegExp)).map((match)=>({
8
+ index: match.index ?? 0,
9
+ tag: match[0],
10
+ src: match[2]
11
+ }));
12
+ }
13
+ function getAssetBasename(src) {
14
+ const withoutQuery = src.split(/[?#]/)[0];
15
+ return withoutQuery.split('/').pop() || withoutQuery;
16
+ }
17
+ function isEntryScript(src, entryName, asyncEntry) {
18
+ const basename = getAssetBasename(src);
19
+ const prefix = asyncEntry ? `async-${entryName}` : entryName;
20
+ return basename === `${prefix}.js` || basename.startsWith(`${prefix}.`) || basename.startsWith(`${prefix}-`);
21
+ }
22
+ const dedupeByUrl = (chunks)=>{
23
+ const seen = new Set();
24
+ return chunks.filter((chunk)=>{
25
+ if (void 0 === chunk.url || '' === chunk.url || seen.has(chunk.url)) return false;
26
+ seen.add(chunk.url);
27
+ return true;
28
+ });
29
+ };
30
+ const isAsyncEntryScriptChunk = (chunk, entryName)=>{
31
+ if (void 0 === chunk.url || !chunk.url.endsWith('.js')) return false;
32
+ const asyncEntryName = `async-${entryName}`;
33
+ const filename = chunk.filename ?? chunk.url;
34
+ const basename = filename.split('/').pop() ?? filename;
35
+ return basename === `${asyncEntryName}.js` || basename.startsWith(`${asyncEntryName}.`) || basename.startsWith(`${asyncEntryName}-`);
36
+ };
37
+ function getRouteAssets(runtimeContext, routeManifest = runtimeContext.routeManifest) {
38
+ return routeManifest?.routeAssets;
39
+ }
40
+ function getMatchedRouteAssets(runtimeContext, routeManifest) {
41
+ const routeAssets = getRouteAssets(runtimeContext, routeManifest);
42
+ if (void 0 === routeAssets) return [];
43
+ const matchedRouteIds = getRouterMatchedRouteIds(runtimeContext) ?? [];
44
+ return matchedRouteIds.flatMap((routeId)=>routeAssets[routeId]?.assets ?? []);
45
+ }
46
+ const orderHydrationScriptChunks = ({ asyncEntryChunks, collectedChunks, matchedRouteChunks, entryName })=>{
47
+ const asyncEntryScriptChunks = [];
48
+ const asyncEntryDependencyChunks = [];
49
+ for (const chunk of asyncEntryChunks)if (isAsyncEntryScriptChunk(chunk, entryName)) asyncEntryScriptChunks.push(chunk);
50
+ else asyncEntryDependencyChunks.push(chunk);
51
+ return dedupeByUrl([
52
+ ...asyncEntryDependencyChunks,
53
+ ...collectedChunks,
54
+ ...matchedRouteChunks,
55
+ ...asyncEntryScriptChunks
56
+ ]);
57
+ };
58
+ function injectBeforeHydrationEntryScript(template, scripts, entryName = 'index') {
59
+ if ('' === scripts) return template;
60
+ const scriptTags = getScriptTags(template);
61
+ const target = scriptTags.find((match)=>isEntryScript(match.src, entryName, false)) ?? scriptTags.find((match)=>isEntryScript(match.src, entryName, true));
62
+ if (void 0 === target) return template;
63
+ return `${template.slice(0, target.index)}${scripts}${template.slice(target.index)}`;
64
+ }
65
+ function replaceChunkJsPlaceholder(template, scripts, entryName, placeholder = CHUNK_JS_PLACEHOLDER) {
66
+ if ('' === scripts) return safeReplace(template, placeholder, '');
67
+ const withoutPlaceholder = safeReplace(template, placeholder, '');
68
+ const withEarlyScripts = injectBeforeHydrationEntryScript(withoutPlaceholder, scripts, entryName);
69
+ if (withEarlyScripts !== withoutPlaceholder) return withEarlyScripts;
70
+ return safeReplace(template, placeholder, scripts);
71
+ }
72
+ function createRouteHydrationScriptTags(runtimeContext, entryName, options = {}) {
73
+ const { nonce, template } = options;
74
+ const routeAssets = getRouteAssets(runtimeContext);
75
+ if (void 0 === routeAssets) return '';
76
+ const matchedRouteIds = getRouterMatchedRouteIds(runtimeContext) ?? [];
77
+ const assetEntries = [
78
+ ...matchedRouteIds.map((routeId)=>routeAssets[routeId]),
79
+ routeAssets[`async-${entryName}`]
80
+ ].filter((entry)=>void 0 !== entry);
81
+ const jsAssets = Array.from(new Set(assetEntries.flatMap((entry)=>(entry.assets ?? []).filter((asset)=>asset.endsWith('.js')))));
82
+ const nonceAttr = void 0 === nonce || '' === nonce ? '' : ` nonce="${nonce}"`;
83
+ return jsAssets.filter((asset)=>template?.includes(asset) !== true).map((asset)=>`<script src=${asset}${nonceAttr}></script>`).join(' ');
84
+ }
85
+ export { createRouteHydrationScriptTags, getMatchedRouteAssets, injectBeforeHydrationEntryScript, orderHydrationScriptChunks, replaceChunkJsPlaceholder };
@@ -3,6 +3,7 @@ import { serializeJson } from "@modern-js/runtime-utils/node";
3
3
  import { getRouterHydrationScripts } from "../../../router/runtime/lifecycle.mjs";
4
4
  import { SSR_DATA_JSON_ID } from "../../constants.mjs";
5
5
  import { SSR_DATA_PLACEHOLDER } from "../constants.mjs";
6
+ import { createRouteHydrationScriptTags, replaceChunkJsPlaceholder } from "../scriptOrder.mjs";
6
7
  import { buildHtml } from "../shared.mjs";
7
8
  import { attributesToString, safeReplace } from "../utils.mjs";
8
9
  function buildShellAfterTemplate(afterAppTemplate, options) {
@@ -19,17 +20,12 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
19
20
  (template)=>injectJs(template, entryName, config.nonce)
20
21
  ];
21
22
  async function injectJs(template, entryName, nonce) {
22
- const { routeManifest } = runtimeContext;
23
- if (!routeManifest) return template;
24
- const { routeAssets } = routeManifest;
25
- if (!routeAssets) return template;
26
- const asyncEntry = routeAssets[`async-${entryName}`];
27
- if (asyncEntry) {
28
- const { assets } = asyncEntry;
29
- const jsChunkStr = assets?.filter((asset)=>asset.endsWith('.js'))?.map((asset)=>`<script src=${asset} nonce="${nonce}"></script>`).join(' ');
30
- if (jsChunkStr) return safeReplace(template, '<!--<?- chunksMap.js ?>-->', jsChunkStr);
31
- }
32
- return template;
23
+ const jsChunkStr = createRouteHydrationScriptTags(runtimeContext, entryName, {
24
+ nonce,
25
+ template
26
+ });
27
+ if (!jsChunkStr) return template;
28
+ return replaceChunkJsPlaceholder(template, jsChunkStr, entryName);
33
29
  }
34
30
  return buildHtml(afterAppTemplate, callbacks);
35
31
  }
@@ -1,9 +1,9 @@
1
1
  import "node:module";
2
2
  import { matchRoutes } from "@modern-js/runtime-utils/router";
3
- import react_helmet from "react-helmet";
4
3
  import { getRouterMatchedRouteIds } from "../../../router/runtime/lifecycle.mjs";
5
4
  import { CHUNK_CSS_PLACEHOLDER } from "../constants.mjs";
6
- import { createReplaceHelemt } from "../helmet.mjs";
5
+ import { createFederatedCssLinks } from "../federatedCss.mjs";
6
+ import { createReplaceHelemt, getHelmetData } from "../helmet.mjs";
7
7
  import { buildHtml } from "../shared.mjs";
8
8
  import { checkIsNode, safeReplace } from "../utils.mjs";
9
9
  import { fileURLToPath as __rspack_fileURLToPath } from "node:url";
@@ -21,8 +21,8 @@ const checkIsInline = (chunk, enableInline)=>{
21
21
  return Boolean(enableInline);
22
22
  };
23
23
  async function buildShellBeforeTemplate(beforeAppTemplate, options) {
24
- const { config, runtimeContext, styledComponentsStyleTags, entryName } = options;
25
- const helmetData = react_helmet.renderStatic();
24
+ const { config, runtimeContext, styledComponentsStyleTags, entryName, moduleFederationCssAssets } = options;
25
+ const helmetData = getHelmetData(runtimeContext);
26
26
  const callbacks = [
27
27
  createReplaceHelemt(helmetData),
28
28
  (template)=>injectCss(template, entryName, styledComponentsStyleTags)
@@ -31,33 +31,36 @@ async function buildShellBeforeTemplate(beforeAppTemplate, options) {
31
31
  async function injectCss(template, entryName, styledComponentsStyleTags) {
32
32
  let css = await getCssChunks();
33
33
  if (styledComponentsStyleTags) css += styledComponentsStyleTags;
34
+ css += createFederatedCssLinks(moduleFederationCssAssets, {
35
+ template,
36
+ existingAssets: css.match(/href="([^"]+)"/g)?.map((item)=>item.replace(/^href="/, '').replace(/"$/, ''))
37
+ });
34
38
  return safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
35
39
  async function getCssChunks() {
36
40
  const { routeManifest, routerContext, routes } = runtimeContext;
37
41
  if (!routeManifest) return '';
38
42
  const { routeAssets } = routeManifest;
39
- let matchedRouteManifests;
43
+ let matchedRouteManifests = [];
40
44
  const matchedRouteIds = getRouterMatchedRouteIds(runtimeContext);
41
45
  if (matchedRouteIds?.length) matchedRouteManifests = matchedRouteIds.map((routeId)=>routeAssets[routeId]).filter(Boolean);
42
- else {
43
- if (!routerContext || !routes) return '';
46
+ else if (routerContext && routes) {
44
47
  const matches = matchRoutes(routes, routerContext.location, routerContext.basename);
45
48
  matchedRouteManifests = matches?.map((match, index)=>{
46
49
  if (!index) return;
47
50
  const routeId = match.route.id;
48
51
  if (routeId) return routeAssets[routeId];
49
- }).filter(Boolean);
52
+ }).filter((routeManifest)=>void 0 !== routeManifest) ?? [];
50
53
  }
51
54
  const asyncEntry = routeAssets[`async-${entryName}`];
52
- if (asyncEntry) matchedRouteManifests?.push(asyncEntry);
53
- const cssChunks = matchedRouteManifests ? matchedRouteManifests.reduce((chunks, routeManifest)=>{
55
+ if (asyncEntry) matchedRouteManifests.push(asyncEntry);
56
+ const cssChunks = matchedRouteManifests.reduce((chunks, routeManifest)=>{
54
57
  const { referenceCssAssets = [] } = routeManifest;
55
58
  const _cssChunks = referenceCssAssets.filter((asset)=>asset?.endsWith('.css') && !template.includes(asset));
56
59
  return [
57
60
  ...chunks,
58
61
  ..._cssChunks
59
62
  ];
60
- }, []) : [];
63
+ }, []);
61
64
  const { inlineStyles } = config;
62
65
  const styles = await Promise.all(cssChunks.map(async (chunk)=>{
63
66
  const link = `<link href="${chunk}" rel="stylesheet" />`;
@@ -0,0 +1,65 @@
1
+ import "node:module";
2
+ import { matchRoutes } from "@modern-js/runtime-utils/router";
3
+ import { getRouterMatchedRouteIds } from "../../../router/runtime/lifecycle.mjs";
4
+ import { CHUNK_CSS_PLACEHOLDER } from "../constants.mjs";
5
+ import { createFederatedCssLinks } from "../federatedCss.mjs";
6
+ import { createReplaceHelemt, getHelmetData } from "../helmet.mjs";
7
+ import { buildHtml } from "../shared.mjs";
8
+ import { safeReplace } from "../utils.mjs";
9
+ const checkIsInline = (chunk, enableInline)=>{
10
+ if ('production' !== process.env.NODE_ENV) return false;
11
+ if (enableInline instanceof RegExp) return enableInline.test(chunk);
12
+ return Boolean(enableInline);
13
+ };
14
+ async function buildShellBeforeTemplate(beforeAppTemplate, options) {
15
+ const { config, runtimeContext, styledComponentsStyleTags, entryName, moduleFederationCssAssets } = options;
16
+ const helmetData = getHelmetData(runtimeContext);
17
+ const callbacks = [
18
+ createReplaceHelemt(helmetData),
19
+ (template)=>injectCss(template, entryName, styledComponentsStyleTags)
20
+ ];
21
+ return buildHtml(beforeAppTemplate, callbacks);
22
+ async function injectCss(template, entryName, styledComponentsStyleTags) {
23
+ let css = await getCssChunks();
24
+ if (styledComponentsStyleTags) css += styledComponentsStyleTags;
25
+ css += createFederatedCssLinks(moduleFederationCssAssets, {
26
+ template,
27
+ existingAssets: css.match(/href="([^"]+)"/g)?.map((item)=>item.replace(/^href="/, '').replace(/"$/, ''))
28
+ });
29
+ return safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
30
+ async function getCssChunks() {
31
+ const { routeManifest, routerContext, routes } = runtimeContext;
32
+ if (!routeManifest) return '';
33
+ const { routeAssets } = routeManifest;
34
+ let matchedRouteManifests = [];
35
+ const matchedRouteIds = getRouterMatchedRouteIds(runtimeContext);
36
+ if (matchedRouteIds?.length) matchedRouteManifests = matchedRouteIds.map((routeId)=>routeAssets[routeId]).filter(Boolean);
37
+ else if (routerContext && routes) {
38
+ const matches = matchRoutes(routes, routerContext.location, routerContext.basename);
39
+ matchedRouteManifests = matches?.map((match, index)=>{
40
+ if (!index) return;
41
+ const routeId = match.route.id;
42
+ if (routeId) return routeAssets[routeId];
43
+ }).filter((routeManifest)=>void 0 !== routeManifest) ?? [];
44
+ }
45
+ const asyncEntry = routeAssets[`async-${entryName}`];
46
+ if (asyncEntry) matchedRouteManifests.push(asyncEntry);
47
+ const cssChunks = matchedRouteManifests.reduce((chunks, routeManifest)=>{
48
+ const { referenceCssAssets = [] } = routeManifest;
49
+ const _cssChunks = referenceCssAssets.filter((asset)=>asset?.endsWith('.css') && !template.includes(asset));
50
+ return [
51
+ ...chunks,
52
+ ..._cssChunks
53
+ ];
54
+ }, []);
55
+ const { inlineStyles } = config;
56
+ const styles = cssChunks.map((chunk)=>{
57
+ const link = `<link href="${chunk}" rel="stylesheet" />`;
58
+ checkIsInline(chunk, inlineStyles);
59
+ return link;
60
+ });
61
+ return `${styles.join('')}`;
62
+ }
63
+ }
64
+ }
65
+ export { buildShellBeforeTemplate };
@@ -16,7 +16,7 @@ const defaultExtender = {
16
16
  };
17
17
  const createReadableStreamFromElement = async (request, rootElement, options)=>{
18
18
  const { renderToPipeableStream } = await import("react-dom/server");
19
- const { runtimeContext, htmlTemplate, config, ssrConfig, entryName } = options;
19
+ const { runtimeContext, htmlTemplate, config, ssrConfig, entryName, moduleFederationCssAssets } = options;
20
20
  let shellChunkStatus = ShellChunkStatus.START;
21
21
  let renderLevel = RenderLevel.SERVER_RENDER;
22
22
  const forceStream2String = Boolean(process.env.MODERN_JS_STREAM_TO_STRING);
@@ -36,11 +36,14 @@ const createReadableStreamFromElement = async (request, rootElement, options)=>{
36
36
  if (extender.modifyRootElement) processedRootElement = extender.modifyRootElement(processedRootElement);
37
37
  });
38
38
  const chunkVec = [];
39
+ let hasStartedPipe = false;
39
40
  return new Promise((resolve)=>{
40
41
  const { pipe: reactStreamingPipe } = renderToPipeableStream(processedRootElement, {
41
42
  nonce: config.nonce,
42
43
  identifierPrefix: SSR_HYDRATION_ID_PREFIX,
43
44
  [onReady] () {
45
+ if (hasStartedPipe) return;
46
+ hasStartedPipe = true;
44
47
  let styledComponentsStyleTags = '';
45
48
  extenders.forEach((extender)=>{
46
49
  if (extender.getStyleTags) styledComponentsStyleTags += extender.getStyleTags();
@@ -53,6 +56,7 @@ const createReadableStreamFromElement = async (request, rootElement, options)=>{
53
56
  runtimeContext,
54
57
  config,
55
58
  entryName,
59
+ moduleFederationCssAssets,
56
60
  styledComponentsStyleTags
57
61
  }).then(({ shellAfter, shellBefore })=>{
58
62
  const pendingScripts = [];
@@ -110,7 +114,8 @@ const createReadableStreamFromElement = async (request, rootElement, options)=>{
110
114
  renderLevel,
111
115
  runtimeContext,
112
116
  entryName,
113
- config
117
+ config,
118
+ moduleFederationCssAssets
114
119
  }).then(({ shellAfter, shellBefore })=>{
115
120
  const fallbackHtml = `${shellBefore}${shellAfter}`;
116
121
  const readableStream = getReadableStreamFromString(fallbackHtml);
@@ -9,19 +9,21 @@ import { getTemplates } from "./template.mjs";
9
9
  const createReadableStreamFromElement = async (request, rootElement, options)=>{
10
10
  let shellChunkStatus = ShellChunkStatus.START;
11
11
  const chunkVec = [];
12
- const { htmlTemplate, runtimeContext, config, ssrConfig, entryName, rscRoot } = options;
12
+ const { htmlTemplate, runtimeContext, config, ssrConfig, entryName, moduleFederationCssAssets, rscManifest, rscRoot } = options;
13
13
  const { shellBefore, shellAfter } = await getTemplates(htmlTemplate, {
14
14
  renderLevel: RenderLevel.SERVER_RENDER,
15
15
  runtimeContext,
16
16
  ssrConfig,
17
17
  request,
18
18
  config,
19
- entryName
19
+ entryName,
20
+ moduleFederationCssAssets
20
21
  });
21
22
  try {
22
23
  const readableOriginal = await renderSSRStream(rootElement, {
23
24
  request,
24
25
  nonce: config.nonce,
26
+ rscManifest,
25
27
  rscRoot: rscRoot,
26
28
  routes: runtimeContext.routes,
27
29
  onError (error) {
@@ -23,12 +23,15 @@ function isPromiseLike(value) {
23
23
  return !!value && 'function' == typeof value.then;
24
24
  }
25
25
  function toErrorInfo(error) {
26
+ if ('production' === process.env.NODE_ENV) return {
27
+ message: 'Unexpected Server Error'
28
+ };
26
29
  if (error && 'object' == typeof error) {
27
30
  const maybeMsg = error.message;
28
31
  const maybeStack = error.stack;
29
32
  return {
30
33
  message: 'string' == typeof maybeMsg ? maybeMsg : String(maybeMsg ?? error),
31
- stack: 'production' !== process.env.NODE_ENV ? maybeStack : void 0
34
+ stack: maybeStack
32
35
  };
33
36
  }
34
37
  return {
@@ -64,7 +64,7 @@ function createRenderStreaming(createReadableStreamPromise) {
64
64
  const end = time();
65
65
  const { runtimeContext, config, resource } = options;
66
66
  const { onError, onTiming } = options;
67
- const { htmlTemplate, entryName } = resource;
67
+ const { htmlTemplate, entryName, moduleFederationCssAssets } = resource;
68
68
  const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries);
69
69
  const StreamServerRootWrapper = ({ children })=>/*#__PURE__*/ jsxs(Fragment, {
70
70
  children: [
@@ -84,9 +84,11 @@ function createRenderStreaming(createReadableStreamPromise) {
84
84
  runtimeContext,
85
85
  ssrConfig,
86
86
  entryName,
87
+ moduleFederationCssAssets,
87
88
  rscClientManifest: options.rscClientManifest,
88
89
  rscSSRManifest: options.rscSSRManifest,
89
90
  rscServerManifest: options.rscServerManifest,
91
+ rscManifest: options.rscManifest,
90
92
  rscRoot: options.rscRoot,
91
93
  onShellReady () {
92
94
  const cost = end();
@@ -2,12 +2,12 @@ import "node:module";
2
2
  import { time } from "@modern-js/runtime-utils/time";
3
3
  import { SSR_HYDRATION_ID_PREFIX } from "@modern-js/utils/universal/constants";
4
4
  import server from "react-dom/server";
5
- import react_helmet from "react-helmet";
6
5
  import { RenderLevel } from "../../constants.mjs";
7
6
  import { getGlobalInternalRuntimeContext } from "../../context/index.mjs";
8
7
  import { wrapRuntimeContextProvider } from "../../react/wrapper.mjs";
9
- import { CHUNK_CSS_PLACEHOLDER, CHUNK_JS_PLACEHOLDER, HTML_PLACEHOLDER, SSR_DATA_PLACEHOLDER } from "../constants.mjs";
10
- import { createReplaceHelemt } from "../helmet.mjs";
8
+ import { CHUNK_CSS_PLACEHOLDER, HTML_PLACEHOLDER, SSR_DATA_PLACEHOLDER } from "../constants.mjs";
9
+ import { createReplaceHelemt, getHelmetData } from "../helmet.mjs";
10
+ import { replaceChunkJsPlaceholder } from "../scriptOrder.mjs";
11
11
  import { buildHtml } from "../shared.mjs";
12
12
  import { SSRErrors, SSRTimings } from "../tracer.mjs";
13
13
  import { getSSRConfigByEntry, safeReplace } from "../utils.mjs";
@@ -20,7 +20,7 @@ const renderString = async (request, serverRoot, options)=>{
20
20
  onTiming
21
21
  };
22
22
  const routerContext = runtimeContext.routerContext;
23
- const { htmlTemplate, entryName, loadableStats, routeManifest } = resource;
23
+ const { htmlTemplate, entryName, loadableStats, routeManifest, moduleFederationCssAssets } = resource;
24
24
  const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries);
25
25
  const chunkSet = {
26
26
  renderLevel: RenderLevel.CLIENT_RENDER,
@@ -33,8 +33,10 @@ const renderString = async (request, serverRoot, options)=>{
33
33
  stats: loadableStats,
34
34
  nonce: config.nonce,
35
35
  routeManifest,
36
+ runtimeContext,
36
37
  template: htmlTemplate,
37
38
  entryName,
39
+ moduleFederationCssAssets,
38
40
  chunkSet,
39
41
  config
40
42
  }),
@@ -58,10 +60,10 @@ const renderString = async (request, serverRoot, options)=>{
58
60
  const rootElement = wrapRuntimeContextProvider(serverRoot, Object.assign(runtimeContext, {
59
61
  ssr: true
60
62
  }));
61
- const html = await generateHtml(rootElement, htmlTemplate, chunkSet, collectors, runtimeContext.ssrContext?.htmlModifiers || [], tracer);
63
+ const html = await generateHtml(rootElement, htmlTemplate, chunkSet, collectors, runtimeContext.ssrContext?.htmlModifiers || [], runtimeContext, entryName, tracer);
62
64
  return html;
63
65
  };
64
- async function generateHtml(App, htmlTemplate, chunkSet, collectors, htmlModifiers, { onError, onTiming }) {
66
+ async function generateHtml(App, htmlTemplate, chunkSet, collectors, htmlModifiers, runtimeContext, entryName, { onError, onTiming }) {
65
67
  let html = '';
66
68
  let helmetData;
67
69
  const finalApp = collectors.reduce((pre, creator)=>creator.collect?.(pre) || pre, App);
@@ -71,7 +73,7 @@ async function generateHtml(App, htmlTemplate, chunkSet, collectors, htmlModifie
71
73
  identifierPrefix: SSR_HYDRATION_ID_PREFIX
72
74
  });
73
75
  chunkSet.renderLevel = RenderLevel.SERVER_RENDER;
74
- helmetData = react_helmet.renderStatic();
76
+ helmetData = getHelmetData(runtimeContext);
75
77
  const cost = end();
76
78
  onTiming(SSRTimings.RENDER_HTML, cost);
77
79
  } catch (e) {
@@ -82,7 +84,7 @@ async function generateHtml(App, htmlTemplate, chunkSet, collectors, htmlModifie
82
84
  const { ssrScripts, cssChunk, jsChunk } = chunkSet;
83
85
  const finalHtml = await buildHtml(htmlTemplate, [
84
86
  createReplaceHtml(html),
85
- createReplaceChunkJs(jsChunk),
87
+ createReplaceChunkJs(jsChunk, entryName),
86
88
  createReplaceChunkCss(cssChunk),
87
89
  createReplaceSSRDataScript(ssrScripts),
88
90
  createReplaceHelemt(helmetData),
@@ -96,8 +98,8 @@ function createReplaceHtml(html) {
96
98
  function createReplaceSSRDataScript(data) {
97
99
  return (template)=>safeReplace(template, SSR_DATA_PLACEHOLDER, data);
98
100
  }
99
- function createReplaceChunkJs(js) {
100
- return (template)=>safeReplace(template, CHUNK_JS_PLACEHOLDER, js);
101
+ function createReplaceChunkJs(js, entryName) {
102
+ return (template)=>replaceChunkJsPlaceholder(template, js, entryName);
101
103
  }
102
104
  function createReplaceChunkCss(css) {
103
105
  return (template)=>safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
@@ -1,5 +1,7 @@
1
1
  import "node:module";
2
2
  import { ChunkExtractor } from "@loadable/server";
3
+ import { createFederatedCssLinks } from "../federatedCss.mjs";
4
+ import { getMatchedRouteAssets, orderHydrationScriptChunks } from "../scriptOrder.mjs";
3
5
  import { attributesToString, checkIsNode } from "../utils.mjs";
4
6
  import { fileURLToPath as __rspack_fileURLToPath } from "node:url";
5
7
  import { dirname as __rspack_dirname } from "node:path";
@@ -9,6 +11,15 @@ const extname = (uri)=>{
9
11
  return `.${uri?.split('.').pop()}` || '';
10
12
  };
11
13
  const generateChunks = (chunks, ext)=>chunks.filter((chunk)=>Boolean(chunk.url)).filter((chunk)=>extname(chunk.url).slice(1) === ext);
14
+ const routeAssetToChunk = (asset)=>({
15
+ chunk: asset,
16
+ filename: asset.replace(/^\//, ''),
17
+ linkType: 'preload',
18
+ path: asset,
19
+ scriptType: asset.endsWith('.css') ? 'style' : "script",
20
+ type: 'routeAsset',
21
+ url: asset
22
+ });
12
23
  const checkIsInline = (chunk, enableInline)=>{
13
24
  if ('production' !== process.env.NODE_ENV) return false;
14
25
  if (enableInline instanceof RegExp) return enableInline.test(chunk.url);
@@ -25,6 +36,11 @@ class LoadableCollector {
25
36
  const { routeManifest, entryName } = this.options;
26
37
  return routeManifest?.routeAssets?.[entryName]?.assets;
27
38
  }
39
+ getMatchedRouteChunks() {
40
+ const { routeManifest, runtimeContext } = this.options;
41
+ if (!routeManifest) return [];
42
+ return getMatchedRouteAssets(runtimeContext, routeManifest).map(routeAssetToChunk);
43
+ }
28
44
  collect(comopnent) {
29
45
  const { stats, entryName } = this.options;
30
46
  if (!stats) return comopnent;
@@ -37,20 +53,29 @@ class LoadableCollector {
37
53
  return this.extractor.collectChunks(comopnent);
38
54
  }
39
55
  async effect() {
40
- if (!this.extractor) return;
41
56
  const { extractor, options } = this;
42
57
  const { entryName, config } = options;
43
58
  const asyncChunks = [];
44
- if (config.enableAsyncEntry) try {
59
+ if (extractor && config.enableAsyncEntry) try {
45
60
  asyncChunks.push(...extractor.getChunkAssets([
46
61
  `async-${entryName}`
47
62
  ]));
48
63
  } catch (e) {}
49
- const chunks = [].concat(asyncChunks).concat(extractor.getChunkAssets(extractor.chunks));
50
- const scriptChunks = generateChunks(chunks, 'js');
64
+ const collectedChunks = extractor ? extractor.getChunkAssets(extractor.chunks) : [];
65
+ const matchedRouteChunks = this.getMatchedRouteChunks();
66
+ const orderedScriptChunks = orderHydrationScriptChunks({
67
+ asyncEntryChunks: asyncChunks,
68
+ collectedChunks,
69
+ matchedRouteChunks,
70
+ entryName
71
+ });
72
+ const chunks = [].concat(asyncChunks).concat(collectedChunks).concat(matchedRouteChunks);
73
+ const scriptChunks = generateChunks(orderedScriptChunks, 'js');
51
74
  const styleChunks = generateChunks(chunks, 'css');
52
- this.emitLoadableScripts(extractor);
53
- await this.emitScriptAssets(scriptChunks);
75
+ if (extractor) {
76
+ this.emitLoadableScripts(extractor);
77
+ await this.emitScriptAssets(scriptChunks);
78
+ }
54
79
  await this.emitStyleAssets(styleChunks);
55
80
  }
56
81
  emitLoadableScripts(extractor) {
@@ -85,19 +110,28 @@ class LoadableCollector {
85
110
  chunkSet.jsChunk += scripts.filter((script)=>Boolean(script)).join('');
86
111
  }
87
112
  async emitStyleAssets(chunks) {
88
- const { template, chunkSet, config, entryName } = this.options;
113
+ const { template, chunkSet, config, moduleFederationCssAssets } = this.options;
89
114
  const { inlineStyles } = config;
90
115
  const atrributes = attributesToString(this.generateAttributes());
91
116
  const linkRegExp = /<link .*?href="([^"]+)".*?>/g;
92
117
  const matchs = template.matchAll(linkRegExp);
93
118
  const existedLinks = [];
94
119
  for (const match of matchs)existedLinks.push(match[1]);
95
- const css = await Promise.all(chunks.filter((chunk)=>!existedLinks.includes(chunk.url) && !this.existsAssets?.includes(chunk.path)).map(async (chunk)=>{
120
+ const emittedChunks = chunks.filter((chunk)=>!existedLinks.includes(chunk.url) && !this.existsAssets?.includes(chunk.path));
121
+ const css = await Promise.all(emittedChunks.map(async (chunk)=>{
96
122
  const link = `<link${atrributes} href="${chunk.url}" rel="stylesheet" />`;
97
123
  if (checkIsNode() && checkIsInline(chunk, inlineStyles)) return readAsset(chunk).then((content)=>`<style>${content}</style>`).catch((_)=>link);
98
124
  return link;
99
125
  }));
100
126
  chunkSet.cssChunk += css.filter((css)=>Boolean(css)).join('');
127
+ chunkSet.cssChunk += createFederatedCssLinks(moduleFederationCssAssets, {
128
+ template,
129
+ attributes: this.generateAttributes(),
130
+ existingAssets: [
131
+ ...existedLinks,
132
+ ...emittedChunks.map((chunk)=>chunk.url)
133
+ ]
134
+ });
101
135
  }
102
136
  generateAttributes(extraAtr = {}) {
103
137
  const { config } = this.options;
@@ -113,4 +147,4 @@ class LoadableCollector {
113
147
  this.options = options;
114
148
  }
115
149
  }
116
- export { LoadableCollector };
150
+ export { LoadableCollector, orderHydrationScriptChunks };
@@ -1,6 +1,6 @@
1
1
  import "node:module";
2
2
  import { serializeJson } from "@modern-js/runtime-utils/node";
3
- import { getRouterHydrationScripts } from "../../../router/runtime/lifecycle.mjs";
3
+ import { getRouterHydrationScripts, getRouterServerSnapshot } from "../../../router/runtime/lifecycle.mjs";
4
4
  import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "../../constants.mjs";
5
5
  import { attributesToString, serializeErrors } from "../utils.mjs";
6
6
  function _check_private_redeclaration(obj, privateCollection) {
@@ -90,7 +90,7 @@ function getSSRData() {
90
90
  }
91
91
  function getRouterData() {
92
92
  const { routerContext, runtimeContext } = _class_private_field_get(this, _options);
93
- const snapshotRouterData = runtimeContext.routerServerSnapshot?.routerData;
93
+ const snapshotRouterData = getRouterServerSnapshot(runtimeContext)?.routerData;
94
94
  if (snapshotRouterData) return {
95
95
  loaderData: snapshotRouterData.loaderData,
96
96
  errors: serializeErrors(snapshotRouterData.errors || null)
@@ -13,17 +13,40 @@ function serializeErrors(errors) {
13
13
  if (!errors) return null;
14
14
  const entries = Object.entries(errors);
15
15
  const serialized = {};
16
- for (const [key, val] of entries)if (isRouteErrorResponse(val)) serialized[key] = {
17
- ...val,
18
- __type: 'RouteErrorResponse'
16
+ for (const [key, val] of entries)if (isRouteErrorResponse(val)) serialized[key] = serializeRouteErrorResponse(val);
17
+ else if (val instanceof Error) serialized[key] = serializeError(val);
18
+ else serialized[key] = val;
19
+ return serialized;
20
+ }
21
+ function shouldRedactServerError() {
22
+ return 'development' !== process.env.NODE_ENV && 'test' !== process.env.NODE_ENV;
23
+ }
24
+ function serializeError(error) {
25
+ if (shouldRedactServerError()) return {
26
+ message: 'Unexpected Server Error',
27
+ stack: void 0,
28
+ __type: 'Error'
19
29
  };
20
- else if (val instanceof Error) serialized[key] = {
21
- message: val.message,
22
- stack: val.stack,
30
+ return {
31
+ message: error.message,
32
+ stack: error.stack,
23
33
  __type: 'Error'
24
34
  };
25
- else serialized[key] = val;
26
- return serialized;
35
+ }
36
+ function serializeRouteErrorResponse(error) {
37
+ if (!isRouteErrorResponse(error)) return error;
38
+ if (error.status >= 500 && shouldRedactServerError()) return {
39
+ status: error.status,
40
+ statusText: 'Internal Server Error',
41
+ data: 'Unexpected Server Error',
42
+ __type: 'RouteErrorResponse'
43
+ };
44
+ return {
45
+ status: error.status,
46
+ statusText: error.statusText,
47
+ data: error.data,
48
+ __type: 'RouteErrorResponse'
49
+ };
27
50
  }
28
51
  function getSSRConfigByEntry(entryName, ssr, ssrByEntries) {
29
52
  if (ssrByEntries?.[entryName]) return ssrByEntries[entryName];
@@ -301,7 +301,7 @@ const documentPlugin = ()=>({
301
301
  const { entrypoints, internalDirectory, appDirectory } = api.getAppContext();
302
302
  const documentFilePath = getDocumentByEntryName(entrypoints, entryName, appDirectory);
303
303
  if (!documentFilePath) return null;
304
- return async ({ htmlPlugin })=>{
304
+ return async (templateData)=>{
305
305
  const config = api.getNormalizedConfig();
306
306
  const documentParams = getDocParams({
307
307
  config: config,
@@ -320,6 +320,8 @@ const documentPlugin = ()=>({
320
320
  debug("entry %s's document jsx rendered html: %o", entryName, html);
321
321
  const { partialsByEntrypoint } = api.getAppContext();
322
322
  html = processPartials(html, entryName, partialsByEntrypoint || {});
323
+ const htmlPlugin = templateData.htmlPlugin || templateData.htmlWebpackPlugin || templateData.htmlRspackPlugin;
324
+ if (!htmlPlugin) throw new Error('Failed to get HTML plugin tags from template parameters.');
323
325
  const { scripts, links, metas, titles } = extractHtmlTags(htmlPlugin, templateParameters);
324
326
  return processPlaceholders(html, config, scripts, links, metas, titles);
325
327
  };