@bleedingdev/modern-js-app-tools 3.2.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 (432) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/bin/modern.js +36 -0
  4. package/dist/cjs/baseline.js +83 -0
  5. package/dist/cjs/builder/builder-rspack/index.js +40 -0
  6. package/dist/cjs/builder/generator/adapterCopy.js +79 -0
  7. package/dist/cjs/builder/generator/createBuilderProviderConfig.js +100 -0
  8. package/dist/cjs/builder/generator/createCopyPattern.js +67 -0
  9. package/dist/cjs/builder/generator/getBuilderEnvironments.js +90 -0
  10. package/dist/cjs/builder/generator/index.js +80 -0
  11. package/dist/cjs/builder/index.js +50 -0
  12. package/dist/cjs/builder/shared/builderPlugins/adapterBasic.js +133 -0
  13. package/dist/cjs/builder/shared/builderPlugins/adapterHtml.js +89 -0
  14. package/dist/cjs/builder/shared/builderPlugins/adapterPrecompress.js +112 -0
  15. package/dist/cjs/builder/shared/builderPlugins/adapterSSR.js +151 -0
  16. package/dist/cjs/builder/shared/builderPlugins/builderHooks.js +51 -0
  17. package/dist/cjs/builder/shared/builderPlugins/index.js +86 -0
  18. package/dist/cjs/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.js +71 -0
  19. package/dist/cjs/builder/shared/bundlerPlugins/HtmlBottomTemplate.js +56 -0
  20. package/dist/cjs/builder/shared/bundlerPlugins/RouterPlugin.js +191 -0
  21. package/dist/cjs/builder/shared/bundlerPlugins/index.js +72 -0
  22. package/dist/cjs/builder/shared/createCopyInfo.js +59 -0
  23. package/dist/cjs/builder/shared/index.js +72 -0
  24. package/dist/cjs/builder/shared/loaders/serverModuleLoader.js +39 -0
  25. package/dist/cjs/builder/shared/types.js +18 -0
  26. package/dist/cjs/commands/build.js +107 -0
  27. package/dist/cjs/commands/deploy.js +44 -0
  28. package/dist/cjs/commands/dev.js +121 -0
  29. package/dist/cjs/commands/index.js +99 -0
  30. package/dist/cjs/commands/info.js +110 -0
  31. package/dist/cjs/commands/inspect.js +49 -0
  32. package/dist/cjs/commands/runtime.js +159 -0
  33. package/dist/cjs/commands/serve.js +92 -0
  34. package/dist/cjs/compat/hooks.js +104 -0
  35. package/dist/cjs/compat/index.js +62 -0
  36. package/dist/cjs/compat/utils.js +135 -0
  37. package/dist/cjs/config/default.js +125 -0
  38. package/dist/cjs/config/index.js +65 -0
  39. package/dist/cjs/config/initialize/index.js +41 -0
  40. package/dist/cjs/config/initialize/inits.js +101 -0
  41. package/dist/cjs/constants.js +40 -0
  42. package/dist/cjs/defineConfig.js +36 -0
  43. package/dist/cjs/esm/register-esm.js +48 -0
  44. package/dist/cjs/esm/register-esm.mjs +10 -0
  45. package/dist/cjs/esm/ts-paths-loader.js +73 -0
  46. package/dist/cjs/esm/ts-paths-loader.mjs +35 -0
  47. package/dist/cjs/exports/server.js +18 -0
  48. package/dist/cjs/index.js +358 -0
  49. package/dist/cjs/locale/en.js +79 -0
  50. package/dist/cjs/locale/index.js +46 -0
  51. package/dist/cjs/locale/zh.js +79 -0
  52. package/dist/cjs/plugins/analyze/constants.js +48 -0
  53. package/dist/cjs/plugins/analyze/getBundleEntry.js +97 -0
  54. package/dist/cjs/plugins/analyze/getFileSystemEntry.js +117 -0
  55. package/dist/cjs/plugins/analyze/getHtmlTemplate.js +144 -0
  56. package/dist/cjs/plugins/analyze/getServerRoutes.js +177 -0
  57. package/dist/cjs/plugins/analyze/index.js +237 -0
  58. package/dist/cjs/plugins/analyze/isDefaultExportFunction.js +86 -0
  59. package/dist/cjs/plugins/analyze/templates.js +56 -0
  60. package/dist/cjs/plugins/analyze/utils.js +126 -0
  61. package/dist/cjs/plugins/deploy/index.js +77 -0
  62. package/dist/cjs/plugins/deploy/platforms/gh-pages.js +87 -0
  63. package/dist/cjs/plugins/deploy/platforms/netlify.js +140 -0
  64. package/dist/cjs/plugins/deploy/platforms/node.js +100 -0
  65. package/dist/cjs/plugins/deploy/platforms/platform.js +18 -0
  66. package/dist/cjs/plugins/deploy/platforms/templates/netlify-entry.cjs +57 -0
  67. package/dist/cjs/plugins/deploy/platforms/templates/netlify-entry.mjs +59 -0
  68. package/dist/cjs/plugins/deploy/platforms/templates/node-entry.cjs +44 -0
  69. package/dist/cjs/plugins/deploy/platforms/templates/node-entry.mjs +46 -0
  70. package/dist/cjs/plugins/deploy/platforms/templates/vercel-entry.cjs +57 -0
  71. package/dist/cjs/plugins/deploy/platforms/templates/vercel-entry.mjs +58 -0
  72. package/dist/cjs/plugins/deploy/platforms/vercel.js +159 -0
  73. package/dist/cjs/plugins/deploy/types.js +18 -0
  74. package/dist/cjs/plugins/deploy/utils/generator.js +104 -0
  75. package/dist/cjs/plugins/deploy/utils/index.js +123 -0
  76. package/dist/cjs/plugins/initialize/index.js +93 -0
  77. package/dist/cjs/plugins/serverBuild.js +90 -0
  78. package/dist/cjs/plugins/serverRuntime.js +49 -0
  79. package/dist/cjs/presetUltramodern.js +41 -0
  80. package/dist/cjs/rsbuild.js +90 -0
  81. package/dist/cjs/run/index.js +98 -0
  82. package/dist/cjs/types/config/deploy.js +18 -0
  83. package/dist/cjs/types/config/dev.js +18 -0
  84. package/dist/cjs/types/config/experiments.js +18 -0
  85. package/dist/cjs/types/config/html.js +18 -0
  86. package/dist/cjs/types/config/index.js +58 -0
  87. package/dist/cjs/types/config/output.js +18 -0
  88. package/dist/cjs/types/config/performance.js +18 -0
  89. package/dist/cjs/types/config/resolve.js +18 -0
  90. package/dist/cjs/types/config/security.js +18 -0
  91. package/dist/cjs/types/config/source.js +18 -0
  92. package/dist/cjs/types/config/testing.js +18 -0
  93. package/dist/cjs/types/config/tools.js +18 -0
  94. package/dist/cjs/types/index.js +58 -0
  95. package/dist/cjs/types/plugin.js +18 -0
  96. package/dist/cjs/types/utils.js +18 -0
  97. package/dist/cjs/ultramodern/designSystem.js +119 -0
  98. package/dist/cjs/utils/config.js +45 -0
  99. package/dist/cjs/utils/createServer.js +52 -0
  100. package/dist/cjs/utils/env.js +46 -0
  101. package/dist/cjs/utils/generateWatchFiles.js +54 -0
  102. package/dist/cjs/utils/getConfigFile.js +49 -0
  103. package/dist/cjs/utils/getSelectedEntries.js +60 -0
  104. package/dist/cjs/utils/initAppContext.js +71 -0
  105. package/dist/cjs/utils/loadPlugins.js +85 -0
  106. package/dist/cjs/utils/printInstructions.js +43 -0
  107. package/dist/cjs/utils/register.js +128 -0
  108. package/dist/cjs/utils/restart.js +52 -0
  109. package/dist/cjs/utils/routes.js +65 -0
  110. package/dist/cjs/utils/types.js +18 -0
  111. package/dist/esm/baseline.mjs +46 -0
  112. package/dist/esm/builder/builder-rspack/index.mjs +6 -0
  113. package/dist/esm/builder/generator/adapterCopy.mjs +35 -0
  114. package/dist/esm/builder/generator/createBuilderProviderConfig.mjs +66 -0
  115. package/dist/esm/builder/generator/createCopyPattern.mjs +30 -0
  116. package/dist/esm/builder/generator/getBuilderEnvironments.mjs +56 -0
  117. package/dist/esm/builder/generator/index.mjs +46 -0
  118. package/dist/esm/builder/index.mjs +7 -0
  119. package/dist/esm/builder/shared/builderPlugins/adapterBasic.mjs +89 -0
  120. package/dist/esm/builder/shared/builderPlugins/adapterHtml.mjs +55 -0
  121. package/dist/esm/builder/shared/builderPlugins/adapterPrecompress.mjs +68 -0
  122. package/dist/esm/builder/shared/builderPlugins/adapterSSR.mjs +117 -0
  123. package/dist/esm/builder/shared/builderPlugins/builderHooks.mjs +17 -0
  124. package/dist/esm/builder/shared/builderPlugins/index.mjs +5 -0
  125. package/dist/esm/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.mjs +37 -0
  126. package/dist/esm/builder/shared/bundlerPlugins/HtmlBottomTemplate.mjs +22 -0
  127. package/dist/esm/builder/shared/bundlerPlugins/RouterPlugin.mjs +157 -0
  128. package/dist/esm/builder/shared/bundlerPlugins/index.mjs +3 -0
  129. package/dist/esm/builder/shared/createCopyInfo.mjs +15 -0
  130. package/dist/esm/builder/shared/index.mjs +3 -0
  131. package/dist/esm/builder/shared/loaders/serverModuleLoader.mjs +5 -0
  132. package/dist/esm/builder/shared/types.mjs +0 -0
  133. package/dist/esm/commands/build.mjs +63 -0
  134. package/dist/esm/commands/deploy.mjs +10 -0
  135. package/dist/esm/commands/dev.mjs +77 -0
  136. package/dist/esm/commands/index.mjs +47 -0
  137. package/dist/esm/commands/info.mjs +76 -0
  138. package/dist/esm/commands/inspect.mjs +15 -0
  139. package/dist/esm/commands/runtime.mjs +116 -0
  140. package/dist/esm/commands/serve.mjs +48 -0
  141. package/dist/esm/compat/hooks.mjs +67 -0
  142. package/dist/esm/compat/index.mjs +28 -0
  143. package/dist/esm/compat/utils.mjs +95 -0
  144. package/dist/esm/config/default.mjs +91 -0
  145. package/dist/esm/config/index.mjs +2 -0
  146. package/dist/esm/config/initialize/index.mjs +7 -0
  147. package/dist/esm/config/initialize/inits.mjs +54 -0
  148. package/dist/esm/constants.mjs +3 -0
  149. package/dist/esm/defineConfig.mjs +2 -0
  150. package/dist/esm/esm/register-esm.mjs +11 -0
  151. package/dist/esm/esm/ts-paths-loader.mjs +36 -0
  152. package/dist/esm/exports/server.mjs +0 -0
  153. package/dist/esm/index.mjs +131 -0
  154. package/dist/esm/locale/en.mjs +45 -0
  155. package/dist/esm/locale/index.mjs +9 -0
  156. package/dist/esm/locale/zh.mjs +45 -0
  157. package/dist/esm/plugins/analyze/constants.mjs +8 -0
  158. package/dist/esm/plugins/analyze/getBundleEntry.mjs +53 -0
  159. package/dist/esm/plugins/analyze/getFileSystemEntry.mjs +66 -0
  160. package/dist/esm/plugins/analyze/getHtmlTemplate.mjs +97 -0
  161. package/dist/esm/plugins/analyze/getServerRoutes.mjs +130 -0
  162. package/dist/esm/plugins/analyze/index.mjs +203 -0
  163. package/dist/esm/plugins/analyze/isDefaultExportFunction.mjs +41 -0
  164. package/dist/esm/plugins/analyze/templates.mjs +22 -0
  165. package/dist/esm/plugins/analyze/utils.mjs +63 -0
  166. package/dist/esm/plugins/deploy/index.mjs +43 -0
  167. package/dist/esm/plugins/deploy/platforms/gh-pages.mjs +43 -0
  168. package/dist/esm/plugins/deploy/platforms/netlify.mjs +96 -0
  169. package/dist/esm/plugins/deploy/platforms/node.mjs +56 -0
  170. package/dist/esm/plugins/deploy/platforms/platform.mjs +0 -0
  171. package/dist/esm/plugins/deploy/platforms/templates/netlify-entry.cjs +57 -0
  172. package/dist/esm/plugins/deploy/platforms/templates/netlify-entry.mjs +59 -0
  173. package/dist/esm/plugins/deploy/platforms/templates/node-entry.cjs +44 -0
  174. package/dist/esm/plugins/deploy/platforms/templates/node-entry.mjs +46 -0
  175. package/dist/esm/plugins/deploy/platforms/templates/vercel-entry.cjs +57 -0
  176. package/dist/esm/plugins/deploy/platforms/templates/vercel-entry.mjs +58 -0
  177. package/dist/esm/plugins/deploy/platforms/vercel.mjs +115 -0
  178. package/dist/esm/plugins/deploy/types.mjs +0 -0
  179. package/dist/esm/plugins/deploy/utils/generator.mjs +48 -0
  180. package/dist/esm/plugins/deploy/utils/index.mjs +67 -0
  181. package/dist/esm/plugins/initialize/index.mjs +59 -0
  182. package/dist/esm/plugins/serverBuild.mjs +45 -0
  183. package/dist/esm/plugins/serverRuntime.mjs +15 -0
  184. package/dist/esm/presetUltramodern.mjs +4 -0
  185. package/dist/esm/rsbuild.mjs +47 -0
  186. package/dist/esm/rslib-runtime.mjs +18 -0
  187. package/dist/esm/run/index.mjs +61 -0
  188. package/dist/esm/types/config/deploy.mjs +0 -0
  189. package/dist/esm/types/config/dev.mjs +0 -0
  190. package/dist/esm/types/config/experiments.mjs +0 -0
  191. package/dist/esm/types/config/html.mjs +0 -0
  192. package/dist/esm/types/config/index.mjs +1 -0
  193. package/dist/esm/types/config/output.mjs +0 -0
  194. package/dist/esm/types/config/performance.mjs +0 -0
  195. package/dist/esm/types/config/resolve.mjs +0 -0
  196. package/dist/esm/types/config/security.mjs +0 -0
  197. package/dist/esm/types/config/source.mjs +0 -0
  198. package/dist/esm/types/config/testing.mjs +0 -0
  199. package/dist/esm/types/config/tools.mjs +0 -0
  200. package/dist/esm/types/index.mjs +1 -0
  201. package/dist/esm/types/plugin.mjs +0 -0
  202. package/dist/esm/types/utils.mjs +0 -0
  203. package/dist/esm/ultramodern/designSystem.mjs +73 -0
  204. package/dist/esm/utils/config.mjs +11 -0
  205. package/dist/esm/utils/createServer.mjs +12 -0
  206. package/dist/esm/utils/env.mjs +12 -0
  207. package/dist/esm/utils/generateWatchFiles.mjs +10 -0
  208. package/dist/esm/utils/getConfigFile.mjs +5 -0
  209. package/dist/esm/utils/getSelectedEntries.mjs +26 -0
  210. package/dist/esm/utils/initAppContext.mjs +27 -0
  211. package/dist/esm/utils/loadPlugins.mjs +45 -0
  212. package/dist/esm/utils/printInstructions.mjs +9 -0
  213. package/dist/esm/utils/register.mjs +81 -0
  214. package/dist/esm/utils/restart.mjs +18 -0
  215. package/dist/esm/utils/routes.mjs +15 -0
  216. package/dist/esm/utils/types.mjs +0 -0
  217. package/dist/esm-node/baseline.mjs +47 -0
  218. package/dist/esm-node/builder/builder-rspack/index.mjs +7 -0
  219. package/dist/esm-node/builder/generator/adapterCopy.mjs +36 -0
  220. package/dist/esm-node/builder/generator/createBuilderProviderConfig.mjs +67 -0
  221. package/dist/esm-node/builder/generator/createCopyPattern.mjs +31 -0
  222. package/dist/esm-node/builder/generator/getBuilderEnvironments.mjs +57 -0
  223. package/dist/esm-node/builder/generator/index.mjs +47 -0
  224. package/dist/esm-node/builder/index.mjs +8 -0
  225. package/dist/esm-node/builder/shared/builderPlugins/adapterBasic.mjs +93 -0
  226. package/dist/esm-node/builder/shared/builderPlugins/adapterHtml.mjs +56 -0
  227. package/dist/esm-node/builder/shared/builderPlugins/adapterPrecompress.mjs +69 -0
  228. package/dist/esm-node/builder/shared/builderPlugins/adapterSSR.mjs +119 -0
  229. package/dist/esm-node/builder/shared/builderPlugins/builderHooks.mjs +18 -0
  230. package/dist/esm-node/builder/shared/builderPlugins/index.mjs +6 -0
  231. package/dist/esm-node/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.mjs +38 -0
  232. package/dist/esm-node/builder/shared/bundlerPlugins/HtmlBottomTemplate.mjs +23 -0
  233. package/dist/esm-node/builder/shared/bundlerPlugins/RouterPlugin.mjs +158 -0
  234. package/dist/esm-node/builder/shared/bundlerPlugins/index.mjs +4 -0
  235. package/dist/esm-node/builder/shared/createCopyInfo.mjs +16 -0
  236. package/dist/esm-node/builder/shared/index.mjs +4 -0
  237. package/dist/esm-node/builder/shared/loaders/serverModuleLoader.mjs +6 -0
  238. package/dist/esm-node/builder/shared/types.mjs +1 -0
  239. package/dist/esm-node/commands/build.mjs +64 -0
  240. package/dist/esm-node/commands/deploy.mjs +11 -0
  241. package/dist/esm-node/commands/dev.mjs +78 -0
  242. package/dist/esm-node/commands/index.mjs +48 -0
  243. package/dist/esm-node/commands/info.mjs +77 -0
  244. package/dist/esm-node/commands/inspect.mjs +16 -0
  245. package/dist/esm-node/commands/runtime.mjs +117 -0
  246. package/dist/esm-node/commands/serve.mjs +49 -0
  247. package/dist/esm-node/compat/hooks.mjs +68 -0
  248. package/dist/esm-node/compat/index.mjs +29 -0
  249. package/dist/esm-node/compat/utils.mjs +96 -0
  250. package/dist/esm-node/config/default.mjs +92 -0
  251. package/dist/esm-node/config/index.mjs +3 -0
  252. package/dist/esm-node/config/initialize/index.mjs +8 -0
  253. package/dist/esm-node/config/initialize/inits.mjs +55 -0
  254. package/dist/esm-node/constants.mjs +4 -0
  255. package/dist/esm-node/defineConfig.mjs +3 -0
  256. package/dist/esm-node/esm/register-esm.mjs +12 -0
  257. package/dist/esm-node/esm/ts-paths-loader.mjs +37 -0
  258. package/dist/esm-node/exports/server.mjs +1 -0
  259. package/dist/esm-node/index.mjs +133 -0
  260. package/dist/esm-node/locale/en.mjs +46 -0
  261. package/dist/esm-node/locale/index.mjs +10 -0
  262. package/dist/esm-node/locale/zh.mjs +46 -0
  263. package/dist/esm-node/plugins/analyze/constants.mjs +9 -0
  264. package/dist/esm-node/plugins/analyze/getBundleEntry.mjs +54 -0
  265. package/dist/esm-node/plugins/analyze/getFileSystemEntry.mjs +67 -0
  266. package/dist/esm-node/plugins/analyze/getHtmlTemplate.mjs +98 -0
  267. package/dist/esm-node/plugins/analyze/getServerRoutes.mjs +131 -0
  268. package/dist/esm-node/plugins/analyze/index.mjs +204 -0
  269. package/dist/esm-node/plugins/analyze/isDefaultExportFunction.mjs +42 -0
  270. package/dist/esm-node/plugins/analyze/templates.mjs +23 -0
  271. package/dist/esm-node/plugins/analyze/utils.mjs +64 -0
  272. package/dist/esm-node/plugins/deploy/index.mjs +44 -0
  273. package/dist/esm-node/plugins/deploy/platforms/gh-pages.mjs +44 -0
  274. package/dist/esm-node/plugins/deploy/platforms/netlify.mjs +98 -0
  275. package/dist/esm-node/plugins/deploy/platforms/node.mjs +58 -0
  276. package/dist/esm-node/plugins/deploy/platforms/platform.mjs +1 -0
  277. package/dist/esm-node/plugins/deploy/platforms/templates/netlify-entry.cjs +57 -0
  278. package/dist/esm-node/plugins/deploy/platforms/templates/netlify-entry.mjs +59 -0
  279. package/dist/esm-node/plugins/deploy/platforms/templates/node-entry.cjs +44 -0
  280. package/dist/esm-node/plugins/deploy/platforms/templates/node-entry.mjs +46 -0
  281. package/dist/esm-node/plugins/deploy/platforms/templates/vercel-entry.cjs +57 -0
  282. package/dist/esm-node/plugins/deploy/platforms/templates/vercel-entry.mjs +58 -0
  283. package/dist/esm-node/plugins/deploy/platforms/vercel.mjs +117 -0
  284. package/dist/esm-node/plugins/deploy/types.mjs +1 -0
  285. package/dist/esm-node/plugins/deploy/utils/generator.mjs +49 -0
  286. package/dist/esm-node/plugins/deploy/utils/index.mjs +71 -0
  287. package/dist/esm-node/plugins/initialize/index.mjs +60 -0
  288. package/dist/esm-node/plugins/serverBuild.mjs +46 -0
  289. package/dist/esm-node/plugins/serverRuntime.mjs +16 -0
  290. package/dist/esm-node/presetUltramodern.mjs +5 -0
  291. package/dist/esm-node/rsbuild.mjs +48 -0
  292. package/dist/esm-node/rslib-runtime.mjs +19 -0
  293. package/dist/esm-node/run/index.mjs +62 -0
  294. package/dist/esm-node/types/config/deploy.mjs +1 -0
  295. package/dist/esm-node/types/config/dev.mjs +1 -0
  296. package/dist/esm-node/types/config/experiments.mjs +1 -0
  297. package/dist/esm-node/types/config/html.mjs +1 -0
  298. package/dist/esm-node/types/config/index.mjs +2 -0
  299. package/dist/esm-node/types/config/output.mjs +1 -0
  300. package/dist/esm-node/types/config/performance.mjs +1 -0
  301. package/dist/esm-node/types/config/resolve.mjs +1 -0
  302. package/dist/esm-node/types/config/security.mjs +1 -0
  303. package/dist/esm-node/types/config/source.mjs +1 -0
  304. package/dist/esm-node/types/config/testing.mjs +1 -0
  305. package/dist/esm-node/types/config/tools.mjs +1 -0
  306. package/dist/esm-node/types/index.mjs +2 -0
  307. package/dist/esm-node/types/plugin.mjs +1 -0
  308. package/dist/esm-node/types/utils.mjs +1 -0
  309. package/dist/esm-node/ultramodern/designSystem.mjs +74 -0
  310. package/dist/esm-node/utils/config.mjs +12 -0
  311. package/dist/esm-node/utils/createServer.mjs +13 -0
  312. package/dist/esm-node/utils/env.mjs +13 -0
  313. package/dist/esm-node/utils/generateWatchFiles.mjs +11 -0
  314. package/dist/esm-node/utils/getConfigFile.mjs +6 -0
  315. package/dist/esm-node/utils/getSelectedEntries.mjs +27 -0
  316. package/dist/esm-node/utils/initAppContext.mjs +28 -0
  317. package/dist/esm-node/utils/loadPlugins.mjs +46 -0
  318. package/dist/esm-node/utils/printInstructions.mjs +10 -0
  319. package/dist/esm-node/utils/register.mjs +83 -0
  320. package/dist/esm-node/utils/restart.mjs +19 -0
  321. package/dist/esm-node/utils/routes.mjs +16 -0
  322. package/dist/esm-node/utils/types.mjs +1 -0
  323. package/dist/types/baseline.d.ts +46 -0
  324. package/dist/types/builder/builder-rspack/index.d.ts +2 -0
  325. package/dist/types/builder/generator/adapterCopy.d.ts +3 -0
  326. package/dist/types/builder/generator/createBuilderProviderConfig.d.ts +3 -0
  327. package/dist/types/builder/generator/createCopyPattern.d.ts +16 -0
  328. package/dist/types/builder/generator/getBuilderEnvironments.d.ts +6 -0
  329. package/dist/types/builder/generator/index.d.ts +8 -0
  330. package/dist/types/builder/index.d.ts +3 -0
  331. package/dist/types/builder/shared/builderPlugins/adapterBasic.d.ts +3 -0
  332. package/dist/types/builder/shared/builderPlugins/adapterHtml.d.ts +3 -0
  333. package/dist/types/builder/shared/builderPlugins/adapterPrecompress.d.ts +3 -0
  334. package/dist/types/builder/shared/builderPlugins/adapterSSR.d.ts +3 -0
  335. package/dist/types/builder/shared/builderPlugins/builderHooks.d.ts +3 -0
  336. package/dist/types/builder/shared/builderPlugins/index.d.ts +5 -0
  337. package/dist/types/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.d.ts +7 -0
  338. package/dist/types/builder/shared/bundlerPlugins/HtmlBottomTemplate.d.ts +9 -0
  339. package/dist/types/builder/shared/bundlerPlugins/RouterPlugin.d.ts +32 -0
  340. package/dist/types/builder/shared/bundlerPlugins/index.d.ts +3 -0
  341. package/dist/types/builder/shared/createCopyInfo.d.ts +8 -0
  342. package/dist/types/builder/shared/index.d.ts +3 -0
  343. package/dist/types/builder/shared/loaders/serverModuleLoader.d.ts +3 -0
  344. package/dist/types/builder/shared/types.d.ts +6 -0
  345. package/dist/types/commands/build.d.ts +4 -0
  346. package/dist/types/commands/deploy.d.ts +3 -0
  347. package/dist/types/commands/dev.d.ts +9 -0
  348. package/dist/types/commands/index.d.ts +10 -0
  349. package/dist/types/commands/info.d.ts +18 -0
  350. package/dist/types/commands/inspect.d.ts +4 -0
  351. package/dist/types/commands/runtime.d.ts +11 -0
  352. package/dist/types/commands/serve.d.ts +8 -0
  353. package/dist/types/compat/hooks.d.ts +7 -0
  354. package/dist/types/compat/index.d.ts +2 -0
  355. package/dist/types/compat/utils.d.ts +13 -0
  356. package/dist/types/config/default.d.ts +3 -0
  357. package/dist/types/config/index.d.ts +2 -0
  358. package/dist/types/config/initialize/index.d.ts +3 -0
  359. package/dist/types/config/initialize/inits.d.ts +4 -0
  360. package/dist/types/constants.d.ts +2 -0
  361. package/dist/types/defineConfig.d.ts +11 -0
  362. package/dist/types/esm/register-esm.d.mts +11 -0
  363. package/dist/types/esm/ts-node-loader.d.mts +6 -0
  364. package/dist/types/esm/ts-paths-loader.d.mts +6 -0
  365. package/dist/types/exports/server.d.ts +1 -0
  366. package/dist/types/index.d.ts +17 -0
  367. package/dist/types/locale/en.d.ts +44 -0
  368. package/dist/types/locale/index.d.ts +90 -0
  369. package/dist/types/locale/zh.d.ts +44 -0
  370. package/dist/types/plugins/analyze/constants.d.ts +3 -0
  371. package/dist/types/plugins/analyze/getBundleEntry.d.ts +4 -0
  372. package/dist/types/plugins/analyze/getFileSystemEntry.d.ts +7 -0
  373. package/dist/types/plugins/analyze/getHtmlTemplate.d.ts +27 -0
  374. package/dist/types/plugins/analyze/getServerRoutes.d.ts +8 -0
  375. package/dist/types/plugins/analyze/index.d.ts +3 -0
  376. package/dist/types/plugins/analyze/isDefaultExportFunction.d.ts +1 -0
  377. package/dist/types/plugins/analyze/templates.d.ts +5 -0
  378. package/dist/types/plugins/analyze/utils.d.ts +10 -0
  379. package/dist/types/plugins/deploy/index.d.ts +3 -0
  380. package/dist/types/plugins/deploy/platforms/gh-pages.d.ts +2 -0
  381. package/dist/types/plugins/deploy/platforms/netlify.d.ts +2 -0
  382. package/dist/types/plugins/deploy/platforms/node.d.ts +2 -0
  383. package/dist/types/plugins/deploy/platforms/platform.d.ts +17 -0
  384. package/dist/types/plugins/deploy/platforms/templates/netlify-entry.d.cts +2 -0
  385. package/dist/types/plugins/deploy/platforms/templates/netlify-entry.d.mts +2 -0
  386. package/dist/types/plugins/deploy/platforms/templates/node-entry.d.cts +1 -0
  387. package/dist/types/plugins/deploy/platforms/templates/node-entry.d.mts +1 -0
  388. package/dist/types/plugins/deploy/platforms/templates/vercel-entry.d.cts +2 -0
  389. package/dist/types/plugins/deploy/platforms/templates/vercel-entry.d.mts +2 -0
  390. package/dist/types/plugins/deploy/platforms/vercel.d.ts +2 -0
  391. package/dist/types/plugins/deploy/types.d.ts +3 -0
  392. package/dist/types/plugins/deploy/utils/generator.d.ts +24 -0
  393. package/dist/types/plugins/deploy/utils/index.d.ts +16 -0
  394. package/dist/types/plugins/initialize/index.d.ts +3 -0
  395. package/dist/types/plugins/serverBuild.d.ts +3 -0
  396. package/dist/types/plugins/serverRuntime.d.ts +3 -0
  397. package/dist/types/presetUltramodern.d.ts +6 -0
  398. package/dist/types/rsbuild.d.ts +12 -0
  399. package/dist/types/run/index.d.ts +20 -0
  400. package/dist/types/types/config/deploy.d.ts +38 -0
  401. package/dist/types/types/config/dev.d.ts +55 -0
  402. package/dist/types/types/config/experiments.d.ts +3 -0
  403. package/dist/types/types/config/html.d.ts +3 -0
  404. package/dist/types/types/config/index.d.ts +48 -0
  405. package/dist/types/types/config/output.d.ts +61 -0
  406. package/dist/types/types/config/performance.d.ts +3 -0
  407. package/dist/types/types/config/resolve.d.ts +2 -0
  408. package/dist/types/types/config/security.d.ts +2 -0
  409. package/dist/types/types/config/source.d.ts +61 -0
  410. package/dist/types/types/config/testing.d.ts +8 -0
  411. package/dist/types/types/config/tools.d.ts +21 -0
  412. package/dist/types/types/index.d.ts +10 -0
  413. package/dist/types/types/plugin.d.ts +114 -0
  414. package/dist/types/types/utils.d.ts +1 -0
  415. package/dist/types/ultramodern/designSystem.d.ts +54 -0
  416. package/dist/types/utils/config.d.ts +2 -0
  417. package/dist/types/utils/createServer.d.ts +5 -0
  418. package/dist/types/utils/env.d.ts +2 -0
  419. package/dist/types/utils/generateWatchFiles.d.ts +2 -0
  420. package/dist/types/utils/getConfigFile.d.ts +1 -0
  421. package/dist/types/utils/getSelectedEntries.d.ts +5 -0
  422. package/dist/types/utils/initAppContext.d.ts +31 -0
  423. package/dist/types/utils/loadPlugins.d.ts +13 -0
  424. package/dist/types/utils/printInstructions.d.ts +3 -0
  425. package/dist/types/utils/register.d.ts +19 -0
  426. package/dist/types/utils/restart.d.ts +2 -0
  427. package/dist/types/utils/routes.d.ts +4 -0
  428. package/dist/types/utils/types.d.ts +49 -0
  429. package/lib/types.d.ts +252 -0
  430. package/package.json +138 -0
  431. package/rslib.config.mts +39 -0
  432. package/rstest.config.mts +20 -0
