@modern-js/app-tools 3.9.3 → 3.10.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 (291) hide show
  1. package/dist/cjs/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.js +54 -2
  2. package/dist/cjs/compat/hooks.js +0 -5
  3. package/dist/cjs/compat/index.js +0 -5
  4. package/dist/cjs/compat/utils.js +0 -5
  5. package/dist/cjs/plugins/initialize/index.js +0 -1
  6. package/dist/esm/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.mjs +54 -2
  7. package/dist/esm/compat/hooks.mjs +0 -5
  8. package/dist/esm/compat/index.mjs +0 -5
  9. package/dist/esm/compat/utils.mjs +0 -5
  10. package/dist/esm/plugins/initialize/index.mjs +0 -1
  11. package/dist/esm-node/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.mjs +54 -2
  12. package/dist/esm-node/compat/hooks.mjs +0 -5
  13. package/dist/esm-node/compat/index.mjs +0 -5
  14. package/dist/esm-node/compat/utils.mjs +0 -5
  15. package/dist/esm-node/plugins/initialize/index.mjs +0 -1
  16. package/dist/types/types/config/index.d.ts +0 -2
  17. package/dist/types/types/config/tools.d.ts +0 -8
  18. package/docs/apis/app/commands.md +2 -0
  19. package/docs/apis/app/hooks/api/lambda.md +2 -0
  20. package/docs/apis/app/hooks/config/favicon.md +2 -0
  21. package/docs/apis/app/hooks/config/html.md +2 -0
  22. package/docs/apis/app/hooks/config/icon.md +2 -0
  23. package/docs/apis/app/hooks/config/mock.md +2 -0
  24. package/docs/apis/app/hooks/config/public.md +2 -0
  25. package/docs/apis/app/hooks/config/upload.md +3 -3
  26. package/docs/apis/app/hooks/modern-config.md +2 -0
  27. package/docs/apis/app/hooks/server/server.md +2 -0
  28. package/docs/apis/app/hooks/shared.md +2 -0
  29. package/docs/apis/app/hooks/src/app.md +2 -0
  30. package/docs/apis/app/hooks/src/entry.md +2 -0
  31. package/docs/apis/app/hooks/src/entry.server.md +2 -0
  32. package/docs/apis/app/hooks/src/modern.runtime.md +2 -0
  33. package/docs/apis/app/hooks/src/routes.md +2 -0
  34. package/docs/apis/app/hooks/src/server.md +2 -0
  35. package/docs/apis/app/runtime/bff/use-hono-context.md +2 -0
  36. package/docs/apis/app/runtime/core/create-root.md +5 -1
  37. package/docs/apis/app/runtime/core/render.md +7 -2
  38. package/docs/apis/app/runtime/core/runtime-context.md +18 -16
  39. package/docs/apis/app/runtime/router/router.md +11 -6
  40. package/docs/apis/app/runtime/ssr/no-ssr.md +2 -0
  41. package/docs/apis/app/runtime/ssr/renderStreaming.md +2 -0
  42. package/docs/apis/app/runtime/ssr/renderString.md +2 -0
  43. package/docs/apis/app/runtime/ssr/requestHandler.md +2 -0
  44. package/docs/apis/app/runtime/utility/css-in-js.md +2 -0
  45. package/docs/apis/app/runtime/utility/head.md +2 -0
  46. package/docs/apis/app/runtime/utility/loadable.md +2 -0
  47. package/docs/community/blog/2022-0708-updates.md +2 -0
  48. package/docs/community/blog/2022-0910-updates.md +2 -0
  49. package/docs/community/blog/overview.md +2 -0
  50. package/docs/community/blog/v2-release-note.md +2 -0
  51. package/docs/community/blog/v3-release-note.md +18 -13
  52. package/docs/community/contributing-guide.md +17 -33
  53. package/docs/community/releases.md +2 -0
  54. package/docs/community/showcase.md +2 -0
  55. package/docs/community/team.md +2 -0
  56. package/docs/configure/app/bff/cross-project.md +2 -0
  57. package/docs/configure/app/bff/prefix.md +2 -0
  58. package/docs/configure/app/builder-plugins.md +2 -0
  59. package/docs/configure/app/dev/asset-prefix.md +2 -0
  60. package/docs/configure/app/dev/before-start-url.md +2 -0
  61. package/docs/configure/app/dev/client.md +2 -0
  62. package/docs/configure/app/dev/hmr.md +2 -0
  63. package/docs/configure/app/dev/host.md +2 -0
  64. package/docs/configure/app/dev/https.md +2 -0
  65. package/docs/configure/app/dev/lazy-compilation.md +19 -1
  66. package/docs/configure/app/dev/live-reload.md +2 -0
  67. package/docs/configure/app/dev/mock-dir.md +2 -0
  68. package/docs/configure/app/dev/progress-bar.md +2 -0
  69. package/docs/configure/app/dev/server.md +2 -0
  70. package/docs/configure/app/dev/setup-middlewares.md +2 -0
  71. package/docs/configure/app/dev/start-url.md +2 -0
  72. package/docs/configure/app/dev/watch-files.md +2 -0
  73. package/docs/configure/app/dev/write-to-disk.md +2 -0
  74. package/docs/configure/app/experiments/source-build.md +2 -0
  75. package/docs/configure/app/html/app-icon.md +2 -0
  76. package/docs/configure/app/html/crossorigin.md +2 -0
  77. package/docs/configure/app/html/favicon.md +2 -0
  78. package/docs/configure/app/html/inject.md +2 -0
  79. package/docs/configure/app/html/meta.md +2 -0
  80. package/docs/configure/app/html/mount-id.md +2 -0
  81. package/docs/configure/app/html/output-structure.md +2 -0
  82. package/docs/configure/app/html/script-loading.md +2 -0
  83. package/docs/configure/app/html/tags.md +2 -0
  84. package/docs/configure/app/html/template-parameters.md +2 -0
  85. package/docs/configure/app/html/template.md +2 -0
  86. package/docs/configure/app/html/title.md +2 -0
  87. package/docs/configure/app/output/asset-prefix.md +2 -0
  88. package/docs/configure/app/output/assets-retry.md +2 -0
  89. package/docs/configure/app/output/charset.md +2 -0
  90. package/docs/configure/app/output/clean-dist-path.md +2 -0
  91. package/docs/configure/app/output/convert-to-rem.md +2 -0
  92. package/docs/configure/app/output/copy.md +2 -0
  93. package/docs/configure/app/output/css-modules.md +3 -5
  94. package/docs/configure/app/output/data-uri-limit.md +2 -0
  95. package/docs/configure/app/output/disable-css-module-extension.md +2 -0
  96. package/docs/configure/app/output/disable-inline-runtime-chunk.md +2 -0
  97. package/docs/configure/app/output/disable-svgr.md +2 -0
  98. package/docs/configure/app/output/disable-ts-checker.md +2 -0
  99. package/docs/configure/app/output/dist-path.md +2 -0
  100. package/docs/configure/app/output/enable-asset-manifest.md +2 -0
  101. package/docs/configure/app/output/enable-css-module-tsdeclaration.md +2 -0
  102. package/docs/configure/app/output/enable-inline-route-manifests.md +2 -0
  103. package/docs/configure/app/output/externals.md +2 -0
  104. package/docs/configure/app/output/filename-hash.md +2 -0
  105. package/docs/configure/app/output/filename.md +2 -0
  106. package/docs/configure/app/output/inject-styles.md +2 -0
  107. package/docs/configure/app/output/inline-scripts.md +3 -2
  108. package/docs/configure/app/output/inline-styles.md +3 -2
  109. package/docs/configure/app/output/legal-comments.md +2 -0
  110. package/docs/configure/app/output/minify.md +2 -0
  111. package/docs/configure/app/output/override-browserslist.md +2 -0
  112. package/docs/configure/app/output/polyfill.md +2 -0
  113. package/docs/configure/app/output/source-map.md +2 -0
  114. package/docs/configure/app/output/split-route-chunks.md +3 -1
  115. package/docs/configure/app/output/ssg.md +2 -0
  116. package/docs/configure/app/output/ssgByEntries.md +2 -0
  117. package/docs/configure/app/output/svg-default-export.md +2 -0
  118. package/docs/configure/app/output/temp-dir.md +2 -0
  119. package/docs/configure/app/performance/build-cache.md +2 -0
  120. package/docs/configure/app/performance/chunk-split.md +3 -4
  121. package/docs/configure/app/performance/dns-prefetch.md +2 -0
  122. package/docs/configure/app/performance/preconnect.md +2 -0
  123. package/docs/configure/app/performance/prefetch.md +2 -0
  124. package/docs/configure/app/performance/preload.md +2 -0
  125. package/docs/configure/app/performance/print-file-size.md +2 -0
  126. package/docs/configure/app/performance/profile.md +2 -0
  127. package/docs/configure/app/performance/remove-console.md +2 -0
  128. package/docs/configure/app/performance/remove-moment-locale.md +2 -0
  129. package/docs/configure/app/plugins.md +2 -0
  130. package/docs/configure/app/resolve/alias-strategy.md +2 -0
  131. package/docs/configure/app/resolve/alias.md +2 -0
  132. package/docs/configure/app/resolve/condition-names.md +2 -0
  133. package/docs/configure/app/resolve/dedupe.md +2 -0
  134. package/docs/configure/app/resolve/extensions.md +2 -0
  135. package/docs/configure/app/runtime/0-intro.md +2 -0
  136. package/docs/configure/app/runtime/plugins.md +8 -4
  137. package/docs/configure/app/runtime/router.md +2 -0
  138. package/docs/configure/app/security/check-syntax.md +2 -0
  139. package/docs/configure/app/security/nonce.md +2 -0
  140. package/docs/configure/app/security/sri.md +2 -0
  141. package/docs/configure/app/server/base-url.md +2 -0
  142. package/docs/configure/app/server/port.md +2 -0
  143. package/docs/configure/app/server/public-routes.md +2 -0
  144. package/docs/configure/app/server/routes.md +2 -0
  145. package/docs/configure/app/server/rsc.md +2 -0
  146. package/docs/configure/app/server/ssr-by-entries.md +2 -0
  147. package/docs/configure/app/server/ssr.md +3 -1
  148. package/docs/configure/app/server/tsconfig-path.md +4 -2
  149. package/docs/configure/app/source/alias-strategy.md +2 -0
  150. package/docs/configure/app/source/alias.md +2 -0
  151. package/docs/configure/app/source/config-dir.md +2 -0
  152. package/docs/configure/app/source/decorators.md +2 -0
  153. package/docs/configure/app/source/define.md +2 -0
  154. package/docs/configure/app/source/disable-default-entries.md +2 -0
  155. package/docs/configure/app/source/enable-async-entry.md +2 -0
  156. package/docs/configure/app/source/enable-async-pre-entry.md +2 -0
  157. package/docs/configure/app/source/entries-dir.md +2 -0
  158. package/docs/configure/app/source/entries.md +2 -0
  159. package/docs/configure/app/source/exclude.md +2 -0
  160. package/docs/configure/app/source/global-vars.md +2 -0
  161. package/docs/configure/app/source/include.md +2 -0
  162. package/docs/configure/app/source/main-entry-name.md +2 -0
  163. package/docs/configure/app/source/pre-entry.md +2 -0
  164. package/docs/configure/app/source/react-compiler.md +2 -0
  165. package/docs/configure/app/source/transform-import.md +2 -0
  166. package/docs/configure/app/split-chunks.md +2 -0
  167. package/docs/configure/app/tools/autoprefixer.md +2 -0
  168. package/docs/configure/app/tools/bundler-chain.md +2 -0
  169. package/docs/configure/app/tools/css-extract.md +2 -0
  170. package/docs/configure/app/tools/css-loader.md +2 -0
  171. package/docs/configure/app/tools/dev-server.md +2 -0
  172. package/docs/configure/app/tools/html-plugin.md +2 -0
  173. package/docs/configure/app/tools/less.md +2 -0
  174. package/docs/configure/app/tools/lightningcss-loader.md +2 -0
  175. package/docs/configure/app/tools/minify-css.md +2 -0
  176. package/docs/configure/app/tools/postcss.md +2 -0
  177. package/docs/configure/app/tools/rspack.md +2 -0
  178. package/docs/configure/app/tools/sass.md +8 -6
  179. package/docs/configure/app/tools/style-loader.md +2 -0
  180. package/docs/configure/app/tools/svgr.md +2 -0
  181. package/docs/configure/app/tools/swc.md +2 -0
  182. package/docs/configure/app/tools/ts-checker.md +2 -0
  183. package/docs/configure/app/usage.md +3 -5
  184. package/docs/guides/advanced-features/bff/cross-project.md +6 -4
  185. package/docs/guides/advanced-features/bff/extend-server.md +2 -0
  186. package/docs/guides/advanced-features/bff/frameworks.md +2 -0
  187. package/docs/guides/advanced-features/bff/function.md +2 -0
  188. package/docs/guides/advanced-features/bff/operators.md +2 -0
  189. package/docs/guides/advanced-features/bff/sdk.md +2 -0
  190. package/docs/guides/advanced-features/bff/upload.md +2 -0
  191. package/docs/guides/advanced-features/bff.md +2 -0
  192. package/docs/guides/advanced-features/build-performance.md +2 -0
  193. package/docs/guides/advanced-features/compatibility.md +2 -0
  194. package/docs/guides/advanced-features/international/advanced.md +3 -1
  195. package/docs/guides/advanced-features/international/api.md +21 -13
  196. package/docs/guides/advanced-features/international/best-practices.md +17 -15
  197. package/docs/guides/advanced-features/international/configuration.md +3 -1
  198. package/docs/guides/advanced-features/international/locale-detection.md +15 -4
  199. package/docs/guides/advanced-features/international/quick-start.md +2 -0
  200. package/docs/guides/advanced-features/international/resource-loading.md +11 -7
  201. package/docs/guides/advanced-features/international/routing.md +5 -1
  202. package/docs/guides/advanced-features/international.md +2 -0
  203. package/docs/guides/advanced-features/low-level.md +2 -0
  204. package/docs/guides/advanced-features/page-performance/code-split.md +2 -0
  205. package/docs/guides/advanced-features/page-performance/inline-assets.md +2 -0
  206. package/docs/guides/advanced-features/page-performance/optimize-bundle.md +2 -0
  207. package/docs/guides/advanced-features/page-performance/react-compiler.md +2 -0
  208. package/docs/guides/advanced-features/server-monitor/logger.md +2 -0
  209. package/docs/guides/advanced-features/server-monitor/metrics.md +2 -0
  210. package/docs/guides/advanced-features/server-monitor/monitors.md +3 -3
  211. package/docs/guides/advanced-features/source-build.md +3 -1
  212. package/docs/guides/advanced-features/web-server.md +5 -3
  213. package/docs/guides/basic-features/alias.md +2 -0
  214. package/docs/guides/basic-features/css/css-in-js.md +2 -0
  215. package/docs/guides/basic-features/css/css-modules.md +2 -0
  216. package/docs/guides/basic-features/css/css.md +2 -0
  217. package/docs/guides/basic-features/css/tailwindcss.md +2 -0
  218. package/docs/guides/basic-features/data/data-cache.md +2 -0
  219. package/docs/guides/basic-features/data/data-fetch.md +3 -3
  220. package/docs/guides/basic-features/data/data-write.md +25 -28
  221. package/docs/guides/basic-features/debug/mock.md +4 -2
  222. package/docs/guides/basic-features/debug/proxy.md +2 -0
  223. package/docs/guides/basic-features/debug/rsdoctor.md +2 -0
  224. package/docs/guides/basic-features/debug/using-storybook.md +6 -4
  225. package/docs/guides/basic-features/deploy.md +2 -0
  226. package/docs/guides/basic-features/env-vars.md +2 -0
  227. package/docs/guides/basic-features/html.md +4 -3
  228. package/docs/guides/basic-features/output-files.md +3 -1
  229. package/docs/guides/basic-features/render/before-render.md +2 -0
  230. package/docs/guides/basic-features/render/overview.md +2 -0
  231. package/docs/guides/basic-features/render/rsc.md +12 -2
  232. package/docs/guides/basic-features/render/ssg.md +2 -0
  233. package/docs/guides/basic-features/render/ssr-cache.md +2 -0
  234. package/docs/guides/basic-features/render/ssr.md +10 -12
  235. package/docs/guides/basic-features/render/streaming-ssr.md +4 -1
  236. package/docs/guides/basic-features/routes/config-routes.md +54 -54
  237. package/docs/guides/basic-features/routes/routes.md +2 -0
  238. package/docs/guides/basic-features/static-assets/json-files.md +2 -0
  239. package/docs/guides/basic-features/static-assets/svg-assets.md +2 -0
  240. package/docs/guides/basic-features/static-assets/wasm-assets.md +2 -0
  241. package/docs/guides/basic-features/static-assets.md +2 -0
  242. package/docs/guides/basic-features/testing/playwright.md +8 -6
  243. package/docs/guides/basic-features/testing/rstest.md +7 -5
  244. package/docs/guides/concept/builder.md +2 -0
  245. package/docs/guides/concept/entries.md +2 -0
  246. package/docs/guides/concept/server.md +2 -0
  247. package/docs/guides/get-started/ai-coding-agents.md +5 -3
  248. package/docs/guides/get-started/glossary.md +2 -0
  249. package/docs/guides/get-started/introduction.md +2 -0
  250. package/docs/guides/get-started/quick-start.md +13 -5
  251. package/docs/guides/get-started/tech-stack.md +2 -0
  252. package/docs/guides/get-started/upgrade.md +2 -0
  253. package/docs/guides/topic-detail/module-federation/application.md +2 -0
  254. package/docs/guides/topic-detail/module-federation/deploy.md +4 -2
  255. package/docs/guides/topic-detail/module-federation/i18n.md +2 -0
  256. package/docs/guides/topic-detail/module-federation/introduce.md +2 -0
  257. package/docs/guides/topic-detail/module-federation/ssr.md +2 -0
  258. package/docs/guides/topic-detail/module-federation/usage.md +2 -0
  259. package/docs/guides/troubleshooting/builder.md +2 -0
  260. package/docs/guides/troubleshooting/cli.md +2 -0
  261. package/docs/guides/troubleshooting/dependencies.md +2 -0
  262. package/docs/guides/troubleshooting/hmr.md +2 -0
  263. package/docs/guides/upgrade/config.md +14 -0
  264. package/docs/guides/upgrade/entry.md +2 -0
  265. package/docs/guides/upgrade/other.md +2 -0
  266. package/docs/guides/upgrade/overview.md +2 -0
  267. package/docs/guides/upgrade/tailwindcss.md +2 -0
  268. package/docs/guides/upgrade/web-server.md +25 -6
  269. package/docs/index.md +2 -0
  270. package/docs/llms.txt +5 -5
  271. package/docs/plugin/cli-plugins/api.md +2 -0
  272. package/docs/plugin/cli-plugins/life-cycle.md +2 -0
  273. package/docs/plugin/introduction.md +2 -0
  274. package/docs/plugin/official/cli-plugins/plugin-bff.md +2 -0
  275. package/docs/plugin/official/cli-plugins/plugin-ssg.md +2 -0
  276. package/docs/plugin/official/cli-plugins/plugin-styled-components.md +2 -0
  277. package/docs/plugin/official/cli-plugins.md +2 -0
  278. package/docs/plugin/plugin-system.md +3 -3
  279. package/docs/plugin/runtime-plugins/api.md +2 -0
  280. package/docs/plugin/runtime-plugins/life-cycle.md +2 -0
  281. package/docs/plugin/server-plugins/api.md +2 -0
  282. package/docs/plugin/server-plugins/life-cycle.md +2 -0
  283. package/docs/tutorials/examples/csr-auth.md +2 -0
  284. package/docs/tutorials/foundations/introduction.md +2 -0
  285. package/lib/types.d.ts +0 -1
  286. package/package.json +16 -17
  287. package/{rslib.config.mts → rstack.config.mts} +4 -4
  288. package/dist/cjs/types/config/testing.js +0 -18
  289. package/dist/esm/types/config/testing.mjs +0 -0
  290. package/dist/esm-node/types/config/testing.mjs +0 -1
  291. package/dist/types/types/config/testing.d.ts +0 -8
