@modern-js/runtime 2.54.5 → 2.55.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 (301) hide show
  1. package/dist/cjs/{ssr/serverRender/renderToString/index.js → cli/alias.js} +29 -18
  2. package/dist/cjs/cli/code.js +124 -0
  3. package/dist/cjs/cli/constants.js +23 -2
  4. package/dist/cjs/cli/index.js +92 -17
  5. package/dist/cjs/{ssr/cli → cli/ssr}/index.js +7 -86
  6. package/dist/cjs/cli/template.js +101 -0
  7. package/dist/cjs/cli/template.server.js +71 -0
  8. package/dist/cjs/core/browser/hydrate.js +116 -0
  9. package/dist/cjs/core/browser/index.js +122 -0
  10. package/dist/cjs/core/compatible.js +39 -74
  11. package/dist/cjs/{ssr/serverRender/types.js → core/constants.js} +3 -3
  12. package/dist/cjs/core/context/index.js +39 -2
  13. package/dist/cjs/core/context/runtime.js +3 -3
  14. package/dist/cjs/core/loader/useLoader.js +2 -2
  15. package/dist/cjs/core/plugin/base.js +0 -4
  16. package/dist/cjs/core/plugin/index.js +6 -0
  17. package/dist/cjs/core/react/index.js +51 -0
  18. package/dist/cjs/{ssr/serverRender → core/server}/helmet.js +11 -2
  19. package/dist/cjs/core/server/index.js +38 -0
  20. package/dist/cjs/core/server/requestHandler.js +156 -0
  21. package/dist/cjs/core/server/server.js +34 -0
  22. package/dist/cjs/{ssr/serverRender/renderToStream/buildTemplate.share.js → core/server/shared.js} +7 -10
  23. package/dist/cjs/core/server/stream/afterTemplate.js +80 -0
  24. package/dist/cjs/{ssr/serverRender/renderToStream/bulidTemplate.before.js → core/server/stream/beforeTemplate.js} +11 -12
  25. package/dist/cjs/core/server/stream/createReadableStream.js +124 -0
  26. package/dist/cjs/core/server/stream/createReadableStream.worker.js +105 -0
  27. package/dist/cjs/core/server/stream/index.js +30 -0
  28. package/dist/cjs/core/server/stream/shared.js +112 -0
  29. package/dist/cjs/{ssr/serverRender/renderToStream → core/server/stream}/template.js +6 -10
  30. package/dist/cjs/core/server/string/index.js +152 -0
  31. package/dist/cjs/{ssr/serverRender/renderToString → core/server/string}/loadable.js +9 -12
  32. package/dist/cjs/core/server/string/prefetch.js +112 -0
  33. package/dist/cjs/core/server/string/ssrData.js +100 -0
  34. package/dist/cjs/{ssr/serverRender/renderToString → core/server/string}/styledComponent.js +20 -11
  35. package/dist/cjs/core/server/string/types.js +16 -0
  36. package/dist/cjs/core/server/tracer.js +60 -0
  37. package/dist/cjs/{ssr/serverRender → core/server}/utils.js +48 -2
  38. package/dist/cjs/router/cli/code/index.js +10 -6
  39. package/dist/cjs/router/cli/code/templates.js +58 -3
  40. package/dist/cjs/router/cli/constants.js +6 -0
  41. package/dist/cjs/router/cli/entry.js +2 -4
  42. package/dist/cjs/router/cli/handler.js +22 -5
  43. package/dist/cjs/router/cli/index.js +29 -56
  44. package/dist/cjs/router/runtime/index.js +2 -0
  45. package/dist/cjs/router/runtime/plugin.js +13 -40
  46. package/dist/cjs/router/runtime/plugin.node.js +17 -32
  47. package/dist/cjs/state/cli/index.js +7 -35
  48. package/dist/cjs/state/runtime/plugin.js +6 -15
  49. package/dist/esm/cli/alias.js +30 -0
  50. package/dist/esm/cli/code.js +131 -0
  51. package/dist/esm/cli/constants.js +15 -1
  52. package/dist/esm/cli/index.js +111 -18
  53. package/dist/esm/{ssr/cli → cli/ssr}/babel-plugin-ssr-loader-id.js +1 -1
  54. package/dist/esm/cli/ssr/index.js +110 -0
  55. package/dist/esm/{ssr/cli → cli/ssr}/loadable-bundler-plugin.js +1 -1
  56. package/dist/esm/cli/template.js +53 -0
  57. package/dist/esm/cli/template.server.js +26 -0
  58. package/dist/esm/core/browser/hydrate.js +88 -0
  59. package/dist/esm/core/browser/index.js +224 -0
  60. package/dist/esm/core/compatible.js +48 -90
  61. package/dist/esm/core/context/index.js +32 -1
  62. package/dist/esm/core/context/runtime.js +3 -2
  63. package/dist/esm/core/loader/useLoader.js +2 -2
  64. package/dist/esm/core/plugin/base.js +0 -4
  65. package/dist/esm/core/plugin/index.js +10 -0
  66. package/dist/esm/core/react/index.js +31 -0
  67. package/dist/esm/{ssr/serverRender → core/server}/helmet.js +10 -2
  68. package/dist/esm/core/server/index.js +16 -0
  69. package/dist/esm/core/server/react/prerender/type.js +0 -0
  70. package/dist/esm/core/server/requestHandler.js +181 -0
  71. package/dist/esm/core/server/server.js +8 -0
  72. package/dist/esm/core/server/shared.js +10 -0
  73. package/dist/esm/core/server/stream/afterTemplate.js +60 -0
  74. package/dist/esm/{ssr/serverRender/renderToStream/bulidTemplate.before.js → core/server/stream/beforeTemplate.js} +10 -11
  75. package/dist/esm/{ssr/serverRender/renderToStream/renderToPipe.js → core/server/stream/createReadableStream.js} +43 -38
  76. package/dist/esm/core/server/stream/createReadableStream.worker.js +142 -0
  77. package/dist/esm/core/server/stream/index.js +6 -0
  78. package/dist/esm/core/server/stream/shared.js +102 -0
  79. package/dist/esm/core/server/stream/template.js +42 -0
  80. package/dist/esm/core/server/string/index.js +219 -0
  81. package/dist/esm/{ssr/serverRender/renderToString → core/server/string}/loadable.js +10 -13
  82. package/dist/esm/{ssr → core/server/string}/prefetch.js +27 -21
  83. package/dist/esm/core/server/string/ssrData.js +83 -0
  84. package/dist/esm/core/server/string/styledComponent.js +34 -0
  85. package/dist/esm/core/server/string/types.js +0 -0
  86. package/dist/esm/core/server/tracer.js +34 -0
  87. package/dist/esm/core/server/utils.js +83 -0
  88. package/dist/esm/router/cli/code/index.js +11 -8
  89. package/dist/esm/router/cli/code/templates.js +100 -7
  90. package/dist/esm/router/cli/constants.js +4 -0
  91. package/dist/esm/router/cli/entry.js +2 -4
  92. package/dist/esm/router/cli/handler.js +70 -8
  93. package/dist/esm/router/cli/index.js +52 -65
  94. package/dist/esm/router/runtime/index.js +1 -0
  95. package/dist/esm/router/runtime/plugin.js +12 -20
  96. package/dist/esm/router/runtime/plugin.node.js +19 -34
  97. package/dist/esm/state/cli/index.js +9 -38
  98. package/dist/esm/state/runtime/plugin.js +5 -5
  99. package/dist/esm-node/cli/alias.js +28 -0
  100. package/dist/esm-node/cli/code.js +90 -0
  101. package/dist/esm-node/cli/constants.js +15 -1
  102. package/dist/esm-node/cli/index.js +84 -13
  103. package/dist/esm-node/{ssr/cli → cli/ssr}/babel-plugin-ssr-loader-id.js +1 -1
  104. package/dist/esm-node/cli/ssr/index.js +87 -0
  105. package/dist/esm-node/{ssr/cli → cli/ssr}/loadable-bundler-plugin.js +1 -1
  106. package/dist/esm-node/cli/template.js +64 -0
  107. package/dist/esm-node/cli/template.server.js +47 -0
  108. package/dist/esm-node/core/browser/hydrate.js +81 -0
  109. package/dist/esm-node/core/browser/index.js +88 -0
  110. package/dist/esm-node/core/compatible.js +39 -74
  111. package/dist/esm-node/core/context/index.js +32 -1
  112. package/dist/esm-node/core/context/runtime.js +3 -3
  113. package/dist/esm-node/core/loader/useLoader.js +2 -2
  114. package/dist/esm-node/core/plugin/base.js +0 -4
  115. package/dist/esm-node/core/plugin/index.js +5 -0
  116. package/dist/esm-node/core/react/index.js +27 -0
  117. package/dist/esm-node/{ssr/serverRender → core/server}/helmet.js +6 -2
  118. package/dist/esm-node/core/server/index.js +12 -0
  119. package/dist/esm-node/core/server/requestHandler.js +132 -0
  120. package/dist/esm-node/core/server/server.js +8 -0
  121. package/dist/esm-node/core/server/shared.js +6 -0
  122. package/dist/esm-node/core/server/stream/afterTemplate.js +56 -0
  123. package/dist/esm-node/{ssr/serverRender/renderToStream/bulidTemplate.before.js → core/server/stream/beforeTemplate.js} +8 -9
  124. package/dist/esm-node/{ssr/serverRender/renderToStream/renderToPipe.js → core/server/stream/createReadableStream.js} +41 -35
  125. package/dist/esm-node/core/server/stream/createReadableStream.worker.js +71 -0
  126. package/dist/esm-node/core/server/stream/index.js +6 -0
  127. package/dist/esm-node/core/server/stream/shared.js +75 -0
  128. package/dist/esm-node/core/server/stream/template.js +15 -0
  129. package/dist/esm-node/core/server/string/index.js +118 -0
  130. package/dist/esm-node/{ssr/serverRender/renderToString → core/server/string}/loadable.js +8 -11
  131. package/dist/esm-node/core/server/string/prefetch.js +78 -0
  132. package/dist/esm-node/core/server/string/ssrData.js +76 -0
  133. package/dist/esm-node/core/server/string/styledComponent.js +29 -0
  134. package/dist/esm-node/core/server/tracer.js +33 -0
  135. package/dist/esm-node/core/server/utils.js +60 -0
  136. package/dist/esm-node/router/cli/code/index.js +8 -5
  137. package/dist/esm-node/router/cli/code/templates.js +60 -6
  138. package/dist/esm-node/router/cli/constants.js +4 -0
  139. package/dist/esm-node/router/cli/entry.js +2 -4
  140. package/dist/esm-node/router/cli/handler.js +21 -5
  141. package/dist/esm-node/router/cli/index.js +31 -58
  142. package/dist/esm-node/router/runtime/index.js +1 -0
  143. package/dist/esm-node/router/runtime/plugin.js +13 -30
  144. package/dist/esm-node/router/runtime/plugin.node.js +18 -33
  145. package/dist/esm-node/state/cli/index.js +8 -36
  146. package/dist/esm-node/state/runtime/plugin.js +5 -5
  147. package/dist/types/cli/alias.d.ts +7 -0
  148. package/dist/types/cli/code.d.ts +10 -0
  149. package/dist/types/cli/constants.d.ts +7 -0
  150. package/dist/types/cli/index.d.ts +8 -1
  151. package/dist/types/cli/template.d.ts +27 -0
  152. package/dist/types/cli/template.server.d.ts +15 -0
  153. package/dist/types/common.d.ts +9 -0
  154. package/dist/types/core/browser/hydrate.d.ts +5 -0
  155. package/dist/types/core/browser/index.d.ts +2 -0
  156. package/dist/types/core/config.d.ts +5 -6
  157. package/dist/types/core/constants.d.ts +5 -0
  158. package/dist/types/core/context/index.d.ts +34 -1
  159. package/dist/types/core/context/runtime.d.ts +2 -2
  160. package/dist/types/core/plugin/base.d.ts +3 -33
  161. package/dist/types/core/plugin/index.d.ts +2 -11
  162. package/dist/types/core/plugin/runner.d.ts +1 -11
  163. package/dist/types/core/react/index.d.ts +6 -0
  164. package/dist/types/core/server/helmet.d.ts +3 -0
  165. package/dist/types/core/server/index.d.ts +4 -0
  166. package/dist/types/core/server/requestHandler.d.ts +11 -0
  167. package/dist/types/core/server/server.d.ts +4 -0
  168. package/dist/types/core/server/shared.d.ts +9 -0
  169. package/dist/types/core/server/stream/afterTemplate.d.ts +12 -0
  170. package/dist/types/core/server/stream/beforeTemplate.d.ts +8 -0
  171. package/dist/types/core/server/stream/createReadableStream.d.ts +2 -0
  172. package/dist/types/core/server/stream/createReadableStream.worker.d.ts +2 -0
  173. package/dist/types/core/server/stream/index.d.ts +1 -0
  174. package/dist/types/core/server/stream/shared.d.ts +22 -0
  175. package/dist/types/core/server/stream/template.d.ts +9 -0
  176. package/dist/types/core/server/string/index.d.ts +2 -0
  177. package/dist/types/core/server/string/loadable.d.ts +35 -0
  178. package/dist/types/core/server/string/prefetch.d.ts +15 -0
  179. package/dist/types/core/server/string/ssrData.d.ts +18 -0
  180. package/dist/types/core/server/string/styledComponent.d.ts +11 -0
  181. package/dist/types/core/server/string/types.d.ts +12 -0
  182. package/dist/types/core/server/tracer.d.ts +21 -0
  183. package/dist/types/core/server/utils.d.ts +19 -0
  184. package/dist/types/core/types.d.ts +35 -1
  185. package/dist/types/index.d.ts +1 -1
  186. package/dist/types/router/cli/code/index.d.ts +3 -4
  187. package/dist/types/router/cli/code/templates.d.ts +9 -1
  188. package/dist/types/router/cli/constants.d.ts +2 -0
  189. package/dist/types/router/cli/handler.d.ts +1 -0
  190. package/dist/types/router/runtime/index.d.ts +1 -0
  191. package/dist/types/router/runtime/plugin.d.ts +1 -1
  192. package/dist/types/router/runtime/plugin.node.d.ts +2 -2
  193. package/dist/types/router/runtime/types.d.ts +1 -2
  194. package/dist/types/state/runtime/plugin.d.ts +2 -2
  195. package/package.json +49 -42
  196. package/types/router.d.ts +7 -2
  197. package/dist/cjs/ssr/index.js +0 -183
  198. package/dist/cjs/ssr/index.node.js +0 -86
  199. package/dist/cjs/ssr/prefetch.js +0 -92
  200. package/dist/cjs/ssr/serverRender/index.js +0 -39
  201. package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +0 -74
  202. package/dist/cjs/ssr/serverRender/renderToStream/index.js +0 -74
  203. package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.js +0 -104
  204. package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.worker.js +0 -108
  205. package/dist/cjs/ssr/serverRender/renderToString/buildHtml.js +0 -52
  206. package/dist/cjs/ssr/serverRender/renderToString/entry.js +0 -179
  207. package/dist/cjs/ssr/serverRender/renderToString/render.js +0 -61
  208. package/dist/cjs/ssr/serverRender/tracker.js +0 -113
  209. package/dist/cjs/ssr/utils.js +0 -94
  210. package/dist/esm/ssr/cli/index.js +0 -194
  211. package/dist/esm/ssr/index.js +0 -169
  212. package/dist/esm/ssr/index.node.js +0 -78
  213. package/dist/esm/ssr/serverRender/index.js +0 -55
  214. package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.js +0 -48
  215. package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.share.js +0 -12
  216. package/dist/esm/ssr/serverRender/renderToStream/index.js +0 -49
  217. package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.worker.js +0 -164
  218. package/dist/esm/ssr/serverRender/renderToStream/template.js +0 -46
  219. package/dist/esm/ssr/serverRender/renderToString/buildHtml.js +0 -34
  220. package/dist/esm/ssr/serverRender/renderToString/entry.js +0 -257
  221. package/dist/esm/ssr/serverRender/renderToString/index.js +0 -34
  222. package/dist/esm/ssr/serverRender/renderToString/render.js +0 -55
  223. package/dist/esm/ssr/serverRender/renderToString/styledComponent.js +0 -25
  224. package/dist/esm/ssr/serverRender/tracker.js +0 -82
  225. package/dist/esm/ssr/serverRender/utils.js +0 -21
  226. package/dist/esm/ssr/utils.js +0 -59
  227. package/dist/esm-node/ssr/cli/index.js +0 -166
  228. package/dist/esm-node/ssr/index.js +0 -147
  229. package/dist/esm-node/ssr/index.node.js +0 -50
  230. package/dist/esm-node/ssr/prefetch.js +0 -72
  231. package/dist/esm-node/ssr/serverRender/index.js +0 -19
  232. package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.js +0 -50
  233. package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.share.js +0 -8
  234. package/dist/esm-node/ssr/serverRender/renderToStream/index.js +0 -40
  235. package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.worker.js +0 -88
  236. package/dist/esm-node/ssr/serverRender/renderToStream/template.js +0 -19
  237. package/dist/esm-node/ssr/serverRender/renderToString/buildHtml.js +0 -24
  238. package/dist/esm-node/ssr/serverRender/renderToString/entry.js +0 -149
  239. package/dist/esm-node/ssr/serverRender/renderToString/index.js +0 -17
  240. package/dist/esm-node/ssr/serverRender/renderToString/render.js +0 -27
  241. package/dist/esm-node/ssr/serverRender/renderToString/styledComponent.js +0 -20
  242. package/dist/esm-node/ssr/serverRender/tracker.js +0 -87
  243. package/dist/esm-node/ssr/serverRender/utils.js +0 -17
  244. package/dist/esm-node/ssr/utils.js +0 -57
  245. package/dist/types/ssr/index.d.ts +0 -11
  246. package/dist/types/ssr/index.node.d.ts +0 -5
  247. package/dist/types/ssr/prefetch.d.ts +0 -16
  248. package/dist/types/ssr/serverRender/helmet.d.ts +0 -2
  249. package/dist/types/ssr/serverRender/index.d.ts +0 -2
  250. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +0 -7
  251. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.share.d.ts +0 -3
  252. package/dist/types/ssr/serverRender/renderToStream/bulidTemplate.before.d.ts +0 -2
  253. package/dist/types/ssr/serverRender/renderToStream/index.d.ts +0 -3
  254. package/dist/types/ssr/serverRender/renderToStream/renderToPipe.d.ts +0 -7
  255. package/dist/types/ssr/serverRender/renderToStream/renderToPipe.worker.d.ts +0 -12
  256. package/dist/types/ssr/serverRender/renderToStream/template.d.ts +0 -6
  257. package/dist/types/ssr/serverRender/renderToString/buildHtml.d.ts +0 -6
  258. package/dist/types/ssr/serverRender/renderToString/entry.d.ts +0 -24
  259. package/dist/types/ssr/serverRender/renderToString/index.d.ts +0 -2
  260. package/dist/types/ssr/serverRender/renderToString/loadable.d.ts +0 -26
  261. package/dist/types/ssr/serverRender/renderToString/render.d.ts +0 -16
  262. package/dist/types/ssr/serverRender/renderToString/styledComponent.d.ts +0 -15
  263. package/dist/types/ssr/serverRender/tracker.d.ts +0 -20
  264. package/dist/types/ssr/serverRender/types.d.ts +0 -49
  265. package/dist/types/ssr/serverRender/utils.d.ts +0 -9
  266. package/dist/types/ssr/utils.d.ts +0 -10
  267. /package/dist/cjs/{ssr/cli → cli/ssr}/babel-plugin-ssr-loader-id.js +0 -0
  268. /package/dist/cjs/{ssr/cli → cli/ssr}/loadable-bundler-plugin.js +0 -0
  269. /package/dist/cjs/{ssr/react/withCallback/index.js → core/browser/withCallback.js} +0 -0
  270. /package/dist/cjs/{ssr/serverRender → core/server}/constants.js +0 -0
  271. /package/dist/cjs/{ssr → core/server}/react/index.js +0 -0
  272. /package/dist/cjs/{ssr → core/server}/react/nossr/index.js +0 -0
  273. /package/dist/cjs/{ssr → core/server}/react/prerender/index.js +0 -0
  274. /package/dist/cjs/{ssr → core/server}/react/prerender/type.js +0 -0
  275. /package/dist/cjs/{ssr → core/server}/react/prerender/util.js +0 -0
  276. /package/dist/esm/{ssr/react/withCallback/index.js → core/browser/withCallback.js} +0 -0
  277. /package/dist/esm/{ssr/serverRender/types.js → core/constants.js} +0 -0
  278. /package/dist/esm/{ssr/serverRender → core/server}/constants.js +0 -0
  279. /package/dist/esm/{ssr → core/server}/react/index.js +0 -0
  280. /package/dist/esm/{ssr → core/server}/react/nossr/index.js +0 -0
  281. /package/dist/esm/{ssr → core/server}/react/prerender/index.js +0 -0
  282. /package/dist/esm/{ssr → core/server}/react/prerender/util.js +0 -0
  283. /package/dist/esm-node/{ssr/react/withCallback/index.js → core/browser/withCallback.js} +0 -0
  284. /package/dist/esm-node/{ssr/serverRender/types.js → core/constants.js} +0 -0
  285. /package/dist/esm-node/{ssr/serverRender → core/server}/constants.js +0 -0
  286. /package/dist/esm-node/{ssr → core/server}/react/index.js +0 -0
  287. /package/dist/esm-node/{ssr → core/server}/react/nossr/index.js +0 -0
  288. /package/dist/esm-node/{ssr → core/server}/react/prerender/index.js +0 -0
  289. /package/dist/esm-node/{ssr → core/server}/react/prerender/type.js +0 -0
  290. /package/dist/esm-node/{ssr → core/server}/react/prerender/util.js +0 -0
  291. /package/dist/{esm/ssr/react/prerender/type.js → esm-node/core/server/string/types.js} +0 -0
  292. /package/dist/types/{ssr/cli → cli/ssr}/babel-plugin-ssr-loader-id.d.ts +0 -0
  293. /package/dist/types/{ssr/cli → cli/ssr}/index.d.ts +0 -0
  294. /package/dist/types/{ssr/cli → cli/ssr}/loadable-bundler-plugin.d.ts +0 -0
  295. /package/dist/types/{ssr/react/withCallback/index.d.ts → core/browser/withCallback.d.ts} +0 -0
  296. /package/dist/types/{ssr/serverRender → core/server}/constants.d.ts +0 -0
  297. /package/dist/types/{ssr → core/server}/react/index.d.ts +0 -0
  298. /package/dist/types/{ssr → core/server}/react/nossr/index.d.ts +0 -0
  299. /package/dist/types/{ssr → core/server}/react/prerender/index.d.ts +0 -0
  300. /package/dist/types/{ssr → core/server}/react/prerender/type.d.ts +0 -0
  301. /package/dist/types/{ssr → core/server}/react/prerender/util.d.ts +0 -0
