@bleedingdev/modern-js-app-tools 3.5.0-ultramodern.98 → 3.8.1-ultramodern.1

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 (334) hide show
  1. package/bin/modern-bundle-docs.js +7 -0
  2. package/dist/cjs/builder/generator/createBuilderProviderConfig.js +5 -1
  3. package/dist/cjs/builder/generator/getBuilderEnvironments.js +80 -11
  4. package/dist/cjs/bundleDocs.js +114 -0
  5. package/dist/cjs/commands/build.js +2 -1
  6. package/dist/cjs/commands/deploy.js +4 -2
  7. package/dist/cjs/commands/index.js +0 -4
  8. package/dist/cjs/config/default.js +2 -0
  9. package/dist/cjs/index.js +56 -15
  10. package/dist/cjs/plugins/analyze/index.js +2 -2
  11. package/dist/cjs/plugins/analyze/utils.js +3 -2
  12. package/dist/cjs/plugins/deploy/platforms/cloudflare-output-verifier/index.js +1 -1
  13. package/dist/cjs/plugins/deploy/platforms/cloudflare-output-verifier/worker-bundles.js +94 -18
  14. package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-entry.001-bootstrap-security.mjs +1 -0
  15. package/dist/cjs/plugins/deploy/platforms/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +14 -0
  16. package/dist/cjs/plugins/initialize/index.js +4 -3
  17. package/dist/cjs/plugins/serverBuild.js +3 -2
  18. package/dist/cjs/ultramodern-release-envelope/framework-output.js +109 -57
  19. package/dist/esm/builder/generator/createBuilderProviderConfig.mjs +5 -1
  20. package/dist/esm/builder/generator/getBuilderEnvironments.mjs +70 -10
  21. package/dist/esm/bundleDocs.mjs +62 -0
  22. package/dist/esm/commands/build.mjs +2 -1
  23. package/dist/esm/commands/deploy.mjs +4 -2
  24. package/dist/esm/commands/index.mjs +0 -4
  25. package/dist/esm/config/default.mjs +2 -0
  26. package/dist/esm/index.mjs +15 -1
  27. package/dist/esm/plugins/analyze/index.mjs +2 -2
  28. package/dist/esm/plugins/analyze/utils.mjs +3 -2
  29. package/dist/esm/plugins/deploy/platforms/cloudflare-output-verifier/index.mjs +1 -1
  30. package/dist/esm/plugins/deploy/platforms/cloudflare-output-verifier/worker-bundles.mjs +93 -18
  31. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-entry.001-bootstrap-security.mjs +1 -0
  32. package/dist/esm/plugins/deploy/platforms/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +14 -0
  33. package/dist/esm/plugins/initialize/index.mjs +4 -3
  34. package/dist/esm/plugins/serverBuild.mjs +3 -2
  35. package/dist/esm/ultramodern-release-envelope/framework-output.mjs +107 -58
  36. package/dist/esm-node/builder/generator/createBuilderProviderConfig.mjs +5 -1
  37. package/dist/esm-node/builder/generator/getBuilderEnvironments.mjs +70 -10
  38. package/dist/esm-node/bundleDocs.mjs +63 -0
  39. package/dist/esm-node/commands/build.mjs +2 -1
  40. package/dist/esm-node/commands/deploy.mjs +4 -2
  41. package/dist/esm-node/commands/index.mjs +0 -4
  42. package/dist/esm-node/config/default.mjs +2 -0
  43. package/dist/esm-node/index.mjs +15 -1
  44. package/dist/esm-node/plugins/analyze/index.mjs +2 -2
  45. package/dist/esm-node/plugins/analyze/utils.mjs +3 -2
  46. package/dist/esm-node/plugins/deploy/platforms/cloudflare-output-verifier/index.mjs +1 -1
  47. package/dist/esm-node/plugins/deploy/platforms/cloudflare-output-verifier/worker-bundles.mjs +93 -18
  48. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-entry.001-bootstrap-security.mjs +1 -0
  49. package/dist/esm-node/plugins/deploy/platforms/templates/cloudflare-worker-mf-ssr-runtime-plugin.mjs +14 -0
  50. package/dist/esm-node/plugins/initialize/index.mjs +4 -3
  51. package/dist/esm-node/plugins/serverBuild.mjs +3 -2
  52. package/dist/esm-node/ultramodern-release-envelope/framework-output.mjs +107 -58
  53. package/dist/types/builder/generator/getBuilderEnvironments.d.ts +29 -0
  54. package/dist/types/bundleDocs.d.ts +20 -0
  55. package/dist/types/commands/deploy.d.ts +2 -1
  56. package/dist/types/index.d.ts +4 -1
  57. package/dist/types/plugins/analyze/utils.d.ts +1 -1
  58. package/dist/types/plugins/deploy/platforms/cloudflare-output-verifier/worker-bundles.d.ts +1 -1
  59. package/dist/types/plugins/deploy/platforms/templates/cloudflare-entry.001-bootstrap-security.d.mts +1 -1
  60. package/dist/types/plugins/deploy/platforms/templates/cloudflare-worker-mf-ssr-runtime-plugin.d.mts +13 -0
  61. package/dist/types/types/config/dev.d.ts +6 -0
  62. package/dist/types/ultramodern-release-envelope/framework-output.d.ts +1 -0
  63. package/docs/apis/app/commands.md +231 -0
  64. package/docs/apis/app/hooks/api/lambda.md +9 -0
  65. package/docs/apis/app/hooks/config/favicon.md +24 -0
  66. package/docs/apis/app/hooks/config/html.md +5 -0
  67. package/docs/apis/app/hooks/config/icon.md +24 -0
  68. package/docs/apis/app/hooks/config/mock.md +6 -0
  69. package/docs/apis/app/hooks/config/public.md +26 -0
  70. package/docs/apis/app/hooks/config/upload.md +50 -0
  71. package/docs/apis/app/hooks/modern-config.md +5 -0
  72. package/docs/apis/app/hooks/server/server.md +5 -0
  73. package/docs/apis/app/hooks/shared.md +3 -0
  74. package/docs/apis/app/hooks/src/app.md +30 -0
  75. package/docs/apis/app/hooks/src/entry.md +34 -0
  76. package/docs/apis/app/hooks/src/entry.server.md +51 -0
  77. package/docs/apis/app/hooks/src/modern.runtime.md +5 -0
  78. package/docs/apis/app/hooks/src/routes.md +86 -0
  79. package/docs/apis/app/hooks/src/server.md +3 -0
  80. package/docs/apis/app/runtime/bff/use-backend-context.md +27 -0
  81. package/docs/apis/app/runtime/core/create-root.md +19 -0
  82. package/docs/apis/app/runtime/core/render.md +39 -0
  83. package/docs/apis/app/runtime/core/runtime-context.md +156 -0
  84. package/docs/apis/app/runtime/router/router.md +283 -0
  85. package/docs/apis/app/runtime/ssr/no-ssr.md +35 -0
  86. package/docs/apis/app/runtime/ssr/renderStreaming.md +67 -0
  87. package/docs/apis/app/runtime/ssr/renderString.md +60 -0
  88. package/docs/apis/app/runtime/ssr/requestHandler.md +44 -0
  89. package/docs/apis/app/runtime/utility/css-in-js.md +40 -0
  90. package/docs/apis/app/runtime/utility/head.md +35 -0
  91. package/docs/apis/app/runtime/utility/loadable.md +82 -0
  92. package/docs/community/blog/2022-0708-updates.md +91 -0
  93. package/docs/community/blog/2022-0910-updates.md +76 -0
  94. package/docs/community/blog/overview.md +63 -0
  95. package/docs/community/blog/v2-release-note.md +238 -0
  96. package/docs/community/blog/v3-release-note.md +622 -0
  97. package/docs/community/contributing-guide.md +252 -0
  98. package/docs/community/releases.md +23 -0
  99. package/docs/community/showcase.md +24 -0
  100. package/docs/community/team.md +14 -0
  101. package/docs/configure/app/bff/cross-project.md +20 -0
  102. package/docs/configure/app/bff/effect.md +313 -0
  103. package/docs/configure/app/bff/prefix.md +29 -0
  104. package/docs/configure/app/bff/runtime-framework.md +26 -0
  105. package/docs/configure/app/builder-plugins.md +66 -0
  106. package/docs/configure/app/dev/asset-prefix.md +13 -0
  107. package/docs/configure/app/dev/before-start-url.md +17 -0
  108. package/docs/configure/app/dev/client.md +41 -0
  109. package/docs/configure/app/dev/hmr.md +10 -0
  110. package/docs/configure/app/dev/host.md +18 -0
  111. package/docs/configure/app/dev/https.md +77 -0
  112. package/docs/configure/app/dev/lazy-compilation.md +39 -0
  113. package/docs/configure/app/dev/live-reload.md +10 -0
  114. package/docs/configure/app/dev/mock-dir.md +31 -0
  115. package/docs/configure/app/dev/progress-bar.md +19 -0
  116. package/docs/configure/app/dev/server.md +124 -0
  117. package/docs/configure/app/dev/setup-middlewares.md +32 -0
  118. package/docs/configure/app/dev/start-url.md +48 -0
  119. package/docs/configure/app/dev/watch-files.md +27 -0
  120. package/docs/configure/app/dev/write-to-disk.md +10 -0
  121. package/docs/configure/app/experiments/source-build.md +31 -0
  122. package/docs/configure/app/html/app-icon.md +28 -0
  123. package/docs/configure/app/html/crossorigin.md +10 -0
  124. package/docs/configure/app/html/favicon.md +16 -0
  125. package/docs/configure/app/html/inject.md +10 -0
  126. package/docs/configure/app/html/meta.md +24 -0
  127. package/docs/configure/app/html/mount-id.md +10 -0
  128. package/docs/configure/app/html/output-structure.md +10 -0
  129. package/docs/configure/app/html/script-loading.md +10 -0
  130. package/docs/configure/app/html/tags.md +15 -0
  131. package/docs/configure/app/html/template-parameters.md +33 -0
  132. package/docs/configure/app/html/template.md +10 -0
  133. package/docs/configure/app/html/title.md +18 -0
  134. package/docs/configure/app/output/asset-prefix.md +11 -0
  135. package/docs/configure/app/output/assets-retry.md +77 -0
  136. package/docs/configure/app/output/charset.md +10 -0
  137. package/docs/configure/app/output/clean-dist-path.md +16 -0
  138. package/docs/configure/app/output/convert-to-rem.md +79 -0
  139. package/docs/configure/app/output/copy.md +10 -0
  140. package/docs/configure/app/output/css-modules.md +48 -0
  141. package/docs/configure/app/output/data-uri-limit.md +26 -0
  142. package/docs/configure/app/output/disable-css-module-extension.md +55 -0
  143. package/docs/configure/app/output/disable-inline-runtime-chunk.md +41 -0
  144. package/docs/configure/app/output/disable-svgr.md +18 -0
  145. package/docs/configure/app/output/disable-ts-checker.md +49 -0
  146. package/docs/configure/app/output/dist-path.md +43 -0
  147. package/docs/configure/app/output/enable-asset-manifest.md +36 -0
  148. package/docs/configure/app/output/enable-css-module-tsdeclaration.md +28 -0
  149. package/docs/configure/app/output/enable-inline-route-manifests.md +16 -0
  150. package/docs/configure/app/output/externals.md +20 -0
  151. package/docs/configure/app/output/filename-hash.md +10 -0
  152. package/docs/configure/app/output/filename.md +55 -0
  153. package/docs/configure/app/output/inject-styles.md +10 -0
  154. package/docs/configure/app/output/inline-scripts.md +29 -0
  155. package/docs/configure/app/output/inline-styles.md +29 -0
  156. package/docs/configure/app/output/legal-comments.md +18 -0
  157. package/docs/configure/app/output/minify.md +22 -0
  158. package/docs/configure/app/output/override-browserslist.md +22 -0
  159. package/docs/configure/app/output/polyfill.md +12 -0
  160. package/docs/configure/app/output/source-map.md +30 -0
  161. package/docs/configure/app/output/split-route-chunks.md +16 -0
  162. package/docs/configure/app/output/ssg.md +81 -0
  163. package/docs/configure/app/output/ssgByEntries.md +90 -0
  164. package/docs/configure/app/output/svg-default-export.md +30 -0
  165. package/docs/configure/app/output/temp-dir.md +20 -0
  166. package/docs/configure/app/performance/build-cache.md +44 -0
  167. package/docs/configure/app/performance/chunk-split.md +40 -0
  168. package/docs/configure/app/performance/dns-prefetch.md +15 -0
  169. package/docs/configure/app/performance/preconnect.md +16 -0
  170. package/docs/configure/app/performance/prefetch.md +21 -0
  171. package/docs/configure/app/performance/preload.md +23 -0
  172. package/docs/configure/app/performance/print-file-size.md +40 -0
  173. package/docs/configure/app/performance/profile.md +10 -0
  174. package/docs/configure/app/performance/remove-console.md +10 -0
  175. package/docs/configure/app/performance/remove-moment-locale.md +10 -0
  176. package/docs/configure/app/performance/rsdoctor.md +38 -0
  177. package/docs/configure/app/plugins.md +59 -0
  178. package/docs/configure/app/resolve/alias-strategy.md +10 -0
  179. package/docs/configure/app/resolve/alias.md +9 -0
  180. package/docs/configure/app/resolve/condition-names.md +13 -0
  181. package/docs/configure/app/resolve/dedupe.md +9 -0
  182. package/docs/configure/app/resolve/extensions.md +13 -0
  183. package/docs/configure/app/runtime/0-intro.md +58 -0
  184. package/docs/configure/app/runtime/plugins.md +58 -0
  185. package/docs/configure/app/runtime/router.md +35 -0
  186. package/docs/configure/app/security/check-syntax.md +69 -0
  187. package/docs/configure/app/security/nonce.md +15 -0
  188. package/docs/configure/app/security/sri.md +20 -0
  189. package/docs/configure/app/server/base-url.md +26 -0
  190. package/docs/configure/app/server/port.md +18 -0
  191. package/docs/configure/app/server/public-routes.md +22 -0
  192. package/docs/configure/app/server/routes.md +86 -0
  193. package/docs/configure/app/server/rsc.md +22 -0
  194. package/docs/configure/app/server/ssr-by-entries.md +25 -0
  195. package/docs/configure/app/server/ssr.md +80 -0
  196. package/docs/configure/app/server/tsconfig-path.md +59 -0
  197. package/docs/configure/app/source/alias-strategy.md +14 -0
  198. package/docs/configure/app/source/alias.md +23 -0
  199. package/docs/configure/app/source/config-dir.md +20 -0
  200. package/docs/configure/app/source/decorators.md +25 -0
  201. package/docs/configure/app/source/define.md +16 -0
  202. package/docs/configure/app/source/disable-default-entries.md +28 -0
  203. package/docs/configure/app/source/enable-async-entry.md +54 -0
  204. package/docs/configure/app/source/enable-async-pre-entry.md +26 -0
  205. package/docs/configure/app/source/entries-dir.md +35 -0
  206. package/docs/configure/app/source/entries.md +179 -0
  207. package/docs/configure/app/source/exclude.md +10 -0
  208. package/docs/configure/app/source/global-vars.md +106 -0
  209. package/docs/configure/app/source/include.md +36 -0
  210. package/docs/configure/app/source/main-entry-name.md +24 -0
  211. package/docs/configure/app/source/pre-entry.md +10 -0
  212. package/docs/configure/app/source/react-compiler.md +68 -0
  213. package/docs/configure/app/source/transform-import.md +27 -0
  214. package/docs/configure/app/split-chunks.md +17 -0
  215. package/docs/configure/app/tools/autoprefixer.md +44 -0
  216. package/docs/configure/app/tools/bundler-chain.md +26 -0
  217. package/docs/configure/app/tools/css-extract.md +33 -0
  218. package/docs/configure/app/tools/css-loader.md +17 -0
  219. package/docs/configure/app/tools/dev-server.md +113 -0
  220. package/docs/configure/app/tools/html-plugin.md +41 -0
  221. package/docs/configure/app/tools/less.md +81 -0
  222. package/docs/configure/app/tools/lightningcss-loader.md +35 -0
  223. package/docs/configure/app/tools/minify-css.md +53 -0
  224. package/docs/configure/app/tools/postcss.md +34 -0
  225. package/docs/configure/app/tools/rspack.md +10 -0
  226. package/docs/configure/app/tools/sass.md +78 -0
  227. package/docs/configure/app/tools/style-loader.md +10 -0
  228. package/docs/configure/app/tools/swc.md +65 -0
  229. package/docs/configure/app/tools/ts-checker.md +116 -0
  230. package/docs/configure/app/usage.md +276 -0
  231. package/docs/guides/advanced-features/bff/cross-project.md +109 -0
  232. package/docs/guides/advanced-features/bff/data-platform.md +116 -0
  233. package/docs/guides/advanced-features/bff/extend-server.md +120 -0
  234. package/docs/guides/advanced-features/bff/frameworks.md +243 -0
  235. package/docs/guides/advanced-features/bff/function.md +318 -0
  236. package/docs/guides/advanced-features/bff/operators.md +554 -0
  237. package/docs/guides/advanced-features/bff/sdk.md +116 -0
  238. package/docs/guides/advanced-features/bff/upload.md +101 -0
  239. package/docs/guides/advanced-features/bff.md +18 -0
  240. package/docs/guides/advanced-features/build-performance.md +130 -0
  241. package/docs/guides/advanced-features/compatibility.md +120 -0
  242. package/docs/guides/advanced-features/international/advanced.md +128 -0
  243. package/docs/guides/advanced-features/international/api.md +267 -0
  244. package/docs/guides/advanced-features/international/best-practices.md +286 -0
  245. package/docs/guides/advanced-features/international/configuration.md +228 -0
  246. package/docs/guides/advanced-features/international/locale-detection.md +126 -0
  247. package/docs/guides/advanced-features/international/quick-start.md +128 -0
  248. package/docs/guides/advanced-features/international/resource-loading.md +154 -0
  249. package/docs/guides/advanced-features/international/routing.md +173 -0
  250. package/docs/guides/advanced-features/international.md +27 -0
  251. package/docs/guides/advanced-features/low-level.md +46 -0
  252. package/docs/guides/advanced-features/page-performance/code-split.md +77 -0
  253. package/docs/guides/advanced-features/page-performance/inline-assets.md +159 -0
  254. package/docs/guides/advanced-features/page-performance/optimize-bundle.md +97 -0
  255. package/docs/guides/advanced-features/page-performance/react-compiler.md +51 -0
  256. package/docs/guides/advanced-features/server-monitor/logger.md +41 -0
  257. package/docs/guides/advanced-features/server-monitor/metrics.md +58 -0
  258. package/docs/guides/advanced-features/server-monitor/monitors.md +242 -0
  259. package/docs/guides/advanced-features/source-build.md +164 -0
  260. package/docs/guides/advanced-features/web-server.md +288 -0
  261. package/docs/guides/basic-features/alias.md +102 -0
  262. package/docs/guides/basic-features/css/css-in-js.md +72 -0
  263. package/docs/guides/basic-features/css/css-modules.md +212 -0
  264. package/docs/guides/basic-features/css/css.md +27 -0
  265. package/docs/guides/basic-features/css/tailwindcss.md +27 -0
  266. package/docs/guides/basic-features/data/data-cache.md +510 -0
  267. package/docs/guides/basic-features/data/data-fetch.md +415 -0
  268. package/docs/guides/basic-features/data/data-write.md +227 -0
  269. package/docs/guides/basic-features/debug/mock.md +109 -0
  270. package/docs/guides/basic-features/debug/proxy.md +21 -0
  271. package/docs/guides/basic-features/debug/rsdoctor.md +47 -0
  272. package/docs/guides/basic-features/debug/using-storybook.md +112 -0
  273. package/docs/guides/basic-features/deploy.md +458 -0
  274. package/docs/guides/basic-features/env-vars.md +177 -0
  275. package/docs/guides/basic-features/html.md +255 -0
  276. package/docs/guides/basic-features/output-files.md +141 -0
  277. package/docs/guides/basic-features/render/before-render.md +108 -0
  278. package/docs/guides/basic-features/render/overview.md +47 -0
  279. package/docs/guides/basic-features/render/rsc.md +516 -0
  280. package/docs/guides/basic-features/render/ssg.md +228 -0
  281. package/docs/guides/basic-features/render/ssr-cache.md +201 -0
  282. package/docs/guides/basic-features/render/ssr.md +321 -0
  283. package/docs/guides/basic-features/render/streaming-ssr.md +264 -0
  284. package/docs/guides/basic-features/routes/config-routes.md +426 -0
  285. package/docs/guides/basic-features/routes/routes.md +524 -0
  286. package/docs/guides/basic-features/static-assets/json-files.md +120 -0
  287. package/docs/guides/basic-features/static-assets/svg-assets.md +168 -0
  288. package/docs/guides/basic-features/static-assets/wasm-assets.md +62 -0
  289. package/docs/guides/basic-features/static-assets.md +160 -0
  290. package/docs/guides/basic-features/testing/playwright.md +120 -0
  291. package/docs/guides/basic-features/testing/rstest.md +251 -0
  292. package/docs/guides/concept/builder.md +37 -0
  293. package/docs/guides/concept/entries.md +319 -0
  294. package/docs/guides/concept/server.md +35 -0
  295. package/docs/guides/get-started/ai-coding-agents.md +58 -0
  296. package/docs/guides/get-started/glossary.md +63 -0
  297. package/docs/guides/get-started/introduction.md +40 -0
  298. package/docs/guides/get-started/quick-start.md +269 -0
  299. package/docs/guides/get-started/tech-stack.md +91 -0
  300. package/docs/guides/get-started/ultramodern.md +440 -0
  301. package/docs/guides/get-started/upgrade.md +118 -0
  302. package/docs/guides/topic-detail/module-federation/application.md +116 -0
  303. package/docs/guides/topic-detail/module-federation/deploy.md +104 -0
  304. package/docs/guides/topic-detail/module-federation/i18n.md +670 -0
  305. package/docs/guides/topic-detail/module-federation/introduce.md +35 -0
  306. package/docs/guides/topic-detail/module-federation/ssr.md +182 -0
  307. package/docs/guides/topic-detail/module-federation/usage.md +219 -0
  308. package/docs/guides/troubleshooting/builder.md +110 -0
  309. package/docs/guides/troubleshooting/cli.md +35 -0
  310. package/docs/guides/troubleshooting/dependencies.md +119 -0
  311. package/docs/guides/troubleshooting/hmr.md +144 -0
  312. package/docs/guides/upgrade/config.md +954 -0
  313. package/docs/guides/upgrade/entry.md +463 -0
  314. package/docs/guides/upgrade/other.md +183 -0
  315. package/docs/guides/upgrade/overview.md +33 -0
  316. package/docs/guides/upgrade/tailwindcss.md +91 -0
  317. package/docs/guides/upgrade/web-server.md +109 -0
  318. package/docs/index.md +33 -0
  319. package/docs/llms.txt +290 -0
  320. package/docs/plugin/cli-plugins/api.md +573 -0
  321. package/docs/plugin/cli-plugins/life-cycle.md +2 -0
  322. package/docs/plugin/introduction.md +152 -0
  323. package/docs/plugin/official/cli-plugins/plugin-bff.md +5 -0
  324. package/docs/plugin/official/cli-plugins/plugin-ssg.md +5 -0
  325. package/docs/plugin/official/cli-plugins/plugin-styled-components.md +5 -0
  326. package/docs/plugin/official/cli-plugins.md +4 -0
  327. package/docs/plugin/plugin-system.md +238 -0
  328. package/docs/plugin/runtime-plugins/api.md +194 -0
  329. package/docs/plugin/runtime-plugins/life-cycle.md +2 -0
  330. package/docs/plugin/server-plugins/api.md +209 -0
  331. package/docs/plugin/server-plugins/life-cycle.md +13 -0
  332. package/docs/tutorials/examples/csr-auth.md +9 -0
  333. package/docs/tutorials/foundations/introduction.md +16 -0
  334. package/package.json +63 -22