@@ -0,0 +1,23 @@
1
+ import "node:module";
2
+ class BottomTemplatePlugin {
3
+ apply(compiler) {
4
+ compiler.hooks.compilation.tap(this.name, (compilation)=>{
5
+ this.htmlPlugin.getCompilationHooks(compilation).beforeEmit.tap(this.name, (data)=>{
6
+ if (!data.plugin.options?.__internal__) return data;
7
+ if (this.bottomTemplateReg.test(data.html)) {
8
+ data.html = data.html.replace(this.bottomTemplateReg, '');
9
+ const { bottomTemplate } = data.plugin.options;
10
+ if (bottomTemplate) data.html = data.html.replace(this.bodyRegExp, (match)=>`\n${bottomTemplate}\n${match}`);
11
+ }
12
+ return data;
13
+ });
14
+ });
15
+ }
16
+ constructor(htmlPlugin){
17
+ this.bottomTemplateReg = /<!--<\?-\s*bottomTemplate\s*\?>-->/;
18
+ this.bodyRegExp = /(<\/\s*body\s*>)/i;
19
+ this.htmlPlugin = htmlPlugin;
20
+ this.name = 'bottom-template';
21
+ }
22
+ }
23
+ export { BottomTemplatePlugin };
@@ -0,0 +1,158 @@
1
+ import "node:module";
2
+ import { ROUTE_MANIFEST_FILE } from "@modern-js/utils";
3
+ import { merge, mergeWith } from "@modern-js/utils/lodash";
4
+ import { ROUTE_MANIFEST } from "@modern-js/utils/universal/constants";
5
+ import { createHash } from "crypto";
6
+ const PLUGIN_NAME = 'ModernjsRoutePlugin';
7
+ const generateContentHash = (content)=>createHash('md5').update(content).digest('hex').slice(0, 8);
8
+ class RouterPlugin {
9
+ isTargetNodeOrWebWorker(target) {
10
+ if ('node' === target || Array.isArray(target) && target.includes('node')) return true;
11
+ if ('webworker' === target || Array.isArray(target) && target.includes('webworker')) return true;
12
+ return false;
13
+ }
14
+ getEntryChunks(compilation, chunks) {
15
+ const entrypointsArray = Array.from(compilation.entrypoints.entries());
16
+ const entryChunkIds = entrypointsArray.map((entrypoint)=>entrypoint[0]);
17
+ const entryChunks = [
18
+ ...chunks
19
+ ].filter((chunk)=>chunk.names?.some((name)=>entryChunkIds.includes(name)));
20
+ return entryChunks;
21
+ }
22
+ getEntryChunkFiles(entryChunks) {
23
+ return entryChunks.map((chunk)=>[
24
+ ...chunk.files || []
25
+ ].find((fname)=>fname.includes('.js')));
26
+ }
27
+ apply(compiler) {
28
+ const { target } = compiler.options;
29
+ if (this.isTargetNodeOrWebWorker(target)) return;
30
+ const { rspack } = compiler;
31
+ const { Compilation, sources } = rspack;
32
+ const { RawSource } = sources;
33
+ const normalizePath = (path)=>{
34
+ if (!path.endsWith('/')) return `${path}/`;
35
+ return path;
36
+ };
37
+ const chunksToHtmlName = new Map();
38
+ const ROUTE_MANIFEST_HOLDER = "route-manifest";
39
+ const placeholder = `<!--<?- ${ROUTE_MANIFEST_HOLDER} ?>-->`;
40
+ compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation)=>{
41
+ this.HtmlBundlerPlugin.getCompilationHooks(compilation).beforeEmit.tapAsync('RouterManifestPlugin', (data, callback)=>{
42
+ const { outputName } = data;
43
+ const { chunks } = data.plugin.options;
44
+ chunksToHtmlName.set(chunks, outputName);
45
+ data.html = data.html.replace("<\/script>", `</script>${placeholder}`);
46
+ callback(null, data);
47
+ });
48
+ compilation.hooks.processAssets.tapPromise({
49
+ name: PLUGIN_NAME,
50
+ stage: Compilation.PROCESS_ASSETS_STAGE_REPORT
51
+ }, async ()=>{
52
+ const stats = compilation.getStats().toJson({
53
+ all: false,
54
+ publicPath: true,
55
+ assets: true,
56
+ chunkGroups: true,
57
+ chunks: true,
58
+ ids: true
59
+ });
60
+ const { publicPath, chunks = [], namedChunkGroups } = stats;
61
+ const routeAssets = {};
62
+ if (!namedChunkGroups) return;
63
+ const prevManifestAsset = compilation.getAsset(ROUTE_MANIFEST_FILE);
64
+ const prevManifestStr = prevManifestAsset ? prevManifestAsset.source.source().toString() : JSON.stringify({
65
+ routeAssets: {}
66
+ });
67
+ const prevManifest = JSON.parse(prevManifestStr);
68
+ const asyncEntryNames = [];
69
+ for (const [name, chunkGroup] of Object.entries(namedChunkGroups)){
70
+ if (name.startsWith('async-')) asyncEntryNames.push(name);
71
+ const assets = chunkGroup.assets.map((asset)=>{
72
+ const filename = asset.name;
73
+ return publicPath ? normalizePath(publicPath) + filename : filename;
74
+ });
75
+ const referenceCssAssets = assets.filter((asset)=>/\.css$/.test(asset));
76
+ routeAssets[name] = {
77
+ chunkIds: chunkGroup.chunks,
78
+ assets,
79
+ referenceCssAssets
80
+ };
81
+ if (prevManifest.routeAssets[name]) mergeWith(routeAssets[name], prevManifest.routeAssets[name], (obj, source)=>{
82
+ if (Array.isArray(obj)) return obj.concat(source);
83
+ return Object.assign(source, obj);
84
+ });
85
+ }
86
+ if (asyncEntryNames.length > 0) for (const asyncEntryName of asyncEntryNames){
87
+ const syncEntryName = asyncEntryName.replace('async-', '');
88
+ const syncEntry = routeAssets[syncEntryName];
89
+ const asyncEntry = routeAssets[asyncEntryName];
90
+ merge(syncEntry, asyncEntry);
91
+ }
92
+ const manifest = {
93
+ routeAssets
94
+ };
95
+ const entryNames = Array.from(compilation.entrypoints.keys());
96
+ let entryChunks = [];
97
+ entryChunks = this.getEntryChunks(compilation, chunks);
98
+ const entryChunkFiles = this.getEntryChunkFiles(entryChunks);
99
+ const entryChunkFileIds = entryChunks.map((chunk)=>chunk.id);
100
+ for(let i = 0; i < entryChunkFiles.length; i++){
101
+ const entryName = entryNames[i];
102
+ const file = entryChunkFiles[i];
103
+ const chunkNames = entryChunks[i].names;
104
+ const chunkId = entryChunkFileIds[i];
105
+ const asset = compilation.assets[file];
106
+ if (!asset || !chunkId) continue;
107
+ let relatedAssets = {};
108
+ if (entryChunkFiles.length > 1) Object.keys(routeAssets).forEach((routeId)=>{
109
+ const segments = routeId.split('_');
110
+ const chunkName = segments[0];
111
+ if (chunkNames?.includes(chunkName)) relatedAssets[routeId] = routeAssets[routeId];
112
+ });
113
+ else relatedAssets = routeAssets;
114
+ const manifest = {
115
+ routeAssets: relatedAssets
116
+ };
117
+ const injectedContent = `
118
+ ;(function(){
119
+ window.${ROUTE_MANIFEST} = ${JSON.stringify(manifest, (k, v)=>{
120
+ if (('assets' === k || 'referenceCssAssets' === k) && Array.isArray(v)) return v.map((item)=>item.replace(publicPath, ''));
121
+ return v;
122
+ })};
123
+ })();
124
+ `;
125
+ let htmlName;
126
+ for (const [chunks, name] of chunksToHtmlName.entries())if (Array.isArray(chunkNames) && Array.isArray(chunks) && chunkNames.every((value, index)=>value === chunks[index])) {
127
+ htmlName = name;
128
+ break;
129
+ }
130
+ const oldHtml = compilation.assets[htmlName];
131
+ const { enableInlineRouteManifests, disableFilenameHash, staticJsDir, scriptLoading, nonce } = this;
132
+ const nonceAttr = nonce ? `nonce="${nonce}"` : '';
133
+ if (oldHtml) if (enableInlineRouteManifests) compilation.updateAsset(htmlName, new RawSource(oldHtml.source().toString().replace(placeholder, `<script ${nonceAttr}>${injectedContent}</script>`)), void 0);
134
+ else {
135
+ const scriptPath = `${staticJsDir}/${ROUTE_MANIFEST_HOLDER}-${entryName}${disableFilenameHash ? '.js' : `.${generateContentHash(injectedContent)}.js`}`;
136
+ const scriptUrl = `${publicPath}${scriptPath}`;
137
+ const scriptLoadingAttr = 'defer' === scriptLoading ? scriptLoading : 'module' === scriptLoading ? 'type="module"' : '';
138
+ const script = `<script ${scriptLoadingAttr} ${nonceAttr} src="${scriptUrl}"></script>`;
139
+ compilation.updateAsset(htmlName, new RawSource(oldHtml.source().toString().replace(placeholder, script)), void 0);
140
+ compilation.emitAsset(scriptPath, new RawSource(injectedContent));
141
+ }
142
+ }
143
+ if (prevManifestAsset) compilation.updateAsset(ROUTE_MANIFEST_FILE, new RawSource(JSON.stringify(manifest, null, 2)), void 0);
144
+ else compilation.emitAsset(ROUTE_MANIFEST_FILE, new RawSource(JSON.stringify(manifest, null, 2)));
145
+ });
146
+ });
147
+ }
148
+ constructor({ staticJsDir = 'static/js', HtmlBundlerPlugin, enableInlineRouteManifests, disableFilenameHash = false, scriptLoading = 'defer', nonce }){
149
+ this.name = 'RouterPlugin';
150
+ this.HtmlBundlerPlugin = HtmlBundlerPlugin;
151
+ this.enableInlineRouteManifests = enableInlineRouteManifests;
152
+ this.staticJsDir = staticJsDir;
153
+ this.disableFilenameHash = disableFilenameHash;
154
+ this.scriptLoading = scriptLoading;
155
+ this.nonce = nonce;
156
+ }
157
+ }
158
+ export { RouterPlugin };
@@ -0,0 +1,4 @@
1
+ import "node:module";
2
+ export * from "./HtmlAsyncChunkPlugin.mjs";
3
+ export * from "./HtmlBottomTemplate.mjs";
4
+ export * from "./RouterPlugin.mjs";
@@ -0,0 +1,16 @@
1
+ import "node:module";
2
+ import { resolvePublicDirPaths } from "@modern-js/server-core";
3
+ import path from "path";
4
+ function createCopyInfo(appContext, config) {
5
+ const configDir = path.resolve(appContext.appDirectory, config.source.configDir || './config');
6
+ const uploadDir = path.posix.join(configDir.replace(/\\/g, '/'), 'upload');
7
+ const publicDir = path.posix.join(configDir.replace(/\\/g, '/'), 'public');
8
+ const customPublicDirPaths = resolvePublicDirPaths(config.server?.publicDir, appContext.appDirectory);
9
+ return {
10
+ configDir,
11
+ uploadDir,
12
+ publicDir,
13
+ customPublicDirs: customPublicDirPaths
14
+ };
15
+ }
16
+ export { createCopyInfo };
@@ -0,0 +1,4 @@
1
+ import "node:module";
2
+ export * from "./builderPlugins/index.mjs";
3
+ export * from "./createCopyInfo.mjs";
4
+ export * from "./types.mjs";
@@ -0,0 +1,6 @@
1
+ import "node:module";
2
+ function loader() {
3
+ return "module.exports = {}";
4
+ }
5
+ const serverModuleLoader = loader;
6
+ export default serverModuleLoader;
@@ -0,0 +1 @@
1
+ import "node:module";
@@ -0,0 +1,64 @@
1
+ import "node:module";
2
+ import node_path from "node:path";
3
+ import { fs, logger } from "@modern-js/utils";
4
+ import { loadServerPlugins } from "../utils/loadPlugins.mjs";
5
+ import { setupTsRuntime } from "../utils/register.mjs";
6
+ import { generateRoutes } from "../utils/routes.mjs";
7
+ async function copyEnvFiles(appDirectory, distDirectory) {
8
+ try {
9
+ const files = await fs.readdir(appDirectory);
10
+ const envFileRegex = /^\.env(\.[a-zA-Z0-9_-]+)*$/;
11
+ const envFiles = files.filter((file)=>envFileRegex.test(file));
12
+ if (0 === envFiles.length) return void logger.debug('No .env files found to copy');
13
+ const copyPromises = envFiles.map(async (envFile)=>{
14
+ const sourcePath = node_path.resolve(appDirectory, envFile);
15
+ const targetPath = node_path.resolve(distDirectory, envFile);
16
+ try {
17
+ const stat = await fs.stat(sourcePath);
18
+ if (stat.isDirectory()) return;
19
+ await fs.copy(sourcePath, targetPath);
20
+ } catch (error) {
21
+ logger.warn(`Failed to copy ${envFile}:`, error);
22
+ }
23
+ });
24
+ await Promise.all(copyPromises);
25
+ } catch (error) {
26
+ logger.warn('Failed to copy .env files:', error);
27
+ }
28
+ }
29
+ const build = async (api, options)=>{
30
+ if (options?.analyze) process.env.BUNDLE_ANALYZE = 'true';
31
+ const resolvedConfig = api.getNormalizedConfig();
32
+ const appContext = api.getAppContext();
33
+ const hooks = api.getHooks();
34
+ const combinedAlias = [].concat(resolvedConfig?.resolve?.alias ?? []).concat(resolvedConfig?.source?.alias ?? []);
35
+ await loadServerPlugins(api, appContext.appDirectory, appContext.metaName);
36
+ await setupTsRuntime(appContext.appDirectory, appContext.distDirectory, combinedAlias, {
37
+ moduleType: appContext.moduleType,
38
+ tsconfigPath: resolvedConfig?.server?.tsconfigPath
39
+ });
40
+ const { apiOnly } = appContext;
41
+ if (apiOnly) {
42
+ await hooks.onBeforeBuild.call({
43
+ environments: {},
44
+ bundlerConfigs: void 0,
45
+ isFirstCompile: false,
46
+ isWatch: false
47
+ });
48
+ await generateRoutes(appContext);
49
+ await hooks.onAfterBuild.call({
50
+ environments: {},
51
+ stats: void 0,
52
+ isFirstCompile: false,
53
+ isWatch: false
54
+ });
55
+ return;
56
+ }
57
+ logger.info('Starting production build...');
58
+ if (!appContext.builder) throw new Error('Expect the Builder to have been initialized, But the appContext.builder received `undefined`');
59
+ await appContext.builder.onAfterBuild(async ()=>copyEnvFiles(appContext.appDirectory, appContext.distDirectory));
60
+ await appContext.builder.build({
61
+ watch: options?.watch
62
+ });
63
+ };
64
+ export { build };
@@ -0,0 +1,11 @@
1
+ import "node:module";
2
+ import { getServerPlugins } from "../utils/loadPlugins.mjs";
3
+ const deploy = async (api, options)=>{
4
+ const hooks = api.getHooks();
5
+ const { metaName } = api.getAppContext();
6
+ await getServerPlugins(api, metaName);
7
+ await hooks.onBeforeDeploy.call(options);
8
+ await hooks.deploy.call();
9
+ await hooks.onAfterDeploy.call(options);
10
+ };
11
+ export { deploy };
@@ -0,0 +1,78 @@
1
+ import "node:module";
2
+ import node_path from "node:path";
3
+ import { applyPlugins } from "@modern-js/prod-server";
4
+ import { createDevServer } from "@modern-js/server";
5
+ import { DEFAULT_DEV_HOST, SERVER_DIR, getMeta, logger } from "@modern-js/utils";
6
+ import { setServer } from "../utils/createServer.mjs";
7
+ import { loadServerPlugins } from "../utils/loadPlugins.mjs";
8
+ import { printInstructions } from "../utils/printInstructions.mjs";
9
+ import { setupTsRuntime } from "../utils/register.mjs";
10
+ import { generateRoutes } from "../utils/routes.mjs";
11
+ const dev = async (api, options, devServerOptions)=>{
12
+ if (options.analyze) process.env.BUNDLE_ANALYZE = 'true';
13
+ const normalizedConfig = api.getNormalizedConfig();
14
+ const appContext = api.getAppContext();
15
+ const hooks = api.getHooks();
16
+ const combinedAlias = [].concat(normalizedConfig?.resolve?.alias ?? []).concat(normalizedConfig?.source?.alias ?? []);
17
+ await setupTsRuntime(appContext.appDirectory, appContext.distDirectory, combinedAlias, {
18
+ moduleType: appContext.moduleType,
19
+ tsconfigPath: normalizedConfig?.server?.tsconfigPath
20
+ });
21
+ const { appDirectory, port, apiOnly, metaName, serverRoutes } = appContext;
22
+ const meta = getMeta(metaName);
23
+ const serverConfigPath = node_path.resolve(appDirectory, SERVER_DIR, `${meta}.server`);
24
+ await hooks.onBeforeDev.call();
25
+ if (!appContext.builder && !apiOnly) throw new Error('Expect the Builder to have been initialized, But the appContext.builder received `undefined`');
26
+ await generateRoutes(appContext);
27
+ const pluginInstances = await loadServerPlugins(api, appDirectory, metaName);
28
+ const serverOptions = {
29
+ metaName,
30
+ dev: {
31
+ https: normalizedConfig.dev.https,
32
+ setupMiddlewares: normalizedConfig.dev.setupMiddlewares
33
+ },
34
+ appContext: {
35
+ appDirectory,
36
+ internalDirectory: appContext.internalDirectory,
37
+ apiDirectory: appContext.apiDirectory,
38
+ lambdaDirectory: appContext.lambdaDirectory,
39
+ sharedDirectory: appContext.sharedDirectory,
40
+ bffRuntimeFramework: appContext.bffRuntimeFramework
41
+ },
42
+ serverConfigPath,
43
+ routes: serverRoutes,
44
+ pwd: appDirectory,
45
+ config: normalizedConfig,
46
+ plugins: pluginInstances,
47
+ ...devServerOptions
48
+ };
49
+ const host = normalizedConfig.dev?.host || DEFAULT_DEV_HOST;
50
+ if (apiOnly) {
51
+ const { server } = await createDevServer({
52
+ ...serverOptions,
53
+ runCompile: false
54
+ }, devServerOptions?.applyPlugins || applyPlugins);
55
+ server.listen({
56
+ port,
57
+ host
58
+ }, ()=>{
59
+ printInstructions(hooks, appContext, normalizedConfig);
60
+ });
61
+ setServer(server);
62
+ } else {
63
+ const { server, afterListen } = await createDevServer({
64
+ ...serverOptions,
65
+ builder: appContext.builder
66
+ }, devServerOptions?.applyPlugins || applyPlugins);
67
+ server.listen({
68
+ port,
69
+ host
70
+ }, async (err)=>{
71
+ if (err) logger.error('Occur error %s, when start dev server', err);
72
+ logger.debug('listen dev server done');
73
+ await afterListen();
74
+ });
75
+ setServer(server);
76
+ }
77
+ };
78
+ export { dev };
@@ -0,0 +1,48 @@
1
+ import "node:module";
2
+ import { i18n, localeKeys } from "../locale/index.mjs";
3
+ import { runtimeCommand } from "./runtime.mjs";
4
+ const devCommand = async (program, api)=>{
5
+ program.command('dev').alias('start').usage('[options]').description(i18n.t(localeKeys.command.dev.describe)).option('-c --config <config>', i18n.t(localeKeys.command.shared.config)).option('-e --entry [entry...]', i18n.t(localeKeys.command.dev.entry)).option('--analyze', i18n.t(localeKeys.command.shared.analyze)).option('--api-only', i18n.t(localeKeys.command.dev.apiOnly)).option('--web-only', i18n.t(localeKeys.command.dev.webOnly)).action(async (options)=>{
6
+ const { dev } = await import("./dev.mjs");
7
+ await dev(api, options);
8
+ });
9
+ };
10
+ const buildCommand = async (program, api)=>{
11
+ program.command('build').usage('[options]').description(i18n.t(localeKeys.command.build.describe)).option('-c --config <config>', i18n.t(localeKeys.command.shared.config)).option('--analyze', i18n.t(localeKeys.command.shared.analyze)).option('-w --watch', i18n.t(localeKeys.command.build.watch)).action(async (options)=>{
12
+ const { build } = await import("./build.mjs");
13
+ await build(api, options);
14
+ });
15
+ };
16
+ const serverCommand = (program, api)=>{
17
+ program.command('serve').usage('[options]').description(i18n.t(localeKeys.command.serve.describe)).option('--api-only', i18n.t(localeKeys.command.dev.apiOnly)).option('-c --config <config>', i18n.t(localeKeys.command.shared.config)).action(async ()=>{
18
+ const { serve } = await import("./serve.mjs");
19
+ await serve(api);
20
+ });
21
+ };
22
+ const deployCommand = (program, api)=>{
23
+ program.command('deploy').usage('[options]').option('-c --config <config>', i18n.t(localeKeys.command.shared.config)).option('-s --skip-build', i18n.t(localeKeys.command.shared.skipBuild)).description(i18n.t(localeKeys.command.deploy.describe)).action(async (options)=>{
24
+ if (!options.skipBuild) {
25
+ const { build } = await import("./build.mjs");
26
+ await build(api);
27
+ }
28
+ const { deploy } = await import("./deploy.mjs");
29
+ await deploy(api, options);
30
+ process.exit(0);
31
+ });
32
+ };
33
+ const inspectCommand = (program, api)=>{
34
+ program.command('inspect').description('inspect the internal configs').option("--env <env>", i18n.t(localeKeys.command.inspect.env), 'development').option('--output <output>', i18n.t(localeKeys.command.inspect.output), './').option('--verbose', i18n.t(localeKeys.command.inspect.verbose)).option('-c --config <config>', i18n.t(localeKeys.command.shared.config)).action(async (options)=>{
35
+ const { inspect } = await import("./inspect.mjs");
36
+ inspect(api, options);
37
+ });
38
+ };
39
+ const infoCommand = (program, api)=>{
40
+ program.command('info').usage('[options]').description(i18n.t(localeKeys.command.info.describe)).option('-c --config <config>', i18n.t(localeKeys.command.shared.config)).option('--json', 'output as JSON format for machine reading').action(async (options)=>{
41
+ const { info } = await import("./info.mjs");
42
+ await info(api, options);
43
+ });
44
+ };
45
+ const runtimeOperationsCommand = async (program, api)=>{
46
+ await runtimeCommand(program, api);
47
+ };
48
+ export { buildCommand, deployCommand, devCommand, infoCommand, inspectCommand, runtimeOperationsCommand, serverCommand };
@@ -0,0 +1,77 @@
1
+ import "node:module";
2
+ import { getEntryOptions, isApiOnly } from "@modern-js/utils";
3
+ import { isMainEntry } from "../utils/routes.mjs";
4
+ const info = async (api, options = {})=>{
5
+ const normalizedConfig = api.getNormalizedConfig();
6
+ const appContext = api.getAppContext();
7
+ const hooks = api.getHooks();
8
+ const apiOnly = await isApiOnly(appContext.appDirectory, normalizedConfig.source?.entriesDir, appContext.apiDirectory);
9
+ if (apiOnly) {
10
+ const projectInfo = {
11
+ entries: [],
12
+ apiOnly: true
13
+ };
14
+ printProjectInfo(projectInfo, options.json);
15
+ return;
16
+ }
17
+ const [{ getBundleEntry }] = await Promise.all([
18
+ import("../plugins/analyze/getBundleEntry.mjs")
19
+ ]);
20
+ const { entrypoints } = await hooks.modifyEntrypoints.call({
21
+ entrypoints: await getBundleEntry(hooks, appContext, normalizedConfig)
22
+ });
23
+ const { source: { mainEntryName }, server: { ssr, ssrByEntries }, output: { ssg, ssgByEntries } } = normalizedConfig;
24
+ const { packageName } = appContext;
25
+ const entries = entrypoints.map((entrypoint)=>{
26
+ const { entryName, entry, isAutoMount, isCustomSourceEntry, customEntry } = entrypoint;
27
+ const isMain = isMainEntry(entryName, mainEntryName);
28
+ const ssrOptions = getEntryOptions(entryName, isMain, ssr, ssrByEntries, packageName);
29
+ const ssgOptions = getEntryOptions(entryName, isMain, ssg, ssgByEntries, packageName);
30
+ let ssrMode = false;
31
+ if (ssrOptions) {
32
+ if ('boolean' == typeof ssrOptions) ssrMode = 'stream';
33
+ else if ('object' == typeof ssrOptions) ssrMode = 'string' === ssrOptions.mode ? 'string' : 'stream';
34
+ }
35
+ return {
36
+ entryName,
37
+ isMainEntry: isMain,
38
+ entry,
39
+ isAutoMount: isAutoMount ?? true,
40
+ isCustomSourceEntry: isCustomSourceEntry ?? false,
41
+ customEntry: customEntry ?? false,
42
+ ssr: ssrMode,
43
+ ssg: Boolean(ssgOptions)
44
+ };
45
+ });
46
+ const projectInfo = {
47
+ entries,
48
+ apiOnly: false
49
+ };
50
+ printProjectInfo(projectInfo, options.json);
51
+ };
52
+ function printProjectInfo(projectInfo, jsonOnly) {
53
+ if (jsonOnly) return void console.log(JSON.stringify(projectInfo, null, 2));
54
+ console.log('');
55
+ console.log('===== Modern.js Project Info =====');
56
+ console.log('');
57
+ console.log(JSON.stringify(projectInfo, null, 2));
58
+ console.log('');
59
+ console.log('===== Entry Details =====');
60
+ console.log('');
61
+ if (projectInfo.apiOnly) return void console.log('This is an API-only project (no page entries).');
62
+ if (0 === projectInfo.entries.length) return void console.log('No entries found.');
63
+ for (const entry of projectInfo.entries){
64
+ console.log(`Entry: ${entry.entryName}`);
65
+ console.log(` - Path: ${entry.entry}`);
66
+ console.log(` - Main Entry: ${entry.isMainEntry}`);
67
+ console.log(` - Auto Mount: ${entry.isAutoMount}`);
68
+ console.log(` - Custom Entry: ${entry.customEntry}`);
69
+ console.log(` - Custom Source Entry: ${entry.isCustomSourceEntry}`);
70
+ console.log(" - Rendering Mode:");
71
+ if (entry.ssg) console.log(" - SSG: enabled");
72
+ else if (entry.ssr) console.log(` - SSR: ${entry.ssr} mode`);
73
+ else console.log(" - CSR: enabled (default)");
74
+ console.log('');
75
+ }
76
+ }
77
+ export { info };
@@ -0,0 +1,16 @@
1
+ import "node:module";
2
+ const inspect = async (api, options)=>{
3
+ const appContext = api.getAppContext();
4
+ if (!appContext.builder) throw new Error('Expect the Builder to have been initialized, But the appContext.builder received `undefined`');
5
+ const metaName = 'modern-js' === appContext.metaName ? 'modern.js' : appContext.metaName;
6
+ return appContext.builder.inspectConfig({
7
+ mode: options.env,
8
+ verbose: options.verbose,
9
+ outputPath: options.output,
10
+ writeToDisk: true,
11
+ extraConfigs: {
12
+ [metaName]: api.getNormalizedConfig()
13
+ }
14
+ });
15
+ };
16
+ export { inspect };
@@ -0,0 +1,117 @@
1
+ import "node:module";
2
+ const DEFAULT_RUNTIME_HOST = 'http://127.0.0.1:8080';
3
+ const DEFAULT_RUNTIME_STATUS_PATH = '/_modern/runtime/status';
4
+ const DEFAULT_RUNTIME_FALLBACK_SIGNAL_PATH = '/_modern/contract-gates/runtime-fallback';
5
+ const DEFAULT_RUNTIME_TOKEN_HEADER = 'x-modernjs-runtime-signal-token';
6
+ const DEFAULT_TIMEOUT_MS = 5000;
7
+ const resolveRuntimeEndpoint = (input, defaultPath)=>{
8
+ const rawInput = input?.trim();
9
+ if (!rawInput) return `${DEFAULT_RUNTIME_HOST}${defaultPath}`;
10
+ if (rawInput.startsWith('http://') || rawInput.startsWith('https://')) return rawInput;
11
+ const normalized = rawInput.startsWith('/') ? rawInput : `/${rawInput}`;
12
+ return `${DEFAULT_RUNTIME_HOST}${normalized}`;
13
+ };
14
+ const resolveToken = ({ token, tokenEnv })=>{
15
+ if ('string' == typeof token && token.trim().length > 0) return token.trim();
16
+ if ('string' == typeof tokenEnv && tokenEnv.trim().length > 0) {
17
+ const value = process.env[tokenEnv.trim()];
18
+ if ('string' == typeof value && value.trim().length > 0) return value.trim();
19
+ }
20
+ };
21
+ const parseTimeoutMs = (value)=>{
22
+ if ('string' != typeof value || 0 === value.trim().length) return DEFAULT_TIMEOUT_MS;
23
+ const parsed = Number.parseInt(value, 10);
24
+ if (!Number.isFinite(parsed) || parsed <= 0) return DEFAULT_TIMEOUT_MS;
25
+ return parsed;
26
+ };
27
+ const parseMetadata = (metadata)=>{
28
+ if ('string' != typeof metadata || 0 === metadata.trim().length) return;
29
+ const parsed = JSON.parse(metadata);
30
+ if (!parsed || 'object' != typeof parsed || Array.isArray(parsed)) throw new Error('metadata must be a JSON object');
31
+ return parsed;
32
+ };
33
+ const fetchWithTimeout = async (url, init, timeoutMs)=>{
34
+ const controller = new AbortController();
35
+ const timeout = setTimeout(()=>{
36
+ controller.abort();
37
+ }, timeoutMs);
38
+ try {
39
+ return await fetch(url, {
40
+ ...init,
41
+ signal: controller.signal
42
+ });
43
+ } finally{
44
+ clearTimeout(timeout);
45
+ }
46
+ };
47
+ const parseResponseBody = async (response)=>{
48
+ const text = await response.text();
49
+ if (!text) return {};
50
+ try {
51
+ return JSON.parse(text);
52
+ } catch (_error) {
53
+ return {
54
+ raw: text
55
+ };
56
+ }
57
+ };
58
+ const printOutput = (payload, jsonOnly)=>{
59
+ if (jsonOnly) return void console.log(JSON.stringify(payload, null, 2));
60
+ console.log(JSON.stringify(payload, null, 2));
61
+ };
62
+ const createRuntimeFallbackSignalPayload = (options)=>{
63
+ const payload = {
64
+ appName: options.app,
65
+ reason: options.reason || 'runtime_fallback',
66
+ phase: options.phase || 'load'
67
+ };
68
+ if (options.entry) payload.entry = options.entry;
69
+ if (options.runtimeDigest) payload.runtimeDigest = options.runtimeDigest;
70
+ const metadata = parseMetadata(options.metadata);
71
+ if (metadata) payload.metadata = metadata;
72
+ return payload;
73
+ };
74
+ const runtimeCommand = async (program, _api)=>{
75
+ const runtime = program.command('runtime').description('runtime operations');
76
+ runtime.command('status').description('read runtime status snapshot').option('--endpoint <endpoint>', 'runtime status endpoint URL or path').option('--token <token>', 'runtime status auth token').option('--token-env <name>', 'environment variable name that stores runtime status auth token', 'MODERN_RUNTIME_SIGNAL_TOKEN').option('--header-name <name>', 'auth header name', DEFAULT_RUNTIME_TOKEN_HEADER).option('--timeout <ms>', 'request timeout in milliseconds', '5000').option('--json', 'output as JSON format for machine reading').action(async (options)=>{
77
+ const endpoint = resolveRuntimeEndpoint(options.endpoint, DEFAULT_RUNTIME_STATUS_PATH);
78
+ const timeoutMs = parseTimeoutMs(options.timeout);
79
+ const token = resolveToken({
80
+ token: options.token,
81
+ tokenEnv: options.tokenEnv
82
+ });
83
+ const headerName = options.headerName?.trim() || DEFAULT_RUNTIME_TOKEN_HEADER;
84
+ const headers = new Headers();
85
+ if (token) headers.set(headerName, token);
86
+ const response = await fetchWithTimeout(endpoint, {
87
+ method: 'GET',
88
+ headers
89
+ }, timeoutMs);
90
+ const payload = await parseResponseBody(response);
91
+ if (!response.ok) throw new Error(`runtime status request failed with ${response.status}: ${JSON.stringify(payload)}`);
92
+ printOutput(payload, options.json);
93
+ });
94
+ runtime.command('fallback-signal').description('emit runtime fallback signal for canary gate mutation').requiredOption('--app <appName>', 'remote app name').option('--endpoint <endpoint>', 'runtime fallback signal endpoint URL or path').option('--reason <reason>', 'fallback reason', 'runtime_fallback').option('--phase <phase>', 'fallback phase', 'load').option('--entry <entry>', 'remote entry URL').option('--runtime-digest <digest>', 'runtime digest value').option('--metadata <json>', 'metadata JSON object string').option('--token <token>', 'runtime signal auth token').option('--token-env <name>', 'environment variable name that stores runtime signal auth token', 'MODERN_RUNTIME_SIGNAL_TOKEN').option('--header-name <name>', 'auth header name', DEFAULT_RUNTIME_TOKEN_HEADER).option('--timeout <ms>', 'request timeout in milliseconds', '5000').option('--json', 'output as JSON format for machine reading').action(async (options)=>{
95
+ const endpoint = resolveRuntimeEndpoint(options.endpoint, DEFAULT_RUNTIME_FALLBACK_SIGNAL_PATH);
96
+ const timeoutMs = parseTimeoutMs(options.timeout);
97
+ const token = resolveToken({
98
+ token: options.token,
99
+ tokenEnv: options.tokenEnv
100
+ });
101
+ const headerName = options.headerName?.trim() || DEFAULT_RUNTIME_TOKEN_HEADER;
102
+ const payload = createRuntimeFallbackSignalPayload(options);
103
+ const headers = new Headers({
104
+ 'content-type': 'application/json'
105
+ });
106
+ if (token) headers.set(headerName, token);
107
+ const response = await fetchWithTimeout(endpoint, {
108
+ method: 'POST',
109
+ headers,
110
+ body: JSON.stringify(payload)
111
+ }, timeoutMs);
112
+ const responsePayload = await parseResponseBody(response);
113
+ if (!response.ok) throw new Error(`runtime fallback signal request failed with ${response.status}: ${JSON.stringify(responsePayload)}`);
114
+ printOutput(responsePayload, options.json);
115
+ });
116
+ };
117
+ export { createRuntimeFallbackSignalPayload, resolveRuntimeEndpoint, resolveToken, runtimeCommand };