@@ -0,0 +1,118 @@
1
+ import ReactHelmet from "react-helmet";
2
+ import ReactDomServer from "react-dom/server";
3
+ import React from "react";
4
+ import { time } from "@modern-js/runtime-utils/time";
5
+ import { run } from "@modern-js/runtime-utils/node";
6
+ import { parseHeaders } from "@modern-js/runtime-utils/universal/request";
7
+ import { createReplaceHelemt } from "../helmet";
8
+ import { getSSRConfigByEntry, safeReplace } from "../utils";
9
+ import { CHUNK_CSS_PLACEHOLDER, CHUNK_JS_PLACEHOLDER, HTML_PLACEHOLDER, SSR_DATA_PLACEHOLDER } from "../constants";
10
+ import { buildHtml } from "../shared";
11
+ import { SSRErrors, SSRTimings, createOnError, createOnTiming } from "../tracer";
12
+ import { RenderLevel } from "../../constants";
13
+ import { SSRDataCollector } from "./ssrData";
14
+ import { LoadableCollector } from "./loadable";
15
+ import { StyledCollector } from "./styledComponent";
16
+ import { prefetch } from "./prefetch";
17
+ const renderString = async (request, serverRoot, options) => {
18
+ const headersData = parseHeaders(request);
19
+ return run(headersData, async () => {
20
+ var _runtimeContext_ssrContext;
21
+ const { resource, runtimeContext, config, onError, onTiming, staticGenerate } = options;
22
+ const tracer = {
23
+ onError: createOnError(onError),
24
+ onTiming: createOnTiming(onTiming)
25
+ };
26
+ const routerContext = runtimeContext.routerContext;
27
+ const { htmlTemplate, entryName, loadableStats, routeManifest } = resource;
28
+ const chunkSet = {
29
+ renderLevel: RenderLevel.CLIENT_RENDER,
30
+ ssrScripts: "",
31
+ jsChunk: "",
32
+ cssChunk: ""
33
+ };
34
+ let prefetchData = {};
35
+ try {
36
+ prefetchData = await prefetch(serverRoot, request, options, tracer);
37
+ chunkSet.renderLevel = RenderLevel.SERVER_PREFETCH;
38
+ } catch (e) {
39
+ chunkSet.renderLevel = RenderLevel.CLIENT_RENDER;
40
+ }
41
+ const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries, staticGenerate);
42
+ const collectors = [
43
+ new StyledCollector(chunkSet),
44
+ new LoadableCollector({
45
+ stats: loadableStats,
46
+ nonce: config.nonce,
47
+ routeManifest,
48
+ template: htmlTemplate,
49
+ entryName,
50
+ chunkSet,
51
+ config
52
+ }),
53
+ new SSRDataCollector({
54
+ request,
55
+ prefetchData,
56
+ ssrConfig,
57
+ ssrContext: runtimeContext.ssrContext,
58
+ chunkSet,
59
+ routerContext,
60
+ nonce: config.nonce
61
+ })
62
+ ];
63
+ const rootElement = React.cloneElement(serverRoot, {
64
+ _internal_context: Object.assign(runtimeContext, {
65
+ ssr: true
66
+ })
67
+ });
68
+ const html = await generateHtml(rootElement, htmlTemplate, chunkSet, collectors, ((_runtimeContext_ssrContext = runtimeContext.ssrContext) === null || _runtimeContext_ssrContext === void 0 ? void 0 : _runtimeContext_ssrContext.htmlModifiers) || [], tracer);
69
+ return html;
70
+ });
71
+ };
72
+ async function generateHtml(App, htmlTemplate, chunkSet, collectors, htmlModifiers, { onError, onTiming }) {
73
+ const end = time();
74
+ let html = "";
75
+ let helmetData;
76
+ if (chunkSet.renderLevel >= RenderLevel.SERVER_PREFETCH) {
77
+ try {
78
+ const finalApp = collectors.reduce((pre, creator) => {
79
+ var _creator_collect;
80
+ return ((_creator_collect = creator.collect) === null || _creator_collect === void 0 ? void 0 : _creator_collect.call(creator, pre)) || pre;
81
+ }, App);
82
+ html = ReactDomServer.renderToString(finalApp);
83
+ helmetData = ReactHelmet.renderStatic();
84
+ chunkSet.renderLevel = RenderLevel.SERVER_RENDER;
85
+ await Promise.all(collectors.map((component) => component.effect()));
86
+ const cost = end();
87
+ onTiming(SSRTimings.RENDER_HTML, cost);
88
+ } catch (e) {
89
+ chunkSet.renderLevel = RenderLevel.CLIENT_RENDER;
90
+ onError(SSRErrors.RENDER_HTML, e);
91
+ }
92
+ }
93
+ const { ssrScripts, cssChunk, jsChunk } = chunkSet;
94
+ const finalHtml = await buildHtml(htmlTemplate, [
95
+ createReplaceHtml(html),
96
+ createReplaceChunkJs(jsChunk),
97
+ createReplaceChunkCss(cssChunk),
98
+ createReplaceSSRDataScript(ssrScripts),
99
+ createReplaceHelemt(helmetData),
100
+ ...htmlModifiers
101
+ ]);
102
+ return finalHtml;
103
+ }
104
+ function createReplaceHtml(html) {
105
+ return (template) => safeReplace(template, HTML_PLACEHOLDER, html);
106
+ }
107
+ function createReplaceSSRDataScript(data) {
108
+ return (template) => safeReplace(template, SSR_DATA_PLACEHOLDER, data);
109
+ }
110
+ function createReplaceChunkJs(js) {
111
+ return (template) => safeReplace(template, CHUNK_JS_PLACEHOLDER, js);
112
+ }
113
+ function createReplaceChunkCss(css) {
114
+ return (template) => safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
115
+ }
116
+ export {
117
+ renderString
118
+ };
@@ -61,13 +61,12 @@ class LoadableCollector {
61
61
  if (!check(scripts)) {
62
62
  return;
63
63
  }
64
- const { result: { chunksMap } } = this.options;
64
+ const { chunkSet } = this.options;
65
65
  const s = scripts.split("</script>").slice(0, 2).map((i) => `${i}</script>`).join("");
66
- chunksMap.js += s;
66
+ chunkSet.jsChunk += s;
67
67
  }
