@bleedingdev/modern-js-runtime 3.2.0-ultramodern.99 → 3.4.0-ultramodern.0

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 (322) hide show
  1. package/dist/cjs/boundary-debugger/index.js +19 -11
  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 +9 -5
  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 +9 -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 +15 -9
  39. package/dist/cjs/core/server/constants.js +15 -11
  40. package/dist/cjs/core/server/federatedCss.js +11 -7
  41. package/dist/cjs/core/server/helmet.js +11 -6
  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 +84 -9
  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 +15 -23
  52. package/dist/cjs/core/server/stream/beforeTemplate.js +11 -7
  53. package/dist/cjs/core/server/stream/beforeTemplate.worker.js +10 -6
  54. package/dist/cjs/core/server/stream/createReadableStream.js +16 -10
  55. package/dist/cjs/core/server/stream/createReadableStream.worker.js +15 -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 +9 -5
  59. package/dist/cjs/core/server/stream/template.js +9 -5
  60. package/dist/cjs/core/server/string/index.js +10 -12
  61. package/dist/cjs/core/server/string/loadable.js +24 -54
  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 +63 -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 +14 -11
  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 +153 -83
  82. package/dist/cjs/exports/loadable.js +27 -18
  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 +16 -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 -19
  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 -29
  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 +19 -9
  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 -15
  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 +9 -5
  127. package/dist/esm/boundary-debugger/index.mjs +10 -6
  128. package/dist/esm/cli/index.mjs +4 -2
  129. package/dist/esm/core/context/extensions.mjs +28 -0
  130. package/dist/esm/core/context/helmetContext.mjs +13 -0
  131. package/dist/esm/core/context/index.mjs +5 -0
  132. package/dist/esm/core/react/wrapper.mjs +6 -4
  133. package/dist/esm/core/server/federatedCss.mjs +2 -2
  134. package/dist/esm/core/server/helmet.mjs +2 -1
  135. package/dist/esm/core/server/requestHandler.mjs +43 -30
  136. package/dist/esm/core/server/routerCleanup.mjs +66 -0
  137. package/dist/esm/core/server/scriptOrder.mjs +62 -3
  138. package/dist/esm/core/server/stream/afterTemplate.mjs +8 -20
  139. package/dist/esm/core/server/stream/beforeTemplate.mjs +3 -3
  140. package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +1 -1
  141. package/dist/esm/core/server/stream/createReadableStream.mjs +7 -5
  142. package/dist/esm/core/server/stream/createReadableStream.worker.mjs +6 -2
  143. package/dist/esm/core/server/stream/deferredScript.mjs +4 -1
  144. package/dist/esm/core/server/string/index.mjs +3 -9
  145. package/dist/esm/core/server/string/loadable.mjs +14 -48
  146. package/dist/esm/core/server/string/ssrData.mjs +2 -2
  147. package/dist/esm/core/server/utils.mjs +52 -9
  148. package/dist/esm/document/cli/index.mjs +5 -6
  149. package/dist/esm/exports/head.mjs +144 -78
  150. package/dist/esm/exports/loadable.mjs +12 -6
  151. package/dist/esm/exports/tanstack-router.mjs +30 -3
  152. package/dist/esm/module-federation/index.mjs +109 -0
  153. package/dist/esm/router/cli/code/index.mjs +8 -48
  154. package/dist/esm/router/cli/code/templates.mjs +1 -14
  155. package/dist/esm/router/cli/handler.mjs +1 -1
  156. package/dist/esm/router/cli/index.mjs +3 -25
  157. package/dist/esm/router/runtime/DeferredDataScripts.node.mjs +16 -4
  158. package/dist/esm/router/runtime/PrefetchLink.mjs +152 -21
  159. package/dist/esm/router/runtime/internal.mjs +16 -15
  160. package/dist/esm/router/runtime/lifecycle.mjs +22 -13
  161. package/dist/esm/router/runtime/plugin.mjs +4 -11
  162. package/dist/esm/router/runtime/plugin.node.mjs +4 -9
  163. package/dist/esm/router/runtime/provider.mjs +57 -0
  164. package/dist/esm/router/runtime/rsc-router.mjs +10 -4
  165. package/dist/esm/router/runtime/utils.mjs +35 -10
  166. package/dist/esm-node/boundary-debugger/index.mjs +10 -6
  167. package/dist/esm-node/cli/index.mjs +4 -2
  168. package/dist/esm-node/core/context/extensions.mjs +29 -0
  169. package/dist/esm-node/core/context/helmetContext.mjs +14 -0
  170. package/dist/esm-node/core/context/index.mjs +5 -0
  171. package/dist/esm-node/core/react/wrapper.mjs +6 -4
  172. package/dist/esm-node/core/server/federatedCss.mjs +2 -2
  173. package/dist/esm-node/core/server/helmet.mjs +2 -1
  174. package/dist/esm-node/core/server/requestHandler.mjs +43 -30
  175. package/dist/esm-node/core/server/routerCleanup.mjs +67 -0
  176. package/dist/esm-node/core/server/scriptOrder.mjs +62 -3
  177. package/dist/esm-node/core/server/stream/afterTemplate.mjs +8 -20
  178. package/dist/esm-node/core/server/stream/beforeTemplate.mjs +3 -3
  179. package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +1 -1
  180. package/dist/esm-node/core/server/stream/createReadableStream.mjs +7 -5
  181. package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +6 -2
  182. package/dist/esm-node/core/server/stream/deferredScript.mjs +4 -1
  183. package/dist/esm-node/core/server/string/index.mjs +3 -9
  184. package/dist/esm-node/core/server/string/loadable.mjs +14 -48
  185. package/dist/esm-node/core/server/string/ssrData.mjs +2 -2
  186. package/dist/esm-node/core/server/utils.mjs +52 -9
  187. package/dist/esm-node/document/cli/index.mjs +5 -6
  188. package/dist/esm-node/exports/head.mjs +144 -78
  189. package/dist/esm-node/exports/loadable.mjs +12 -6
  190. package/dist/esm-node/exports/tanstack-router.mjs +30 -3
  191. package/dist/esm-node/module-federation/index.mjs +110 -0
  192. package/dist/esm-node/router/cli/code/index.mjs +8 -48
  193. package/dist/esm-node/router/cli/code/templates.mjs +1 -14
  194. package/dist/esm-node/router/cli/handler.mjs +1 -1
  195. package/dist/esm-node/router/cli/index.mjs +3 -25
  196. package/dist/esm-node/router/runtime/DeferredDataScripts.node.mjs +16 -4
  197. package/dist/esm-node/router/runtime/PrefetchLink.mjs +152 -21
  198. package/dist/esm-node/router/runtime/internal.mjs +16 -15
  199. package/dist/esm-node/router/runtime/lifecycle.mjs +22 -13
  200. package/dist/esm-node/router/runtime/plugin.mjs +4 -11
  201. package/dist/esm-node/router/runtime/plugin.node.mjs +4 -9
  202. package/dist/esm-node/router/runtime/provider.mjs +58 -0
  203. package/dist/esm-node/router/runtime/rsc-router.mjs +10 -4
  204. package/dist/esm-node/router/runtime/utils.mjs +35 -10
  205. package/dist/types/cli/entry.d.ts +2 -2
  206. package/dist/types/cli/index.d.ts +3 -1
  207. package/dist/types/core/context/extensions.d.ts +37 -0
  208. package/dist/types/core/context/helmetContext.d.ts +10 -0
  209. package/dist/types/core/context/index.d.ts +6 -0
  210. package/dist/types/core/context/response/index.server.d.ts +4 -1
  211. package/dist/types/core/context/runtime.d.ts +1 -11
  212. package/dist/types/core/plugin/index.d.ts +1 -1
  213. package/dist/types/core/server/routerCleanup.d.ts +28 -0
  214. package/dist/types/core/server/scriptOrder.d.ts +24 -0
  215. package/dist/types/core/server/string/loadable.d.ts +1 -7
  216. package/dist/types/core/server/utils.d.ts +19 -1
  217. package/dist/types/document/constants.d.ts +3 -1
  218. package/dist/types/exports/head.d.ts +4 -4
  219. package/dist/types/exports/loadable.d.ts +1 -1
  220. package/dist/types/exports/tanstack-router.d.ts +88 -5
  221. package/dist/types/module-federation/index.d.ts +65 -0
  222. package/dist/types/router/cli/code/index.d.ts +1 -3
  223. package/dist/types/router/cli/code/utils.d.ts +1 -1
  224. package/dist/types/router/cli/entry.d.ts +1 -1
  225. package/dist/types/router/cli/handler.d.ts +0 -3
  226. package/dist/types/router/runtime/DeferredDataScripts.d.ts +1 -1
  227. package/dist/types/router/runtime/PrefetchLink.d.ts +5 -1
  228. package/dist/types/router/runtime/internal.d.ts +1 -0
  229. package/dist/types/router/runtime/lifecycle.d.ts +2 -0
  230. package/dist/types/router/runtime/plugin.d.ts +1 -1
  231. package/dist/types/router/runtime/plugin.node.d.ts +1 -1
  232. package/dist/types/router/runtime/provider.d.ts +61 -0
  233. package/package.json +34 -26
  234. package/rstest.config.mts +2 -4
  235. package/dist/cjs/router/cli/code/tanstackTypes.js +0 -443
  236. package/dist/cjs/router/runtime/tanstack/basepathRewrite.js +0 -62
  237. package/dist/cjs/router/runtime/tanstack/dataMutation.js +0 -345
  238. package/dist/cjs/router/runtime/tanstack/hydrationBoundary.js +0 -43
  239. package/dist/cjs/router/runtime/tanstack/plugin.js +0 -240
  240. package/dist/cjs/router/runtime/tanstack/plugin.node.js +0 -268
  241. package/dist/cjs/router/runtime/tanstack/prefetchLink.js +0 -55
  242. package/dist/cjs/router/runtime/tanstack/routeTree.js +0 -510
  243. package/dist/cjs/router/runtime/tanstack/rsc/ClientSlot.js +0 -53
  244. package/dist/cjs/router/runtime/tanstack/rsc/CompositeComponent.js +0 -75
  245. package/dist/cjs/router/runtime/tanstack/rsc/ReplayableStream.js +0 -141
  246. package/dist/cjs/router/runtime/tanstack/rsc/RscNodeRenderer.js +0 -65
  247. package/dist/cjs/router/runtime/tanstack/rsc/SlotContext.js +0 -54
  248. package/dist/cjs/router/runtime/tanstack/rsc/client.js +0 -93
  249. package/dist/cjs/router/runtime/tanstack/rsc/createRscProxy.js +0 -141
  250. package/dist/cjs/router/runtime/tanstack/rsc/index.js +0 -42
  251. package/dist/cjs/router/runtime/tanstack/rsc/server.js +0 -246
  252. package/dist/cjs/router/runtime/tanstack/rsc/slotUsageSanitizer.js +0 -65
  253. package/dist/cjs/router/runtime/tanstack/rsc/symbols.js +0 -72
  254. package/dist/cjs/ssr/index.node.js +0 -121
  255. package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +0 -84
  256. package/dist/cjs/ssr/serverRender/renderToString/entry.js +0 -196
  257. package/dist/cjs/ssr/serverRender/types.js +0 -36
  258. package/dist/esm/router/cli/code/tanstackTypes.mjs +0 -396
  259. package/dist/esm/router/runtime/tanstack/basepathRewrite.mjs +0 -28
  260. package/dist/esm/router/runtime/tanstack/dataMutation.mjs +0 -305
  261. package/dist/esm/router/runtime/tanstack/hydrationBoundary.mjs +0 -9
  262. package/dist/esm/router/runtime/tanstack/plugin.mjs +0 -206
  263. package/dist/esm/router/runtime/tanstack/plugin.node.mjs +0 -234
  264. package/dist/esm/router/runtime/tanstack/prefetchLink.mjs +0 -18
  265. package/dist/esm/router/runtime/tanstack/routeTree.mjs +0 -470
  266. package/dist/esm/router/runtime/tanstack/rsc/ClientSlot.mjs +0 -19
  267. package/dist/esm/router/runtime/tanstack/rsc/CompositeComponent.mjs +0 -41
  268. package/dist/esm/router/runtime/tanstack/rsc/ReplayableStream.mjs +0 -104
  269. package/dist/esm/router/runtime/tanstack/rsc/RscNodeRenderer.mjs +0 -31
  270. package/dist/esm/router/runtime/tanstack/rsc/SlotContext.mjs +0 -17
  271. package/dist/esm/router/runtime/tanstack/rsc/client.mjs +0 -53
  272. package/dist/esm/router/runtime/tanstack/rsc/createRscProxy.mjs +0 -107
  273. package/dist/esm/router/runtime/tanstack/rsc/index.mjs +0 -1
  274. package/dist/esm/router/runtime/tanstack/rsc/server.mjs +0 -200
  275. package/dist/esm/router/runtime/tanstack/rsc/slotUsageSanitizer.mjs +0 -31
  276. package/dist/esm/router/runtime/tanstack/rsc/symbols.mjs +0 -17
  277. package/dist/esm/ssr/index.node.mjs +0 -44
  278. package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.mjs +0 -50
  279. package/dist/esm/ssr/serverRender/renderToString/entry.mjs +0 -151
  280. package/dist/esm/ssr/serverRender/types.mjs +0 -1
  281. package/dist/esm-node/router/cli/code/tanstackTypes.mjs +0 -397
  282. package/dist/esm-node/router/runtime/tanstack/basepathRewrite.mjs +0 -29
  283. package/dist/esm-node/router/runtime/tanstack/dataMutation.mjs +0 -306
  284. package/dist/esm-node/router/runtime/tanstack/hydrationBoundary.mjs +0 -10
  285. package/dist/esm-node/router/runtime/tanstack/plugin.mjs +0 -207
  286. package/dist/esm-node/router/runtime/tanstack/plugin.node.mjs +0 -235
  287. package/dist/esm-node/router/runtime/tanstack/prefetchLink.mjs +0 -19
  288. package/dist/esm-node/router/runtime/tanstack/routeTree.mjs +0 -471
  289. package/dist/esm-node/router/runtime/tanstack/rsc/ClientSlot.mjs +0 -20
  290. package/dist/esm-node/router/runtime/tanstack/rsc/CompositeComponent.mjs +0 -42
  291. package/dist/esm-node/router/runtime/tanstack/rsc/ReplayableStream.mjs +0 -105
  292. package/dist/esm-node/router/runtime/tanstack/rsc/RscNodeRenderer.mjs +0 -32
  293. package/dist/esm-node/router/runtime/tanstack/rsc/SlotContext.mjs +0 -18
  294. package/dist/esm-node/router/runtime/tanstack/rsc/client.mjs +0 -54
  295. package/dist/esm-node/router/runtime/tanstack/rsc/createRscProxy.mjs +0 -108
  296. package/dist/esm-node/router/runtime/tanstack/rsc/index.mjs +0 -2
  297. package/dist/esm-node/router/runtime/tanstack/rsc/server.mjs +0 -201
  298. package/dist/esm-node/router/runtime/tanstack/rsc/slotUsageSanitizer.mjs +0 -32
  299. package/dist/esm-node/router/runtime/tanstack/rsc/symbols.mjs +0 -18
  300. package/dist/esm-node/ssr/index.node.mjs +0 -45
  301. package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.mjs +0 -51
  302. package/dist/esm-node/ssr/serverRender/renderToString/entry.mjs +0 -152
  303. package/dist/esm-node/ssr/serverRender/types.mjs +0 -2
  304. package/dist/types/router/cli/code/tanstackTypes.d.ts +0 -10
  305. package/dist/types/router/runtime/tanstack/basepathRewrite.d.ts +0 -8
  306. package/dist/types/router/runtime/tanstack/dataMutation.d.ts +0 -29
  307. package/dist/types/router/runtime/tanstack/hydrationBoundary.d.ts +0 -2
  308. package/dist/types/router/runtime/tanstack/plugin.d.ts +0 -6
  309. package/dist/types/router/runtime/tanstack/plugin.node.d.ts +0 -6
  310. package/dist/types/router/runtime/tanstack/prefetchLink.d.ts +0 -11
  311. package/dist/types/router/runtime/tanstack/routeTree.d.ts +0 -8
  312. package/dist/types/router/runtime/tanstack/rsc/ClientSlot.d.ts +0 -5
  313. package/dist/types/router/runtime/tanstack/rsc/CompositeComponent.d.ts +0 -3
  314. package/dist/types/router/runtime/tanstack/rsc/ReplayableStream.d.ts +0 -24
  315. package/dist/types/router/runtime/tanstack/rsc/RscNodeRenderer.d.ts +0 -5
  316. package/dist/types/router/runtime/tanstack/rsc/SlotContext.d.ts +0 -11
  317. package/dist/types/router/runtime/tanstack/rsc/client.d.ts +0 -11
  318. package/dist/types/router/runtime/tanstack/rsc/createRscProxy.d.ts +0 -7
  319. package/dist/types/router/runtime/tanstack/rsc/index.d.ts +0 -2
  320. package/dist/types/router/runtime/tanstack/rsc/server.d.ts +0 -14
  321. package/dist/types/router/runtime/tanstack/rsc/slotUsageSanitizer.d.ts +0 -2
  322. package/dist/types/router/runtime/tanstack/rsc/symbols.d.ts +0 -46