@@ -0,0 +1,62 @@
1
+ import node_fs from "node:fs";
2
+ import node_path from "node:path";
3
+ const DEFAULT_INDEX_FILE = 'llms.txt';
4
+ const DEFAULT_EXCLUDED_DIRS = [
5
+ 'zh'
6
+ ];
7
+ function bundleDocs({ source, target, indexFile = DEFAULT_INDEX_FILE, excludedDirs = DEFAULT_EXCLUDED_DIRS }) {
8
+ if (!node_fs.existsSync(source)) {
9
+ console.warn(`[bundle-docs] docs build output not found: ${source}`);
10
+ console.warn('[bundle-docs] skipping the bundled docs — build the docs site first if you need them');
11
+ return 0;
12
+ }
13
+ node_fs.rmSync(target, {
14
+ recursive: true,
15
+ force: true
16
+ });
17
+ const isBundled = (rel)=>rel === indexFile || rel.endsWith('.md') && !excludedDirs.some((dir)=>rel.startsWith(`${dir}${node_path.sep}`));
18
+ let count = 0;
19
+ for (const entry of node_fs.readdirSync(source, {
20
+ recursive: true,
21
+ withFileTypes: true
22
+ })){
23
+ if (!entry.isFile()) continue;
24
+ const from = node_path.join(entry.parentPath ?? entry.path, entry.name);
25
+ const rel = node_path.relative(source, from);
26
+ if (!isBundled(rel)) continue;
27
+ const to = node_path.join(target, rel);
28
+ node_fs.mkdirSync(node_path.dirname(to), {
29
+ recursive: true
30
+ });
31
+ node_fs.copyFileSync(from, to);
32
+ count++;
33
+ }
34
+ if (0 === count) throw new Error(`[bundle-docs] no files copied from ${source}`);
35
+ return count;
36
+ }
37
+ function parseArgs(argv) {
38
+ const options = {};
39
+ for(let i = 0; i < argv.length; i += 2){
40
+ const key = argv[i]?.replace(/^--/, '');
41
+ const value = argv[i + 1];
42
+ if (key && value) options[key] = value;
43
+ }
44
+ return options;
45
+ }
46
+ function runBundleDocsCli(pkgRoot) {
47
+ const args = parseArgs(process.argv.slice(2));
48
+ const source = args.source ? node_path.resolve(process.cwd(), args.source) : node_path.resolve(pkgRoot, '../../document/doc_build');
49
+ const target = args.target ? node_path.resolve(process.cwd(), args.target) : node_path.resolve(pkgRoot, 'docs');
50
+ try {
51
+ const count = bundleDocs({
52
+ source,
53
+ target,
54
+ indexFile: args.index
55
+ });
56
+ if (count > 0) console.log(`[bundle-docs] bundled ${count} doc files into docs`);
57
+ } catch (error) {
58
+ console.error(error.message);
59
+ process.exit(1);
60
+ }
61
+ }
62
+ export { bundleDocs, runBundleDocsCli };
@@ -56,8 +56,9 @@ const build = async (api, options)=>{
56
56
  logger.info('Starting production build...');
57
57
  if (!appContext.builder) throw new Error('Expect the Builder to have been initialized, But the appContext.builder received `undefined`');
58
58
  await appContext.builder.onAfterBuild(async ()=>copyEnvFiles(appContext.appDirectory, appContext.distDirectory));
59
- await appContext.builder.build({
59
+ const buildResult = await appContext.builder.build({
60
60
  watch: options?.watch
61
61
  });
62
+ if (!options?.watch) await buildResult?.close();
62
63
  };
63
64
  export { build };
@@ -1,8 +1,10 @@
1
1
  import { getServerPlugins } from "../utils/loadPlugins.mjs";
2
- const deploy = async (api, options)=>{
2
+ import { build } from "./build.mjs";
3
+ const deploy = async (api, options = {})=>{
3
4
  const hooks = api.getHooks();
4
5
  const { metaName } = api.getAppContext();
5
- await getServerPlugins(api, metaName);
6
+ if (options.skipBuild) await getServerPlugins(api, metaName);
7
+ else await build(api);
6
8
  await hooks.onBeforeDeploy.call(options);
7
9
  await hooks.deploy.call();
8
10
  await hooks.onAfterDeploy.call(options);
@@ -19,10 +19,6 @@ const serverCommand = (program, api)=>{
19
19
  };
20
20
  const deployCommand = (program, api)=>{
21
21
  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)=>{
22
- if (!options.skipBuild) {
23
- const { build } = await import("./build.mjs");
24
- await build(api);
25
- }
26
22
  const { deploy } = await import("./deploy.mjs");
27
23
  await deploy(api, options);
28
24
  process.exit(0);
@@ -1,7 +1,9 @@
1
+ import { AGGRED_DIR } from "@modern-js/server-core";
1
2
  import { DEFAULT_ENTRY_NAME } from "@modern-js/utils";
2
3
  import { getAutoInjectEnv } from "../utils/env.mjs";
3
4
  function createDefaultConfig(appContext) {
4
5
  const dev = {
6
+ mockDir: `./${AGGRED_DIR.mock}`,
5
7
  cliShortcuts: {
6
8
  help: false,
7
9
  custom: (shortcuts = [])=>shortcuts.filter(({ key })=>'r' !== key && 'u' !== key && 'o' !== key)
@@ -85,7 +85,18 @@ const appTools = ()=>({
85
85
  ].some((tag)=>getArgv().includes(tag));
86
86
  if (isSkipBuild) return;
87
87
  }
88
- if ('dev' === command || 'start' === command || 'build' === command || 'deploy' === command) {
88
+ const { command: contextCommand } = api.getAppContext();
89
+ const shouldClean = [
90
+ 'dev',
91
+ 'start',
92
+ 'build',
93
+ 'deploy'
94
+ ].includes(command) || [
95
+ 'dev',
96
+ 'start',
97
+ 'build'
98
+ ].includes(contextCommand);
99
+ if (shouldClean) {
89
100
  const resolvedConfig = api.getNormalizedConfig();
90
101
  if (resolvedConfig.output.cleanDistPath) {
91
102
  const appContext = api.getAppContext();
@@ -125,9 +136,12 @@ const appTools = ()=>({
125
136
  });
126
137
  const src = appTools;
127
138
  export { defineConfig } from "./defineConfig.mjs";
139
+ export { build } from "./commands/build.mjs";
140
+ export { deploy } from "./commands/deploy.mjs";
128
141
  export { dev } from "./commands/dev.mjs";
129
142
  export { serve } from "./commands/serve.mjs";
130
143
  export { resolveModernRsbuildConfig } from "./rsbuild.mjs";
144
+ export { closeServer } from "./utils/createServer.mjs";
131
145
  export { mergeConfig } from "@modern-js/plugin/cli";
132
146
  export default src;
133
147
  export { appTools, generateWatchFiles, initAppContext };
@@ -23,7 +23,7 @@ const analyze = ()=>({
23
23
  const resolvedConfig = api.getNormalizedConfig();
24
24
  const hooks = api.getHooks();
25
25
  try {
26
- if (checkIsBuildCommands()) fs.emptydirSync(appContext.internalDirectory);
26
+ if (checkIsBuildCommands(appContext.command)) fs.emptydirSync(appContext.internalDirectory);
27
27
  } catch {}
28
28
  const apiOnly = await isApiOnly(appContext.appDirectory, resolvedConfig.source?.entriesDir, appContext.apiDirectory);
29
29
  const [{ getProdEntrypoints, getProdServerRoutes }] = await Promise.all([
@@ -125,7 +125,7 @@ const analyze = ()=>({
125
125
  htmlTemplates
126
126
  };
127
127
  api.updateAppContext(appContext);
128
- if (checkIsBuildCommands()) {
128
+ if (checkIsBuildCommands(appContext.command)) {
129
129
  await hooks.generateEntryCode.call({
130
130
  entrypoints
131
131
  });
@@ -38,7 +38,7 @@ const parseModule = async ({ source, filename })=>{
38
38
  return await parse(content);
39
39
  };
40
40
  const getServerCombinedModuleFile = (internalDirectory, entryName)=>path.join(internalDirectory, entryName, 'server-loader-combined.js');
41
- const checkIsBuildCommands = ()=>{
41
+ const checkIsBuildCommands = (contextCommand)=>{
42
42
  const buildCommands = [
43
43
  'dev',
44
44
  'start',
@@ -48,7 +48,8 @@ const checkIsBuildCommands = ()=>{
48
48
  'dev-worker'
49
49
  ];
50
50
  const command = getCommand();
51
- return buildCommands.includes(command);
51
+ if (buildCommands.includes(command)) return true;
52
+ return 'dev' === contextCommand || 'start' === contextCommand || 'build' === contextCommand || 'deploy' === contextCommand;
52
53
  };
53
54
  const checkIsServeCommand = ()=>{
54
55
  const command = getCommand();
@@ -116,7 +116,7 @@ const verifyCloudflareOutput = async (options)=>{
116
116
  path: publicPath
117
117
  });
118
118
  }
119
- if (false !== options.importWorker && await pathExists(outputPlan.paths.workerEntry)) await verifyWorkerImport(issues, outputPlan.paths.workerEntry);
119
+ if (false !== options.importWorker && await pathExists(outputPlan.paths.workerEntry)) await verifyWorkerImport(issues, outputPlan.paths.workerEntry, manifest);
120
120
  return {
121
121
  ok: 0 === issues.length,
122
122
  issues
@@ -1,7 +1,9 @@
1
1
  import promises from "node:fs/promises";
2
2
  import node_path from "node:path";
3
3
  import { pathToFileURL } from "node:url";
4
+ import { isDeepStrictEqual } from "node:util";
4
5
  import { parse } from "@babel/parser";
6
+ import traverse from "@babel/traverse";
5
7
  import { CLOUDFLARE_WORKER_BUNDLE_DIRECTORY, CLOUDFLARE_WORKER_NODE_BUILTINS } from "../cloudflare-output-contract.mjs";
6
8
  import { addIssue } from "./issues.mjs";
7
9
  const getReferencedRouteWorkers = (manifest)=>Array.isArray(manifest?.routeSpec?.routes) ? manifest.routeSpec.routes.map((route)=>'string' == typeof route?.worker && route.worker.length > 0 ? route.worker : void 0).filter((worker)=>'string' == typeof worker) : [];
@@ -45,6 +47,7 @@ const getNodeName = (node)=>{
45
47
  if (!isAstNode(node)) return;
46
48
  return 'Identifier' === node.type && 'string' == typeof node.name ? node.name : 'StringLiteral' === node.type && 'string' == typeof node.value ? node.value : void 0;
47
49
  };
50
+ const getStringLiteralValue = (node)=>isAstNode(node) && 'StringLiteral' === node.type && 'string' == typeof node.value ? node.value : void 0;
48
51
  const collectBindingNames = (node, names)=>{
49
52
  if (!isAstNode(node)) return;
50
53
  const name = getNodeName(node);
@@ -54,7 +57,11 @@ const collectBindingNames = (node, names)=>{
54
57
  } else if ('ArrayPattern' === node.type && Array.isArray(node.elements)) for (const element of node.elements)collectBindingNames(element, names);
55
58
  else if ('AssignmentPattern' === node.type || 'RestElement' === node.type) collectBindingNames('AssignmentPattern' === node.type ? node.left : node.argument, names);
56
59
  };
57
- const getMemberPropertyName = (node)=>'MemberExpression' === node.type ? getNodeName(node.property) : void 0;
60
+ const getMemberPropertyName = (node)=>{
61
+ if ('MemberExpression' !== node.type) return;
62
+ return true === node.computed ? getStringLiteralValue(node.property) : getNodeName(node.property);
63
+ };
64
+ const isAmbientModuleRequire = (node, modulePath)=>isAstNode(node) && 'MemberExpression' === node.type && isAstNode(node.object) && 'Identifier' === node.object.type && 'module' === node.object.name && void 0 === modulePath.scope.getBinding('module') && 'require' === getMemberPropertyName(node);
58
65
  const isModuleExports = (node)=>isAstNode(node) && 'MemberExpression' === node.type && isAstNode(node.object) && 'Identifier' === node.object.type && 'module' === node.object.name && 'exports' === getMemberPropertyName(node);
59
66
  const collectCommonJsExports = (statement, exports)=>{
60
67
  if ('ExpressionStatement' !== statement.type || !isAstNode(statement.expression) || 'AssignmentExpression' !== statement.expression.type) return;
@@ -89,19 +96,31 @@ const collectEsmExports = (statement, exports)=>{
89
96
  }
90
97
  }
91
98
  };
92
- const visitAst = (node, visitor)=>{
93
- visitor(node);
94
- for (const [key, value] of Object.entries(node))if ('loc' !== key && 'start' !== key && 'end' !== key && 'leadingComments' !== key && 'trailingComments' !== key && 'innerComments' !== key) {
95
- if (isAstNode(value)) visitAst(value, visitor);
96
- else if (Array.isArray(value)) {
97
- for (const item of value)if (isAstNode(item)) visitAst(item, visitor);
99
+ const getStaticImport = (modulePath)=>{
100
+ const node = modulePath.node;
101
+ if (('ImportDeclaration' === node.type || 'ExportNamedDeclaration' === node.type || 'ExportAllDeclaration' === node.type) && isAstNode(node.source)) return getStringLiteralValue(node.source);
102
+ if ('ImportExpression' === node.type && isAstNode(node.source)) return getStringLiteralValue(node.source);
103
+ if ('CallExpression' === node.type && Array.isArray(node.arguments) && 1 === node.arguments.length && isAstNode(node.callee) && ('Identifier' === node.callee.type && 'require' === node.callee.name && void 0 === modulePath.scope.getBinding('require') || isAmbientModuleRequire(node.callee, modulePath) || 'Import' === node.callee.type)) return getStringLiteralValue(node.arguments[0]);
104
+ };
105
+ const isAmbientLoaderWrite = (modulePath)=>{
106
+ let targetPath = modulePath;
107
+ while(targetPath.parentPath){
108
+ const parentPath = targetPath.parentPath;
109
+ if (parentPath.isAssignmentExpression()) return 'left' === targetPath.key;
110
+ if (parentPath.isUpdateExpression()) return 'argument' === targetPath.key;
111
+ if (parentPath.isForInStatement() || parentPath.isForOfStatement()) return 'left' === targetPath.key;
112
+ if (parentPath.isObjectProperty()) {
113
+ if ('value' !== targetPath.key) return false;
114
+ targetPath = parentPath;
115
+ continue;
116
+ }
117
+ if (parentPath.isObjectPattern() || parentPath.isArrayPattern() || parentPath.isRestElement() || parentPath.isAssignmentPattern()) {
118
+ targetPath = parentPath;
119
+ continue;
98
120
  }
121
+ break;
99
122
  }
100
- };
101
- const getStaticImport = (node)=>{
102
- if (('ImportDeclaration' === node.type || 'ExportNamedDeclaration' === node.type || 'ExportAllDeclaration' === node.type) && isAstNode(node.source)) return getNodeName(node.source);
103
- if ('ImportExpression' === node.type && isAstNode(node.source)) return getNodeName(node.source);
104
- if ('CallExpression' === node.type && Array.isArray(node.arguments) && 1 === node.arguments.length && isAstNode(node.callee) && ('Identifier' === node.callee.type && 'require' === node.callee.name || 'Import' === node.callee.type)) return getNodeName(node.arguments[0]);
123
+ return false;
105
124
  };
106
125
  const analyzeWorkerModule = (source)=>{
107
126
  const ast = parse(source, {
@@ -109,17 +128,49 @@ const analyzeWorkerModule = (source)=>{
109
128
  });
110
129
  const exports = new Set();
111
130
  const imports = new Set();
131
+ let unsafeCommonJsLoaderUsage = false;
132
+ let unsafeDynamicImport = false;
112
133
  for (const statement of ast.program.body){
113
134
  collectEsmExports(statement, exports);
114
135
  collectCommonJsExports(statement, exports);
115
136
  }
116
- visitAst(ast.program, (node)=>{
117
- const specifier = getStaticImport(node);
118
- if (specifier) imports.add(specifier);
137
+ traverse(ast, {
138
+ enter (modulePath) {
139
+ const node = modulePath.node;
140
+ if (('ImportExpression' === node.type || 'CallExpression' === node.type && isAstNode(node.callee) && 'Import' === node.callee.type) && void 0 === getStaticImport(modulePath)) unsafeDynamicImport = true;
141
+ if (modulePath.isReferencedIdentifier({
142
+ name: 'require'
143
+ }) && void 0 === modulePath.scope.getBinding('require')) {
144
+ const parentPath = modulePath.parentPath;
145
+ const isStaticRequireCall = parentPath?.isCallExpression() && 'callee' === modulePath.key && void 0 !== getStaticImport(parentPath);
146
+ const isAvailabilityCheck = parentPath?.isUnaryExpression({
147
+ operator: 'typeof'
148
+ });
149
+ if (!isStaticRequireCall && !isAvailabilityCheck) unsafeCommonJsLoaderUsage = true;
150
+ }
151
+ if ('Identifier' === node.type && isAmbientLoaderWrite(modulePath) && ('require' === node.name || 'module' === node.name) && void 0 === modulePath.scope.getBinding(node.name)) unsafeCommonJsLoaderUsage = true;
152
+ if (modulePath.isReferencedIdentifier({
153
+ name: 'module'
154
+ }) && void 0 === modulePath.scope.getBinding('module')) {
155
+ const parentPath = modulePath.parentPath;
156
+ const isExportsAccess = null !== parentPath && isModuleExports(parentPath.node);
157
+ const isStaticModuleRequireCall = null !== parentPath && isAmbientModuleRequire(parentPath.node, parentPath) && parentPath.parentPath?.isCallExpression() === true && 'callee' === parentPath.key && void 0 !== getStaticImport(parentPath.parentPath);
158
+ if (!isExportsAccess && !isStaticModuleRequireCall) unsafeCommonJsLoaderUsage = true;
159
+ }
160
+ if (isAmbientModuleRequire(node, modulePath)) {
161
+ const parentPath = modulePath.parentPath;
162
+ const isStaticRequireCall = parentPath?.isCallExpression() && 'callee' === modulePath.key && void 0 !== getStaticImport(parentPath);
163
+ if (!isStaticRequireCall) unsafeCommonJsLoaderUsage = true;
164
+ }
165
+ const specifier = getStaticImport(modulePath);
166
+ if (void 0 !== specifier) imports.add(specifier);
167
+ }
119
168
  });
120
169
  return {
121
170
  exports,
122
- imports
171
+ imports,
172
+ unsafeCommonJsLoaderUsage,
173
+ unsafeDynamicImport
123
174
  };
124
175
  };
125
176
  const getPackageName = (specifier)=>specifier.startsWith('@') ? specifier.split('/').slice(0, 2).join('/') : specifier.split('/')[0];
@@ -170,7 +221,25 @@ const verifyWorkerModuleClosure = async (issues, entryPath, entrySource, contrac
170
221
  return;
171
222
  }
172
223
  if (isEntry) entryAnalysis = analysis;
224
+ if (analysis.unsafeCommonJsLoaderUsage) addIssue(issues, {
225
+ code: 'invalid-worker-bundle',
226
+ message: 'Cloudflare worker bundles must use exactly one string-literal specifier in ambient CommonJS loader calls and must not pass or alias the loader.',
227
+ path: modulePath
228
+ });
229
+ if (analysis.unsafeDynamicImport) addIssue(issues, {
230
+ code: 'invalid-worker-bundle',
231
+ message: 'Cloudflare worker bundles must not contain non-static dynamic module imports.',
232
+ path: modulePath
233
+ });
173
234
  for (const specifier of analysis.imports){
235
+ if (0 === specifier.length) {
236
+ addIssue(issues, {
237
+ code: 'invalid-worker-bundle',
238
+ message: 'Cloudflare worker bundle module specifiers must not be empty.',
239
+ path: modulePath
240
+ });
241
+ continue;
242
+ }
174
243
  if (!specifier.startsWith('.') && !node_path.isAbsolute(specifier)) {
175
244
  if (CLOUDFLARE_WORKER_NODE_BUILTIN_SPECIFIERS.has(specifier)) continue;
176
245
  if (specifier.startsWith('node:')) {
@@ -219,14 +288,20 @@ const verifyWorkerBundleReferences = async (issues, worker, source, contract)=>{
219
288
  path: worker.path
220
289
  });
221
290
  };
222
- const verifyWorkerImport = async (issues, entryPath)=>{
291
+ const verifyWorkerImport = async (issues, entryPath, expectedManifest)=>{
223
292
  try {
224
- const worker = (await import(`${pathToFileURL(entryPath).href}?t=${Date.now()}`)).default;
293
+ const workerModule = await import(`${pathToFileURL(entryPath).href}?t=${Date.now()}`);
294
+ const worker = workerModule.default;
225
295
  if (!worker || 'function' != typeof worker.fetch) addIssue(issues, {
226
296
  code: 'worker-import-failed',
227
297
  message: 'Cloudflare server entry must default-export a Worker with fetch.',
228
298
  path: entryPath
229
299
  });
300
+ if (void 0 !== expectedManifest && !isDeepStrictEqual(workerModule.modernWorkerManifest, expectedManifest)) addIssue(issues, {
301
+ code: 'worker-import-failed',
302
+ message: 'Cloudflare server entry runtime manifest must exactly match modern-worker-manifest.json.',
303
+ path: entryPath
304
+ });
230
305
  } catch (error) {
231
306
  addIssue(issues, {
232
307
  code: 'worker-import-failed',
@@ -1,5 +1,6 @@
1
1
  const ASSETS_BINDING = 'ASSETS';
2
2
  const MODERN_WORKER_MANIFEST = p_workerManifest;
3
+ export const modernWorkerManifest = MODERN_WORKER_MANIFEST;
3
4
  const WORKER_MODULE_LOADERS = p_workerModuleLoaders;
4
5
  const workerModulePromises = new Map();
5
6
  const effectBffDispatcherPromises = new Map();
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Workerd cannot initialize Module Federation's Node-oriented SSR data-fetch
3
+ * runtime. Cloudflare workers do not load native MF remotes, so retain the
4
+ * runtime-plugin contract without installing its server data-fetch hooks.
5
+ */
6
+ export const injectDataFetchFunctionPlugin = () => ({
7
+ name: '@module-federation/inject-data-fetch-function-plugin',
8
+ setup() {},
9
+ });
10
+
11
+ export const mfSSRDevPlugin = () => ({
12
+ name: '@module-federation/modern-js-v3',
13
+ setup() {},
14
+ });
@@ -25,7 +25,7 @@ const initialize = ()=>({
25
25
  api.modifyResolvedConfig(async (resolved)=>{
26
26
  let appContext = api.getAppContext();
27
27
  const userConfig = api.getConfig();
28
- const port = await getServerPort(resolved);
28
+ const port = await getServerPort(resolved, appContext.command);
29
29
  appContext = {
30
30
  ...appContext,
31
31
  port,
@@ -60,9 +60,10 @@ function stabilizeConfig(resolve, config, keys) {
60
60
  resolve[key] = config[key] || {};
61
61
  });
62
62
  }
63
- async function getServerPort(config) {
63
+ async function getServerPort(config, contextCommand) {
64
64
  const prodPort = Number(process.env.PORT) || config.server.port || 8080;
65
- if (isDev() && isDevCommand()) return getPort(Number(process.env.PORT) || prodPort);
65
+ const isProgrammaticDev = 'dev' === contextCommand || 'start' === contextCommand;
66
+ if (isDev() && (isDevCommand() || isProgrammaticDev)) return getPort(Number(process.env.PORT) || prodPort);
66
67
  return prodPort;
67
68
  }
68
69
  export default initialize;
@@ -17,7 +17,7 @@ const serverBuild = ()=>({
17
17
  name: '@modern-js/server-build',
18
18
  setup (api) {
19
19
  api.onAfterBuild(async ()=>{
20
- const { appDirectory, distDirectory, metaName } = api.getAppContext();
20
+ const { appDirectory, distDirectory, metaName, moduleType } = api.getAppContext();
21
21
  if (!checkHasCache(appDirectory) && !checkHasConfig(appDirectory, metaName)) return;
22
22
  const modernConfig = api.getNormalizedConfig();
23
23
  const distDir = path.resolve(distDirectory);
@@ -37,7 +37,8 @@ const serverBuild = ()=>({
37
37
  }, {
38
38
  sourceDirs,
39
39
  distDir,
40
- tsconfigPath
40
+ tsconfigPath,
41
+ moduleType
41
42
  });
42
43
  });
43
44
  }