68
68
  async emitScriptAssets(chunks) {
69
- const { template, config, nonce, result } = this.options;
70
- const { chunksMap } = result;
69
+ const { template, nonce, chunkSet, config } = this.options;
71
70
  const { scriptLoading = "defer", enableInlineScripts } = config;
72
71
  const scriptLoadingAtr = {
73
72
  defer: scriptLoading === "defer" ? true : void 0,
@@ -92,10 +91,11 @@ class LoadableCollector {
92
91
  return script;
93
92
  }
94
93
  }));
95
- chunksMap.js += scripts.filter((script) => Boolean(script)).join("");
94
+ chunkSet.jsChunk += scripts.filter((script) => Boolean(script)).join("");
96
95
  }
97
96
  async emitStyleAssets(chunks) {
98
- const { template, result: { chunksMap }, config: { enableInlineStyles } } = this.options;
97
+ const { template, chunkSet, config } = this.options;
98
+ const { enableInlineStyles } = config;
99
99
  const atrributes = attributesToString(this.generateAttributes());
100
100
  const css = await Promise.all(chunks.filter((chunk) => {
101
101
  var _this_existsAssets;
@@ -111,7 +111,7 @@ class LoadableCollector {
111
111
  return link;
112
112
  }
113
113
  }));
114
- chunksMap.css += css.filter((css2) => Boolean(css2)).join("");
114
+ chunkSet.jsChunk += css.filter((css2) => Boolean(css2)).join("");
115
115
  }
