@modern-js/app-tools 2.4.0 → 2.5.0-alpha.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 (276) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/dist/cjs/analyze/constants.js +100 -0
  3. package/dist/cjs/analyze/generateCode.js +251 -0
  4. package/dist/cjs/analyze/getBundleEntry.js +101 -0
  5. package/dist/cjs/analyze/getClientRoutes/getRoutes.js +225 -0
  6. package/dist/cjs/analyze/getClientRoutes/getRoutesLegacy.js +221 -0
  7. package/dist/cjs/analyze/getClientRoutes/index.js +30 -0
  8. package/dist/cjs/analyze/getClientRoutes/utils.js +58 -0
  9. package/dist/cjs/analyze/getFileSystemEntry.js +131 -0
  10. package/dist/cjs/analyze/getHtmlTemplate.js +124 -0
  11. package/dist/cjs/analyze/getServerRoutes.js +174 -0
  12. package/dist/cjs/analyze/index.js +294 -0
  13. package/dist/cjs/analyze/isDefaultExportFunction.js +71 -0
  14. package/dist/cjs/analyze/makeLegalIdentifier.js +36 -0
  15. package/dist/cjs/analyze/nestedRoutes.js +179 -0
  16. package/dist/cjs/analyze/templates.js +330 -0
  17. package/dist/cjs/analyze/utils.js +152 -0
  18. package/dist/cjs/builder/builder-rspack/index.js +31 -0
  19. package/dist/cjs/builder/builder-webpack/builderPlugins/compatModern.js +64 -0
  20. package/dist/cjs/builder/builder-webpack/index.js +78 -0
  21. package/dist/cjs/builder/builder-webpack/webpackPlugins/RouterPlugin.js +120 -0
  22. package/dist/cjs/builder/builder-webpack/webpackPlugins/index.js +17 -0
  23. package/dist/cjs/builder/generator/createBuilderOptions.js +47 -0
  24. package/dist/cjs/builder/generator/createBuilderProviderConfig.js +49 -0
  25. package/dist/cjs/builder/generator/getBuilderTargets.js +39 -0
  26. package/dist/cjs/builder/generator/index.js +58 -0
  27. package/dist/cjs/builder/index.js +46 -0
  28. package/dist/cjs/builder/shared/builderPlugins/adapterModern.js +230 -0
  29. package/dist/cjs/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.js +50 -0
  30. package/dist/cjs/builder/shared/bundlerPlugins/HtmlBottomTemplate.js +57 -0
  31. package/dist/cjs/builder/shared/createCopyPattern.js +75 -0
  32. package/dist/cjs/builder/shared/index.js +19 -0
  33. package/dist/cjs/builder/shared/loaders/serverModuleLoader.js +28 -0
  34. package/dist/cjs/builder/shared/types.js +15 -0
  35. package/dist/cjs/commands/build.js +75 -0
  36. package/dist/cjs/commands/deploy.js +31 -0
  37. package/dist/cjs/commands/dev.js +91 -0
  38. package/dist/cjs/commands/index.js +19 -0
  39. package/dist/cjs/commands/inspect.js +41 -0
  40. package/dist/cjs/commands/serve.js +63 -0
  41. package/dist/cjs/config/default.js +186 -0
  42. package/dist/cjs/config/index.js +19 -0
  43. package/dist/cjs/config/initialize/index.js +35 -0
  44. package/dist/cjs/config/initialize/inits.js +161 -0
  45. package/dist/cjs/config/legacy/createHtmlConfig.js +58 -0
  46. package/dist/cjs/config/legacy/createOutputConfig.js +91 -0
  47. package/dist/cjs/config/legacy/createSourceConfig.js +62 -0
  48. package/dist/cjs/config/legacy/createToolsConfig.js +65 -0
  49. package/dist/cjs/config/legacy/index.js +75 -0
  50. package/dist/cjs/defineConfig.js +33 -0
  51. package/dist/cjs/exports/server.js +27 -0
  52. package/dist/cjs/hooks.js +54 -0
  53. package/dist/cjs/index.js +198 -0
  54. package/dist/cjs/initialize/index.js +102 -0
  55. package/dist/cjs/locale/en.js +59 -0
  56. package/dist/cjs/locale/index.js +33 -0
  57. package/dist/cjs/locale/zh.js +59 -0
  58. package/dist/cjs/schema/Schema.js +63 -0
  59. package/dist/cjs/schema/index.js +118 -0
  60. package/dist/cjs/schema/legacy.js +169 -0
  61. package/dist/cjs/types/config/deploy.js +15 -0
  62. package/dist/cjs/types/config/dev.js +15 -0
  63. package/dist/cjs/types/config/experiments.js +15 -0
  64. package/dist/cjs/types/config/html.js +15 -0
  65. package/dist/cjs/types/config/index.js +17 -0
  66. package/dist/cjs/types/config/output.js +15 -0
  67. package/dist/cjs/types/config/performance.js +15 -0
  68. package/dist/cjs/types/config/security.js +15 -0
  69. package/dist/cjs/types/config/source.js +15 -0
  70. package/dist/cjs/types/config/tools.js +15 -0
  71. package/dist/cjs/types/hooks.js +15 -0
  72. package/dist/cjs/types/index.js +19 -0
  73. package/dist/cjs/types/legacyConfig/deploy.js +15 -0
  74. package/dist/cjs/types/legacyConfig/dev.js +15 -0
  75. package/dist/cjs/types/legacyConfig/index.js +15 -0
  76. package/dist/cjs/types/legacyConfig/output.js +15 -0
  77. package/dist/cjs/types/legacyConfig/source.js +15 -0
  78. package/dist/cjs/types/legacyConfig/tools.js +15 -0
  79. package/dist/cjs/types/utils.js +15 -0
  80. package/dist/cjs/utils/config.js +115 -0
  81. package/dist/cjs/utils/createServer.js +70 -0
  82. package/dist/cjs/utils/env.js +38 -0
  83. package/dist/cjs/utils/generateWatchFiles.js +63 -0
  84. package/dist/cjs/utils/getSelectedEntries.js +61 -0
  85. package/dist/cjs/utils/getServerInternalPlugins.js +41 -0
  86. package/dist/cjs/utils/language.js +31 -0
  87. package/dist/cjs/utils/printInstructions.js +34 -0
  88. package/dist/cjs/utils/restart.js +45 -0
  89. package/dist/cjs/utils/routes.js +39 -0
  90. package/dist/cjs/utils/types.js +15 -0
  91. package/dist/esm/analyze/constants.js +42 -0
  92. package/dist/esm/analyze/generateCode.js +486 -0
  93. package/dist/esm/analyze/getBundleEntry.js +64 -0
  94. package/dist/esm/analyze/getClientRoutes/getRoutes.js +233 -0
  95. package/dist/esm/analyze/getClientRoutes/getRoutesLegacy.js +231 -0
  96. package/dist/esm/analyze/getClientRoutes/index.js +3 -0
  97. package/dist/esm/analyze/getClientRoutes/utils.js +23 -0
  98. package/dist/esm/analyze/getFileSystemEntry.js +107 -0
  99. package/dist/esm/analyze/getHtmlTemplate.js +302 -0
  100. package/dist/esm/analyze/getServerRoutes.js +224 -0
  101. package/dist/esm/analyze/index.js +703 -0
  102. package/dist/esm/analyze/isDefaultExportFunction.js +47 -0
  103. package/dist/esm/analyze/makeLegalIdentifier.js +13 -0
  104. package/dist/esm/analyze/nestedRoutes.js +409 -0
  105. package/dist/esm/analyze/templates.js +466 -0
  106. package/dist/esm/analyze/utils.js +374 -0
  107. package/dist/esm/builder/builder-rspack/index.js +6 -0
  108. package/dist/esm/builder/builder-webpack/builderPlugins/compatModern.js +64 -0
  109. package/dist/esm/builder/builder-webpack/index.js +301 -0
  110. package/dist/esm/builder/builder-webpack/webpackPlugins/RouterPlugin.js +346 -0
  111. package/dist/esm/builder/builder-webpack/webpackPlugins/index.js +1 -0
  112. package/dist/esm/builder/generator/createBuilderOptions.js +41 -0
  113. package/dist/esm/builder/generator/createBuilderProviderConfig.js +70 -0
  114. package/dist/esm/builder/generator/getBuilderTargets.js +16 -0
  115. package/dist/esm/builder/generator/index.js +199 -0
  116. package/dist/esm/builder/index.js +175 -0
  117. package/dist/esm/builder/shared/builderPlugins/adapterModern.js +300 -0
  118. package/dist/esm/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.js +110 -0
  119. package/dist/esm/builder/shared/bundlerPlugins/HtmlBottomTemplate.js +72 -0
  120. package/dist/esm/builder/shared/createCopyPattern.js +40 -0
  121. package/dist/esm/builder/shared/index.js +3 -0
  122. package/dist/esm/builder/shared/loaders/serverModuleLoader.js +5 -0
  123. package/dist/esm/builder/shared/types.js +1 -0
  124. package/dist/esm/commands/build.js +291 -0
  125. package/dist/esm/commands/deploy.js +154 -0
  126. package/dist/esm/commands/dev.js +301 -0
  127. package/dist/esm/commands/index.js +3 -0
  128. package/dist/esm/commands/inspect.js +149 -0
  129. package/dist/esm/commands/serve.js +199 -0
  130. package/dist/esm/config/default.js +210 -0
  131. package/dist/esm/config/index.js +3 -0
  132. package/dist/esm/config/initialize/index.js +10 -0
  133. package/dist/esm/config/initialize/inits.js +211 -0
  134. package/dist/esm/config/legacy/createHtmlConfig.js +19 -0
  135. package/dist/esm/config/legacy/createOutputConfig.js +41 -0
  136. package/dist/esm/config/legacy/createSourceConfig.js +42 -0
  137. package/dist/esm/config/legacy/createToolsConfig.js +23 -0
  138. package/dist/esm/config/legacy/index.js +38 -0
  139. package/dist/esm/defineConfig.js +61 -0
  140. package/dist/esm/exports/server.js +2 -0
  141. package/dist/esm/hooks.js +29 -0
  142. package/dist/esm/index.js +713 -0
  143. package/dist/esm/initialize/index.js +284 -0
  144. package/dist/esm/locale/en.js +38 -0
  145. package/dist/esm/locale/index.js +9 -0
  146. package/dist/esm/locale/zh.js +38 -0
  147. package/dist/esm/schema/Schema.js +273 -0
  148. package/dist/esm/schema/index.js +181 -0
  149. package/dist/esm/schema/legacy.js +337 -0
  150. package/dist/esm/types/config/deploy.js +1 -0
  151. package/dist/esm/types/config/dev.js +1 -0
  152. package/dist/esm/types/config/experiments.js +1 -0
  153. package/dist/esm/types/config/html.js +1 -0
  154. package/dist/esm/types/config/index.js +1 -0
  155. package/dist/esm/types/config/output.js +1 -0
  156. package/dist/esm/types/config/performance.js +1 -0
  157. package/dist/esm/types/config/security.js +1 -0
  158. package/dist/esm/types/config/source.js +1 -0
  159. package/dist/esm/types/config/tools.js +1 -0
  160. package/dist/esm/types/hooks.js +1 -0
  161. package/dist/esm/types/index.js +3 -0
  162. package/dist/esm/types/legacyConfig/deploy.js +1 -0
  163. package/dist/esm/types/legacyConfig/dev.js +1 -0
  164. package/dist/esm/types/legacyConfig/index.js +1 -0
  165. package/dist/esm/types/legacyConfig/output.js +1 -0
  166. package/dist/esm/types/legacyConfig/source.js +1 -0
  167. package/dist/esm/types/legacyConfig/tools.js +1 -0
  168. package/dist/esm/types/utils.js +1 -0
  169. package/dist/esm/utils/config.js +302 -0
  170. package/dist/esm/utils/createServer.js +258 -0
  171. package/dist/esm/utils/env.js +13 -0
  172. package/dist/esm/utils/generateWatchFiles.js +214 -0
  173. package/dist/esm/utils/getSelectedEntries.js +186 -0
  174. package/dist/esm/utils/getServerInternalPlugins.js +210 -0
  175. package/dist/esm/utils/language.js +6 -0
  176. package/dist/esm/utils/printInstructions.js +152 -0
  177. package/dist/esm/utils/restart.js +187 -0
  178. package/dist/esm/utils/routes.js +153 -0
  179. package/dist/esm/utils/types.js +1 -0
  180. package/dist/esm-node/analyze/constants.js +56 -0
  181. package/dist/esm-node/analyze/generateCode.js +227 -0
  182. package/dist/esm-node/analyze/getBundleEntry.js +77 -0
  183. package/dist/esm-node/analyze/getClientRoutes/getRoutes.js +201 -0
  184. package/dist/esm-node/analyze/getClientRoutes/getRoutesLegacy.js +197 -0
  185. package/dist/esm-node/analyze/getClientRoutes/index.js +6 -0
  186. package/dist/esm-node/analyze/getClientRoutes/utils.js +31 -0
  187. package/dist/esm-node/analyze/getFileSystemEntry.js +109 -0
  188. package/dist/esm-node/analyze/getHtmlTemplate.js +95 -0
  189. package/dist/esm-node/analyze/getServerRoutes.js +154 -0
  190. package/dist/esm-node/analyze/index.js +285 -0
  191. package/dist/esm-node/analyze/isDefaultExportFunction.js +42 -0
  192. package/dist/esm-node/analyze/makeLegalIdentifier.js +13 -0
  193. package/dist/esm-node/analyze/nestedRoutes.js +150 -0
  194. package/dist/esm-node/analyze/templates.js +297 -0
  195. package/dist/esm-node/analyze/utils.js +121 -0
  196. package/dist/esm-node/builder/builder-rspack/index.js +8 -0
  197. package/dist/esm-node/builder/builder-webpack/builderPlugins/compatModern.js +41 -0
  198. package/dist/esm-node/builder/builder-webpack/index.js +51 -0
  199. package/dist/esm-node/builder/builder-webpack/webpackPlugins/RouterPlugin.js +96 -0
  200. package/dist/esm-node/builder/builder-webpack/webpackPlugins/index.js +1 -0
  201. package/dist/esm-node/builder/generator/createBuilderOptions.js +24 -0
  202. package/dist/esm-node/builder/generator/createBuilderProviderConfig.js +26 -0
  203. package/dist/esm-node/builder/generator/getBuilderTargets.js +21 -0
  204. package/dist/esm-node/builder/generator/index.js +29 -0
  205. package/dist/esm-node/builder/index.js +17 -0
  206. package/dist/esm-node/builder/shared/builderPlugins/adapterModern.js +202 -0
  207. package/dist/esm-node/builder/shared/bundlerPlugins/HtmlAsyncChunkPlugin.js +27 -0
  208. package/dist/esm-node/builder/shared/bundlerPlugins/HtmlBottomTemplate.js +34 -0
  209. package/dist/esm-node/builder/shared/createCopyPattern.js +46 -0
  210. package/dist/esm-node/builder/shared/index.js +3 -0
  211. package/dist/esm-node/builder/shared/loaders/serverModuleLoader.js +7 -0
  212. package/dist/esm-node/builder/shared/types.js +0 -0
  213. package/dist/esm-node/commands/build.js +52 -0
  214. package/dist/esm-node/commands/deploy.js +8 -0
  215. package/dist/esm-node/commands/dev.js +72 -0
  216. package/dist/esm-node/commands/index.js +3 -0
  217. package/dist/esm-node/commands/inspect.js +18 -0
  218. package/dist/esm-node/commands/serve.js +34 -0
  219. package/dist/esm-node/config/default.js +162 -0
  220. package/dist/esm-node/config/index.js +3 -0
  221. package/dist/esm-node/config/initialize/index.js +12 -0
  222. package/dist/esm-node/config/initialize/inits.js +136 -0
  223. package/dist/esm-node/config/legacy/createHtmlConfig.js +35 -0
  224. package/dist/esm-node/config/legacy/createOutputConfig.js +68 -0
  225. package/dist/esm-node/config/legacy/createSourceConfig.js +39 -0
  226. package/dist/esm-node/config/legacy/createToolsConfig.js +42 -0
  227. package/dist/esm-node/config/legacy/index.js +51 -0
  228. package/dist/esm-node/defineConfig.js +9 -0
  229. package/dist/esm-node/exports/server.js +4 -0
  230. package/dist/esm-node/hooks.js +35 -0
  231. package/dist/esm-node/index.js +172 -0
  232. package/dist/esm-node/initialize/index.js +91 -0
  233. package/dist/esm-node/locale/en.js +36 -0
  234. package/dist/esm-node/locale/index.js +9 -0
  235. package/dist/esm-node/locale/zh.js +36 -0
  236. package/dist/esm-node/schema/Schema.js +40 -0
  237. package/dist/esm-node/schema/index.js +88 -0
  238. package/dist/esm-node/schema/legacy.js +148 -0
  239. package/dist/esm-node/types/config/deploy.js +0 -0
  240. package/dist/esm-node/types/config/dev.js +0 -0
  241. package/dist/esm-node/types/config/experiments.js +0 -0
  242. package/dist/esm-node/types/config/html.js +0 -0
  243. package/dist/esm-node/types/config/index.js +1 -0
  244. package/dist/esm-node/types/config/output.js +0 -0
  245. package/dist/esm-node/types/config/performance.js +0 -0
  246. package/dist/esm-node/types/config/security.js +0 -0
  247. package/dist/esm-node/types/config/source.js +0 -0
  248. package/dist/esm-node/types/config/tools.js +0 -0
  249. package/dist/esm-node/types/hooks.js +0 -0
  250. package/dist/esm-node/types/index.js +3 -0
  251. package/dist/esm-node/types/legacyConfig/deploy.js +0 -0
  252. package/dist/esm-node/types/legacyConfig/dev.js +0 -0
  253. package/dist/esm-node/types/legacyConfig/index.js +0 -0
  254. package/dist/esm-node/types/legacyConfig/output.js +0 -0
  255. package/dist/esm-node/types/legacyConfig/source.js +0 -0
  256. package/dist/esm-node/types/legacyConfig/tools.js +0 -0
  257. package/dist/esm-node/types/utils.js +0 -0
  258. package/dist/esm-node/utils/config.js +88 -0
  259. package/dist/esm-node/utils/createServer.js +37 -0
  260. package/dist/esm-node/utils/env.js +15 -0
  261. package/dist/esm-node/utils/generateWatchFiles.js +33 -0
  262. package/dist/esm-node/utils/getSelectedEntries.js +38 -0
  263. package/dist/esm-node/utils/getServerInternalPlugins.js +18 -0
  264. package/dist/esm-node/utils/language.js +8 -0
  265. package/dist/esm-node/utils/printInstructions.js +11 -0
  266. package/dist/esm-node/utils/restart.js +22 -0
  267. package/dist/esm-node/utils/routes.js +10 -0
  268. package/dist/esm-node/utils/types.js +0 -0
  269. package/dist/js/modern/analyze/nestedRoutes.js +1 -10
  270. package/dist/js/node/analyze/nestedRoutes.js +1 -10
  271. package/dist/js/treeshaking/analyze/nestedRoutes.js +1 -10
  272. package/dist/types/analyze/templates.d.ts +3 -1
  273. package/dist/types/types/config/tools.d.ts +1 -1
  274. package/dist/types/types/hooks.d.ts +5 -4
  275. package/dist/types/types/index.d.ts +3 -1
  276. package/package.json +30 -31