@@ -24,11 +24,15 @@ function __webpack_require__(moduleId) {
24
24
  };
25
25
  })();
26
26
  (()=>{
27
- __webpack_require__.d = (exports1, definition)=>{
28
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
29
- enumerable: true,
30
- get: definition[key]
31
- });
27
+ __webpack_require__.d = (exports1, getters, values)=>{
28
+ var define = (defs, kind)=>{
29
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
30
+ enumerable: true,
31
+ [kind]: defs[key]
32
+ });
33
+ };
34
+ define(getters, "get");
35
+ define(values, "value");
32
36
  };
33
37
  })();
34
38
  (()=>{
@@ -47,9 +51,6 @@ function __webpack_require__(moduleId) {
47
51
  var __webpack_exports__ = {};
48
52
  (()=>{
49
53
  __webpack_require__.r(__webpack_exports__);
50
- __webpack_require__.d(__webpack_exports__, {
51
- isRedirectResponse: ()=>isRedirectResponse
52
- });
53
54
  var _modern_js_render_client__rspack_import_0 = __webpack_require__("@modern-js/render/client");
54
55
  var __rspack_reexport = {};
55
56
  for(const __rspack_import_key in _modern_js_render_client__rspack_import_0)if ([
@@ -58,6 +59,9 @@ var __webpack_exports__ = {};
58
59
  ].indexOf(__rspack_import_key) < 0) __rspack_reexport[__rspack_import_key] = ()=>_modern_js_render_client__rspack_import_0[__rspack_import_key];
59
60
  __webpack_require__.d(__webpack_exports__, __rspack_reexport);
60
61
  const isRedirectResponse = (res)=>null != res.headers.get('X-Modernjs-Redirect');
62
+ __webpack_require__.d(__webpack_exports__, {}, {
63
+ isRedirectResponse: isRedirectResponse
64
+ });
61
65
  })();
62
66
  exports.isRedirectResponse = __webpack_exports__.isRedirectResponse;
63
67
  for(var __rspack_i in __webpack_exports__)if (-1 === [
@@ -24,11 +24,15 @@ function __webpack_require__(moduleId) {
24
24
  };
25
25
  })();
26
26
  (()=>{
27
- __webpack_require__.d = (exports1, definition)=>{
28
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
29
- enumerable: true,
30
- get: definition[key]
31
- });
27
+ __webpack_require__.d = (exports1, getters, values)=>{
28
+ var define = (defs, kind)=>{
29
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
30
+ enumerable: true,
31
+ [kind]: defs[key]
32
+ });
33
+ };
34
+ define(getters, "get");
35
+ define(values, "value");
32
36
  };
33
37
  })();