116
116
  generateAttributes(extraAtr = {}) {
117
117
  const { config } = this.options;
@@ -129,9 +129,6 @@ class LoadableCollector {
129
129
  this.options = options;
130
130
  }
131
131
  }
132
- function createLoadableCollector(options) {
133
- return new LoadableCollector(options);
134
- }
135
132
  export {
136
- createLoadableCollector
133
+ LoadableCollector
137
134
  };
@@ -0,0 +1,78 @@
1
+ import { renderToStaticMarkup } from "react-dom/server";
2
+ import { run } from "@modern-js/runtime-utils/node";
3
+ import { ChunkExtractor } from "@loadable/server";
4
+ import { time } from "@modern-js/runtime-utils/time";
5
+ import { parseHeaders } from "@modern-js/runtime-utils/universal/request";
6
+ import React from "react";
7
+ import { SSRErrors, SSRTimings } from "../tracer";
8
+ const prefetch = async (App, request, options, { onError, onTiming }) => {
9
+ const headersData = parseHeaders(request);
10
+ const { runtimeContext: context, resource, config } = options;
11
+ const { entryName, loadableStats } = resource;
12
+ return run(headersData, async () => {
13
+ var _context_store;
14
+ if (!config.disablePrerender) {
15
+ try {
16
+ const end = time();
17
+ if (loadableStats) {
18
+ const extractor = new ChunkExtractor({
19
+ stats: loadableStats,
20
+ entrypoints: [
21
+ entryName
22
+ ].filter(Boolean)
23
+ });
24
+ renderToStaticMarkup(extractor.collectChunks(/* @__PURE__ */ React.cloneElement(App, {
25
+ _internal_context: Object.assign(context, {
26
+ ssr: false
27
+ })
28
+ })));
29
+ } else {
30
+ renderToStaticMarkup(/* @__PURE__ */ React.cloneElement(App, {
31
+ _internal_context: Object.assign(context, {
32
+ ssr: false
33
+ })
34
+ }));
35
+ }
36
+ const cost = end();
37
+ onTiming(SSRTimings.PRERENDER, cost);
38
+ } catch (e) {
39
+ const error = e;
40
+ onError(SSRErrors.PRERENDER, error);
41
+ throw e;
42
+ }
43
+ }
44
+ if (!context.loaderManager.hasPendingLoaders()) {
45
+ return {
46
+ initialData: context.initialData,
47
+ i18nData: context.__i18nData__
48
+ };
49
+ }
50
+ let loadersData = {};
51
+ try {
52
+ const end = time();
53
+ loadersData = await context.loaderManager.awaitPendingLoaders();
54
+ const cost = end();
55
+ onTiming(SSRTimings.USE_LOADER, cost);
56
+ } catch (e) {
57
+ onError(SSRErrors.USE_LOADER, e);
58
+ throw e;
59
+ }
60
+ Object.keys(loadersData).forEach((id) => {
61
+ const data = loadersData[id];
62
+ if (data._error) {
63
+ onError(SSRErrors.USE_LOADER, data._error);
64
+ delete data._error;
65
+ }
66
+ });
67
+ return {
68
+ loadersData,
69
+ initialData: context.initialData,
70
+ i18nData: context.__i18nData__,
71
+ // todo: move to plugin state
72
+ storeState: context === null || context === void 0 ? void 0 : (_context_store = context.store) === null || _context_store === void 0 ? void 0 : _context_store.getState()
73
+ };
74
+ });
75
+ };
76
+ export {
77
+ prefetch
78
+ };
@@ -0,0 +1,76 @@
1
+ import { _ as _class_private_field_get } from "@swc/helpers/_/_class_private_field_get";
2
+ import { _ as _class_private_field_init } from "@swc/helpers/_/_class_private_field_init";
3
+ import { _ as _class_private_field_set } from "@swc/helpers/_/_class_private_field_set";
4
+ import { _ as _class_private_method_get } from "@swc/helpers/_/_class_private_method_get";
5
+ import { _ as _class_private_method_init } from "@swc/helpers/_/_class_private_method_init";
6
+ import { serializeJson } from "@modern-js/runtime-utils/node";
7
+ import { attributesToString, serializeErrors } from "../utils";
8
+ import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "../constants";
9
+ var _options = /* @__PURE__ */ new WeakMap(), _getSSRData = /* @__PURE__ */ new WeakSet(), _getSSRDataScripts = /* @__PURE__ */ new WeakSet();
10
+ class SSRDataCollector {
11
+ effect() {
12
+ const { routerContext, chunkSet } = _class_private_field_get(this, _options);
13
+ const ssrData = _class_private_method_get(this, _getSSRData, getSSRData).call(this);
14
+ const routerData = routerContext ? {
15
+ loaderData: routerContext.loaderData,
16
+ errors: serializeErrors(routerContext.errors)
17
+ } : void 0;
18
+ const ssrDataScripts = _class_private_method_get(this, _getSSRDataScripts, getSSRDataScripts).call(this, ssrData, routerData);
19
+ chunkSet.ssrScripts = ssrDataScripts;
20
+ }
21
+ constructor(options) {
22
+ _class_private_method_init(this, _getSSRData);
23
+ _class_private_method_init(this, _getSSRDataScripts);
24
+ _class_private_field_init(this, _options, {
25
+ writable: true,
26
+ value: void 0
27
+ });
28
+ _class_private_field_set(this, _options, options);
29
+ }
30
+ }
31
+ function getSSRData() {
32
+ const { prefetchData, chunkSet, ssrConfig, ssrContext } = _class_private_field_get(this, _options);
33
+ const { reporter, request } = ssrContext;
34
+ const headers = typeof ssrConfig === "object" && ssrConfig.unsafeHeaders ? Object.fromEntries(Object.entries(request.headers).filter(([key, _]) => {
35
+ var _ssrConfig_unsafeHeaders_map, _ssrConfig_unsafeHeaders;
36
+ return (_ssrConfig_unsafeHeaders = ssrConfig.unsafeHeaders) === null || _ssrConfig_unsafeHeaders === void 0 ? void 0 : (_ssrConfig_unsafeHeaders_map = _ssrConfig_unsafeHeaders.map((header) => header.toLowerCase())) === null || _ssrConfig_unsafeHeaders_map === void 0 ? void 0 : _ssrConfig_unsafeHeaders_map.includes(key.toLowerCase());
37
+ })) : void 0;
38
+ return {
39
+ data: prefetchData,
40
+ context: {
41
+ request: {
42
+ params: request.params,
43
+ query: request.query,
44
+ pathname: request.pathname,
45
+ host: request.host,
46
+ url: request.raw.url,
47
+ headers
48
+ },
49
+ reporter: {
50
+ sessionId: reporter === null || reporter === void 0 ? void 0 : reporter.sessionId
51
+ }
52
+ },
53
+ mode: "string",
54
+ renderLevel: chunkSet.renderLevel
55
+ };
56
+ }
57
+ function getSSRDataScripts(ssrData, routerData) {
58
+ const { nonce, ssrConfig } = _class_private_field_get(this, _options);
59
+ const inlineScript = typeof ssrConfig === "boolean" ? true : (ssrConfig === null || ssrConfig === void 0 ? void 0 : ssrConfig.inlineScript) !== false;
60
+ const useInlineScript = inlineScript !== false;
61
+ const serializeSSRData = serializeJson(ssrData);
62
+ const attrsStr = attributesToString({
63
+ nonce
64
+ });
65
+ let ssrDataScripts = useInlineScript ? `<script${attrsStr}>window._SSR_DATA = ${serializeSSRData}</script>` : `<script type="application/json" id="${SSR_DATA_JSON_ID}">${serializeSSRData}</script>`;
66
+ if (routerData) {
67
+ const serializedRouterData = serializeJson(routerData);
68
+ ssrDataScripts += useInlineScript ? `
69
+ <script${attrsStr}>window._ROUTER_DATA = ${serializedRouterData}</script>` : `
70
+ <script type="application/json" id="${ROUTER_DATA_JSON_ID}">${serializedRouterData}</script>`;
71
+ }
72
+ return ssrDataScripts;
73
+ }
74
+ export {
75
+ SSRDataCollector
76
+ };
@@ -0,0 +1,29 @@
1
+ import { _ as _class_private_field_get } from "@swc/helpers/_/_class_private_field_get";
2
+ import { _ as _class_private_field_init } from "@swc/helpers/_/_class_private_field_init";
3
+ import { _ as _class_private_field_set } from "@swc/helpers/_/_class_private_field_set";
4
+ import { ServerStyleSheet } from "styled-components";
5
+ var _sheet = /* @__PURE__ */ new WeakMap(), _chunkSet = /* @__PURE__ */ new WeakMap();
6
+ class StyledCollector {
7
+ collect(comopnent) {
8
+ return _class_private_field_get(this, _sheet).collectStyles(comopnent);
9
+ }
10
+ effect() {
11
+ const css = _class_private_field_get(this, _sheet).getStyleTags();
12
+ _class_private_field_get(this, _chunkSet).cssChunk += css;
13
+ }
14
+ constructor(chunkSet) {
15
+ _class_private_field_init(this, _sheet, {
16
+ writable: true,
17
+ value: void 0
18
+ });
19
+ _class_private_field_init(this, _chunkSet, {
20
+ writable: true,
21
+ value: void 0
22
+ });
23
+ _class_private_field_set(this, _sheet, new ServerStyleSheet());
24
+ _class_private_field_set(this, _chunkSet, chunkSet);
25
+ }
26
+ }
27
+ export {
28
+ StyledCollector
29
+ };
@@ -0,0 +1,33 @@
1
+ var SSRTimings;
2
+ (function(SSRTimings2) {
3
+ SSRTimings2["PRERENDER"] = "ssr-prerender";
4
+ SSRTimings2["RENDER_HTML"] = "ssr-render-html";
5
+ SSRTimings2["RENDER_SHELL"] = "ssr-render-shell";
6
+ SSRTimings2["USE_LOADER"] = "use-loader";
7
+ })(SSRTimings || (SSRTimings = {}));
8
+ var SSRErrors;
9
+ (function(SSRErrors2) {
10
+ SSRErrors2["PRERENDER"] = "App Prerender";
11
+ SSRErrors2["USE_LOADER"] = "App run useLoader";
12
+ SSRErrors2["RENDER_HTML"] = "App Render To HTML";
13
+ SSRErrors2["RENDER_STREAM"] = "An error occurs during streaming SSR";
14
+ SSRErrors2["RENDER_SHELL"] = "An error occurs during streaming render shell";
15
+ })(SSRErrors || (SSRErrors = {}));
16
+ function createOnError(onError) {
17
+ return (key, e) => {
18
+ const error = e instanceof Error ? e : new Error("Unexpected Server Error");
19
+ error.name = key;
20
+ onError === null || onError === void 0 ? void 0 : onError(e);
21
+ };
22
+ }
23
+ function createOnTiming(onTiming) {
24
+ return (key, cost) => {
25
+ onTiming === null || onTiming === void 0 ? void 0 : onTiming(key, cost);
26
+ };
27
+ }
28
+ export {
29
+ SSRErrors,
30
+ SSRTimings,
31
+ createOnError,
32
+ createOnTiming
33
+ };
@@ -0,0 +1,60 @@
1
+ import { isRouteErrorResponse } from "@modern-js/runtime-utils/remix-router";
2
+ function attributesToString(attributes) {
3
+ return Object.entries(attributes).reduce((str, [key, value]) => {
4
+ return value === void 0 ? str : `${str} ${key}="${value}"`;
5
+ }, "");
6
+ }
7
+ function safeReplace(source, searchValue, replaceValue) {
8
+ return source.replace(searchValue, () => replaceValue);
9
+ }
10
+ function checkIsNode() {
11
+ var _process_release;
12
+ return typeof process !== "undefined" && ((_process_release = process.release) === null || _process_release === void 0 ? void 0 : _process_release.name) === "node";
13
+ }
14
+ function serializeErrors(errors) {
15
+ if (!errors) {
16
+ return null;
17
+ }
18
+ const entries = Object.entries(errors);
19
+ const serialized = {};
20
+ for (const [key, val] of entries) {
21
+ if (isRouteErrorResponse(val)) {
22
+ serialized[key] = {
23
+ ...val,
24
+ __type: "RouteErrorResponse"
25
+ };
26
+ } else if (val instanceof Error) {
27
+ serialized[key] = {
28
+ message: val.message,
29
+ stack: val.stack,
30
+ __type: "Error"
31
+ };
32
+ } else {
33
+ serialized[key] = val;
34
+ }
35
+ }
36
+ return serialized;
37
+ }
38
+ function getSSRConfigByEntry(entryName, ssr, ssrByEntries, staticGenerate) {
39
+ if (staticGenerate) {
40
+ return true;
41
+ }
42
+ if (ssrByEntries === null || ssrByEntries === void 0 ? void 0 : ssrByEntries[entryName]) {
43
+ return ssrByEntries[entryName];
44
+ }
45
+ return ssr;
46
+ }
47
+ function getSSRMode(ssrConfig) {
48
+ if (typeof ssrConfig === "boolean") {
49
+ return ssrConfig ? "string" : false;
50
+ }
51
+ return (ssrConfig === null || ssrConfig === void 0 ? void 0 : ssrConfig.mode) === "stream" ? "stream" : "string";
52
+ }
53
+ export {
54
+ attributesToString,
55
+ checkIsNode,
56
+ getSSRConfigByEntry,
57
+ getSSRMode,
58
+ safeReplace,
59
+ serializeErrors
60
+ };
@@ -1,6 +1,7 @@
1
1
  import path from "path";