@@ -0,0 +1,51 @@
1
+ import {
2
+ builderWebpackProvider
3
+ } from "@modern-js/builder-webpack-provider";
4
+ import { applyOptionsChain } from "@modern-js/utils";
5
+ import { createCopyPattern } from "../shared";
6
+ import { generateBuilder } from "../generator";
7
+ import { PluginCompatModern } from "./builderPlugins/compatModern";
8
+ function createWebpackBuilderForModern(options) {
9
+ return generateBuilder(options, builderWebpackProvider, {
10
+ modifyBuilderConfig(config) {
11
+ modifyOutputConfig(config, options.appContext);
12
+ },
13
+ async modifyBuilderInstance(builder) {
14
+ await applyBuilderPlugins(builder, options);
15
+ }
16
+ });
17
+ }
18
+ function modifyOutputConfig(config, appContext) {
19
+ config.output = createOutputConfig(config, appContext);
20
+ function createOutputConfig(config2, appContext2) {
21
+ const defaultCopyPattern = createCopyPattern(appContext2, config2, "upload");
22
+ const { copy } = config2.output;
23
+ const copyOptions = Array.isArray(copy) ? copy : copy == null ? void 0 : copy.patterns;
24
+ const builderCopy = [...copyOptions || [], defaultCopyPattern];
25
+ return {
26
+ ...config2.output,
27
+ copy: builderCopy
28
+ };
29
+ }
30
+ }
31
+ async function applyBuilderPlugins(builder, options) {
32
+ const { normalizedConfig } = options;
33
+ if (!normalizedConfig.output.disableNodePolyfill) {
34
+ const { PluginNodePolyfill } = await import("@modern-js/builder-plugin-node-polyfill");
35
+ builder.addPlugins([PluginNodePolyfill()]);
36
+ }
37
+ if (normalizedConfig.tools.esbuild) {
38
+ const { esbuild: esbuildOptions } = normalizedConfig.tools;
39
+ const { PluginEsbuild } = await import("@modern-js/builder-plugin-esbuild");
40
+ builder.addPlugins([
41
+ PluginEsbuild({
42
+ loader: false,
43
+ minimize: applyOptionsChain({}, esbuildOptions)
44
+ })
45
+ ]);
46
+ }
47
+ builder.addPlugins([PluginCompatModern(options)]);
48
+ }
49
+ export {
50
+ createWebpackBuilderForModern
51
+ };
@@ -0,0 +1,96 @@
1
+ import path from "path";
2
+ import {
3
+ fs,
4
+ ROUTE_MANIFEST,
5
+ logger,
6
+ ROUTE_MINIFEST_FILE
7
+ } from "@modern-js/utils";
8
+ const PLUGIN_NAME = "ModernjsRoutePlugin";
9
+ class RouterPlugin {
10
+ apply(compiler) {
11
+ const { target } = compiler.options;
12
+ if (target === "node" || Array.isArray(target) && target.includes("node")) {
13
+ return;
14
+ }
15
+ if (target === "webworker" || Array.isArray(target) && target.includes("webworker")) {
16
+ return;
17
+ }
18
+ const { webpack } = compiler;
19
+ const { Compilation, sources } = webpack;
20
+ const { RawSource } = sources;
21
+ const { PROCESS_ASSETS_STAGE_REPORT } = Compilation;
22
+ const outputPath = compiler.options.output.path;
23
+ const newAssetsMap = /* @__PURE__ */ new Map();
24
+ const normalizePath = (path2) => {
25
+ if (!path2.endsWith("/")) {
26
+ return `${path2}/`;
27
+ }
28
+ return path2;
29
+ };
30
+ compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
31
+ compilation.hooks.processAssets.tapPromise(
32
+ {
33
+ name: PLUGIN_NAME,
34
+ stage: PROCESS_ASSETS_STAGE_REPORT
35
+ },
36
+ async () => {
37
+ const stats = compilation.getStats().toJson({
38
+ chunkGroups: true,
39
+ chunks: true
40
+ });
41
+ const { publicPath } = stats;
42
+ const routeAssets = {};
43
+ const { namedChunkGroups, assetsByChunkName } = stats;
44
+ if (!namedChunkGroups || !assetsByChunkName) {
45
+ logger.warn(
46
+ "Route manifest does not exist, performance will be affected"
47
+ );
48
+ return;
49
+ }
50
+ for (const [name, chunkGroup] of Object.entries(namedChunkGroups)) {
51
+ if (assetsByChunkName[name]) {
52
+ routeAssets[name] = {
53
+ chunkIds: chunkGroup.chunks,
54
+ assets: assetsByChunkName[name].map(
55
+ (item) => publicPath ? normalizePath(publicPath) + item : item
56
+ )
57
+ };
58
+ }
59
+ }
60
+ const manifest = {
61
+ routeAssets
62
+ };
63
+ const injectedContent = `
64
+ ;(function(){
65
+ window.${ROUTE_MANIFEST} = ${JSON.stringify(manifest)};
66
+ })();
67
+ `;
68
+ const entrypointsArray = Array.from(
69
+ compilation.entrypoints.entries()
70
+ );
71
+ const entryChunkIds = entrypointsArray.map(
72
+ (entrypoint) => entrypoint[0]
73
+ );
74
+ const entryChunks = [...compilation.chunks].filter((chunk) => {
75
+ return entryChunkIds.includes(chunk.name);
76
+ });
77
+ const entryChunkFiles = entryChunks.map(
78
+ (chunk) => [...chunk.files].find((fname) => fname.includes(".js"))
79
+ );
80
+ for (const file of entryChunkFiles) {
81
+ const asset = compilation.assets[file];
82
+ const newContent = `${injectedContent}${asset.source().toString()}`;
83
+ newAssetsMap.set(path.join(outputPath, file), newContent);
84
+ compilation.updateAsset(file, new RawSource(newContent));
85
+ }
86
+ const filename = path.join(outputPath, ROUTE_MINIFEST_FILE);
87
+ await fs.ensureFile(filename);
88
+ await fs.writeFile(filename, JSON.stringify(manifest, null, 2));
89
+ }
90
+ );
91
+ });
92
+ }
93
+ }
94
+ export {
95
+ RouterPlugin
96
+ };
@@ -0,0 +1 @@
1
+ export * from "./RouterPlugin";
@@ -0,0 +1,24 @@
1
+ function createBuilderOptions(target, appContext) {
2
+ const entries = {};
3
+ const { entrypoints = [], checkedEntries } = appContext;
4
+ for (const { entryName, entry } of entrypoints) {
5
+ if (checkedEntries && !checkedEntries.includes(entryName)) {
6
+ continue;
7
+ }
8
+ if (entryName in entries) {
9
+ entries[entryName].push(entry);
10
+ } else {
11
+ entries[entryName] = [entry];
12
+ }
13
+ }
14
+ return {
15
+ cwd: appContext.appDirectory,
16
+ target,
17
+ configPath: appContext.configFile || void 0,
18
+ entry: entries,
19
+ framework: appContext.metaName
20
+ };
21
+ }
22
+ export {
23
+ createBuilderOptions
24
+ };
@@ -0,0 +1,26 @@
1
+ function createBuilderProviderConfig(resolveConfig, appContext, modifyBuilderConfig) {
2
+ const htmlConfig = { ...resolveConfig.html };
3
+ if (!htmlConfig.template) {
4
+ htmlConfig.templateByEntries = {
5
+ ...htmlConfig.templateByEntries,
6
+ ...appContext.htmlTemplates
7
+ };
8
+ }
9
+ const config = {
10
+ ...resolveConfig,
11
+ dev: {
12
+ ...resolveConfig.dev,
13
+ port: appContext.port
14
+ },
15
+ html: htmlConfig,
16
+ output: {
17
+ ...resolveConfig.output,
18
+ cleanDistPath: false
19
+ }
20
+ };
21
+ modifyBuilderConfig == null ? void 0 : modifyBuilderConfig(config);
22
+ return config;
23
+ }
24
+ export {
25
+ createBuilderProviderConfig
26
+ };
@@ -0,0 +1,21 @@
1
+ import {
2
+ isProd,
3
+ isServiceWorker,
4
+ isSSR,
5
+ isUseSSRBundle
6
+ } from "@modern-js/utils";
7
+ function getBuilderTargets(normalizedConfig) {
8
+ const targets = ["web"];
9
+ const useNodeTarget = isProd() ? isUseSSRBundle(normalizedConfig) : isSSR(normalizedConfig);
10
+ if (useNodeTarget) {
11
+ targets.push("node");
12
+ }
13
+ const useWorkerTarget = isProd() ? isServiceWorker(normalizedConfig) : false;
14
+ if (useWorkerTarget) {
15
+ targets.push("service-worker");
16
+ }
17
+ return targets;
18
+ }
19
+ export {
20
+ getBuilderTargets
21
+ };
@@ -0,0 +1,29 @@
1
+ import { createBuilder } from "@modern-js/builder";
2
+ import { createBuilderProviderConfig } from "./createBuilderProviderConfig";
3
+ import { getBuilderTargets } from "./getBuilderTargets";
4
+ import { createBuilderOptions } from "./createBuilderOptions";
5
+ async function generateBuilder(options, generateProvider, utils) {
6
+ const { normalizedConfig, appContext } = options;
7
+ const { modifyBuilderConfig, modifyBuilderInstance } = utils || {};
8
+ const builderConfig = createBuilderProviderConfig(
9
+ normalizedConfig,
10
+ appContext,
11
+ modifyBuilderConfig
12
+ );
13
+ const provider = generateProvider({
14
+ builderConfig
15
+ });
16
+ const target = getBuilderTargets(normalizedConfig);
17
+ const builderOptions = createBuilderOptions(target, appContext);
18
+ const builder = await createBuilder(provider, builderOptions);
19
+ await applyBuilderPlugins(builder, options);
20
+ await (modifyBuilderInstance == null ? void 0 : modifyBuilderInstance(builder));
21
+ return builder;
22
+ }
23
+ async function applyBuilderPlugins(builder, options) {
24
+ const { builderPluginAdapterModern } = await import("../shared/builderPlugins/adapterModern");
25
+ builder.addPlugins([builderPluginAdapterModern(options)]);
26
+ }
27
+ export {
28
+ generateBuilder
29
+ };
@@ -0,0 +1,17 @@
1
+ async function createBuilderGenerator(bundler) {
2
+ if (bundler === "rspack") {
3
+ try {
4
+ const { createRspackBuilderForModern } = await import("./builder-rspack");
5
+ return createRspackBuilderForModern;
6
+ } catch (_) {
7
+ throw new Error(
8
+ "Failed to use rspack, please check if you have `@modern-js/builder-rspack-provider` installed"
9
+ );
10
+ }
11
+ }
12
+ const { createWebpackBuilderForModern } = await import("./builder-webpack");
13
+ return createWebpackBuilderForModern;
14
+ }
15
+ export {
16
+ createBuilderGenerator
17
+ };
@@ -0,0 +1,202 @@
1
+ import {
2
+ mergeBuilderConfig
3
+ } from "@modern-js/builder-shared";
4
+ import { getEntryOptions } from "@modern-js/utils";
5
+ import HtmlWebpackPlugin from "@modern-js/builder-webpack-provider/html-webpack-plugin";
6
+ import { template as lodashTemplate } from "@modern-js/utils/lodash";
7
+ import { HtmlAsyncChunkPlugin } from "../bundlerPlugins/HtmlAsyncChunkPlugin";
8
+ import { BottomTemplatePlugin } from "../bundlerPlugins/HtmlBottomTemplate";
9
+ const isStreamingSSR = (userConfig) => {
10
+ const isStreaming = (ssr) => ssr && typeof ssr === "object" && ssr.mode === "stream";
11
+ const { server } = userConfig;
12
+ if (isStreaming(server.ssr)) {
13
+ return true;
14
+ }
15
+ if ((server == null ? void 0 : server.ssrByEntries) && typeof server.ssrByEntries === "object") {
16
+ for (const name of Object.keys(server.ssrByEntries)) {
17
+ if (isStreaming(server.ssrByEntries[name])) {
18
+ return true;
19
+ }
20
+ }
21
+ }
22
+ return false;
23
+ };
24
+ const builderPluginAdapterModern = (options) => ({
25
+ name: "builder-plugin-adapter-modern",
26
+ setup(api) {
27
+ const { normalizedConfig, appContext } = options;
28
+ api.modifyBuilderConfig((config) => {
29
+ if (isStreamingSSR(normalizedConfig)) {
30
+ return mergeBuilderConfig(config, {
31
+ html: {
32
+ inject: "body"
33
+ }
34
+ });
35
+ }
36
+ return config;
37
+ });
38
+ api.modifyBundlerChain((chain, { target, CHAIN_ID, isProd }) => {
39
+ const builderConfig = api.getNormalizedConfig();
40
+ if (target === "node") {
41
+ chain.name("server");
42
+ } else if (target === "service-worker") {
43
+ chain.name("service-worker");
44
+ } else if (target === "web-worker") {
45
+ chain.name("worker");
46
+ } else if (target === "modern-web") {
47
+ chain.name("modern");
48
+ } else {
49
+ chain.name("client");
50
+ }
51
+ if (target === "node" || target === "service-worker") {
52
+ applyNodeCompat(target, chain, normalizedConfig, isProd);
53
+ }
54
+ if (isHtmlEnabled(builderConfig, target)) {
55
+ applyBottomHtmlPlugin({
56
+ api,
57
+ chain,
58
+ modernConfig: normalizedConfig,
59
+ appContext,
60
+ CHAIN_ID
61
+ });
62
+ applyAsyncChunkHtmlPlugin({
63
+ chain,
64
+ modernConfig: normalizedConfig,
65
+ CHAIN_ID
66
+ });
67
+ }
68
+ if (target !== "node" && target !== "web-worker" && target !== "service-worker") {
69
+ const bareServerModuleReg = /\.(server|node)\.[tj]sx?$/;
70
+ chain.module.rule(CHAIN_ID.RULE.JS).exclude.add(bareServerModuleReg);
71
+ chain.module.rule("bare-server-module").test(bareServerModuleReg).use("server-module-loader").loader(require.resolve("../loaders/serverModuleLoader"));
72
+ }
73
+ });
74
+ applyCallbacks(api, options);
75
+ function isHtmlEnabled(config, target) {
76
+ var _a;
77
+ return ((_a = config.tools) == null ? void 0 : _a.htmlPlugin) !== false && target !== "node" && target !== "service-worker" && target !== "web-worker";
78
+ }
79
+ }
80
+ });
81
+ function applyCallbacks(api, options) {
82
+ options.onAfterBuild && api.onAfterBuild(options.onAfterBuild);
83
+ options.onAfterCreateCompiler && api.onAfterCreateCompiler(options.onAfterCreateCompiler);
84
+ options.onAfterStartDevServer && api.onAfterStartDevServer(options.onAfterStartDevServer);
85
+ options.onBeforeBuild && api.onBeforeBuild(options.onBeforeBuild);
86
+ options.onBeforeCreateCompiler && api.onBeforeCreateCompiler(options.onBeforeCreateCompiler);
87
+ options.onBeforeStartDevServer && api.onBeforeStartDevServer(options.onBeforeStartDevServer);
88
+ options.onDevCompileDone && api.onDevCompileDone(options.onDevCompileDone);
89
+ options.onExit && api.onExit(options.onExit);
90
+ }
91
+ function applyBottomHtmlPlugin({
92
+ api,
93
+ chain,
94
+ modernConfig,
95
+ appContext,
96
+ CHAIN_ID
97
+ }) {
98
+ for (const entryName of Object.keys(api.context.entry)) {
99
+ const baseTemplateParams = {
100
+ entryName,
101
+ title: getEntryOptions(
102
+ entryName,
103
+ modernConfig.html.title,
104
+ modernConfig.html.titleByEntries,
105
+ appContext.packageName
106
+ ),
107
+ mountId: modernConfig.html.mountId,
108
+ ...getEntryOptions(
109
+ entryName,
110
+ modernConfig.html.templateParameters,
111
+ modernConfig.html.templateParametersByEntries,
112
+ appContext.packageName
113
+ )
114
+ };
115
+ chain.plugin(`${CHAIN_ID.PLUGIN.HTML}-${entryName}`).tap((args) => [
116
+ {
117
+ ...args[0] || {},
118
+ __internal__: true,
119
+ bottomTemplate: appContext.htmlTemplates[`__${entryName}-bottom__`] && lodashTemplate(appContext.htmlTemplates[`__${entryName}-bottom__`])(
120
+ baseTemplateParams
121
+ )
122
+ }
123
+ ]);
124
+ }
125
+ chain.plugin(CHAIN_ID.PLUGIN.BOTTOM_TEMPLATE).use(BottomTemplatePlugin, [HtmlWebpackPlugin]);
126
+ }
127
+ function applyAsyncChunkHtmlPlugin({
128
+ chain,
129
+ modernConfig,
130
+ CHAIN_ID
131
+ }) {
132
+ if (isStreamingSSR(modernConfig)) {
133
+ chain.plugin(CHAIN_ID.PLUGIN.HTML_ASYNC_CHUNK).use(HtmlAsyncChunkPlugin, [HtmlWebpackPlugin]);
134
+ }
135
+ }
136
+ function applyNodeCompat(target, chain, modernConfig, isProd) {
137
+ const nodeExts = [
138
+ ".node.js",
139
+ ".node.jsx",
140
+ ".node.ts",
141
+ ".node.tsx",
142
+ ".server.js",
143
+ ".server.ts",
144
+ ".server.ts",
145
+ ".server.tsx"
146
+ ];
147
+ const webWorkerExts = [
148
+ ".worker.js",
149
+ ".worker.jsx",
150
+ ".worker.ts",
151
+ ".worker.tsx"
152
+ ];
153
+ for (const ext of nodeExts) {
154
+ chain.resolve.extensions.prepend(ext);
155
+ }
156
+ if (target === "service-worker") {
157
+ for (const ext of webWorkerExts) {
158
+ chain.resolve.extensions.prepend(ext);
159
+ }
160
+ }
161
+ filterEntriesBySSRConfig(
162
+ isProd,
163
+ chain,
164
+ modernConfig.server,
165
+ modernConfig.output
166
+ );
167
+ function filterEntriesBySSRConfig(isProd2, chain2, serverConfig, outputConfig) {
168
+ var _a;
169
+ const entries = chain2.entryPoints.entries();
170
+ if (isProd2 && ((outputConfig == null ? void 0 : outputConfig.ssg) === true || typeof ((_a = outputConfig == null ? void 0 : outputConfig.ssg) == null ? void 0 : _a[0]) === "function")) {
171
+ return;
172
+ }
173
+ if (typeof entries === "undefined") {
174
+ throw new Error(
175
+ "No entry found, one of src/routes/layout.tsx, src/App.tsx, src/index.tsx is required"
176
+ );
177
+ }
178
+ const entryNames = Object.keys(entries);
179
+ if (isProd2 && entryNames.length === 1 && (outputConfig == null ? void 0 : outputConfig.ssg)) {
180
+ return;
181
+ }
182
+ const ssgEntries = [];
183
+ if (isProd2 && (outputConfig == null ? void 0 : outputConfig.ssg)) {
184
+ const { ssg } = outputConfig;
185
+ entryNames.forEach((name) => {
186
+ if (ssg[name]) {
187
+ ssgEntries.push(name);
188
+ }
189
+ });
190
+ }
191
+ const { ssr, ssrByEntries } = serverConfig || {};
192
+ entryNames.forEach((name) => {
193
+ if (!ssgEntries.includes(name) && (ssr && (ssrByEntries == null ? void 0 : ssrByEntries[name]) === false || !ssr && !(ssrByEntries == null ? void 0 : ssrByEntries[name]))) {
194
+ chain2.entryPoints.delete(name);
195
+ }
196
+ });
197
+ }
198
+ }
199
+ export {
200
+ applyCallbacks,
201
+ builderPluginAdapterModern
202
+ };
@@ -0,0 +1,27 @@
1
+ class HtmlAsyncChunkPlugin {
2
+ constructor(htmlWebpackPlugin) {
3
+ this.name = "HtmlAsyncChunkPlugin";
4
+ this.htmlWebpackPlugin = htmlWebpackPlugin;
5
+ }
6
+ apply(compiler) {
7
+ compiler.hooks.compilation.tap(this.name, (compilation) => {
8
+ const hooks = this.htmlWebpackPlugin.getHooks(compilation);
9
+ hooks.alterAssetTagGroups.tap(this.name, (assets) => {
10
+ const tags = [...assets.headTags, ...assets.bodyTags];
11
+ for (const tag of tags) {
12
+ if (tag.tagName === "script") {
13
+ const { attributes } = tag;
14
+ if (attributes && attributes.defer === true) {
15
+ attributes.async = true;
16
+ delete attributes.defer;
17
+ }
18
+ }
19
+ }
20
+ return assets;
21
+ });
22
+ });
23
+ }
24
+ }
25
+ export {
26
+ HtmlAsyncChunkPlugin
27
+ };
@@ -0,0 +1,34 @@
1
+ class BottomTemplatePlugin {
2
+ constructor(htmlWebpackPlugin) {
3
+ this.bottomTemplateReg = /<!--<\?-\s*bottomTemplate\s*\?>-->/;
4
+ this.bodyRegExp = /(<\/\s*body\s*>)/i;
5
+ this.htmlWebpackPlugin = htmlWebpackPlugin;
6
+ this.name = "bottom-template";
7
+ }
8
+ apply(compiler) {
9
+ compiler.hooks.compilation.tap(this.name, (compilation) => {
10
+ this.htmlWebpackPlugin.getHooks(compilation).beforeEmit.tap(this.name, (data) => {
11
+ var _a;
12
+ if (!((_a = data.plugin.options) == null ? void 0 : _a.__internal__)) {
13
+ return data;
14
+ }
15
+ if (this.bottomTemplateReg.test(data.html)) {
16
+ data.html = data.html.replace(this.bottomTemplateReg, "");
17
+ const { bottomTemplate } = data.plugin.options;
18
+ if (bottomTemplate) {
19
+ data.html = data.html.replace(
20
+ this.bodyRegExp,
21
+ (match) => `
22
+ ${bottomTemplate}
23
+ ${match}`
24
+ );
25
+ }
26
+ }
27
+ return data;
28
+ });
29
+ });
30
+ }
31
+ }
32
+ export {
33
+ BottomTemplatePlugin
34
+ };
@@ -0,0 +1,46 @@
1
+ import path from "path";
2
+ import { removeTailSlash } from "@modern-js/utils";
3
+ function createCopyPattern(appContext, config, patternsType, chain) {
4
+ const configDir = path.resolve(
5
+ appContext.appDirectory,
6
+ config.source.configDir || "./config"
7
+ );
8
+ const uploadDir = path.posix.join(configDir.replace(/\\/g, "/"), "upload");
9
+ const publicDir = path.posix.join(configDir.replace(/\\/g, "/"), "public");
10
+ const minifiedJsRexExp = /\.min\.js/;
11
+ const info = (file) => ({
12
+ minimized: minifiedJsRexExp.test(file.sourceFilename)
13
+ });
14
+ if (patternsType === "public") {
15
+ if (!chain) {
16
+ throw new Error("expect get a webpackChain, but receive 'undefined'");
17
+ }
18
+ return {
19
+ info,
20
+ from: "**/*",
21
+ to: "public",
22
+ context: publicDir,
23
+ noErrorOnMissing: true,
24
+ transform: (content, absoluteFrom) => {
25
+ if (!/\.html?$/.test(absoluteFrom)) {
26
+ return content;
27
+ }
28
+ return content.toString("utf8").replace(
29
+ /<%=\s*assetPrefix\s*%>/g,
30
+ removeTailSlash(chain.output.get("publicPath"))
31
+ );
32
+ }
33
+ };
34
+ } else {
35
+ return {
36
+ info,
37
+ from: "**/*",
38
+ to: "upload",
39
+ context: uploadDir,
40
+ noErrorOnMissing: true
41
+ };
42
+ }
43
+ }
44
+ export {
45
+ createCopyPattern
46
+ };
@@ -0,0 +1,3 @@
1
+ export * from "./createCopyPattern";
2
+ export * from "./types";
3
+ export * from "./builderPlugins/adapterModern";
@@ -0,0 +1,7 @@
1
+ function loader() {
2
+ return `module.exports = {}`;
3
+ }
4
+ var serverModuleLoader_default = loader;
5
+ export {
6
+ serverModuleLoader_default as default
7
+ };
File without changes
@@ -0,0 +1,52 @@
1
+ import { ResolvedConfigContext } from "@modern-js/core";
2
+ import { logger, printBuildError } from "@modern-js/utils";
3
+ import { generateRoutes } from "../utils/routes";
4
+ import { buildServerConfig } from "../utils/config";
5
+ const build = async (api, options) => {
6
+ if (options == null ? void 0 : options.analyze) {
7
+ process.env.BUNDLE_ANALYZE = "true";
8
+ }
9
+ let resolvedConfig = api.useResolvedConfigContext();
10
+ const appContext = api.useAppContext();
11
+ const hookRunners = api.useHookRunners();
12
+ const { apiOnly } = appContext;
13
+ if (apiOnly) {
14
+ const { appDirectory: appDirectory2, distDirectory: distDirectory2, serverConfigFile: serverConfigFile2 } = appContext;
15
+ await hookRunners.beforeBuild({
16
+ bundlerConfigs: void 0
17
+ });
18
+ await buildServerConfig({
19
+ appDirectory: appDirectory2,
20
+ distDirectory: distDirectory2,
21
+ configFile: serverConfigFile2
22
+ });
23
+ await generateRoutes(appContext);
24
+ await hookRunners.afterBuild({
25
+ stats: void 0
26
+ });
27
+ return;
28
+ }
29
+ resolvedConfig = { ...resolvedConfig, cliOptions: options };
30
+ ResolvedConfigContext.set(resolvedConfig);
31
+ const { distDirectory, appDirectory, serverConfigFile } = appContext;
32
+ await buildServerConfig({
33
+ appDirectory,
34
+ distDirectory,
35
+ configFile: serverConfigFile
36
+ });
37
+ try {
38
+ logger.info("Create a production build...\n");
39
+ if (!appContext.builder) {
40
+ throw new Error(
41
+ "Expect the Builder to have been initialized, But the appContext.builder received `undefined`"
42
+ );
43
+ }
44
+ await appContext.builder.build();
45
+ } catch (error) {
46
+ printBuildError(error);
47
+ process.exit(1);
48
+ }
49
+ };
50
+ export {
51
+ build
52
+ };
@@ -0,0 +1,8 @@
1
+ const deploy = async (api, options) => {
2
+ const hookRunners = api.useHookRunners();
3
+ await hookRunners.beforeDeploy(options);
4
+ await hookRunners.afterDeploy(options);
5
+ };
6
+ export {
7
+ deploy
8
+ };