@@ -35,9 +35,25 @@ class HtmlAsyncChunkPlugin {
35
35
  apply(compiler) {
36
36
  compiler.hooks.compilation.tap(this.name, (compilation)=>{
37
37
  const hooks = this.htmlPlugin.getCompilationHooks(compilation);
38
- hooks.alterAssetTagGroups.tap(this.name, (assets)=>{
38
+ const runtimeInEntry = false === compiler.options.optimization.runtimeChunk;
39
+ const getEntryRuntimeUrls = (publicPath)=>new Set([
40
+ ...compilation.entrypoints.values()
41
+ ].flatMap((entrypoint)=>[
42
+ ...entrypoint.getRuntimeChunk().files
43
+ ].flatMap((file)=>{
44
+ const pathname = file.split('?', 1)[0];
45
+ return [
46
+ `${publicPath}${pathname}`,
47
+ `${publicPath}${pathname.split('/').map(encodeURIComponent).join('/')}`
48
+ ];
49
+ })));
50
+ hooks.alterAssetTagGroups.tap({
51
+ name: this.name,
52
+ stage: -1
53
+ }, (assets)=>{
39
54
  const headTags = [];
40
55
  const bodyTags = [];
56
+ const entryRuntimeUrls = runtimeInEntry ? getEntryRuntimeUrls(assets.publicPath) : new Set();
41
57
  const processScriptTag = (tag)=>{
42
58
  const { attributes } = tag;
43
59
  if (attributes && true === attributes.defer) {
@@ -45,7 +61,7 @@ class HtmlAsyncChunkPlugin {
45
61
  delete attributes.defer;
46
62
  }
47
63
  const src = attributes?.src;
48
- const isRuntimeChunk = src && builder_namespaceObject.RUNTIME_CHUNK_REGEX.test(src);
64
+ const isRuntimeChunk = 'string' == typeof src && (runtimeInEntry ? entryRuntimeUrls.has(src.split(/[?#]/, 1)[0]) : builder_namespaceObject.RUNTIME_CHUNK_REGEX.test(src));
49
65
  return isRuntimeChunk ? bodyTags : headTags;
50
66
  };
51
67
  for (const tag of [
@@ -59,6 +75,42 @@ class HtmlAsyncChunkPlugin {
59
75
  bodyTags
60
76
  };
61
77
  });
78
+ if (runtimeInEntry) hooks.alterAssetTagGroups.tap({
79
+ name: this.name,
80
+ stage: 1
81
+ }, (assets)=>{
82
+ const entryRuntimeUrls = getEntryRuntimeUrls(assets.publicPath);
83
+ for (const tag of assets.bodyTags){
84
+ const src = tag.attributes?.src;
85
+ if ("script" !== tag.tagName || 'string' != typeof src || !entryRuntimeUrls.has(src.split(/[?#]/, 1)[0])) continue;
86
+ const attributes = {
87
+ rel: 'module' === tag.attributes.type ? 'modulepreload' : 'preload',
88
+ href: src,
89
+ ...'module' === tag.attributes.type ? {} : {
90
+ as: "script"
91
+ }
92
+ };
93
+ const resourceAttributes = [
94
+ 'crossorigin',
95
+ 'integrity',
96
+ 'referrerpolicy',
97
+ 'fetchpriority',
98
+ 'nonce'
99
+ ];
100
+ for (const key of resourceAttributes)if (void 0 !== tag.attributes[key]) attributes[key] = tag.attributes[key];
101
+ if (!assets.headTags.some((existing)=>'link' === existing.tagName && [
102
+ 'rel',
103
+ 'href',
104
+ 'as',
105
+ ...resourceAttributes
106
+ ].every((key)=>existing.attributes?.[key] === attributes[key]))) assets.headTags.push({
107
+ tagName: 'link',
108
+ voidTag: true,
109
+ attributes
110
+ });
111
+ }
112
+ return assets;
113
+ });
62
114
  });
63
115
  }
64
116
  constructor(htmlPlugin){
@@ -51,11 +51,6 @@ function getHookRunners(context) {
51
51
  const result = await hooks?.appendEntryCode.call(params);
52
52
  return result;
53
53
  },
54
- jestConfig: async (utils)=>{
55
- const result = await hooks?.jestConfig.call(utils, (utils)=>utils);
56
- return result;
57
- },
58
- afterTest: async ()=>hooks.afterTest.call(),
59
54
  config: async ()=>hooks.config.call(),
60
55
  resolvedConfig: (params)=>hooks.modifyResolvedConfig.call(params),
61
56
  htmlPartials: async (params)=>{
@@ -30,7 +30,6 @@ __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
31
  compatPlugin: ()=>compatPlugin
32
32
  });
33
- const plugin_namespaceObject = require("@modern-js/plugin");
34
33
  const external_hooks_js_namespaceObject = require("./hooks.js");
35
34
  const compatPlugin = ()=>({
36
35
  name: '@modern-js/app-tools-compat',
@@ -47,10 +46,6 @@ const compatPlugin = ()=>({
47
46
  useHookRunners: ()=>(0, external_hooks_js_namespaceObject.getHookRunners)(getInternalContext())
48
47
  };
49
48
  },
50
- registryHooks: {
51
- jestConfig: (0, plugin_namespaceObject.createAsyncHook)(),
52
- afterTest: (0, plugin_namespaceObject.createAsyncHook)()
53
- },
54
49
  setup: (api)=>{
55
50
  api.updateAppContext({
56
51
  toolsType: 'app-tools'
@@ -101,11 +101,6 @@ function transformHookParams(hookRunnerName, params) {
101
101
  entrypoint: params[0].entrypoint
102
102
  }
103
103
  };
104
- case 'jestConfig':
105
- return {
106
- isMultiple: true,
107
- params: params
108
- };
109
104
  default:
110
105
  return {
111
106
  isMultiple: false,
@@ -77,7 +77,6 @@ const initialize = ()=>({
77
77
  'html',
78
78
  'output',
79
79
  'tools',
80
- 'testing',
81
80
  'plugins',
82
81
  'builderPlugins',
83
82
  'deploy',
@@ -3,9 +3,25 @@ class HtmlAsyncChunkPlugin {
3
3
  apply(compiler) {
4
4
  compiler.hooks.compilation.tap(this.name, (compilation)=>{
5
5
  const hooks = this.htmlPlugin.getCompilationHooks(compilation);
6
- hooks.alterAssetTagGroups.tap(this.name, (assets)=>{
6
+ const runtimeInEntry = false === compiler.options.optimization.runtimeChunk;
7
+ const getEntryRuntimeUrls = (publicPath)=>new Set([
8
+ ...compilation.entrypoints.values()
9
+ ].flatMap((entrypoint)=>[
10
+ ...entrypoint.getRuntimeChunk().files
11
+ ].flatMap((file)=>{
12
+ const pathname = file.split('?', 1)[0];
13
+ return [
14
+ `${publicPath}${pathname}`,
15
+ `${publicPath}${pathname.split('/').map(encodeURIComponent).join('/')}`
16
+ ];
17
+ })));
18
+ hooks.alterAssetTagGroups.tap({
19
+ name: this.name,
20
+ stage: -1
21
+ }, (assets)=>{
7
22
  const headTags = [];
8
23
  const bodyTags = [];
24
+ const entryRuntimeUrls = runtimeInEntry ? getEntryRuntimeUrls(assets.publicPath) : new Set();
9
25
  const processScriptTag = (tag)=>{
10
26
  const { attributes } = tag;
11
27
  if (attributes && true === attributes.defer) {
@@ -13,7 +29,7 @@ class HtmlAsyncChunkPlugin {
13
29
  delete attributes.defer;
14
30
  }
15
31
  const src = attributes?.src;
16
- const isRuntimeChunk = src && RUNTIME_CHUNK_REGEX.test(src);
32
+ const isRuntimeChunk = 'string' == typeof src && (runtimeInEntry ? entryRuntimeUrls.has(src.split(/[?#]/, 1)[0]) : RUNTIME_CHUNK_REGEX.test(src));
17
33
  return isRuntimeChunk ? bodyTags : headTags;
18
34
  };
19
35
  for (const tag of [
@@ -27,6 +43,42 @@ class HtmlAsyncChunkPlugin {
27
43
  bodyTags
28
44
  };
29
45
  });
46
+ if (runtimeInEntry) hooks.alterAssetTagGroups.tap({
47
+ name: this.name,
48
+ stage: 1
49
+ }, (assets)=>{
50
+ const entryRuntimeUrls = getEntryRuntimeUrls(assets.publicPath);
51
+ for (const tag of assets.bodyTags){
52
+ const src = tag.attributes?.src;
53
+ if ("script" !== tag.tagName || 'string' != typeof src || !entryRuntimeUrls.has(src.split(/[?#]/, 1)[0])) continue;
54
+ const attributes = {
55
+ rel: 'module' === tag.attributes.type ? 'modulepreload' : 'preload',
56
+ href: src,
57
+ ...'module' === tag.attributes.type ? {} : {
58
+ as: "script"
59
+ }
60
+ };
61
+ const resourceAttributes = [
62
+ 'crossorigin',
63
+ 'integrity',
64
+ 'referrerpolicy',
65
+ 'fetchpriority',
66
+ 'nonce'
67
+ ];
68
+ for (const key of resourceAttributes)if (void 0 !== tag.attributes[key]) attributes[key] = tag.attributes[key];
69
+ if (!assets.headTags.some((existing)=>'link' === existing.tagName && [
70
+ 'rel',
71
+ 'href',
72
+ 'as',
73
+ ...resourceAttributes
74
+ ].every((key)=>existing.attributes?.[key] === attributes[key]))) assets.headTags.push({
75
+ tagName: 'link',
76
+ voidTag: true,
77
+ attributes
78
+ });
79
+ }
80
+ return assets;
81
+ });
30
82
  });
31
83
  }
32
84
  constructor(htmlPlugin){
@@ -18,11 +18,6 @@ function getHookRunners(context) {
18
18
  const result = await hooks?.appendEntryCode.call(params);
19
19
  return result;
20
20
  },
21
- jestConfig: async (utils)=>{
22
- const result = await hooks?.jestConfig.call(utils, (utils)=>utils);
23
- return result;
24
- },
25
- afterTest: async ()=>hooks.afterTest.call(),
26
21
  config: async ()=>hooks.config.call(),
27
22
  resolvedConfig: (params)=>hooks.modifyResolvedConfig.call(params),
28
23
  htmlPartials: async (params)=>{
@@ -1,4 +1,3 @@
1
- import { createAsyncHook } from "@modern-js/plugin";
2
1
  import { getHookRunners } from "./hooks.mjs";
3
2
  const compatPlugin = ()=>({
4
3
  name: '@modern-js/app-tools-compat',
@@ -15,10 +14,6 @@ const compatPlugin = ()=>({
15
14
  useHookRunners: ()=>getHookRunners(getInternalContext())
16
15
  };
17
16
  },
18
- registryHooks: {
19
- jestConfig: createAsyncHook(),
20
- afterTest: createAsyncHook()
21
- },
22
17
  setup: (api)=>{
23
18
  api.updateAppContext({
24
19
  toolsType: 'app-tools'
@@ -67,11 +67,6 @@ function transformHookParams(hookRunnerName, params) {
67
67
  entrypoint: params[0].entrypoint
68
68
  }
69
69
  };
70
- case 'jestConfig':
71
- return {
72
- isMultiple: true,
73
- params: params
74
- };
75
70
  default:
76
71
  return {
77
72
  isMultiple: false,
@@ -45,7 +45,6 @@ const initialize = ()=>({
45
45
  'html',
46
46
  'output',
47
47
  'tools',
48
- 'testing',
49
48
  'plugins',
50
49
  'builderPlugins',
51
50
  'deploy',
@@ -4,9 +4,25 @@ class HtmlAsyncChunkPlugin {
4
4
  apply(compiler) {
5
5
  compiler.hooks.compilation.tap(this.name, (compilation)=>{
6
6
  const hooks = this.htmlPlugin.getCompilationHooks(compilation);
7
- hooks.alterAssetTagGroups.tap(this.name, (assets)=>{
7
+ const runtimeInEntry = false === compiler.options.optimization.runtimeChunk;
8
+ const getEntryRuntimeUrls = (publicPath)=>new Set([
9
+ ...compilation.entrypoints.values()
10
+ ].flatMap((entrypoint)=>[
11
+ ...entrypoint.getRuntimeChunk().files
12
+ ].flatMap((file)=>{
13
+ const pathname = file.split('?', 1)[0];
14
+ return [
15
+ `${publicPath}${pathname}`,
16
+ `${publicPath}${pathname.split('/').map(encodeURIComponent).join('/')}`
17
+ ];
18
+ })));
19
+ hooks.alterAssetTagGroups.tap({
20
+ name: this.name,
21
+ stage: -1
22
+ }, (assets)=>{
8
23
  const headTags = [];
9
24
  const bodyTags = [];
25
+ const entryRuntimeUrls = runtimeInEntry ? getEntryRuntimeUrls(assets.publicPath) : new Set();
10
26
  const processScriptTag = (tag)=>{
11
27
  const { attributes } = tag;
12
28
  if (attributes && true === attributes.defer) {
@@ -14,7 +30,7 @@ class HtmlAsyncChunkPlugin {
14
30
  delete attributes.defer;
15
31
  }
16
32
  const src = attributes?.src;
17
- const isRuntimeChunk = src && RUNTIME_CHUNK_REGEX.test(src);
33
+ const isRuntimeChunk = 'string' == typeof src && (runtimeInEntry ? entryRuntimeUrls.has(src.split(/[?#]/, 1)[0]) : RUNTIME_CHUNK_REGEX.test(src));
18
34
  return isRuntimeChunk ? bodyTags : headTags;
19
35
  };
20
36
  for (const tag of [
@@ -28,6 +44,42 @@ class HtmlAsyncChunkPlugin {
28
44
  bodyTags
29
45
  };
30
46
  });
47
+ if (runtimeInEntry) hooks.alterAssetTagGroups.tap({
48
+ name: this.name,
49
+ stage: 1
50
+ }, (assets)=>{
51
+ const entryRuntimeUrls = getEntryRuntimeUrls(assets.publicPath);
52
+ for (const tag of assets.bodyTags){
53
+ const src = tag.attributes?.src;
54
+ if ("script" !== tag.tagName || 'string' != typeof src || !entryRuntimeUrls.has(src.split(/[?#]/, 1)[0])) continue;
55
+ const attributes = {
56
+ rel: 'module' === tag.attributes.type ? 'modulepreload' : 'preload',
57
+ href: src,
58
+ ...'module' === tag.attributes.type ? {} : {
59
+ as: "script"
60
+ }
61
+ };
62
+ const resourceAttributes = [
63
+ 'crossorigin',
64
+ 'integrity',
65
+ 'referrerpolicy',
66
+ 'fetchpriority',
67
+ 'nonce'
68
+ ];
69
+ for (const key of resourceAttributes)if (void 0 !== tag.attributes[key]) attributes[key] = tag.attributes[key];
70
+ if (!assets.headTags.some((existing)=>'link' === existing.tagName && [
71
+ 'rel',
72
+ 'href',
73
+ 'as',
74
+ ...resourceAttributes
75
+ ].every((key)=>existing.attributes?.[key] === attributes[key]))) assets.headTags.push({
76
+ tagName: 'link',
77
+ voidTag: true,
78
+ attributes
79
+ });
80
+ }
81
+ return assets;
82
+ });
31
83
  });
32
84
  }
33
85
  constructor(htmlPlugin){
@@ -19,11 +19,6 @@ function getHookRunners(context) {
19
19
  const result = await hooks?.appendEntryCode.call(params);
20
20
  return result;
21
21
  },
22
- jestConfig: async (utils)=>{
23
- const result = await hooks?.jestConfig.call(utils, (utils)=>utils);
24
- return result;
25
- },
26
- afterTest: async ()=>hooks.afterTest.call(),
27
22
  config: async ()=>hooks.config.call(),
28
23
  resolvedConfig: (params)=>hooks.modifyResolvedConfig.call(params),
29
24
  htmlPartials: async (params)=>{
@@ -1,5 +1,4 @@
1
1
  import "node:module";
2
- import { createAsyncHook } from "@modern-js/plugin";
3
2
  import { getHookRunners } from "./hooks.mjs";
4
3
  const compatPlugin = ()=>({
5
4
  name: '@modern-js/app-tools-compat',
@@ -16,10 +15,6 @@ const compatPlugin = ()=>({
16
15
  useHookRunners: ()=>getHookRunners(getInternalContext())
17
16
  };
18
17
  },
19
- registryHooks: {
20
- jestConfig: createAsyncHook(),
21
- afterTest: createAsyncHook()
22
- },
23
18
  setup: (api)=>{
24
19
  api.updateAppContext({
25
20
  toolsType: 'app-tools'
@@ -68,11 +68,6 @@ function transformHookParams(hookRunnerName, params) {
68
68
  entrypoint: params[0].entrypoint
69
69
  }
70
70
  };
71
- case 'jestConfig':
72
- return {
73
- isMultiple: true,
74
- params: params
75
- };
76
71
  default:
77
72
  return {
78
73
  isMultiple: false,
@@ -46,7 +46,6 @@ const initialize = ()=>({
46
46
  'html',
47
47
  'output',
48
48
  'tools',
49
- 'testing',
50
49
  'plugins',
51
50
  'builderPlugins',
52
51
  'deploy',
@@ -12,7 +12,6 @@ import type { PerformanceUserConfig } from './performance.js';
12
12
  import type { ResolveUserConfig } from './resolve.js';
13
13
  import type { SecurityUserConfig } from './security.js';
14
14
  import type { SourceUserConfig } from './source.js';
15
- import type { TestingUserConfig } from './testing.js';
16
15
  import type { ToolsUserConfig } from './tools.js';
17
16
  export * from './output.js';
18
17
  export interface AppToolsUserConfig {
@@ -32,7 +31,6 @@ export interface AppToolsUserConfig {
32
31
  html?: HtmlUserConfig;
33
32
  tools?: ToolsUserConfig;
34
33
  security?: SecurityUserConfig;
35
- testing?: TestingUserConfig;
36
34
  builderPlugins?: RsbuildPlugins;
37
35
  performance?: PerformanceUserConfig;
38
36
  environments?: RsbuildConfig['environments'];
@@ -1,15 +1,7 @@
1
1
  import type { BuilderConfig } from '@modern-js/builder';
2
- import type { JestConfig } from '@modern-js/types';
3
2
  import type { UnwrapBuilderConfig } from '../utils.js';
4
3
  type BuilderToolsConfig = UnwrapBuilderConfig<BuilderConfig, 'tools'>;
5
4
  export interface ToolsUserConfig extends Omit<BuilderToolsConfig, 'swc'> {
6
- /**
7
- * Used to custom Jest configurations.
8
- * @requires `test` plugin.
9
- * The configuration of `tools.jest` is provided by `test` plugin.
10
- * Please use `yarn new` or `pnpm new` to enable the corresponding capability.
11
- */
12
- jest?: JestConfig | ((jestConfig: JestConfig) => JestConfig);
13
5
  /**
14
6
  * Used to custom SWC configurations.
15
7
  * @requires `swc` plugin.
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # Commands
2
4
 
3
5
  Modern.js has some built-in commands that can help you quickly start a development server, build production environment code, and more.
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # lambda/\*.ts
2
4
 
3
5
  After enabling BFF, the files under the `lambda/` directory will be registered as BFF routes according to conventions.
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # Favicon
2
4
 
3
5
  When there is a `favicon.*` file in the `config` directory at the root of the project, Modern.js will automatically set the file to the [html.favicon](/configure/app/html/favicon.md) configuration option for generating the favicon icon on the page:
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # html/
2
4
 
3
5
  You can inject custom HTML fragments at different locations of the default internal HTML template through the `config/html` directory.
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # Apple Touch Icon
2
4
 
3
5
  When there is an `icon.*` file in the `config` directory at the root of the project, Modern.js will automatically set the file to the [html.appIcon](/configure/app/html/app-icon.md) configuration option for generating the Apple Touch Icon icon under the iOS system.
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # mock/
2
4
 
3
5
  When there is a `config/mock/index.ts` or `config/mock/index.js` file in the
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # public/
2
4
 
3
5
  Any static assets can be placed in the `public/` directory, and the files will be deployed to the corresponding application domain by the server.
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # upload/
2
4
 
3
5
  Any static assets can be placed in the `upload/` directory.
@@ -26,9 +28,7 @@ In React components, you can add this prefix through [Environment Variables](/gu
26
28
 
27
29
  ```tsx
28
30
  export default () => {
29
- return (
30
- <img src={`${process.env.ASSET_PREFIX}/upload/banner.png`}></img>
31
- );
31
+ return <img src={`${process.env.ASSET_PREFIX}/upload/banner.png`}></img>;
32
32
  };
33
33
  ```
34
34
 
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # modern.config.ts
2
4
 
3
5
  The Modern.js configuration file. Through this file, you can personalize the configuration of various aspects of the current project.
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # modern.server.ts
2
4
 
3
5
  This file extends the Modern.js Server. In this file, you can configure [Middleware](/guides/advanced-features/web-server.md#middleware), [RenderMiddleware](/guides/advanced-features/web-server.md#rendermiddleware), or [Plugin](/guides/advanced-features/web-server.md#plugin) for the Server that starts with the Modern.js project.
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # shared/
2
4
 
3
5
  Shared source code directory. When there is common code in `api/`, `server/`, and `src/` in the project, you can put these codes in the `shared` directory instead of directly referencing them.
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # App.tsx
2
4
 
3
5
  The entry identifier when using [Self-controlled Routing](/guides/concept/entries.md#self-controlled-routing) in the application.
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # entry.tsx
2
4
 
3
5
  Normally, the [`routes/`](/apis/app/hooks/src/routes.md) and [`App.tsx`](/apis/app/hooks/src/app.md) hook files can meet our needs. When we need to add custom behavior before component rendering or take full control of the Rspack packaging entry, we can create `entry.ts` file in the src or entry directory. Here are two cases for discussion。
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # entry.server.tsx
2
4
 
3
5
  When the project initiates `server.ssr`, Modern.js generates a default Server-Side entry. The sample code is as follows:
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # modern.runtime.ts
2
4
 
3
5
  The Modern.js Runtime configuration file allows for personalized configuration of the Runtime capabilities for the current project.
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # routes/
2
4
 
3
5
  The identifier for the entry point when the application uses [Conventional Routing](/guides/basic-features/routes/routes.md#conventional-routing).
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # \*.\[server|node].tsx
2
4
 
3
5
  Used in the application project to place server-side code. When `*.tsx` and `*.[server|node].tsx` coexist, SSR will prefer to use the `*.[server|node].tsx` file instead of the `*.tsx` file when rendering on the server.
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # useHonoContext
2
4
 
3
5
  Used to obtain Hono context in an integrated BFF function.
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # createRoot
2
4
 
3
5
  It is used to create the root component provided by Modern.js, which will automatically register Runtime plugins and complete the initialization of Runtime plugins.
@@ -11,7 +13,9 @@ import { createRoot } from '@modern-js/runtime/react';
11
13
  ## Function Signature
12
14
 
13
15
  ```ts
14
- export function createRoot(UserApp?: React.ComponentType | null): React.ComponentType<any>;
16
+ export function createRoot(
17
+ UserApp?: React.ComponentType | null,
18
+ ): React.ComponentType<any>;
15
19
  ```
16
20
 
17
21
  ### Parameters
@@ -1,3 +1,5 @@
1
+ > For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt.
2
+
1
3
  # render
2
4
 
3
5
  It is used to render project components.
@@ -13,7 +15,10 @@ render(<ModernRoot />);
13
15
  ## Function Signature
14
16
 
15
17
  ```ts
16
- export function render(App: React.ReactElement, id?: HTMLElement | string): Promise<any>;
18
+ export function render(
19
+ App: React.ReactElement,
20
+ id?: HTMLElement | string,
21
+ ): Promise<any>;
17
22
  ```
18
23
 
19
24
  ### Parameters
@@ -30,7 +35,7 @@ import { render } from '@modern-js/runtime/browser';
30
35
  const ModernRoot = createRoot();
31
36
 
32
37
  async function beforeRender() {
33
- // todo
38
+ // todo
34
39
  }
35
40
 
36
41
  beforeRender().then(() => {