2
2
  import { fs, getEntryOptions, isRouterV5, isSSGEntry, isUseSSRBundle, logger } from "@modern-js/utils";
3
3
  import { FILE_SYSTEM_ROUTES_FILE_NAME } from "../constants";
4
+ import { ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME } from "../../../cli/constants";
4
5
  import * as templates from "./templates";
5
6
  import { getClientRoutes, getClientRoutesLegacy } from "./getClientRoutes";
6
7
  import { getServerLoadersFile, getServerCombinedModueFile } from "./utils";
@@ -10,14 +11,11 @@ const generateCode = async (appContext, config, entrypoints, api) => {
10
11
  const hookRunners = api.useHookRunners();
11
12
  const isV5 = isRouterV5(config);
12
13
  const getRoutes = isV5 ? getClientRoutesLegacy : getClientRoutes;
13
- const importsStatemets = /* @__PURE__ */ new Map();
14
14
  const oldVersion = typeof (config === null || config === void 0 ? void 0 : config.runtime.router) === "object" ? Boolean((config === null || config === void 0 ? void 0 : config.runtime.router).oldVersion) : false;
15
15
  await Promise.all(entrypoints.map(generateEntryCode));
16
- return {
17
- importsStatemets
18
- };
19
16
  async function generateEntryCode(entrypoint) {
20
17
  const { entryName, isMainEntry, isAutoMount, fileSystemRoutes } = entrypoint;
18
+ const { metaName } = api.useAppContext();
21
19
  if (isAutoMount) {
22
20
  if (fileSystemRoutes) {
23
21
  var _config_output;
@@ -69,6 +67,7 @@ const generateCode = async (appContext, config, entrypoints, api) => {
69
67
  const { code } = await hookRunners.beforeGenerateRoutes({
70
68
  entrypoint,
71
69
  code: await templates.fileSystemRoutes({
70
+ metaName,
72
71
  routes,
73
72
  ssrMode: useSSG ? "string" : mode,
74
73
  nestedRoutesEntry: entrypoint.nestedRoutesEntry,
@@ -95,6 +94,10 @@ const generateCode = async (appContext, config, entrypoints, api) => {
95
94
  }
96
95
  }
97
96
  };
97
+ function generatorRegisterCode(internalDirectory, entryName, code) {
98
+ fs.outputFileSync(path.resolve(internalDirectory, `./${entryName}/${ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME}`), code, "utf8");
99
+ }
98
100
  export {
99
- generateCode
101
+ generateCode,
102
+ generatorRegisterCode
100
103
  };
@@ -1,8 +1,8 @@
1
1
  import path from "path";
2
- import { fs, getEntryOptions, isSSGEntry, slash } from "@modern-js/utils";
2
+ import { findExists, formatImportPath, fs, getEntryOptions, isSSGEntry, slash } from "@modern-js/utils";
3
3
  import { ROUTE_MODULES } from "@modern-js/utils/universal/constants";
4
- import { TEMP_LOADERS_DIR } from "../constants";
5
- import { getServerLoadersFile } from "./utils";
4
+ import { APP_CONFIG_NAME, APP_INIT_EXPORTED, TEMP_LOADERS_DIR } from "../constants";
5
+ import { getPathWithoutExt, getServerLoadersFile, parseModule, replaceWithAlias } from "./utils";
6
6
  const routesForServer = ({ routes }) => {
7
7
  const loaders = [];
8
8
  const actions = [];
@@ -85,7 +85,7 @@ const routesForServer = ({ routes }) => {
85
85
  };
86
86
  const createMatchReg = (keyword) => new RegExp(`("${keyword}":\\s)"([^
87
87
  ]+)"`, "g");
88
- const fileSystemRoutes = async ({ routes, ssrMode, nestedRoutesEntry, entryName, internalDirectory, splitRouteChunks = true }) => {
88
+ const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry, entryName, internalDirectory, splitRouteChunks = true }) => {
89
89
  const components = [];
90
90
  const loadings = [];
91
91
  const errors = [];
@@ -96,7 +96,7 @@ const fileSystemRoutes = async ({ routes, ssrMode, nestedRoutesEntry, entryName,
96
96
  const loadersMapFile = path.join(internalDirectory, entryName, TEMP_LOADERS_DIR, "map.json");
97
97
  const importLazyCode = `
98
98
  import { lazy } from "react";
99
- import loadable, { lazy as loadableLazy } from "@modern-js/runtime/loadable"
99
+ import loadable, { lazy as loadableLazy } from "@${metaName}/runtime/loadable"
100
100
  `;
101
101
  let rootLayoutCode = ``;
102
102
  const getDataLoaderPath = ({ loaderId, clientData, action, inline, routeId }) => {
@@ -295,7 +295,7 @@ const fileSystemRoutes = async ({ routes, ssrMode, nestedRoutesEntry, entryName,
295
295
  await fs.ensureFile(loadersMapFile);
296
296
  await fs.writeJSON(loadersMapFile, loadersMap);
297
297
  const importRuntimeRouterCode = `
298
- import { createShouldRevalidate, handleRouteModule, handleRouteModuleError} from '@modern-js/runtime/router';
298
+ import { createShouldRevalidate, handleRouteModule, handleRouteModuleError} from '@${metaName}/runtime/router';
299
299
  `;
300
300
  const routeModulesCode = `
301
301
  if(typeof document !== 'undefined'){
@@ -328,8 +328,62 @@ function ssrLoaderCombinedModule(entrypoints, entrypoint, config, appContext) {
328
328
  }
329
329
  return null;
330
330
  }
331
+ const runtimeGlobalContext = async ({ metaName, srcDirectory, nestedRoutesEntry, internalSrcAlias, globalApp }) => {
332
+ const imports = [
333
+ `import { setGlobalContext } from '@${metaName}/runtime/context';`
334
+ ];
335
+ if (nestedRoutesEntry) {
336
+ const rootLayoutPath = path.join(nestedRoutesEntry, "layout");
337
+ const rootLayoutFile = findExists([
338
+ ".js",
339
+ ".ts",
340
+ ".jsx",
341
+ ".tsx"
342
+ ].map((ext) => `${rootLayoutPath}${ext}`));
343
+ if (rootLayoutFile) {
344
+ const rootLayoutBuffer = await fs.readFile(rootLayoutFile);
345
+ const rootLayout = rootLayoutBuffer.toString();
346
+ const [, moduleExports] = await parseModule({
347
+ source: rootLayout.toString(),
348
+ filename: rootLayoutFile
349
+ });
350
+ const hasAppConfig = moduleExports.some((e) => e.n === APP_CONFIG_NAME);
351
+ const hasAppInit = moduleExports.some((e) => e.n === APP_INIT_EXPORTED);
352
+ const layoutPath = formatImportPath(getPathWithoutExt(replaceWithAlias(srcDirectory, rootLayoutFile, internalSrcAlias)));
353
+ if (hasAppConfig) {
354
+ imports.push(`import { config as appConfig } from '${layoutPath}';`);
355
+ } else {
356
+ imports.push(`let appConfig;`);
357
+ }
358
+ if (hasAppInit) {
359
+ imports.push(`import { init as appInit } from '${layoutPath}';`);
360
+ } else {
361
+ imports.push(`let appInit;`);
362
+ }
363
+ }
364
+ } else {
365
+ imports.push(`let appConfig;`);
366
+ imports.push(`let appInit;`);
367
+ }
368
+ if (globalApp) {
369
+ imports.push(`import layoutApp from '${formatImportPath(globalApp.replace(srcDirectory, internalSrcAlias))}';`);
370
+ } else {
371
+ imports.push(`let layoutApp;`);
372
+ }
373
+ return `${imports.join("\n")}
374
+
375
+ import { routes } from './routes.js';
376
+
377
+ setGlobalContext({
378
+ layoutApp,
379
+ routes,
380
+ appInit,
381
+ appConfig,
382
+ });`;
383
+ };
331
384
  export {
332
385
  fileSystemRoutes,
333
386
  routesForServer,
387
+ runtimeGlobalContext,
334
388
  ssrLoaderCombinedModule
335
389
  };
@@ -10,6 +10,8 @@ const FILE_SYSTEM_ROUTES_INDEX = "index";
10
10
  const FILE_SYSTEM_ROUTES_IGNORED_REGEX = /\.(d|test|spec|e2e)\.(js|jsx|ts|tsx)$/;
11
11
  const FILE_SYSTEM_ROUTES_DYNAMIC_REGEXP = /^\[(\S+)\]([*+?]?)$/;
12
12
  const FILE_SYSTEM_ROUTES_COMPONENTS_DIR = "internal_components";
13
+ const APP_CONFIG_NAME = "config";
14
+ const APP_INIT_EXPORTED = "init";
13
15
  const NESTED_ROUTE = {
14
16
  LAYOUT_FILE: "layout",
15
17
  LAYOUT_CONFIG_FILE: "layout.config",
@@ -32,6 +34,8 @@ const NESTED_ROUTE = {
32
34
  };
33
35
  export {
34
36
  ACTION_EXPORT_NAME,
37
+ APP_CONFIG_NAME,
38
+ APP_INIT_EXPORTED,
35
39
  FILE_SYSTEM_ROUTES_COMPONENTS_DIR,
36
40
  FILE_SYSTEM_ROUTES_DYNAMIC_REGEXP,
37
41
  FILE_SYSTEM_ROUTES_FILE_NAME,
@@ -34,12 +34,10 @@ const modifyEntrypoints = (entrypoints, config = {}) => {
34
34
  globalApp: findExists(JS_EXTENSIONS.map((ext) => path.resolve(entrypoint.absoluteEntryDir, `./${PAGES_DIR_NAME}/${FILE_SYSTEM_ROUTES_GLOBAL_LAYOUT}${ext}`)))
35
35
  };
36
36
  if (isHasPages) {
37
- entrypoint.entry = path.join(entrypoint.absoluteEntryDir, PAGES_DIR_NAME);
38
- entrypoint.pageRoutesEntry = entrypoint.entry;
37
+ entrypoint.pageRoutesEntry = path.join(entrypoint.absoluteEntryDir, PAGES_DIR_NAME);
39
38
  }
40
39
  if (isHasNestedRoutes) {
41
- entrypoint.entry = path.join(entrypoint.absoluteEntryDir, NESTED_ROUTES_DIR);
42
- entrypoint.nestedRoutesEntry = entrypoint.entry;
40
+ entrypoint.nestedRoutesEntry = path.join(entrypoint.absoluteEntryDir, NESTED_ROUTES_DIR);
43
41
  }
44
42
  } else {
45
43
  throw Error("Custom entries with conventional routing not support use react router v5!");
@@ -2,17 +2,32 @@ import path from "path";
2
2
  import { cloneDeep } from "@modern-js/utils/lodash";
3
3
  import { modifyEntrypoints } from "./entry";
4
4
  import { isPageComponentFile } from "./code/utils";
5
+ import * as templates from "./code/templates";
5
6
  let originEntrypoints = [];
6
7
  async function handleModifyEntrypoints(api, entrypoints) {
7
8
  const config = api.useResolvedConfigContext();
8
- const newEntryPoints = modifyEntrypoints(entrypoints, config);
9
+ return modifyEntrypoints(entrypoints, config);
10
+ }
11
+ async function handleGeneratorEntryCode(api, entrypoints) {
9
12
  const appContext = api.useAppContext();
13
+ const { internalDirectory } = api.useAppContext();
10
14
  const resolvedConfig = api.useResolvedConfigContext();
11
- appContext.entrypoints = newEntryPoints;
12
- originEntrypoints = cloneDeep(newEntryPoints);
13
- const { generateCode } = await import("./code");
15
+ const { generatorRegisterCode, generateCode } = await import("./code");
16
+ originEntrypoints = cloneDeep(entrypoints);
14
17
  await generateCode(appContext, resolvedConfig, entrypoints, api);
15
- return newEntryPoints;
18
+ await Promise.all(entrypoints.map(async (entrypoint) => {
19
+ if (entrypoint.nestedRoutesEntry || entrypoint.pageRoutesEntry) {
20
+ var _entrypoint_fileSystemRoutes;
21
+ generatorRegisterCode(internalDirectory, entrypoint.entryName, await templates.runtimeGlobalContext({
22
+ metaName: appContext.metaName,
23
+ srcDirectory: appContext.srcDirectory,
24
+ nestedRoutesEntry: entrypoint.nestedRoutesEntry,
25
+ internalSrcAlias: appContext.internalSrcAlias,
26
+ globalApp: (_entrypoint_fileSystemRoutes = entrypoint.fileSystemRoutes) === null || _entrypoint_fileSystemRoutes === void 0 ? void 0 : _entrypoint_fileSystemRoutes.globalApp
27
+ }));
28
+ }
29
+ }));
30
+ return entrypoints;
16
31
  }
17
32
  async function handleFileChange(api, e) {
18
33
  const appContext = api.useAppContext();
@@ -32,5 +47,6 @@ async function handleFileChange(api, e) {
32
47
  }
33
48
  export {
34
49
  handleFileChange,
50
+ handleGeneratorEntryCode,
35
51
  handleModifyEntrypoints
36
52
  };