34
38
  (()=>{
@@ -24,11 +24,15 @@ function __webpack_require__(moduleId) {
24
24
  };
25
25
  })();
26
26
  (()=>{
27
- __webpack_require__.d = (exports1, definition)=>{
28
- for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
29
- enumerable: true,
30
- get: definition[key]
31
- });
27
+ __webpack_require__.d = (exports1, getters, values)=>{
28
+ var define = (defs, kind)=>{
29
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
30
+ enumerable: true,
31
+ [kind]: defs[key]
32
+ });
33
+ };
34
+ define(getters, "get");
35
+ define(values, "value");
32
36
  };
33
37
  })();
34
38
  (()=>{
@@ -50,7 +50,7 @@ const readQueryEnabledOverride = ()=>{
50
50
  const detectLanguage = ()=>{
51
51
  if ("u" < typeof document) return 'en';
52
52
  const htmlLanguage = document.documentElement.lang;
53
- if (htmlLanguage) return htmlLanguage.split('-')[0] || 'en';
53
+ if ('' !== htmlLanguage) return htmlLanguage.split('-')[0] || 'en';
54
54
  if ("u" < typeof window) return 'en';
55
55
  return window.location.pathname.split('/').filter(Boolean)[0] || 'en';
56
56
  };
@@ -69,7 +69,7 @@ const getBoundaryId = (element)=>element.dataset.modernBoundaryId ?? element.dat
69
69
  const collectBoundaryElements = (legacySelector)=>{
70
70
  const elements = new Set();
71
71
  for (const element of document.querySelectorAll(boundarySelector))elements.add(element);
72
- if (!legacySelector) return Array.from(elements);
72
+ if (void 0 === legacySelector || '' === legacySelector) return Array.from(elements);
73
73
  try {
74
74
  for (const element of document.querySelectorAll(legacySelector))elements.add(element);
75
75
  } catch {}
@@ -113,7 +113,7 @@ function BoundaryDebugger({ controlMode = 'visible', enabledByDefault = false, l
113
113
  const seenBoxes = new Set();
114
114
  const nextBoxes = collectBoundaryElements(legacySelector).map((element)=>{
115
115
  const boundaryId = getBoundaryId(element);
116
- if (!boundaryId) return;
116
+ if (void 0 === boundaryId || '' === boundaryId) return;
117
117
  const rect = element.getBoundingClientRect();
118
118
  if (rect.width <= 0 || rect.height <= 0) return;
119
119
  const rectKey = formatRectKey(rect);
@@ -124,7 +124,7 @@ function BoundaryDebugger({ controlMode = 'visible', enabledByDefault = false, l
124
124
  const color = boundary?.color ?? palette[hashBoundaryId(boundaryId) % palette.length];
125
125
  const label = boundary?.label ?? boundary?.appId ?? boundaryId;
126
126
  const expose = element.dataset.modernMfExpose;
127
- const detail = expose && expose !== label && expose !== boundaryId ? expose : void 0;
127
+ const detail = void 0 !== expose && '' !== expose && expose !== label && expose !== boundaryId ? expose : void 0;
128
128
  const box = {
129
129
  color,
130
130
  height: rect.height,
@@ -134,7 +134,7 @@ function BoundaryDebugger({ controlMode = 'visible', enabledByDefault = false, l
134
134
  top: rect.top,
135
135
  width: rect.width
136
136
  };
137
- if (detail) box.detail = detail;
137
+ if (void 0 !== detail) box.detail = detail;
138
138
  return box;
139
139
  }).filter((box)=>void 0 !== box);
140
140
  setBoxes(nextBoxes);
@@ -196,9 +196,13 @@ function BoundaryDebugger({ controlMode = 'visible', enabledByDefault = false, l
196
196
  enabled ? /*#__PURE__*/ jsx("div", {
197
197
  "aria-hidden": "true",
198
198
  children: boxes.map((box)=>/*#__PURE__*/ jsx("div", {
199
+ "data-modern-boundary-overlay": "",
200
+ "data-modern-boundary-overlay-id": box.id,
201
+ "data-modern-boundary-overlay-label": box.label,
199
202
  style: {
200
203
  border: `2px solid ${box.color}`,
201
204
  borderRadius: 8,
205
+ boxSizing: 'border-box',
202
206
  boxShadow: `0 0 0 1px rgba(255,255,255,.72), 0 6px 20px color-mix(in srgb, ${box.color} 20%, transparent)`,
203
207
  height: box.height,
204
208
  left: box.left,
@@ -227,7 +231,7 @@ function BoundaryDebugger({ controlMode = 'visible', enabledByDefault = false, l
227
231
  /*#__PURE__*/ jsx("span", {
228
232
  children: box.label
229
233
  }),
230
- box.detail ? /*#__PURE__*/ jsx("span", {
234
+ void 0 !== box.detail && '' !== box.detail ? /*#__PURE__*/ jsx("span", {
231
235
  style: {
232
236
  font: '700 10px/1.1 system-ui, sans-serif',
233
237
  opacity: 0.82,
@@ -1,7 +1,7 @@
1
1
  import { cleanRequireCache, isReact18 as utils_isReact18 } from "@modern-js/utils";
2
2
  import path_0 from "path";
3
3
  import { documentPlugin } from "../document/cli/index.mjs";
4
- import { getEntrypointRoutesDir, handleFileChange, handleGeneratorEntryCode, handleModifyEntrypoints, isRouteEntry, routerPlugin } from "../router/cli/index.mjs";
4
+ import { getEntrypointRoutesDir, getEntrypointRoutesOwner, handleFileChange, handleGeneratorEntryCode, handleModifyEntrypoints, isRouteEntry, routerPlugin } from "../router/cli/index.mjs";
5
5
  import { builderPluginAlias } from "./alias.mjs";
6
6
  import { generateCode } from "./code.mjs";
7
7
  import { ENTRY_BOOTSTRAP_FILE_NAME, ENTRY_POINT_FILE_NAME } from "./constants.mjs";
@@ -89,5 +89,7 @@ const runtimePlugin = (params)=>({
89
89
  }
90
90
  });
91
91
  const cli = runtimePlugin;
92
+ export { makeLegalIdentifier } from "../router/cli/code/makeLegalIdentifier.mjs";
93
+ export { getPathWithoutExt } from "../router/cli/code/utils.mjs";
92
94
  export default cli;
93
- export { documentPlugin, getEntrypointRoutesDir, handleFileChange, handleGeneratorEntryCode, handleModifyEntrypoints, isRouteEntry, isRuntimeEntry, routerPlugin, runtimePlugin, ssrPlugin };
95
+ export { documentPlugin, getEntrypointRoutesDir, getEntrypointRoutesOwner, handleFileChange, handleGeneratorEntryCode, handleModifyEntrypoints, isRouteEntry, isRuntimeEntry, routerPlugin, runtimePlugin, ssrPlugin };
@@ -0,0 +1,28 @@
1
+ const EXTENSIONS_SLOT = Symbol.for('@modern-js/runtime:context-extensions');
2
+ function getStore(context) {
3
+ return context[EXTENSIONS_SLOT];
4
+ }
5
+ function ensureStore(context) {
6
+ const target = context;
7
+ target[EXTENSIONS_SLOT] ??= new Map();
8
+ return target[EXTENSIONS_SLOT];
9
+ }
10
+ function stripRuntimeContextExtensions(context) {
11
+ delete context[EXTENSIONS_SLOT];
12
+ }
13
+ function createRuntimeContextExtension(id) {
14
+ const key = Symbol.for(`@modern-js/runtime:context-extension:${id}`);
15
+ return {
16
+ key,
17
+ get (context) {
18
+ return getStore(context)?.get(key);
19
+ },
20
+ set (context, value) {
21
+ ensureStore(context).set(key, value);
22
+ },
23
+ remove (context) {
24
+ getStore(context)?.delete(key);
25
+ }
26
+ };
27
+ }
28
+ export { createRuntimeContextExtension, stripRuntimeContextExtensions };
@@ -0,0 +1,13 @@
1
+ import { createRuntimeContextExtension } from "./extensions.mjs";
2
+ const helmetContextExtension = createRuntimeContextExtension('@modern-js/runtime:helmet-context');
3
+ function getHelmetContext(context) {
4
+ return helmetContextExtension.get(context);
5
+ }
6
+ function ensureHelmetContext(context) {
7
+ const existing = helmetContextExtension.get(context);
8
+ if (void 0 !== existing) return existing;
9
+ const created = {};
10
+ helmetContextExtension.set(context, created);
11
+ return created;
12
+ }
13
+ export { ensureHelmetContext, getHelmetContext };
@@ -40,6 +40,11 @@ function getGlobalLayoutApp() {
40
40
  function getGlobalBasename() {
41
41
  return globalContext.basename;
42
42
  }
43
+ export { DefaultNotFound } from "../../router/runtime/DefaultNotFound.mjs";
44
+ export { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter } from "../../router/runtime/hooks.mjs";
45
+ export { applyRouterRuntimeState, applyRouterServerPrepareResult, cleanupRouterRuntimeState, createRouterRuntimeState, createRouterServerSnapshot, getRouterHydrationScripts, getRouterMatchedRouteIds, getRouterRuntimeState, getRouterServerSnapshot } from "../../router/runtime/lifecycle.mjs";
46
+ export { registerRouterProvider, resolveRouterProvider, routerProviderRegistryHooks } from "../../router/runtime/provider.mjs";
47
+ export { createRuntimeContextExtension } from "./extensions.mjs";
43
48
  export { InternalRuntimeContext, RuntimeContext, getInitialContext } from "./runtime.mjs";
44
49
  export { getServerPayload, setServerPayload } from "./serverPayload/index.mjs";
45
50
  export { getCurrentEntryName, getGlobalApp, getGlobalBasename, getGlobalEnableRsc, getGlobalInternalRuntimeContext, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRSCRoot, getGlobalRoutes, setGlobalContext, setGlobalInternalRuntimeContext };
@@ -1,24 +1,26 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { HelmetProvider } from "react-helmet-async";
3
3
  import { InternalRuntimeContext, RuntimeContext } from "../context/index.mjs";
4
+ import { stripRuntimeContextExtensions } from "../context/extensions.mjs";
5
+ import { ensureHelmetContext } from "../context/helmetContext.mjs";
4
6
  function wrapRuntimeContextProvider(App, contextValue) {
5
- const { isBrowser, initialData, routes, routerFramework, context, routeManifest, routerRuntime, routerInstance, routerHydrationScript, routerMatchedRouteIds, routerServerSnapshot, routerContext, unstable_getBlockNavState, ssrContext, _internalContext, _internalRouterBaseName, _helmetContext, ...rest } = contextValue;
7
+ const { isBrowser, initialData, routes, context, routeManifest, routerContext, unstable_getBlockNavState, ssrContext, _internalContext, _internalRouterBaseName, ...rest } = contextValue;
6
8
  const internalContextValue = contextValue;
7
- internalContextValue._helmetContext ??= {};
9
+ const helmetContext = ensureHelmetContext(internalContextValue);
8
10
  const runtimeContextValue = {
9
11
  isBrowser,
10
12
  initialData,
11
13
  routes,
12
- routerFramework,
13
14
  context,
14
15
  ...rest
15
16
  };
17
+ stripRuntimeContextExtensions(runtimeContextValue);
16
18
  return /*#__PURE__*/ jsx(InternalRuntimeContext.Provider, {
17
19
  value: internalContextValue,
18
20
  children: /*#__PURE__*/ jsx(RuntimeContext.Provider, {
19
21
  value: runtimeContextValue,
20
22
  children: /*#__PURE__*/ jsx(HelmetProvider, {
21
- context: internalContextValue._helmetContext,
23
+ context: helmetContext,
22
24
  children: App
23
25
  })
24
26
  })
@@ -1,10 +1,10 @@
1
1
  import { attributesToString } from "./utils.mjs";
2
2
  const createFederatedCssLinks = (assets, options)=>{
3
- if (!assets?.length) return '';
3
+ if (void 0 === assets || 0 === assets.length) return '';
4
4
  const seen = new Set(options.existingAssets || []);
5
5
  const attributes = attributesToString(options.attributes || {});
6
6
  const links = [];
7
- for (const asset of assets)if (!(!asset || seen.has(asset) || options.template.includes(asset))) {
7
+ for (const asset of assets)if (!('' === asset || seen.has(asset) || options.template.includes(asset))) {
8
8
  seen.add(asset);
9
9
  links.push(`<link${attributes} href="${asset}" rel="stylesheet" />`);
10
10
  }
@@ -1,3 +1,4 @@
1
+ import { getHelmetContext } from "../context/helmetContext.mjs";
1
2
  import { safeReplace } from "./utils.mjs";
2
3
  const EOL = '\n';
3
4
  const RE_HTML_ATTR = /<html[^>]*>/;
@@ -6,7 +7,7 @@ const RE_LAST_IN_HEAD = /<\/head>/;
6
7
  const RE_TITLE = /<title[^>]*>([\s\S\n\r]*?)<\/title>/;
7
8
  const TEST_TITLE_CONTENT = /(?<=<title[^>]*>)([\s\S\n\r]*?)([.|\S])([\s\S\n\r]*?)(?=<\/title>)/;
8
9
  function getHelmetData(runtimeContext) {
9
- return runtimeContext._helmetContext?.helmet ?? void 0;
10
+ return getHelmetContext(runtimeContext)?.helmet ?? void 0;
10
11
  }
11
12
  function createReplaceHelemt(helmetData) {
12
13
  return helmetData ? (template)=>helmetReplace(template, helmetData) : (tempalte)=>tempalte;
@@ -2,13 +2,14 @@ import { jsx } from "react/jsx-runtime";
2
2
  import { storage } from "@modern-js/runtime-utils/node";
3
3
  import { getPathname, parseCookie, parseHeaders, parseQuery } from "@modern-js/runtime-utils/universal/request";
4
4
  import react, { Fragment } from "react";
5
- import { cleanupRouterRuntimeState } from "../../router/runtime/lifecycle.mjs";
5
+ import { getRouterServerSnapshot } from "../../router/runtime/lifecycle.mjs";
6
6
  import { handleRSCRedirect } from "../../router/runtime/rsc-router.mjs";
7
7
  import { getGlobalInternalRuntimeContext, getGlobalRSCRoot } from "../context/index.mjs";
8
8
  import { getInitialContext } from "../context/runtime.mjs";
9
9
  import { getServerPayload } from "../context/serverPayload/index.mjs";
10
10
  import { createRoot } from "../react/index.mjs";
11
11
  import { CHUNK_CSS_PLACEHOLDER } from "./constants.mjs";
12
+ import { withRouterCleanup } from "./routerCleanup.mjs";
12
13
  import { SSRErrors } from "./tracer.mjs";
13
14
  import { getSSRConfigByEntry, getSSRMode } from "./utils.mjs";
14
15
  async function handleRSCRequest(request, Root, context, options, handleRequest) {
@@ -37,6 +38,39 @@ const processRedirect = (headers, status, ctx)=>{
37
38
  headers
38
39
  });
39
40
  };
41
+ const applyRouterSnapshotResult = (context, onError)=>{
42
+ const routerServerSnapshot = getRouterServerSnapshot(context);
43
+ const routerStatusCode = routerServerSnapshot?.statusCode ?? context.routerContext?.statusCode;
44
+ if (routerStatusCode && 200 !== routerStatusCode) context.ssrContext?.response.status(routerStatusCode);
45
+ const errors = Object.values(routerServerSnapshot?.errors || context.routerContext?.errors || {});
46
+ if (errors.length > 0) onError(errors[0], SSRErrors.LOADER_ERROR);
47
+ };
48
+ const createLoaderRedirectResponse = (beforeRenderResult, redirectCtx)=>{
49
+ if (!beforeRenderResult || !isRedirectStatus(beforeRenderResult.status)) return;
50
+ if (beforeRenderResult.headers.has('X-Modernjs-Redirect')) return beforeRenderResult;
51
+ const redirectUrl = beforeRenderResult.headers.get('Location') || '/';
52
+ return processRedirect(new Headers({
53
+ Location: redirectUrl
54
+ }), beforeRenderResult.status, redirectCtx);
55
+ };
56
+ const renderRequest = async (request, Root, context, options, handleRequest, enableRsc)=>{
57
+ if (enableRsc) return handleRSCRequest(request, Root, context, options, handleRequest);
58
+ return handleRequest(request, Root, {
59
+ ...options,
60
+ runtimeContext: context
61
+ });
62
+ };
63
+ const finalizeRenderResponse = (response, responseProxy, redirectCtx, routerCleanup)=>{
64
+ if (-1 !== responseProxy.status && isRedirectStatus(responseProxy.status) && responseProxy.headers.Location) return processRedirect(new Headers(responseProxy.headers), responseProxy.status, redirectCtx);
65
+ Object.entries(responseProxy.headers).forEach(([key, value])=>{
66
+ response.headers.set(key, value);
67
+ });
68
+ if (-1 !== responseProxy.status) return routerCleanup.deferUntilBodyDone(new Response(response.body, {
69
+ status: responseProxy.status,
70
+ headers: response.headers
71
+ }));
72
+ return routerCleanup.deferUntilBodyDone(response);
73
+ };
40
74
  function createSSRContext(request, options) {
41
75
  const { config, loaderContext, onError, onTiming, locals, resource, params, responseProxy, reporter } = options;
42
76
  const { nonce, useJsonScript } = config;
@@ -132,41 +166,20 @@ const createRequestHandler = async (handleRequest, createRequestOptions)=>{
132
166
  isRSCNavigation: 'true' === request.headers.get('x-rsc-tree'),
133
167
  basename: ssrContext.baseUrl || '/'
134
168
  };
135
- try {
169
+ return withRouterCleanup(context, options.onError, async (routerCleanup)=>{
136
170
  const beforeRenderResult = await runBeforeRender(context);
137
- const routerServerSnapshot = context.routerServerSnapshot;
138
- const routerStatusCode = routerServerSnapshot?.statusCode ?? context.routerContext?.statusCode;
139
- if (routerStatusCode && 200 !== routerStatusCode) context.ssrContext?.response.status(routerStatusCode);
140
- const errors = Object.values(routerServerSnapshot?.errors || context.routerContext?.errors || {});
141
- if (errors.length > 0) options.onError(errors[0], SSRErrors.LOADER_ERROR);
142
- if ("u" > typeof Response && beforeRenderResult instanceof Response && isRedirectStatus(beforeRenderResult.status)) {
143
- if (beforeRenderResult.headers.has('X-Modernjs-Redirect')) return beforeRenderResult;
144
- const redirectUrl = beforeRenderResult.headers.get('Location') || '/';
145
- return processRedirect(new Headers({
146
- Location: redirectUrl
147
- }), beforeRenderResult.status, redirectCtx);
171
+ applyRouterSnapshotResult(context, options.onError);
172
+ if ("u" > typeof Response) {
173
+ const redirectResponse = createLoaderRedirectResponse(beforeRenderResult, redirectCtx);
174
+ if (redirectResponse) return redirectResponse;
148
175
  }
149
176
  if (!createRequestOptions?.enableRsc) {
150
177
  const { htmlTemplate } = options.resource;
151
178
  options.resource.htmlTemplate = htmlTemplate.replace('</head>', `${CHUNK_CSS_PLACEHOLDER}</head>`);
152
179
  }
153
- let response;
154
- response = createRequestOptions?.enableRsc ? await handleRSCRequest(request, Root, context, options, handleRequest) : await handleRequest(request, Root, {
155
- ...options,
156
- runtimeContext: context
157
- });
158
- if (-1 !== responseProxy.status && isRedirectStatus(responseProxy.status) && responseProxy.headers.Location) return processRedirect(new Headers(responseProxy.headers), responseProxy.status, redirectCtx);
159
- Object.entries(responseProxy.headers).forEach(([key, value])=>{
160
- response.headers.set(key, value);
161
- });
162
- if (-1 !== responseProxy.status) return new Response(response.body, {
163
- status: responseProxy.status,
164
- headers: response.headers
165
- });
166
- return response;
167
- } finally{
168
- await cleanupRouterRuntimeState(context);
169
- }
180
+ const response = await renderRequest(request, Root, context, options, handleRequest, !!createRequestOptions?.enableRsc);
181
+ return finalizeRenderResponse(response, responseProxy, redirectCtx, routerCleanup);
182
+ });
170
183
  });
171
184
  };
172
185
  return requestHandler;
@@ -0,0 +1,66 @@
1
+ import { getRouterRuntimeState } from "../../router/runtime/lifecycle.mjs";
2
+ const ROUTER_CLEANUP_ERROR = 'An error occurs during router runtime cleanup';
3
+ async function withRouterCleanup(runtimeContext, onError, callback) {
4
+ const routerCleanup = createRouterCleanup(runtimeContext, onError);
5
+ try {
6
+ return await callback(routerCleanup);
7
+ } finally{
8
+ if (!routerCleanup.deferred) await routerCleanup.run();
9
+ }
10
+ }
11
+ function createRouterCleanup(runtimeContext, onError) {
12
+ let deferred = false;
13
+ let finished = false;
14
+ const run = async ()=>{
15
+ if (finished) return;
16
+ finished = true;
17
+ try {
18
+ await getRouterRuntimeState(runtimeContext)?.cleanup?.();
19
+ } catch (error) {
20
+ onError(error, ROUTER_CLEANUP_ERROR);
21
+ }
22
+ };
23
+ const deferUntilBodyDone = (response)=>{
24
+ const { body } = response;
25
+ if (!body || body.locked) return response;
26
+ deferred = true;
27
+ const reader = body.getReader();
28
+ const wrappedBody = new ReadableStream({
29
+ async pull (controller) {
30
+ let result;
31
+ try {
32
+ result = await reader.read();
33
+ } catch (error) {
34
+ controller.error(error);
35
+ await run();
36
+ return;
37
+ }
38
+ if (result.done) {
39
+ controller.close();
40
+ await run();
41
+ return;
42
+ }
43
+ controller.enqueue(result.value);
44
+ },
45
+ async cancel (reason) {
46
+ try {
47
+ await reader.cancel(reason);
48
+ } catch {}
49
+ await run();
50
+ }
51
+ });
52
+ return new Response(wrappedBody, {
53
+ status: response.status,
54
+ statusText: response.statusText,
55
+ headers: response.headers
56
+ });
57
+ };
58
+ return {
59
+ get deferred () {
60
+ return deferred;
61
+ },
62
+ run,
63
+ deferUntilBodyDone
64
+ };
65
+ }
66
+ export { ROUTER_CLEANUP_ERROR, createRouterCleanup, withRouterCleanup };
@@ -1,3 +1,6 @@
1
+ import { getRouterMatchedRouteIds } from "../../router/runtime/lifecycle.mjs";
2
+ import { CHUNK_JS_PLACEHOLDER } from "./constants.mjs";
3
+ import { safeReplace } from "./utils.mjs";
1
4
  function getScriptTags(template) {
2
5
  const scriptRegExp = /<script\b[^>]*\bsrc=(["'])(.*?)\1[^>]*><\/script>/g;
3
6
  return Array.from(template.matchAll(scriptRegExp)).map((match)=>({
@@ -15,11 +18,67 @@ function isEntryScript(src, entryName, asyncEntry) {
15
18
  const prefix = asyncEntry ? `async-${entryName}` : entryName;
16
19
  return basename === `${prefix}.js` || basename.startsWith(`${prefix}.`) || basename.startsWith(`${prefix}-`);
17
20
  }
21
+ const dedupeByUrl = (chunks)=>{
22
+ const seen = new Set();
23
+ return chunks.filter((chunk)=>{
24
+ if (void 0 === chunk.url || '' === chunk.url || seen.has(chunk.url)) return false;
25
+ seen.add(chunk.url);
26
+ return true;
27
+ });
28
+ };
29
+ const isAsyncEntryScriptChunk = (chunk, entryName)=>{
30
+ if (void 0 === chunk.url || !chunk.url.endsWith('.js')) return false;
31
+ const asyncEntryName = `async-${entryName}`;
32
+ const filename = chunk.filename ?? chunk.url;
33
+ const basename = filename.split('/').pop() ?? filename;
34
+ return basename === `${asyncEntryName}.js` || basename.startsWith(`${asyncEntryName}.`) || basename.startsWith(`${asyncEntryName}-`);
35
+ };
36
+ function getRouteAssets(runtimeContext, routeManifest = runtimeContext.routeManifest) {
37
+ return routeManifest?.routeAssets;
38
+ }
39
+ function getMatchedRouteAssets(runtimeContext, routeManifest) {
40
+ const routeAssets = getRouteAssets(runtimeContext, routeManifest);
41
+ if (void 0 === routeAssets) return [];
42
+ const matchedRouteIds = getRouterMatchedRouteIds(runtimeContext) ?? [];
43
+ return matchedRouteIds.flatMap((routeId)=>routeAssets[routeId]?.assets ?? []);
44
+ }
45
+ const orderHydrationScriptChunks = ({ asyncEntryChunks, collectedChunks, matchedRouteChunks, entryName })=>{
46
+ const asyncEntryScriptChunks = [];
47
+ const asyncEntryDependencyChunks = [];
48
+ for (const chunk of asyncEntryChunks)if (isAsyncEntryScriptChunk(chunk, entryName)) asyncEntryScriptChunks.push(chunk);
49
+ else asyncEntryDependencyChunks.push(chunk);
50
+ return dedupeByUrl([
51
+ ...asyncEntryDependencyChunks,
52
+ ...collectedChunks,
53
+ ...matchedRouteChunks,
54
+ ...asyncEntryScriptChunks
55
+ ]);
56
+ };
18
57
  function injectBeforeHydrationEntryScript(template, scripts, entryName = 'index') {
19
- if (!scripts) return template;
58
+ if ('' === scripts) return template;
20
59
  const scriptTags = getScriptTags(template);
21
60
  const target = scriptTags.find((match)=>isEntryScript(match.src, entryName, false)) ?? scriptTags.find((match)=>isEntryScript(match.src, entryName, true));
22
- if (!target) return template;
61
+ if (void 0 === target) return template;
23
62
  return `${template.slice(0, target.index)}${scripts}${template.slice(target.index)}`;
24
63
  }
25
- export { injectBeforeHydrationEntryScript };
64
+ function replaceChunkJsPlaceholder(template, scripts, entryName, placeholder = CHUNK_JS_PLACEHOLDER) {
65
+ if ('' === scripts) return safeReplace(template, placeholder, '');
66
+ const withoutPlaceholder = safeReplace(template, placeholder, '');
67
+ const withEarlyScripts = injectBeforeHydrationEntryScript(withoutPlaceholder, scripts, entryName);
68
+ if (withEarlyScripts !== withoutPlaceholder) return withEarlyScripts;
69
+ return safeReplace(template, placeholder, scripts);
70
+ }
71
+ function createRouteHydrationScriptTags(runtimeContext, entryName, options = {}) {
72
+ const { nonce, template } = options;
73
+ const routeAssets = getRouteAssets(runtimeContext);
74
+ if (void 0 === routeAssets) return '';
75
+ const matchedRouteIds = getRouterMatchedRouteIds(runtimeContext) ?? [];
76
+ const assetEntries = [
77
+ ...matchedRouteIds.map((routeId)=>routeAssets[routeId]),
78
+ routeAssets[`async-${entryName}`]
79
+ ].filter((entry)=>void 0 !== entry);
80
+ const jsAssets = Array.from(new Set(assetEntries.flatMap((entry)=>(entry.assets ?? []).filter((asset)=>asset.endsWith('.js')))));
81
+ const nonceAttr = void 0 === nonce || '' === nonce ? '' : ` nonce="${nonce}"`;
82
+ return jsAssets.filter((asset)=>template?.includes(asset) !== true).map((asset)=>`<script src=${asset}${nonceAttr}></script>`).join(' ');
83
+ }
84
+ export { createRouteHydrationScriptTags, getMatchedRouteAssets, injectBeforeHydrationEntryScript, orderHydrationScriptChunks, replaceChunkJsPlaceholder };
@@ -1,8 +1,8 @@
1
1
  import { serializeJson } from "@modern-js/runtime-utils/node";
2
- import { getRouterHydrationScripts, getRouterMatchedRouteIds } from "../../../router/runtime/lifecycle.mjs";
2
+ import { getRouterHydrationScripts } from "../../../router/runtime/lifecycle.mjs";
3
3
  import { SSR_DATA_JSON_ID } from "../../constants.mjs";
4
4
  import { SSR_DATA_PLACEHOLDER } from "../constants.mjs";
5
- import { injectBeforeHydrationEntryScript } from "../scriptOrder.mjs";
5
+ import { createRouteHydrationScriptTags, replaceChunkJsPlaceholder } from "../scriptOrder.mjs";
6
6
  import { buildHtml } from "../shared.mjs";
7
7
  import { attributesToString, safeReplace } from "../utils.mjs";
8
8
  function buildShellAfterTemplate(afterAppTemplate, options) {
@@ -19,24 +19,12 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
19
19
  (template)=>injectJs(template, entryName, config.nonce)
20
20
  ];
21
21
  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 matchedRouteIds = getRouterMatchedRouteIds(runtimeContext) ?? [];
27
- const assetEntries = [
28
- ...matchedRouteIds.map((routeId)=>routeAssets[routeId]),
29
- routeAssets[`async-${entryName}`]
30
- ].filter(Boolean);
31
- const jsAssets = Array.from(new Set(assetEntries.flatMap((entry)=>(entry.assets ?? []).filter((asset)=>asset.endsWith('.js')))));
32
- const nonceAttr = nonce ? ` nonce="${nonce}"` : '';
33
- const jsChunkStr = jsAssets.filter((asset)=>!template.includes(asset)).map((asset)=>`<script src=${asset}${nonceAttr}></script>`).join(' ');
34
- if (jsChunkStr) {
35
- const withoutPlaceholder = safeReplace(template, '<!--<?- chunksMap.js ?>-->', '');
36
- const withEarlyScripts = injectBeforeHydrationEntryScript(withoutPlaceholder, jsChunkStr, entryName);
37
- return withEarlyScripts !== withoutPlaceholder ? withEarlyScripts : safeReplace(template, '<!--<?- chunksMap.js ?>-->', jsChunkStr);
38
- }
39
- return template;
22
+ const jsChunkStr = createRouteHydrationScriptTags(runtimeContext, entryName, {
23
+ nonce,
24
+ template
25
+ });
26
+ if (!jsChunkStr) return template;
27
+ return replaceChunkJsPlaceholder(template, jsChunkStr, entryName);
40
28
  }
41
29
  return buildHtml(afterAppTemplate, callbacks);
42
30
  }
@@ -4,7 +4,7 @@ import { CHUNK_CSS_PLACEHOLDER } from "../constants.mjs";
4
4
  import { createFederatedCssLinks } from "../federatedCss.mjs";
5
5
  import { createReplaceHelemt, getHelmetData } from "../helmet.mjs";
6
6
  import { buildHtml } from "../shared.mjs";
7
- import { checkIsNode, safeReplace } from "../utils.mjs";
7
+ import { checkIsNode, hasStylesheetLink, safeReplace } from "../utils.mjs";
8
8
  const readAsset = async (chunk)=>{
9
9
  const fs = await import("fs/promises");
10
10
  const path = await import("path");
@@ -45,13 +45,13 @@ async function buildShellBeforeTemplate(beforeAppTemplate, options) {
45
45
  if (!index) return;
46
46
  const routeId = match.route.id;
47
47
  if (routeId) return routeAssets[routeId];
48
- }).filter(Boolean) ?? [];
48
+ }).filter((routeManifest)=>void 0 !== routeManifest) ?? [];
49
49
  }
50
50
  const asyncEntry = routeAssets[`async-${entryName}`];
51
51
  if (asyncEntry) matchedRouteManifests.push(asyncEntry);
52
52
  const cssChunks = matchedRouteManifests.reduce((chunks, routeManifest)=>{
53
53
  const { referenceCssAssets = [] } = routeManifest;
54
- const _cssChunks = referenceCssAssets.filter((asset)=>asset?.endsWith('.css') && !template.includes(asset));
54
+ const _cssChunks = referenceCssAssets.filter((asset)=>asset?.endsWith('.css') && !hasStylesheetLink(template, asset));
55
55
  return [
56
56
  ...chunks,
57
57
  ..._cssChunks
@@ -39,7 +39,7 @@ async function buildShellBeforeTemplate(beforeAppTemplate, options) {
39
39
  if (!index) return;
40
40
  const routeId = match.route.id;
41
41
  if (routeId) return routeAssets[routeId];
42
- }).filter(Boolean) ?? [];
42
+ }).filter((routeManifest)=>void 0 !== routeManifest) ?? [];
43
43
  }
44
44
  const asyncEntry = routeAssets[`async-${entryName}`];
45
45
  if (asyncEntry) matchedRouteManifests.push(asyncEntry);
@@ -64,12 +64,14 @@ const createReadableStreamFromElement = async (request, rootElement, options)=>{
64
64
  try {
65
65
  if (shellChunkStatus !== ShellChunkStatus.FINISH) {
66
66
  chunkVec.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
67
- const chunkStr = chunk.toString('utf-8');
68
- if (chunkStr.includes(ESCAPED_SHELL_STREAM_END_MARK)) {
69
- let concatedChunk = Buffer.concat(chunkVec).toString('utf-8');
70
- concatedChunk = concatedChunk.replace(ESCAPED_SHELL_STREAM_END_MARK, '');
67
+ const concatedChunk = Buffer.concat(chunkVec).toString('utf-8');
68
+ const markerIndex = concatedChunk.indexOf(ESCAPED_SHELL_STREAM_END_MARK);
69
+ if (-1 !== markerIndex) {
70
+ const beforeMark = concatedChunk.slice(0, markerIndex);
71
+ const afterMark = concatedChunk.slice(markerIndex + ESCAPED_SHELL_STREAM_END_MARK.length);
71
72
  shellChunkStatus = ShellChunkStatus.FINISH;
72
- this.push(`${shellBefore}${concatedChunk}${shellAfter}`);
73
+ this.push(`${shellBefore}${beforeMark}${shellAfter}`);
74
+ if (afterMark) this.push(afterMark);
73
75
  if (pendingScripts.length > 0) for (const s of pendingScripts)this.push(s);
74
76
  }
75
77
  } else this.push(chunk);