@flatjs/evolve 2.3.2-next.1 → 2.3.2-next.2

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 (251) hide show
  1. package/dist/build-server/compiler-server-manager.d.ts +1 -1
  2. package/dist/compiler/create-build-server-compiler.js +1 -1
  3. package/dist/core/rspack/create-externals.d.ts +4 -0
  4. package/dist/core/rspack/create-optimization.d.ts +4 -0
  5. package/dist/core/rspack/create-optimization.js +1 -0
  6. package/dist/core/rspack/create-performance.d.ts +2 -0
  7. package/dist/core/rspack/create-plugins.d.ts +5 -0
  8. package/dist/core/rspack/create-plugins.js +1 -0
  9. package/dist/core/rspack/create-resolve.d.ts +2 -0
  10. package/dist/core/rspack/create-resolve.js +1 -0
  11. package/dist/core/rspack/create-rspack-output.d.ts +4 -0
  12. package/dist/core/rspack/create-rspack-output.js +1 -0
  13. package/dist/core/rspack/create-rspack-rule-sets.d.ts +4 -0
  14. package/dist/core/rspack/create-rspack-rule-sets.js +1 -0
  15. package/dist/core/rspack/dev-serve/add-rspack-compiler-to-dev-server.d.ts +11 -0
  16. package/dist/core/rspack/dev-serve/add-rspack-compiler-to-dev-server.js +1 -0
  17. package/dist/core/rspack/dev-serve/create-rspack-compiler-task.d.ts +3 -0
  18. package/dist/core/rspack/dev-serve/create-rspack-compiler-task.js +1 -0
  19. package/dist/core/rspack/load-rspack-config.d.ts +11 -0
  20. package/dist/core/rspack/load-rspack-config.js +1 -0
  21. package/dist/core/rspack/load-rspack-watch-options.d.ts +12 -0
  22. package/dist/core/rspack/load-rspack-watch-options.js +1 -0
  23. package/dist/core/rspack/start-rspack-build.d.ts +12 -0
  24. package/dist/core/rspack/start-rspack-build.js +1 -0
  25. package/dist/{create-webpack → core/webpack}/create-externals.d.ts +2 -2
  26. package/dist/core/webpack/create-externals.js +1 -0
  27. package/dist/{create-webpack → core/webpack}/create-optimization.d.ts +2 -2
  28. package/dist/core/webpack/create-optimization.js +1 -0
  29. package/dist/{create-webpack → core/webpack}/create-output.d.ts +2 -2
  30. package/dist/core/webpack/create-output.js +1 -0
  31. package/dist/{create-webpack → core/webpack}/create-performance.d.ts +1 -1
  32. package/dist/core/webpack/create-performance.js +1 -0
  33. package/dist/core/webpack/create-plugins.d.ts +5 -0
  34. package/dist/core/webpack/create-plugins.js +1 -0
  35. package/dist/{create-webpack → core/webpack}/create-resolve.d.ts +1 -1
  36. package/dist/{create-webpack → core/webpack}/create-rule-sets.d.ts +2 -2
  37. package/dist/core/webpack/create-rule-sets.js +1 -0
  38. package/dist/{dev-server/add-compiler-to-dev-server.d.ts → core/webpack/dev-serve/add-webpack-compiler-to-dev-server.d.ts} +2 -2
  39. package/dist/core/webpack/dev-serve/add-webpack-compiler-to-dev-server.js +1 -0
  40. package/dist/core/webpack/dev-serve/create-webpack-compiler-task.d.ts +3 -0
  41. package/dist/core/webpack/dev-serve/create-webpack-compiler-task.js +1 -0
  42. package/dist/core/webpack/index.d.ts +2 -0
  43. package/dist/core/webpack/index.js +1 -0
  44. package/dist/{create-webpack → core/webpack}/load-watch-options.d.ts +3 -3
  45. package/dist/core/webpack/load-watch-options.js +1 -0
  46. package/dist/{create-webpack → core/webpack}/load-webpack-config.d.ts +3 -3
  47. package/dist/core/webpack/load-webpack-config.js +1 -0
  48. package/dist/core/webpack/start-webpack-build.d.ts +12 -0
  49. package/dist/core/webpack/start-webpack-build.js +1 -0
  50. package/dist/default-options.js +1 -1
  51. package/dist/dev-server/create-app-page-route.d.ts +1 -1
  52. package/dist/dev-server/create-dev-server-entries.d.ts +1 -1
  53. package/dist/dev-server/index.d.ts +0 -2
  54. package/dist/dev-server/index.js +1 -1
  55. package/dist/dev-server/middlewares/create-page-middleware.d.ts +1 -1
  56. package/dist/dev-server/middlewares/get-all-sorted-modules.d.ts +1 -1
  57. package/dist/dev-server/middlewares/get-dev-server-host-uri.d.ts +1 -1
  58. package/dist/dev-server/middlewares/get-hmr-runtime-chunks.d.ts +1 -1
  59. package/dist/dev-server/middlewares/get-normalized-entry-name.d.ts +1 -1
  60. package/dist/dev-server/middlewares/get-page-main-html.d.ts +1 -1
  61. package/dist/dev-server/middlewares/get-page-module-html.d.ts +1 -1
  62. package/dist/dev-server/middlewares/get-runtime-manifest.d.ts +1 -1
  63. package/dist/helpers/assert-single-compiler.d.ts +14 -1
  64. package/dist/helpers/assert-single-compiler.js +1 -1
  65. package/dist/helpers/custom-listr-renderer.js +1 -1
  66. package/dist/helpers/flat-entry-map.d.ts +1 -1
  67. package/dist/helpers/format-spinner-text.d.ts +3 -1
  68. package/dist/helpers/format-spinner-text.js +1 -1
  69. package/dist/helpers/print-promotion.d.ts +2 -0
  70. package/dist/helpers/print-promotion.js +1 -0
  71. package/dist/index.d.ts +2 -0
  72. package/dist/index.js +1 -1
  73. package/dist/main/create-build-server.d.ts +1 -1
  74. package/dist/main/index.d.ts +0 -1
  75. package/dist/main/index.js +1 -1
  76. package/dist/main/prepare-build.d.ts +1 -1
  77. package/dist/main/prepare-build.js +1 -1
  78. package/dist/main/prepare-serve.d.ts +2 -1
  79. package/dist/main/prepare-serve.js +1 -1
  80. package/dist/main/start-build-dynamic.d.ts +3 -2
  81. package/dist/main/start-build-dynamic.js +1 -1
  82. package/dist/main/start-build-worker.d.ts +1 -3
  83. package/dist/main/start-build-worker.js +1 -1
  84. package/dist/main/start-build.d.ts +1 -1
  85. package/dist/main/start-build.js +1 -1
  86. package/dist/main/start-serve.d.ts +2 -1
  87. package/dist/main/start-serve.js +1 -1
  88. package/dist/minimizer/default-options.d.ts +2 -0
  89. package/dist/minimizer/default-options.js +1 -1
  90. package/dist/minimizer/index.d.ts +2 -1
  91. package/dist/minimizer/index.js +1 -1
  92. package/dist/minimizer/rspack/create-minimizers.d.ts +3 -0
  93. package/dist/minimizer/rspack/create-minimizers.js +1 -0
  94. package/dist/minimizer/{image-minimizer.d.ts → rspack/image-minimizer.d.ts} +1 -1
  95. package/dist/minimizer/rspack/image-minimizer.js +1 -0
  96. package/dist/minimizer/rspack/terser-minimizer.d.ts +6 -0
  97. package/dist/minimizer/rspack/terser-minimizer.js +1 -0
  98. package/dist/minimizer/webpack/create-minimizers.d.ts +3 -0
  99. package/dist/minimizer/webpack/create-minimizers.js +1 -0
  100. package/dist/minimizer/webpack/image-minimizer.d.ts +16 -0
  101. package/dist/minimizer/webpack/image-minimizer.js +1 -0
  102. package/dist/minimizer/webpack/terser-minimizer.d.ts +6 -0
  103. package/dist/minimizer/{terser-minimizer.js → webpack/terser-minimizer.js} +1 -1
  104. package/dist/plugins/{define-variable/define-variable-plugin.d.ts → rspack/define-variable/index.d.ts} +3 -3
  105. package/dist/plugins/rspack/define-variable/index.js +1 -0
  106. package/dist/plugins/rspack/module-federation/external-template-remotes-rspack-plugin.d.ts +4 -0
  107. package/dist/plugins/rspack/module-federation/external-template-remotes-rspack-plugin.js +1 -0
  108. package/dist/plugins/rspack/module-federation/index.d.ts +4 -0
  109. package/dist/plugins/rspack/module-federation/index.js +1 -0
  110. package/dist/plugins/rspack/multi-html/index.d.ts +4 -0
  111. package/dist/plugins/rspack/multi-html/index.js +1 -0
  112. package/dist/plugins/rspack/multi-html/multi-html-cdn-rspack-plugin.d.ts +18 -0
  113. package/dist/plugins/rspack/multi-html/multi-html-cdn-rspack-plugin.js +1 -0
  114. package/dist/plugins/{multi-html/multi-html-modify-plugin.d.ts → rspack/multi-html/multi-html-modify--rspack-plugin.d.ts} +2 -2
  115. package/dist/plugins/rspack/multi-html/multi-html-modify--rspack-plugin.js +1 -0
  116. package/dist/plugins/rspack/multi-html/multi-html-rspack-plugin.d.ts +11 -0
  117. package/dist/plugins/rspack/multi-html/multi-html-rspack-plugin.js +1 -0
  118. package/dist/plugins/{circular-dependency/circular-dependency-plugin.d.ts → webpack/circular-dependency/circular-dependency-webpack-plugin.d.ts} +1 -1
  119. package/dist/plugins/webpack/circular-dependency/circular-dependency-webpack-plugin.js +1 -0
  120. package/dist/plugins/webpack/circular-dependency/index.d.ts +9 -0
  121. package/dist/plugins/webpack/circular-dependency/index.js +1 -0
  122. package/dist/plugins/webpack/clean-webpack/clean-webpack-plugin.js +1 -0
  123. package/dist/plugins/webpack/clean-webpack/index.d.ts +9 -0
  124. package/dist/plugins/webpack/clean-webpack/index.js +1 -0
  125. package/dist/plugins/webpack/define-variable/index.d.ts +16 -0
  126. package/dist/plugins/webpack/define-variable/index.js +1 -0
  127. package/dist/plugins/{html-inject-scripts/plugin-html-inject-script.d.ts → webpack/html-inject-scripts/html-inject-script-webpack-plugin.d.ts} +1 -1
  128. package/dist/plugins/webpack/html-inject-scripts/html-inject-script-webpack-plugin.js +1 -0
  129. package/dist/plugins/webpack/html-inject-scripts/html-inline-script-webpack-plugin.d.ts +12 -0
  130. package/dist/plugins/webpack/html-inject-scripts/html-inline-script-webpack-plugin.js +1 -0
  131. package/dist/plugins/webpack/html-inject-scripts/index.d.ts +2 -0
  132. package/dist/plugins/webpack/html-inject-scripts/index.js +1 -0
  133. package/dist/plugins/{module-federation/external-template-remotes.d.ts → webpack/module-federation/external-template-remotes-webpack-plugin.d.ts} +1 -1
  134. package/dist/plugins/webpack/module-federation/external-template-remotes-webpack-plugin.js +1 -0
  135. package/dist/plugins/webpack/module-federation/index.d.ts +4 -0
  136. package/dist/plugins/webpack/module-federation/index.js +1 -0
  137. package/dist/plugins/webpack/multi-html/index.d.ts +4 -0
  138. package/dist/plugins/webpack/multi-html/index.js +1 -0
  139. package/dist/plugins/{multi-html/multi-html-cdn-plugin.d.ts → webpack/multi-html/multi-html-cdn-webpack-plugin.d.ts} +2 -2
  140. package/dist/plugins/webpack/multi-html/multi-html-cdn-webpack-plugin.js +1 -0
  141. package/dist/plugins/webpack/multi-html/multi-html-modify-webpack-plugin.d.ts +12 -0
  142. package/dist/plugins/webpack/multi-html/multi-html-modify-webpack-plugin.js +1 -0
  143. package/dist/plugins/webpack/multi-html/multi-html-webpack-plugins.d.ts +11 -0
  144. package/dist/plugins/webpack/multi-html/multi-html-webpack-plugins.js +1 -0
  145. package/dist/plugins/webpack/stats-webpack/index.d.ts +12 -0
  146. package/dist/plugins/webpack/stats-webpack/index.js +1 -0
  147. package/dist/plugins/webpack/stats-webpack/stats-webpack-plugin.js +1 -0
  148. package/dist/rules/index.d.ts +2 -0
  149. package/dist/rules/index.js +1 -0
  150. package/dist/rules/rspack/index.d.ts +5 -0
  151. package/dist/rules/rspack/index.js +1 -0
  152. package/dist/rules/rspack/rule-assets.d.ts +10 -0
  153. package/dist/rules/rspack/rule-assets.js +1 -0
  154. package/dist/rules/rspack/rule-css.d.ts +11 -0
  155. package/dist/rules/rspack/rule-css.js +1 -0
  156. package/dist/rules/rspack/rule-less.d.ts +26 -0
  157. package/dist/rules/rspack/rule-less.js +1 -0
  158. package/dist/rules/rspack/rule-scripts.d.ts +3 -0
  159. package/dist/rules/rspack/rule-scripts.js +1 -0
  160. package/dist/rules/rspack/rule-svg-icon.d.ts +6 -0
  161. package/dist/rules/rspack/rule-svg-icon.js +1 -0
  162. package/dist/rules/rule-utils.d.ts +19 -0
  163. package/dist/rules/rule-utils.js +1 -0
  164. package/dist/rules/wepack/index.d.ts +5 -0
  165. package/dist/rules/wepack/index.js +1 -0
  166. package/dist/{create-webpack/rule-sets → rules/wepack}/rule-assets.d.ts +1 -1
  167. package/dist/rules/wepack/rule-assets.js +1 -0
  168. package/dist/{create-webpack/rule-sets → rules/wepack}/rule-css.d.ts +1 -1
  169. package/dist/rules/wepack/rule-css.js +1 -0
  170. package/dist/{create-webpack/rule-sets → rules/wepack}/rule-less.d.ts +1 -1
  171. package/dist/rules/wepack/rule-less.js +1 -0
  172. package/dist/{create-webpack/rule-sets → rules/wepack}/rule-scripts.d.ts +1 -1
  173. package/dist/rules/wepack/rule-scripts.js +1 -0
  174. package/dist/{create-webpack/rule-sets → rules/wepack}/rule-svg-icon.d.ts +1 -1
  175. package/dist/rules/wepack/rule-svg-icon.js +1 -0
  176. package/dist/types/index.d.ts +2 -0
  177. package/dist/types/index.js +1 -1
  178. package/dist/types/types-build.d.ts +4 -0
  179. package/dist/types/types-cli-options.d.ts +5 -0
  180. package/dist/types/types-dev-server.d.ts +23 -0
  181. package/dist/types/types-options.d.ts +5 -0
  182. package/dist/types/types-webpack.d.ts +42 -3
  183. package/package.json +17 -7
  184. package/dist/create-webpack/create-optimization.js +0 -1
  185. package/dist/create-webpack/create-output.js +0 -1
  186. package/dist/create-webpack/create-plugins.d.ts +0 -5
  187. package/dist/create-webpack/create-plugins.js +0 -1
  188. package/dist/create-webpack/create-rule-sets.js +0 -1
  189. package/dist/create-webpack/load-watch-options.js +0 -1
  190. package/dist/create-webpack/load-webpack-config.js +0 -1
  191. package/dist/create-webpack/rule-sets/rule-assets.js +0 -1
  192. package/dist/create-webpack/rule-sets/rule-css.js +0 -1
  193. package/dist/create-webpack/rule-sets/rule-less.js +0 -1
  194. package/dist/create-webpack/rule-sets/rule-scripts.js +0 -1
  195. package/dist/create-webpack/rule-sets/rule-svg-icon.js +0 -1
  196. package/dist/create-webpack/rule-sets/rule-utils.d.ts +0 -7
  197. package/dist/create-webpack/rule-sets/rule-utils.js +0 -1
  198. package/dist/create-webpack/types.d.ts +0 -2
  199. package/dist/dev-server/add-compiler-to-dev-server.js +0 -1
  200. package/dist/dev-server/create-dev-server-compiler-task.d.ts +0 -3
  201. package/dist/dev-server/create-dev-server-compiler-task.js +0 -1
  202. package/dist/dev-server/middlewares/types.d.ts +0 -24
  203. package/dist/dev-server/middlewares/types.js +0 -1
  204. package/dist/helpers/custom-message-channel.d.ts +0 -17
  205. package/dist/helpers/custom-message-channel.js +0 -1
  206. package/dist/main/create-thread-worker.d.ts +0 -31
  207. package/dist/main/create-thread-worker.js +0 -1
  208. package/dist/main/get-worker-path.d.ts +0 -1
  209. package/dist/main/get-worker-path.js +0 -1
  210. package/dist/main/start-group-entry-build.d.ts +0 -15
  211. package/dist/main/start-group-entry-build.js +0 -1
  212. package/dist/minimizer/create-minimizers.d.ts +0 -3
  213. package/dist/minimizer/create-minimizers.js +0 -1
  214. package/dist/minimizer/image-minimizer.js +0 -1
  215. package/dist/minimizer/terser-minimizer.d.ts +0 -6
  216. package/dist/plugins/circular-dependency/circular-dependency-plugin.js +0 -1
  217. package/dist/plugins/circular-dependency/index.d.ts +0 -7
  218. package/dist/plugins/circular-dependency/index.js +0 -1
  219. package/dist/plugins/clean-webpack/clean-webpack-plugin.js +0 -1
  220. package/dist/plugins/clean-webpack/index.d.ts +0 -9
  221. package/dist/plugins/clean-webpack/index.js +0 -1
  222. package/dist/plugins/define-variable/define-variable-plugin.js +0 -1
  223. package/dist/plugins/define-variable/index.d.ts +0 -1
  224. package/dist/plugins/define-variable/index.js +0 -1
  225. package/dist/plugins/html-inject-scripts/plugin-html-inject-script.js +0 -1
  226. package/dist/plugins/module-federation/external-template-remotes.js +0 -1
  227. package/dist/plugins/module-federation/index.d.ts +0 -1
  228. package/dist/plugins/module-federation/index.js +0 -1
  229. package/dist/plugins/module-federation/module-federation.d.ts +0 -4
  230. package/dist/plugins/module-federation/module-federation.js +0 -1
  231. package/dist/plugins/multi-html/index.d.ts +0 -4
  232. package/dist/plugins/multi-html/index.js +0 -1
  233. package/dist/plugins/multi-html/multi-html-cdn-plugin.js +0 -1
  234. package/dist/plugins/multi-html/multi-html-modify-plugin.js +0 -1
  235. package/dist/plugins/multi-html/multi-html-plugin.d.ts +0 -11
  236. package/dist/plugins/multi-html/multi-html-plugin.js +0 -1
  237. package/dist/plugins/stats-webpack/index.d.ts +0 -12
  238. package/dist/plugins/stats-webpack/index.js +0 -1
  239. package/dist/plugins/stats-webpack/stats-webpack-plugin.js +0 -1
  240. /package/dist/{create-webpack → core/rspack}/create-externals.js +0 -0
  241. /package/dist/{create-webpack → core/rspack}/create-performance.js +0 -0
  242. /package/dist/{create-webpack → core/webpack}/create-resolve.js +0 -0
  243. /package/dist/{create-webpack → helpers}/resolve-public-path.d.ts +0 -0
  244. /package/dist/{create-webpack → helpers}/resolve-public-path.js +0 -0
  245. /package/dist/plugins/{clean-webpack → webpack/clean-webpack}/clean-webpack-plugin.d.ts +0 -0
  246. /package/dist/plugins/{stats-webpack → webpack/stats-webpack}/helper-write-stats.d.ts +0 -0
  247. /package/dist/plugins/{stats-webpack → webpack/stats-webpack}/helper-write-stats.js +0 -0
  248. /package/dist/plugins/{stats-webpack → webpack/stats-webpack}/stats-webpack-plugin.d.ts +0 -0
  249. /package/dist/{create-webpack/rule-sets → rules}/constants.d.ts +0 -0
  250. /package/dist/{create-webpack/rule-sets → rules}/constants.js +0 -0
  251. /package/dist/{create-webpack/types.js → types/types-build.js} +0 -0
@@ -1 +1 @@
1
- import{ensureSlash,mergeOptions}from"@flatjs/common";import{ignoreEntryOptionKeys}from"../constants.js";import{EvolveBuildError}from"../errors/evolve-build-error.js";import{printCompilerError}from"../helpers/print-log.js";import{verifyGroupEntryOptions}from"../helpers/verify-group-entry-options.js";import{startGroupEntryBuild}from"./start-group-entry-build.js";export const prepareBuild=async(r,o,t)=>{const e=Object.values(r)[0];if(!verifyGroupEntryOptions(r,ignoreEntryOptionKeys,!0))throw new Error("The entry options in a group must be the same.");const n=o.multiHtmlCdn?.prod||[];if(!n.length)throw new Error(`No CDN config for env:"prod", groupName: ${e.groupName}`);const i=ensureSlash(n[Math.floor(Math.random()*n.length)],!0);try{const n=e.options?.useRelativeAssetPath,s=mergeOptions(o,{webpack:{publicPath:n?"auto":i}});return await startGroupEntryBuild(r,s,t)}catch(r){const o=printCompilerError(r);throw new EvolveBuildError("BUILD_ERROR",o)}};
1
+ import{ensureSlash,mergeOptions}from"@flatjs/common";import{ignoreEntryOptionKeys}from"../constants.js";import{startRspackBuild}from"../core/rspack/start-rspack-build.js";import{startWebpackBuild}from"../core/webpack/index.js";import{EvolveBuildError}from"../errors/evolve-build-error.js";import{printCompilerError}from"../helpers/print-log.js";import{verifyGroupEntryOptions}from"../helpers/verify-group-entry-options.js";export const prepareBuild=async(r,o,t)=>{const{compilerType:e="webpack"}=t||{},p=Object.values(r)[0];if(!verifyGroupEntryOptions(r,ignoreEntryOptionKeys,!0))throw new Error("The entry options in a group must be the same.");const s=o.multiHtmlCdn?.prod||[];if(!s.length)throw new Error(`No CDN config for env:"prod", groupName: ${p.groupName}`);const i=ensureSlash(s[Math.floor(Math.random()*s.length)],!0);try{const s=p.options?.useRelativeAssetPath,n=mergeOptions(o,{webpack:{publicPath:s?"auto":i}});return"webpack"===e?await startWebpackBuild(r,n,t):await startRspackBuild(r,n,t)}catch(r){const o=printCompilerError(r);throw new EvolveBuildError("BUILD_ERROR",o)}};
@@ -1,3 +1,4 @@
1
+ import type { FlatCliOptions } from '../types/types-cli-options.js';
1
2
  import { type EvolveEntryMap } from '../types/types-entry-map.js';
2
3
  import { type FlatEvolveOptions } from '../types/types-options.js';
3
4
  /**
@@ -6,4 +7,4 @@ import { type FlatEvolveOptions } from '../types/types-options.js';
6
7
  * @param servedEntries All normalized webpack entries we have served.
7
8
  * @param evolveOptions FlatEvolveOptions
8
9
  */
9
- export declare const prepareServe: (projectCwd: string, servedEntries: EvolveEntryMap, evolveOptions: FlatEvolveOptions) => Promise<import("express-serve-static-core").Express | undefined>;
10
+ export declare const prepareServe: (projectCwd: string, servedEntries: EvolveEntryMap, evolveOptions: FlatEvolveOptions, cliOptions?: FlatCliOptions) => Promise<import("express-serve-static-core").Express | undefined>;
@@ -1 +1 @@
1
- import{arrayUnique,chalk,logger,urlJoin}from"@flatjs/common";import{attachMockMiddlewares}from"@flatjs/mock";import{ignoreEntryOptionKeys,moduleName}from"../constants.js";import{createAppPageRoute,createDevServer,createDevServerCompilerTask,createDevServerEntries}from"../dev-server/index.js";import{flatEntryMap,openPage}from"../helpers/index.js";import{normalizePageProxy}from"../helpers/normalize-page-proxy.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{verifyGroupEntryOptions}from"../helpers/verify-group-entry-options.js";import{envVerify}from"./env-verify.js";export const prepareServe=async(e,r,o)=>{await envVerify(e,o);const t=splitToEntryGroup(r,o,ignoreEntryOptionKeys,!0);if(!t.length)return void logger.warn("No served entries provided!");const n=[],{app:s,devPort:i,devHostUri:a,publicIp:p}=await createDevServer(o),c=o.devServer?.mockOptions?.mockFilters||[];for(const[,e]of Object.entries(r))c.push(...e.options?.mockFilters||[]);await attachMockMiddlewares(s,{...o.devServer?.mockOptions,mockFilters:arrayUnique(c),projectCwd:e});let l=i;const m=[];for(const e of t){if(!verifyGroupEntryOptions(e,ignoreEntryOptionKeys,!0))throw new Error("The entry options in a group must be the same.");l++;const r=await createDevServerEntries(l,e,o);m.push(r)}const v=flatEntryMap(m);createAppPageRoute(e,s,a,v,o);const d=normalizePageProxy(o.devServer?.pageProxy||"/pages"),f=urlJoin(a,[d]);o.devServer?.autoOpen&&openPage(f);for(const e of m){const r=createDevServerCompilerTask(p,e,m,o);n.push(r)}return Promise.all(n).then((()=>(logger.info(`debug page ➩ ${chalk(["cyan"])(f)}`,moduleName),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",(e=>{const r=e.toString();12===r.charCodeAt(0)?console.clear():[102,70].includes(r.charCodeAt(0))&&logger.info(`debug page ➩ ${chalk(["cyan"])(f)}`,moduleName)})),s)))};
1
+ import{arrayUnique,chalk,logger,urlJoin}from"@flatjs/common";import{attachMockMiddlewares}from"@flatjs/mock";import{ignoreEntryOptionKeys,moduleName}from"../constants.js";import{createRspackCompilerTask}from"../core/rspack/dev-serve/create-rspack-compiler-task.js";import{createWebpackCompilerTask}from"../core/webpack/dev-serve/create-webpack-compiler-task.js";import{createAppPageRoute,createDevServer,createDevServerEntries}from"../dev-server/index.js";import{flatEntryMap,openPage}from"../helpers/index.js";import{normalizePageProxy}from"../helpers/normalize-page-proxy.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{verifyGroupEntryOptions}from"../helpers/verify-group-entry-options.js";import{envVerify}from"./env-verify.js";export const prepareServe=async(e,r,o,t={})=>{const{compilerType:a="webpack"}=t;await envVerify(e,o);const s=splitToEntryGroup(r,o,ignoreEntryOptionKeys,!0);if(!s.length)return void logger.warn("No served entries provided!");const p=[],{app:n,devPort:i,devHostUri:c,publicIp:m}=await createDevServer(o),l=o.devServer?.mockOptions?.mockFilters||[];for(const[,e]of Object.entries(r))l.push(...e.options?.mockFilters||[]);await attachMockMiddlewares(n,{...o.devServer?.mockOptions,mockFilters:arrayUnique(l),projectCwd:e});let v=i;const d=[];for(const e of s){if(!verifyGroupEntryOptions(e,ignoreEntryOptionKeys,!0))throw new Error("The entry options in a group must be the same.");v++;const r=await createDevServerEntries(v,e,o);d.push(r)}const f=flatEntryMap(d);createAppPageRoute(e,n,c,f,o);const y=normalizePageProxy(o.devServer?.pageProxy||"/pages"),g=urlJoin(c,[y]);o.devServer?.autoOpen&&openPage(g);for(const e of d){const r="webpack"===a?createWebpackCompilerTask(m,e,d,o):createRspackCompilerTask(m,e,d,o);p.push(r)}return Promise.all(p).then((()=>(logger.info(`debug page ➩ ${chalk(["cyan"])(g)}`,moduleName),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",(e=>{const r=e.toString();12===r.charCodeAt(0)?console.clear():[102,70].includes(r.charCodeAt(0))&&logger.info(`debug page ➩ ${chalk(["cyan"])(g)}`,moduleName)})),n)))};
@@ -1,7 +1,8 @@
1
1
  import { type PartialDeep } from 'type-fest';
2
2
  import { type ConfigLoaderOptions } from '../load-config/types.js';
3
+ import type { EvolveBuildResult } from '../types/types-build.js';
4
+ import type { FlatCliOptions } from '../types/types-cli-options.js';
3
5
  import { type FlatEvolveOptions } from '../types/types-options.js';
4
- import { type EvolveBuildResult } from './start-group-entry-build.js';
5
6
  export declare function getBuildEntryFiles(projectCwd: string, diffFiles: string[], allEntryInputs: string[], resolveAlias?: Record<string, string>, graphTreeNodeFilter?: (moduleId: string) => boolean): Promise<string[]>;
6
7
  /**
7
8
  * Dynamic check which entry modules need to build.
@@ -17,4 +18,4 @@ export declare function dynamicCheckBuildEntryMap(projectCwd: string, earlyCommi
17
18
  * @param earlyCommit The diff based earlier commit hash
18
19
  * @param lastCommit If is omitted, it will have the same effect as using HEAD instead.
19
20
  */
20
- export declare const startDynamicBuild: (projectCwd: string, earlyCommit?: string, lastCommit?: string, overrideEvolveOptions?: PartialDeep<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions) => Promise<EvolveBuildResult[]>;
21
+ export declare const startDynamicBuild: (projectCwd: string, earlyCommit?: string, lastCommit?: string, overrideEvolveOptions?: PartialDeep<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions, cliOptions?: FlatCliOptions) => Promise<EvolveBuildResult[]>;
@@ -1 +1 @@
1
- import Listr from"listr";import{isAbsolute,join}from"node:path";import{getCommitIdOfBranch,getDiffFiles}from"@armit/git";import{arraysIntersect,chalk,logger,requireResolve}from"@flatjs/common";import{traverseGraph}from"@flatjs/graph";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";import{ignoreEntryOptionKeys,moduleName}from"../constants.js";import{isCI}from"../helpers/check-runtime-env.js";import{CustomListrRenderer}from"../helpers/custom-listr-renderer.js";import{filterActivedEntriesByEntryInputs,filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{formatSpinnerText}from"../helpers/format-spinner-text.js";import{getGitRoot}from"../helpers/get-git-root.js";import{getMaxProcessTasks}from"../helpers/get-max-process-tasks.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{resolveEntryMapInputFiles}from"../helpers/resolve-entry-map-input-files.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{createThreadWorker}from"./create-thread-worker.js";import{envVerify}from"./env-verify.js";export async function getBuildEntryFiles(e,r,t,o,i){const n=[],s=[];for(const e of t)r.includes(e)?n.push(e):s.push(e);if(i&&logger.info("Use custom graph traverse filter",moduleName),s.length){const t=await traverseGraph({input:s,projectCwd:e,treeNodeFilter:i||(()=>!0),lessImportOptions:{projectCwd:e,aliases:o}});if(!t)return n;logger.debug(`DependencyGraph:\n${JSON.stringify(t,null,2)}`);for(const e of s){const o=t[e]||[];arraysIntersect(o,r)&&n.push(e)}}return n}export async function dynamicCheckBuildEntryMap(e,r,t,o,i){const n={projectCwd:e,command:"build",resolve:requireResolve},s=await loadEvolveConfig(n,e,o,i);if(s.ci?.fixedBuildModules&&s.ci?.fixedBuildModules.length){logger.info("Use `fixedBuildModules` configuration to build...");return{buildEntries:filterActivedEntriesByModule(s.entryMap,s.ci?.fixedBuildModules),newEvolveOptions:s}}if(logger.info("Dynamicly checking code changed modules ..."),!r){const e=s.ci?.basedBranch||"origin/master";r=await getCommitIdOfBranch(e),logger.info(`Resolving base branch "${e}" commit hash "${r}" ...`)}logger.info(`diffCommits: \n${JSON.stringify({earlyCommit:r,lastCommit:t},null,2)}`,moduleName);let a=r?await getDiffFiles(r,t):[];const l=getGitRoot(e);if(!l)throw new Error(`No .git root (${e}) found`);if(a=a.map((e=>isAbsolute(e)?e:join(l,e))),logger.debug(`Diff files: \n${JSON.stringify(a,null,2)}`),!a.length)return logger.warn("It seems that there are no code files changed."),{buildEntries:{},newEvolveOptions:s};const m=await resolveEntryMapInputFiles(e,s.entryMap),p=await getBuildEntryFiles(e,a,m,s.webpack?.resolve?.alias,s.ci?.graphTreeNodeFilter);logger.debug(`To build entry files: \n${JSON.stringify(p,null,2)}`);return{buildEntries:await filterActivedEntriesByEntryInputs(e,s.entryMap,p),newEvolveOptions:s}}export const startDynamicBuild=async(e,r,t,o={},i)=>{const{buildEntries:n,newEvolveOptions:s}=await dynamicCheckBuildEntryMap(e,r,t,o,i);await envVerify(e,s);const a=normalizeEvolveEntryMap(n,s.entryMap),l=splitToEntryGroup(a,s,ignoreEntryOptionKeys,!1);if(!l.length)return logger.warn("No build entries provided!"),[];await createGlobalCompiler(!1,s);const{threads:m={}}=s,p=getMaxProcessTasks(l.length,m?.maxThreads);logger.info(`Start dynamic build with (${chalk(["magenta"])(String(p))}) workers`);const c=createThreadWorker({...m,maxThreads:p}),f=new Listr([],{concurrent:p,exitOnError:!0,renderer:isCI()?void 0:CustomListrRenderer}),d=[];for(const r of l){const t=Object.values(r)?.[0]?.groupName||"",n=Object.keys(r);let s=`Group ${chalk(["magenta"])(t)} $STATUS \n${formatSpinnerText(n)}`;isCI()&&(s=`Group ${chalk(["magenta"])(t)} compiling... \n${formatSpinnerText(n)}`),f.add({title:s,task:async()=>{const r=await c.startBuildWorker({projectCwd:e,entryKeys:n,serializedEvolveOptions:jsonSerializer.stringify(o),configLoaderOptions:i,groupName:t});d.push(r)}})}if(f.tasks.length)try{await f.run()}catch(e){throw c.terminate(),e}return c.terminate(),d};
1
+ import Listr from"listr";import{isAbsolute,join}from"node:path";import{getCommitIdOfBranch,getDiffFiles}from"@armit/git";import{arraysIntersect,chalk,logger,requireResolve,resetLoggerConfig}from"@flatjs/common";import{traverseGraph}from"@flatjs/graph";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";import{ignoreEntryOptionKeys,moduleName}from"../constants.js";import{isCI}from"../helpers/check-runtime-env.js";import{CustomListrRenderer}from"../helpers/custom-listr-renderer.js";import{filterActivedEntriesByEntryInputs,filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{getGitRoot}from"../helpers/get-git-root.js";import{getMaxProcessTasks}from"../helpers/get-max-process-tasks.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{printPromotions}from"../helpers/print-promotion.js";import{resolveEntryMapInputFiles}from"../helpers/resolve-entry-map-input-files.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{envVerify}from"./env-verify.js";import startBuildWorker from"./start-build-worker.js";export async function getBuildEntryFiles(e,r,t,o,i){const n=[],s=[];for(const e of t)r.includes(e)?n.push(e):s.push(e);if(i&&logger.info("Use custom graph traverse filter",moduleName),s.length){const t=await traverseGraph({input:s,projectCwd:e,treeNodeFilter:i||(()=>!0),lessImportOptions:{projectCwd:e,aliases:o}});if(!t)return n;logger.debug(`DependencyGraph:\n${JSON.stringify(t,null,2)}`);for(const e of s){const o=t[e]||[];arraysIntersect(o,r)&&n.push(e)}}return n}export async function dynamicCheckBuildEntryMap(e,r,t,o,i){const n={projectCwd:e,command:"build",resolve:requireResolve},s=await loadEvolveConfig(n,e,o,i);if(s.ci?.fixedBuildModules&&s.ci?.fixedBuildModules.length){logger.info("Use `fixedBuildModules` configuration to build...");return{buildEntries:filterActivedEntriesByModule(s.entryMap,s.ci?.fixedBuildModules),newEvolveOptions:s}}if(logger.info("Dynamicly checking code changed modules ..."),!r){const e=s.ci?.basedBranch||"origin/master";r=await getCommitIdOfBranch(e),logger.info(`Resolving base branch "${e}" commit hash "${r}" ...`)}logger.info(`diffCommits: \n${JSON.stringify({earlyCommit:r,lastCommit:t},null,2)}`,moduleName);let l=r?await getDiffFiles(r,t):[];const a=getGitRoot(e);if(!a)throw new Error(`No .git root (${e}) found`);if(l=l.map((e=>isAbsolute(e)?e:join(a,e))),logger.debug(`Diff files: \n${JSON.stringify(l,null,2)}`),!l.length)return logger.warn("It seems that there are no code files changed."),{buildEntries:{},newEvolveOptions:s};const p=await resolveEntryMapInputFiles(e,s.entryMap),m=await getBuildEntryFiles(e,l,p,s.webpack?.resolve?.alias,s.ci?.graphTreeNodeFilter);logger.debug(`To build entry files: \n${JSON.stringify(m,null,2)}`);return{buildEntries:await filterActivedEntriesByEntryInputs(e,s.entryMap,m),newEvolveOptions:s}}export const startDynamicBuild=async(e,r,t,o={},i,n={})=>{const{buildEntries:s,newEvolveOptions:l}=await dynamicCheckBuildEntryMap(e,r,t,o,i);printPromotions(n),await envVerify(e,l);const a=normalizeEvolveEntryMap(s,l.entryMap),p=splitToEntryGroup(a,l,ignoreEntryOptionKeys,!1);if(!p.length)return logger.warn("No build entries provided!"),[];await createGlobalCompiler(!1,l);const{threads:m={}}=l,c=getMaxProcessTasks(p.length,m?.maxThreads);logger.info(`Start dynamic build with (${chalk(["magenta"])(String(c))}) workers`);const f=new Listr([],{concurrent:c,exitOnError:!0,renderer:isCI()?void 0:CustomListrRenderer}),g=[];for(const r of p){const t=Object.values(r)?.[0]?.groupName||"",s=Object.keys(r);let l=`Group ${chalk(["magenta"])(t)} $STATUS $ENTRY_KEYS${s.join(",")}`;isCI()&&(l=`Group ${chalk(["magenta"])(t)} compiling... $ENTRY_KEYS${s.join(",")}`),f.add({title:l,task:async()=>{const r=await startBuildWorker({projectCwd:e,entryKeys:s,serializedEvolveOptions:jsonSerializer.stringify(o),configLoaderOptions:i,groupName:t,cliOptions:n});g.push(r)}})}return f.tasks.length&&await f.run(),isCI()||resetLoggerConfig(),g};
@@ -1,7 +1,6 @@
1
- import type { MessageChannel } from 'node:worker_threads';
2
1
  import { type ConfigLoaderOptions } from '../load-config/types.js';
2
+ import type { EvolveBuildResult } from '../types/types-build.js';
3
3
  import type { FlatCliOptions } from '../types/types-cli-options.js';
4
- import { type EvolveBuildResult } from './start-group-entry-build.js';
5
4
  /**
6
5
  * FIXME: The main entry to start an evolve `build`, NOTE: avoid pass configuration with `function` here.
7
6
  * If you need to call build api avoid `worker` you can directly call `prepareBuild`
@@ -16,7 +15,6 @@ declare const _default: (options: {
16
15
  entryKeys: string[];
17
16
  serializedEvolveOptions: string;
18
17
  configLoaderOptions?: ConfigLoaderOptions;
19
- messagePort?: MessageChannel["port1"];
20
18
  groupName?: string;
21
19
  cliOptions?: FlatCliOptions;
22
20
  }) => Promise<EvolveBuildResult>;
@@ -1 +1 @@
1
- import{configLoggerStdWriteSteam,loggerSimpleStdWriteSteam,requireResolve}from"@flatjs/common";import{ignoreEntryOptionKeys}from"../constants.js";import{isCI}from"../helpers/check-runtime-env.js";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{prepareBuild}from"./prepare-build.js";export default async e=>{isCI()||configLoggerStdWriteSteam();const{projectCwd:r,entryKeys:o,serializedEvolveOptions:t,configLoaderOptions:i,messagePort:s,groupName:p="flatjs_evolve_group",cliOptions:n}=e,l={projectCwd:r,command:"build",resolve:requireResolve},a=jsonSerializer.parse(t)||{},m=await loadEvolveConfig(l,r,a,i),f=o.map((e=>new RegExp(`^${e}$`))),g=filterActivedEntriesByModule(m.entryMap,f),d=normalizeEvolveEntryMap(g,m.entryMap),v=splitToEntryGroup(d,m,ignoreEntryOptionKeys,!1)[0];for(const[,e]of Object.entries(v))e.groupName=p;return prepareBuild(v,m,n).then((e=>(isCI()||loggerSimpleStdWriteSteam.postMessage(s),e)))};
1
+ import{configLoggerStdWriteSteam,requireResolve}from"@flatjs/common";import{ignoreEntryOptionKeys}from"../constants.js";import{isCI}from"../helpers/check-runtime-env.js";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{prepareBuild}from"./prepare-build.js";export default async e=>{isCI()||configLoggerStdWriteSteam();const{projectCwd:r,entryKeys:o,serializedEvolveOptions:i,configLoaderOptions:t,groupName:n="flatjs_evolve_group",cliOptions:p}=e,s={projectCwd:r,command:"build",resolve:requireResolve},l=jsonSerializer.parse(i)||{},a=await loadEvolveConfig(s,r,l,t),m=o.map((e=>new RegExp(`^${e}$`))),f=filterActivedEntriesByModule(a.entryMap,m),d=normalizeEvolveEntryMap(f,a.entryMap),v=splitToEntryGroup(d,a,ignoreEntryOptionKeys,!1)[0];for(const[,e]of Object.entries(v))e.groupName=n;return prepareBuild(v,a,p).then((e=>e))};
@@ -1,6 +1,6 @@
1
1
  import { type PartialDeep } from 'type-fest';
2
2
  import { type ConfigLoaderOptions } from '../load-config/types.js';
3
+ import type { EvolveBuildResult } from '../types/types-build.js';
3
4
  import type { FlatCliOptions } from '../types/types-cli-options.js';
4
5
  import { type FlatEvolveOptions } from '../types/types-options.js';
5
- import { type EvolveBuildResult } from './start-group-entry-build.js';
6
6
  export declare const startBuild: (projectCwd: string, buildModules: string[], overrideEvolveOptions?: PartialDeep<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions, cliOptions?: FlatCliOptions) => Promise<EvolveBuildResult[]>;
@@ -1 +1 @@
1
- import Listr from"listr";import{chalk,logger,requireResolve}from"@flatjs/common";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";import{ignoreEntryOptionKeys}from"../constants.js";import{isCI}from"../helpers/check-runtime-env.js";import{CustomListrRenderer}from"../helpers/custom-listr-renderer.js";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{formatSpinnerText}from"../helpers/format-spinner-text.js";import{getMaxProcessTasks}from"../helpers/get-max-process-tasks.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{createThreadWorker}from"./create-thread-worker.js";import{envVerify}from"./env-verify.js";import{startAnalyzer}from"./start-analyzer.js";export const startBuild=async(r,e,t={},o,i={})=>{const{analyzer:s=!1}=i,a={projectCwd:r,command:"build",resolve:requireResolve},n=await loadEvolveConfig(a,r,t,o);await envVerify(r,n);const l=filterActivedEntriesByModule(n.entryMap,e),m=normalizeEvolveEntryMap(l,n.entryMap),p=splitToEntryGroup(m,n,ignoreEntryOptionKeys,!1);if(!p.length)return logger.warn("No build entries provided!"),[];await createGlobalCompiler(!1,n);const{threads:c={}}=n,f=getMaxProcessTasks(p.length,c?.maxThreads);logger.info(`Start standard build with (${chalk(["magenta"])(String(f))}) workers`);const d=createThreadWorker({...c,maxThreads:f}),g=new Listr([],{concurrent:f,exitOnError:!0,renderer:isCI()?void 0:CustomListrRenderer}),y=[];for(const e of p){const s=Object.values(e)?.[0]?.groupName||"",a=Object.keys(e);let n=`Group ${chalk(["magenta"])(s)} $STATUS \n${formatSpinnerText(a)}`;isCI()&&(n=`Group ${chalk(["magenta"])(s)} compiling... \n${formatSpinnerText(a)}`),g.add({title:n,task:async()=>{const e=await d.startBuildWorker({projectCwd:r,entryKeys:a,groupName:s,serializedEvolveOptions:jsonSerializer.stringify(t),configLoaderOptions:o,cliOptions:i});y.push(e)}})}if(g.tasks.length)try{await g.run()}catch(r){throw d.terminate(),r}return d.terminate(),s&&startAnalyzer(n),y};
1
+ import Listr from"listr";import{chalk,logger,requireResolve,resetLoggerConfig}from"@flatjs/common";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";import{ignoreEntryOptionKeys}from"../constants.js";import{isCI}from"../helpers/check-runtime-env.js";import{CustomListrRenderer}from"../helpers/custom-listr-renderer.js";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{getMaxProcessTasks}from"../helpers/get-max-process-tasks.js";import{jsonSerializer}from"../helpers/json-serializer.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{printPromotions}from"../helpers/print-promotion.js";import{splitToEntryGroup}from"../helpers/split-to-entry-group.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{envVerify}from"./env-verify.js";import{startAnalyzer}from"./start-analyzer.js";import startBuildWorker from"./start-build-worker.js";export const startBuild=async(r,e,o={},t,i={})=>{const{analyzer:s=!1}=i,n={projectCwd:r,command:"build",resolve:requireResolve};printPromotions(i);const a=await loadEvolveConfig(n,r,o,t);await envVerify(r,a);const l=filterActivedEntriesByModule(a.entryMap,e),m=normalizeEvolveEntryMap(l,a.entryMap),p=splitToEntryGroup(m,a,ignoreEntryOptionKeys,!1);if(!p.length)return logger.warn("No build entries provided!"),[];await createGlobalCompiler(!1,a);const{threads:c={}}=a,f=getMaxProcessTasks(p.length,c?.maxThreads);logger.info(`Start standard build with (${chalk(["magenta"])(String(f))}) workers`);const g=new Listr([],{concurrent:f,exitOnError:!0,renderer:isCI()?void 0:CustomListrRenderer}),d=[];for(const e of p){const s=Object.values(e)?.[0]?.groupName||"",n=Object.keys(e);let a=`Group ${chalk(["magenta"])(s)} $STATUS $ENTRY_KEYS${n.join(",")}`;isCI()&&(a=`Group ${chalk(["magenta"])(s)} compiling... $ENTRY_KEYS${n.join(",")}`),g.add({title:a,task:async()=>{const e=await startBuildWorker({projectCwd:r,entryKeys:n,groupName:s,serializedEvolveOptions:jsonSerializer.stringify(o),configLoaderOptions:t,cliOptions:i});d.push(e)}})}return g.tasks.length&&await g.run(),s&&startAnalyzer(a),isCI()||resetLoggerConfig(),d};
@@ -1,5 +1,6 @@
1
1
  import { type PartialDeep } from 'type-fest';
2
2
  import { type ConfigLoaderOptions } from '../load-config/types.js';
3
+ import type { FlatCliOptions } from '../types/types-cli-options.js';
3
4
  import { type FlatEvolveOptions } from '../types/types-options.js';
4
5
  /**
5
6
  * The main entry to start evolve serve
@@ -8,4 +9,4 @@ import { type FlatEvolveOptions } from '../types/types-options.js';
8
9
  * @param overrideEvolveOptions The overrided evolve options
9
10
  * @param configLoaderOptions Evolve config loader options
10
11
  */
11
- export declare const startServe: (projectCwd: string, serveModules: string[], overrideEvolveOptions?: PartialDeep<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions) => Promise<never[] | import("express-serve-static-core").Express | undefined>;
12
+ export declare const startServe: (projectCwd: string, serveModules: string[], overrideEvolveOptions?: PartialDeep<FlatEvolveOptions>, configLoaderOptions?: ConfigLoaderOptions, cliOptions?: FlatCliOptions) => Promise<never[] | import("express-serve-static-core").Express | undefined>;
@@ -1 +1 @@
1
- import{logger,requireResolve}from"@flatjs/common";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{prepareServe}from"./prepare-serve.js";export const startServe=async(e,r,o={},t)=>{const l={projectCwd:e,command:"serve",resolve:requireResolve},i=await loadEvolveConfig(l,e,o,t),a=filterActivedEntriesByModule(i.entryMap,r),n=Object.keys(a);if(!n.length)return logger.warn("No served entries providered!"),[];logger.info({servedEntries:n});const p=normalizeEvolveEntryMap(a,i.entryMap);return await createGlobalCompiler(!0,i),prepareServe(e,p,i)};
1
+ import{logger,requireResolve}from"@flatjs/common";import{createGlobalCompiler}from"../compiler/create-global-compiler.js";import{filterActivedEntriesByModule}from"../helpers/filter-actived-entries.js";import{normalizeEvolveEntryMap}from"../helpers/normalize-entry-map.js";import{printPromotions}from"../helpers/print-promotion.js";import{loadEvolveConfig}from"../load-config/load-evolve-config.js";import{prepareServe}from"./prepare-serve.js";export const startServe=async(e,r,o={},t,i={})=>{const l={projectCwd:e,command:"serve",resolve:requireResolve};printPromotions(i);const n=await loadEvolveConfig(l,e,o,t),p=filterActivedEntriesByModule(n.entryMap,r),a=Object.keys(p);if(!a.length)return logger.warn("No served entries providered!"),[];logger.info({servedEntries:a});const s=normalizeEvolveEntryMap(p,n.entryMap);return await createGlobalCompiler(!0,n),prepareServe(e,s,n,i)};
@@ -1,2 +1,4 @@
1
+ import type { SwcJsMinimizerRspackPluginOptions } from '@rspack/core';
1
2
  import { type TerserMinimizerOptions } from './types.js';
2
3
  export declare const defaultTerserOptions: TerserMinimizerOptions;
4
+ export declare const defaultMinimizerRspackOptions: SwcJsMinimizerRspackPluginOptions['minimizerOptions'];
@@ -1 +1 @@
1
- export const defaultTerserOptions={ecma:void 0,parse:{},compress:{},mangle:!0,module:!1,output:void 0,toplevel:!1,ie8:!1,keep_classnames:void 0,keep_fnames:!1,safari10:!1};
1
+ export const defaultTerserOptions={ecma:void 0,parse:{},compress:{},mangle:!0,module:!1,output:void 0,toplevel:!1,ie8:!1,keep_classnames:void 0,keep_fnames:!1,safari10:!1};export const defaultMinimizerRspackOptions={compress:{ecma:void 0,module:!1,toplevel:!1,ie8:!1,keep_classnames:void 0,keep_fnames:!1},mangle:!0,module:!1,format:{ecma:void 0,safari10:!1}};
@@ -1 +1,2 @@
1
- export * from './create-minimizers.js';
1
+ export * from './rspack/create-minimizers.js';
2
+ export * from './webpack/create-minimizers.js';
@@ -1 +1 @@
1
- export*from"./create-minimizers.js";
1
+ export*from"./rspack/create-minimizers.js";export*from"./webpack/create-minimizers.js";
@@ -0,0 +1,3 @@
1
+ import { type Plugins } from '@rspack/core';
2
+ import { type FlatEvolveWebpackOptions } from '../../types/types-webpack.js';
3
+ export declare const createRspackMinimizers: (serveMode: boolean, webpackOptions?: FlatEvolveWebpackOptions) => Plugins;
@@ -0,0 +1 @@
1
+ import{logger}from"@flatjs/common";import{LightningCssMinimizerRspackPlugin}from"@rspack/core";import{moduleName}from"../../constants.js";import{printInfo}from"../../helpers/print-log.js";import{imageRspackMinimizer}from"./image-minimizer.js";import{terserRspackMinimizer}from"./terser-minimizer.js";export const createRspackMinimizers=(i,r)=>{const e=[];if(i)return logger.debug("Ignore minimizer plugin for `serve` mode",moduleName),e;if(!1===r?.minimizer)return printInfo("Note `minimizer` has been disabled for now"),e;if(e.push(new LightningCssMinimizerRspackPlugin({removeUnusedLocalIdents:!1})),r?.minimizer?.imageMin){const i=imageRspackMinimizer();i&&e.push(i)}if(!1===r?.minimizer?.terserOptions)return e;const m=terserRspackMinimizer(r?.minimizer?.terserOptions||{});return e.push(m),e};
@@ -13,4 +13,4 @@ import ImageMinimizerPlugin from 'image-minimizer-webpack-plugin';
13
13
  * sudo yum install gifsicle
14
14
  * @returns
15
15
  */
16
- export declare const imageMinimizer: () => ImageMinimizerPlugin<unknown, unknown> | null;
16
+ export declare const imageRspackMinimizer: () => ImageMinimizerPlugin<unknown, unknown> | null;
@@ -0,0 +1 @@
1
+ import ImageMinimizerPlugin from"image-minimizer-webpack-plugin";import{projectHasYarn}from"@armit/package";import{chalk,logger,requireResolve}from"@flatjs/common";import{moduleName}from"../../constants.js";const logs=new Map;export const imageRspackMinimizer=()=>{const e=[],i=[["svgo",{}],["gifsicle",{}],["jpegtran",{}],["pngquant",{}]].map((i=>{const n=i[0];try{return requireResolve(import.meta.url,`imagemin-${n}`),i}catch{if(!logs.get(n)){logs.set(n,!0);const i=chalk(["magenta"])(`"${projectHasYarn()?"yarn add":"npm install"} imagemin-${n} -D"`);e.push(`Execute ${i} for assets optimization`)}return null}})).filter(Boolean);if(e.length)for(const i of e)logger.warn(i,moduleName);return i.length?new ImageMinimizerPlugin({minimizer:{implementation:ImageMinimizerPlugin.imageminMinify,options:{plugins:i}}}):null};
@@ -0,0 +1,6 @@
1
+ import { type Plugin } from '@rspack/core';
2
+ import { type TerserMinimizerOptions } from '../types.js';
3
+ /**
4
+ * https://github.com/webpack-contrib/terser-webpack-plugin#terseroptions
5
+ */
6
+ export declare const terserRspackMinimizer: (terserOptions: TerserMinimizerOptions) => Plugin;
@@ -0,0 +1 @@
1
+ import _ from"lodash";import{logger,mergeOptions}from"@flatjs/common";import{SwcJsMinimizerRspackPlugin}from"@rspack/core";import{defaultMinimizerRspackOptions}from"../default-options.js";const assertRspackKeepOption=e=>{if(e)return _.isRegExp(e)?(logger.warn("Rspack does not support RegExp for keep_classnames or keep_fnames, use true instead"),!0):e};export const terserRspackMinimizer=e=>{const s=assertRspackKeepOption(e.keep_classnames),p=assertRspackKeepOption(e.keep_fnames);let a;return a&&_.isRegExp(a)?a=!0:a&&"object"==typeof a&&(a={...a,keep_classnames:assertRspackKeepOption(a.keep_classnames),keep_fnames:assertRspackKeepOption(a.keep_fnames)}),new SwcJsMinimizerRspackPlugin({extractComments:!1,minimizerOptions:mergeOptions(defaultMinimizerRspackOptions,{compress:{ecma:e.ecma,module:e.module,toplevel:e.toplevel,ie8:e.ie8,keep_classnames:s,keep_fnames:p},mangle:a,module:e.module,format:{ecma:e.ecma,safari10:e.safari10}})})};
@@ -0,0 +1,3 @@
1
+ import type { WebpackPlugin } from '../../types/types-webpack.js';
2
+ import { type FlatEvolveWebpackOptions } from '../../types/types-webpack.js';
3
+ export declare const createWebpackMinimizers: (serveMode: boolean, webpackOptions?: FlatEvolveWebpackOptions) => WebpackPlugin[];
@@ -0,0 +1 @@
1
+ import{logger}from"@flatjs/common";import{moduleName}from"../../constants.js";import{printInfo}from"../../helpers/print-log.js";import{imageWebpackMinimizer}from"./image-minimizer.js";import{terserWebpackMinimizer}from"./terser-minimizer.js";export const createWebpackMinimizers=(i,e)=>{const r=[];if(i)return logger.debug("Ignore minimizer plugin for `serve` mode",moduleName),r;if(!1===e?.minimizer)return printInfo("Note `minimizer` has been disabled for now"),r;if(e?.minimizer?.imageMin){const i=imageWebpackMinimizer();i&&r.push(i)}if(!1===e?.minimizer?.terserOptions)return r;const m=terserWebpackMinimizer(e?.minimizer?.terserOptions||{});return r.push(m),r};
@@ -0,0 +1,16 @@
1
+ import ImageMinimizerPlugin from 'image-minimizer-webpack-plugin';
2
+ /**
3
+ * Install libpng library & gifsicle tool
4
+ * macos
5
+ * =====================
6
+ * brew install libpng
7
+ * brew install gifsicle
8
+ *
9
+ * centos
10
+ * =====================
11
+ * sudo yum install libpng
12
+ * sudo yum install epel-release
13
+ * sudo yum install gifsicle
14
+ * @returns
15
+ */
16
+ export declare const imageWebpackMinimizer: () => ImageMinimizerPlugin<unknown, unknown> | null;
@@ -0,0 +1 @@
1
+ import ImageMinimizerPlugin from"image-minimizer-webpack-plugin";import{projectHasYarn}from"@armit/package";import{chalk,logger,requireResolve}from"@flatjs/common";import{moduleName}from"../../constants.js";const logs=new Map;export const imageWebpackMinimizer=()=>{const e=[],i=[["svgo",{}],["gifsicle",{}],["jpegtran",{}],["pngquant",{}]].map((i=>{const n=i[0];try{return requireResolve(import.meta.url,`imagemin-${n}`),i}catch{if(!logs.get(n)){logs.set(n,!0);const i=chalk(["magenta"])(`"${projectHasYarn()?"yarn add":"npm install"} imagemin-${n} -D"`);e.push(`Execute ${i} for assets optimization`)}return null}})).filter(Boolean);if(e.length)for(const i of e)logger.warn(i,moduleName);return i.length?new ImageMinimizerPlugin({minimizer:{implementation:ImageMinimizerPlugin.imageminMinify,options:{plugins:i}}}):null};
@@ -0,0 +1,6 @@
1
+ import type { WebpackPlugin } from '../../types/types-webpack.js';
2
+ import { type TerserMinimizerOptions } from '../types.js';
3
+ /**
4
+ * https://github.com/webpack-contrib/terser-webpack-plugin#terseroptions
5
+ */
6
+ export declare const terserWebpackMinimizer: (terserOptions: TerserMinimizerOptions) => WebpackPlugin;
@@ -1,3 +1,3 @@
1
- import TerserPlugin from"terser-webpack-plugin";import{mergeOptions}from"@flatjs/common";import{defaultTerserOptions}from"./default-options.js";export const terserMinimizer=e=>new TerserPlugin({parallel:!0,
1
+ import TerserPlugin from"terser-webpack-plugin";import{mergeOptions}from"@flatjs/common";import{defaultTerserOptions}from"../default-options.js";export const terserWebpackMinimizer=e=>new TerserPlugin({parallel:!0,
2
2
  // Disable Extract all or some (use /^\**!|@preserve|@license|@cc_on/i RegExp) comments.
3
3
  extractComments:!1,terserOptions:mergeOptions(defaultTerserOptions,e)});
@@ -1,5 +1,5 @@
1
- import { type WebpackPlugin } from '../../create-webpack/types.js';
2
- import { type FlatEvolveOptions } from '../../types/types-options.js';
1
+ import type { Plugins } from '@rspack/core';
2
+ import { type FlatEvolveOptions } from '../../../types/types-options.js';
3
3
  /**
4
4
  * The DefinePlugin replaces variables in your code with other values or expressions at compile time.
5
5
  * ```ts
@@ -11,4 +11,4 @@ import { type FlatEvolveOptions } from '../../types/types-options.js';
11
11
  * ```
12
12
  * @returns
13
13
  */
14
- export declare const createBuiltinDefineVariables: (serveMode: boolean, evolveOptions: FlatEvolveOptions) => Promise<WebpackPlugin[]>;
14
+ export declare const createBuiltinDefineVariablesRspackPlugins: (serveMode: boolean, evolveOptions: FlatEvolveOptions) => Promise<Plugins>;
@@ -0,0 +1 @@
1
+ import{getLastCommitHash,gitBranchName}from"@armit/git";import{logger,mergeOptions}from"@flatjs/common";import{DefinePlugin}from"@rspack/core";export const createBuiltinDefineVariablesRspackPlugins=async(e,i)=>{const{ci:t}=i,n=t?.releaseVersion;let r={"process.env.FLAT_RELEASE_VERSION":JSON.stringify(n)};try{const e=await getLastCommitHash(),i=await gitBranchName();r=mergeOptions({"process.env.FLAT_COMMIT_HASH":JSON.stringify(e),"process.env.FLAT_BRANCH_NAME":JSON.stringify(i),"process.env.FLAT_RELEASE_VERSION":JSON.stringify(e)},r)}catch(e){logger.warn(`Failed to get commit hash or branch name: ${e.message}`)}return[new DefinePlugin({__SENTRY_DEBUG__:e,"process.env.FLAT_BUILD_DATE":JSON.stringify((new Date).toISOString()),...r,...i.pluginOptions.definePlugin})]};
@@ -0,0 +1,4 @@
1
+ import type { Compiler } from '@rspack/core';
2
+ export declare class ExternalTemplateRemotesRspackPlugin {
3
+ apply(compiler: Compiler): void;
4
+ }
@@ -0,0 +1 @@
1
+ import{Compilation,sources}from"@rspack/core";const{RawSource:RawSource}=sources,PLUGIN_NAME="ExternalTemplateRemotesRspackPlugin",isExternalModule=e=>"ExternalModule"===e.constructor.name;function extractUrlAndGlobal(e){const t=e.indexOf("@");if(t<=0||t===e.length-1)throw new Error(`Invalid request "${e}"`);return[e.substring(t+1),e.substring(0,t)]}export class ExternalTemplateRemotesRspackPlugin{apply(e){e.hooks.make.tap(PLUGIN_NAME,(e=>{const t=[];e.hooks.buildModule.tap(PLUGIN_NAME,(e=>{const o=e.identifier().startsWith("external script");isExternalModule(e)&&o&&t.push(e)})),e.hooks.processAssets.tap({name:PLUGIN_NAME,stage:Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE},(o=>{t.forEach((t=>{const s=t.identifier().match(/"([^"]+)"/),n=s?s[1]:"",[r]=extractUrlAndGlobal(n),i=toExpression(r);for(const t of Object.keys(o)){const o=e.getAsset(t),s=o?.source.source()?.toString();if(s&&s.includes(r)){const o=s.replace(`"${r}"`,i);e.updateAsset(t,new RawSource(o))}}}))}))}))}}function toExpression(e){const t=[],o=[];let s=!1,n=!1;for(const r of e)if("["===r){if(s){n=!0;break}s=!0,o.length&&(t.push(`"${o.join("")}"`),o.length=0)}else if("]"===r){if(!s){n=!0;break}s=!1,o.length&&(t.push(`${o.join("")}`),o.length=0),o.length=0}else o.push(r);if(s||n)throw new Error(`Invalid template URL "${e}"`);return o.length&&t.push(`"${o.join("")}"`),t.join(" + ")}
@@ -0,0 +1,4 @@
1
+ import type { Plugin as RspackPlugin } from '@rspack/core';
2
+ import { type EntryMapItem } from '../../../types/types-entry-map.js';
3
+ import { type FlatEvolveOptions } from '../../../types/types-options.js';
4
+ export declare const createModuleFederationRspackPlugins: (serveMode: boolean, entryMapItemList: EntryMapItem[], evolveOptions: FlatEvolveOptions) => RspackPlugin[];
@@ -0,0 +1 @@
1
+ import{join}from"node:path";import{ensureSlash}from"@flatjs/common";import rspack from"@rspack/core";import{normalizeEvolveEntryName}from"../../../helpers/normalize-entry-map.js";import{injectFederationScripts}from"../../../helpers/script-injects.js";import{HtmlInjectScriptWebpackPlugin}from"../../webpack/html-inject-scripts/index.js";import{ExternalTemplateRemotesRspackPlugin}from"./external-template-remotes-rspack-plugin.js";const normalizeWidgetName=(e="")=>e.replace(/[/-]/g,"_").toLowerCase(),remoteFileName=e=>join(e,"micro-remote-module.js");export const createModuleFederationRspackPlugins=(e,t,r)=>{const o=r.projectVirtualPath,n=r.multiHtmlCdn,i=r.multiHtmlCdnEnvResolver,m=[];for(const r of t){const[t,a]=r,s=a.options?.moduleFederation;if(s){const{remotes:r,exposes:a,...l}=s,c=remoteFileName(t),p=normalizeWidgetName(t),u=(a?Array.isArray(a)?a:[a]:[]).map((e=>{const r={};for(const[o,n]of Object.entries(e))r[o]={...n,name:join(t,n.name.replace(/^\//,""))};return r})),d=(r||[]).map((({name:e,endpoint:t})=>{const r=normalizeEvolveEntryName(e,o),n=normalizeWidgetName(r),i=remoteFileName(r),m=t?ensureSlash(t(e,r),!1):"[window.evolveFetchMicroWidgets()]";return{[n]:`${n}@${m}/${i}`}}));m.push(new rspack.container.ModuleFederationPlugin({...l,name:p,filename:c,remotes:d,exposes:u}),new ExternalTemplateRemotesRspackPlugin),e||m.unshift(new HtmlInjectScriptWebpackPlugin([injectFederationScripts(n,i)]))}}return m};
@@ -0,0 +1,4 @@
1
+ import type { Plugin as RspackPlugin } from '@rspack/core';
2
+ import { type EntryMapItem } from '../../../types/types-entry-map.js';
3
+ import { type FlatEvolveOptions } from '../../../types/types-options.js';
4
+ export declare const createHtmlRspackPlugins: (serveMode: boolean, entryMapItemList: EntryMapItem[], evolveOptions: FlatEvolveOptions) => RspackPlugin[];
@@ -0,0 +1 @@
1
+ import{FlatEvolveMultiCdnRspackPlugin}from"./multi-html-cdn-rspack-plugin.js";import{createMultiHtmlRspackPlugins}from"./multi-html-rspack-plugin.js";export const createHtmlRspackPlugins=(t,l,u)=>{const i=[],s=l[0];if(t||s[1]?.options?.output?.library)return i;const n=Object.keys(u.multiHtmlCdn);return i.push(...createMultiHtmlRspackPlugins(t,u,l,n)),i.push(new FlatEvolveMultiCdnRspackPlugin(u,l)),i};
@@ -0,0 +1,18 @@
1
+ import type { Compiler } from 'webpack';
2
+ import type { EntryMapItem, FlatEvolveOptions } from '../../../types/index.js';
3
+ export declare class FlatEvolveMultiCdnRspackPlugin {
4
+ private pluginName;
5
+ private requireFn;
6
+ private config;
7
+ private cdnResolver;
8
+ private entryMapItemList;
9
+ constructor(evolveOptions: FlatEvolveOptions, entryMapItemList: EntryMapItem[]);
10
+ /**
11
+ * Apply the plugin to check if there are non initial chunks which need to be imported using `require-ensure` or `import`
12
+ * https://github.com/webpack/webpack/blob/3d653290fafe385277b48e5a36807124618b9561/lib/MainTemplate.js#L158
13
+ * https://www.npmjs.com/package/vscode-webpack-debugger
14
+ * https://www.cnblogs.com/Scar007/p/9166068.html
15
+ * https://www.cnblogs.com/pluslius/p/10271537.html
16
+ */
17
+ apply(compiler: Compiler): void;
18
+ }
@@ -0,0 +1 @@
1
+ import HtmlWebpackPlugin from"html-webpack-plugin";import{basename}from"node:path";import{ensureSlash}from"@flatjs/common";import rspack from"@rspack/core";import{getRuntimeCDNBase}from"../../../helpers/get-runtime-cdn-base.js";import{findEnvCdn,httpUrlJoin}from"../../../helpers/script-injects.js";export class FlatEvolveMultiCdnRspackPlugin{constructor(e,t){if(this.pluginName="FlatEvolveMultiCdnRspackPlugin",this.requireFn=rspack.RuntimeGlobals.publicPath,this.config=e.multiHtmlCdn,this.entryMapItemList=t,this.cdnResolver=e.multiHtmlCdnEnvResolver||function cdnResolver(){},!this.config?.prod)throw new Error("We must setup `prod` for each CDN config node!")}apply(e){e.hooks.compilation.tap(this.pluginName,(e=>{e.hooks.runtimeModule.tap(this.pluginName,((e,t)=>{const s=this.entryMapItemList.find((e=>e[0]===t.name));if("public_path"===e.name&&s){const t=[];t.push("\n"),t.push("// Dynamic assets path override(`@flatjs/evolve`) plugin-multi-html-cdn`)"),t.push(getRuntimeCDNBase(this.config,this.cdnResolver,this.requireFn)),e.source.source=Buffer.from(t.join("\n"),"utf-8")}}))})),e.hooks.compilation.tap(this.pluginName,(e=>{HtmlWebpackPlugin.getHooks(e).beforeAssetTagGeneration.tap(this.pluginName,(e=>{const{assets:t,plugin:s,outputName:n}=e,i=s?.options?.chunks||[],r=Array.isArray(i)?i.find((e=>n.includes(ensureSlash(e,!0)))):i,{userOptions:o}=e.plugin;if(!r)throw new Error("We must have current chunk!");const a=t.js.filter((e=>e.includes(ensureSlash(r,!0)))),l=t.css.filter((e=>e.includes(ensureSlash(r,!0)))),u=o.multiCdn,p=t.publicPath,c=a.map((e=>{if(u.disabled)return basename(e);const t=findEnvCdn(this.config,u.env);return httpUrlJoin(t,e.replace(p,""))})),m=l.map((e=>{if(u.disabled)return basename(e);const t=findEnvCdn(this.config,u.env);return httpUrlJoin(t,e.replace(p,""))}));return e.assets.js=c,e.assets.css=m,e}))}))}}
@@ -1,10 +1,10 @@
1
1
  import type { Compiler } from 'webpack';
2
- import type { EntryMapItem } from '../../types/types-entry-map.js';
2
+ import type { EntryMapItem } from '../../../types/types-entry-map.js';
3
3
  /**
4
4
  * The MultiHtmlModifyPlugin class is responsible for modifying the HTML output of the webpack compiler.
5
5
  * It hooks into the compilation process and replaces occurrences of "<%= title %>" with the title specified in the options.
6
6
  */
7
- export declare class MultiHtmlModifyPlugin {
7
+ export declare class MultiHtmlModifyRspackPlugin {
8
8
  private pluginName;
9
9
  private entryMapItemList;
10
10
  constructor(list: EntryMapItem[]);
@@ -0,0 +1 @@
1
+ import HtmlWebpackPlugin from"html-webpack-plugin";import{ensureSlash}from"@flatjs/common";const getCurrentEntryOptions=(t=[],i)=>{const e=t.find((t=>i.includes(ensureSlash(t[0],!0))));return e?e[1]?.options:void 0};export class MultiHtmlModifyRspackPlugin{constructor(t){this.pluginName="MultiHtmlModifyRspackPlugin",this.entryMapItemList=t}apply(t){t.hooks.compilation.tap(this.pluginName,(t=>{HtmlWebpackPlugin.getHooks(t).beforeEmit.tapAsync(this.pluginName,((t,i)=>{const e=getCurrentEntryOptions(this.entryMapItemList,t.outputName);/<%= title %>/.test(t.html)&&(t.html=t.html.replace(/<%= title %>/g,e?.title||"")),i(null,t)}))}))}}
@@ -0,0 +1,11 @@
1
+ import type { Plugin as RspackPlugin } from '@rspack/core';
2
+ import { type EntryMapItem } from '../../../types/types-entry-map.js';
3
+ import { type EvolveMultiCdnEnvType } from '../../../types/types-multi-html.js';
4
+ import { type FlatEvolveOptions } from '../../../types/types-options.js';
5
+ /**
6
+ * Create `html-webpack-plugin` for this build, refer to best practices
7
+ * We'd better pass only one entry for each `build` cycle
8
+ * @param buildEntryItem the entries for this `build`
9
+ * @param allEnv
10
+ */
11
+ export declare const createMultiHtmlRspackPlugins: (serveMode: boolean, evolveOptions: FlatEvolveOptions, entryMapItemList: EntryMapItem[], allEnv: Array<EvolveMultiCdnEnvType>) => RspackPlugin[];
@@ -0,0 +1 @@
1
+ import HtmlWebpackPlugin from"html-webpack-plugin";import{existsSync}from"node:fs";import{logger}from"@flatjs/common";import{allowPx2remForModule}from"../../../helpers/allow-px2rem-for-module.js";import{getHtmlPluginConfig}from"../../../helpers/get-html-plugin-config.js";import{normalizeTemplateInjectTokens}from"../../../helpers/normalize-template-inject-tokens.js";import{findEnvCdn}from"../../../helpers/script-injects.js";import{MultiHtmlModifyRspackPlugin}from"./multi-html-modify--rspack-plugin.js";const minifyOpts={minifyJS:!0,removeComments:!0,collapseWhitespace:!0,collapseBooleanAttributes:!1};export const createMultiHtmlRspackPlugins=(e,t,l,i)=>{const n=l[0],[,o]=n,m=[new MultiHtmlModifyRspackPlugin(l)],{options:p}=o,r=e?"development":"production",s=l.map((e=>e[0]));for(const e of i){const l={mode:r,envCdn:findEnvCdn(t.multiHtmlCdn,e)},i=normalizeTemplateInjectTokens(l,p);let o=getHtmlPluginConfig("templatePath",l,p?.templatePath).replace("{0}",e.trim());existsSync(o)||(logger.warn(`The template file ${o} is not exists, use \`prod\` instead!`),o=getHtmlPluginConfig("templatePath",l,p?.templatePath).replace("{0}","prod")),m.push(new HtmlWebpackPlugin({inject:"body",title:getHtmlPluginConfig("title",l,p?.title),chunks:s,minify:!1!==p?.htmlMinify&&!["me","dev"].includes(e)&&minifyOpts,filename:t=>`${t}/index${"prod"===e?"":`-${e}`}.html`,template:o,templateParameters:{title:"<%= title %>",favicon:getHtmlPluginConfig("favicon",l,p?.favicon),viewport:allowPx2remForModule(n,t)?getHtmlPluginConfig("viewport",l,p?.viewport):"",...i},multiCdn:{env:e,disabled:(p?.excludeCdnEnvs||["me","dev","ntv"]).includes(e)}}))}return m};
@@ -46,7 +46,7 @@ export interface Options {
46
46
  compilation: Compilation;
47
47
  }) => void;
48
48
  }
49
- export declare class CircularDependencyPlugin {
49
+ export declare class CircularDependencyWebpackPlugin {
50
50
  private options;
51
51
  constructor(options?: Options);
52
52
  apply(compiler: Compiler): void;
@@ -0,0 +1 @@
1
+ import{relative}from"node:path";import Graph from"tarjan-graph";import webpack from"webpack";import{mergeOptions}from"@flatjs/common";const BASE_ERROR="Circular dependency detected:\r\n",PLUGIN_TITLE="CircularDependencyWebpackPlugin";export class CircularDependencyWebpackPlugin{constructor(o={}){this.options=mergeOptions({exclude:/node_modules/,include:/.*/,failOnError:!1,allowAsyncCycles:!1,projectCwd:process.cwd()},o)}apply(o){const e=this.options.projectCwd;o.hooks.compilation.tap(PLUGIN_TITLE,(o=>{o.hooks.optimizeModules.tap(PLUGIN_TITLE,(t=>{this.options.onStart&&this.options.onStart({compilation:o});const n=new(Graph.default||Graph);for(const e of t){const t=[];for(const n of e.dependencies){if(n.constructor&&"CommonJsSelfReferenceDependency"===n.constructor.name)continue;let r=null;r=o.moduleGraph?o.moduleGraph.getModule(n):n.module,r&&(r instanceof webpack.NormalModule&&r.resource&&(this.options.allowAsyncCycles&&n.weak||e!==r&&t.push(r.identifier())))}n.add(e.identifier(),t)}const r=n.getCycles();this.isCyclic(r,o,e),this.options.onEnd&&this.options.onEnd({compilation:o})}))}))}isCyclic(o,e,t){o.forEach((o=>{const n=o.slice().reverse().map((o=>{const t=e.findModule(o.name);return t instanceof webpack.NormalModule&&t.resource||null}));if(n.every((o=>!o||this.options.exclude.test(o)||!this.options.include.test(o))))return;const r=n.map((o=>relative(t,o)));if(this.options.onDetected){try{this.options.onDetected({paths:r.concat([r[0]]),compilation:e})}catch(o){e.errors.push(o)}return}const s=new Error(BASE_ERROR.concat(r.concat([r[0]]).join(" -> ")));this.options.failOnError?e.errors.push(s):e.warnings.push(s)}))}}
@@ -0,0 +1,9 @@
1
+ import type { FlatEvolveOptions } from '../../../types/types-options.js';
2
+ import type { WebpackPlugin } from '../../../types/types-webpack.js';
3
+ /**
4
+ * Detect modules with circular dependencies when bundling with webpack for `development` mode.
5
+ * @param serveMode development mode
6
+ * @param evolveOptions evolve options
7
+ * @returns
8
+ */
9
+ export declare const createCircularDependencyWebpackPlugins: (serveMode: boolean, evolveOptions: FlatEvolveOptions) => WebpackPlugin[];
@@ -0,0 +1 @@
1
+ import{CircularDependencyWebpackPlugin}from"./circular-dependency-webpack-plugin.js";export const createCircularDependencyWebpackPlugins=(e,c)=>e?[new CircularDependencyWebpackPlugin({projectCwd:c.projectCwd})]:[];
@@ -0,0 +1 @@
1
+ import{rmSync}from"node:fs";import{relative}from"node:path";import{fileWalkSync}from"@armit/file-utility";import{logger}from"@flatjs/common";import{moduleName}from"../../../constants.js";export class CleanWebpackPlugin{constructor(e={}){this.verbose=!0===e.verbose||!1,this.projectCwd=e.projectCwd||process.cwd(),this.cleanStaleWebpackAssets=!0!==e.cleanStaleWebpackAssets&&!1!==e.cleanStaleWebpackAssets||e.cleanStaleWebpackAssets,this.protectWebpackAssets=!0!==e.protectWebpackAssets&&!1!==e.protectWebpackAssets||e.protectWebpackAssets,this.cleanAfterEveryBuildPatterns=Array.isArray(e.cleanAfterEveryBuildPatterns)?e.cleanAfterEveryBuildPatterns:[],this.cleanOnceBeforeBuildPatterns=Array.isArray(e.cleanOnceBeforeBuildPatterns)?e.cleanOnceBeforeBuildPatterns:["**/*"],this.currentAssets=[],this.initialClean=!1,this.outputPath="",this.apply=this.apply.bind(this),this.handleInitial=this.handleInitial.bind(this),this.handleDone=this.handleDone.bind(this),this.removeFiles=this.removeFiles.bind(this)}apply(e){if(!e.options.output||!e.options.output.path)return void logger.warn("clean-webpack-plugin: options.output.path not defined. Plugin disabled...",moduleName);this.outputPath=e.options.output.path;const t=e.hooks;0!==this.cleanOnceBeforeBuildPatterns.length&&t.emit.tap("clean-webpack-plugin",(e=>{this.handleInitial(e)})),t.done.tap("clean-webpack-plugin",(e=>{this.handleDone(e)}))}handleInitial(e){if(this.initialClean)return;e.getStats().hasErrors()||(this.initialClean=!0,this.removeFiles(this.cleanOnceBeforeBuildPatterns))}handleDone(e){if(e.hasErrors())return void(this.verbose&&logger.warn("clean-webpack-plugin: pausing due to webpack errors",moduleName));const t=(e.toJson({assets:!0}).assets||[]).map((e=>e.name)),s=this.currentAssets.filter((e=>!1===t.includes(e)));this.currentAssets=t.sort();const i=[];!0===this.cleanStaleWebpackAssets&&0!==s.length&&i.push(...s),0!==this.cleanAfterEveryBuildPatterns.length&&i.push(...this.cleanAfterEveryBuildPatterns),0!==i.length&&this.removeFiles(i)}removeFiles(e){try{const t=fileWalkSync(e,{absolute:!0,unique:!0,cwd:this.outputPath,dot:!0,ignore:this.protectWebpackAssets?this.currentAssets:[]});for(const e of t)rmSync(e,{force:!0,recursive:!0});this.verbose&&t.forEach((e=>{const t=relative(this.projectCwd,e);logger.debug(`clean-webpack-plugin: removed ${t}`,moduleName)}))}catch(e){if(/Cannot delete files\/folders outside the current working directory\./.test(e.message)){throw new Error("clean-webpack-plugin: Cannot delete files/folders outside the current working directory. Can be overridden with the `dangerouslyAllowCleanPatternsOutsideProject` option.")}throw e}}}
@@ -0,0 +1,9 @@
1
+ import { type EntryMapItem } from '../../../types/types-entry-map.js';
2
+ import { type FlatEvolveOptions } from '../../../types/types-options.js';
3
+ import type { WebpackPlugin } from '../../../types/types-webpack.js';
4
+ /**
5
+ * Cleaning up the /dist folder for `production` build
6
+ * @param singleEntryItem
7
+ * @returns
8
+ */
9
+ export declare const createCleanWebpackPlugins: (serveMode: boolean, entryMapItemList: EntryMapItem[], evolveOptions: FlatEvolveOptions) => WebpackPlugin[];
@@ -0,0 +1 @@
1
+ import{posix}from"node:path";import{ensureSlash}from"@flatjs/common";import{CleanWebpackPlugin}from"./clean-webpack-plugin.js";export const createCleanWebpackPlugins=(e,n,o)=>e?[]:[new CleanWebpackPlugin({verbose:!0,projectCwd:o.projectCwd,cleanOnceBeforeBuildPatterns:n.map((e=>`${posix.join(ensureSlash(e[0],!0),"**/*")}`))})];
@@ -0,0 +1,16 @@
1
+ import type { FlatEvolveOptions } from '../../../types/types-options.js';
2
+ import type { WebpackPlugin } from '../../../types/types-webpack.js';
3
+ /**
4
+ * The DefinePlugin replaces variables in your code with other values or expressions at compile time.
5
+ * ```ts
6
+ * `__SENTRY_DEBUG__`
7
+ * `process.env.FLAT_BUILD_DATE`
8
+ * `process.env.FLAT_COMMIT_HASH`
9
+ * `process.env.FLAT_BRANCH_NAME`
10
+ * `process.env.FLAT_RELEASE_VERSION`
11
+ * ```
12
+ * @param serveMode development mode
13
+ * @param evolveOptions evolve options
14
+ * @returns
15
+ */
16
+ export declare const createBuiltinDefineVariablesWebpackPlugins: (serveMode: boolean, evolveOptions: FlatEvolveOptions) => Promise<WebpackPlugin[]>;
@@ -0,0 +1 @@
1
+ import webpack from"webpack";import{getLastCommitHash,gitBranchName}from"@armit/git";import{logger,mergeOptions}from"@flatjs/common";export const createBuiltinDefineVariablesWebpackPlugins=async(e,t)=>{const{ci:i}=t,n=i?.releaseVersion;let r={"process.env.FLAT_RELEASE_VERSION":JSON.stringify(n)};try{const e=await getLastCommitHash(),t=await gitBranchName();r=mergeOptions({"process.env.FLAT_COMMIT_HASH":JSON.stringify(e),"process.env.FLAT_BRANCH_NAME":JSON.stringify(t),"process.env.FLAT_RELEASE_VERSION":JSON.stringify(e)},r)}catch(e){logger.warn(`Failed to get commit hash or branch name: ${e.message}`)}return[new webpack.DefinePlugin({__SENTRY_DEBUG__:e,"process.env.FLAT_BUILD_DATE":JSON.stringify((new Date).toISOString()),...r,...t.pluginOptions.definePlugin})]};
@@ -1,6 +1,6 @@
1
1
  import type { HtmlTagObject } from 'html-webpack-plugin';
2
2
  import type { Compiler, WebpackPluginInstance } from 'webpack';
3
- export declare class HtmlInjectScriptPlugin implements WebpackPluginInstance {
3
+ export declare class HtmlInjectScriptWebpackPlugin implements WebpackPluginInstance {
4
4
  scripts: string[];
5
5
  constructor(scripts?: string[]);
6
6
  processScripts(): HtmlTagObject[];
@@ -0,0 +1 @@
1
+ import htmlWebpackPlugin from"html-webpack-plugin";const PLUGIN_PREFIX="HtmlInjectScriptWebpackPlugin";export class HtmlInjectScriptWebpackPlugin{constructor(t){this.scripts=t||[]}processScripts(){return this.scripts.filter(Boolean).map((t=>({tagName:"script",innerHTML:t,voidTag:!1,attributes:{},meta:{plugin:"html-inject-script-webpack-plugin"}})))}apply(t){t.hooks.compilation.tap(`${PLUGIN_PREFIX}_compilation`,(t=>{htmlWebpackPlugin.getHooks(t).alterAssetTags.tap(`${PLUGIN_PREFIX}_alterAssetTags`,(t=>(t.assetTags.scripts.unshift(...this.processScripts()),t)))}))}}
@@ -0,0 +1,12 @@
1
+ import type { HtmlTagObject } from 'html-webpack-plugin';
2
+ import type { Compilation as CompilationOptions, Compiler, WebpackPluginInstance } from 'webpack';
3
+ /**
4
+ * https://github.com/icelam/html-inline-script-webpack-plugin/blob/master/src/HtmlInlineScriptPlugin.ts
5
+ */
6
+ export declare class HtmlInlineScriptWebpackPlugin implements WebpackPluginInstance {
7
+ tests: RegExp[];
8
+ constructor(tests?: RegExp[]);
9
+ isFileNeedsToBeInlined(assetName: string): boolean;
10
+ processScriptTag(publicPath: string, assets: CompilationOptions['assets'], tag: HtmlTagObject): HtmlTagObject;
11
+ apply(compiler: Compiler): void;
12
+ }
@@ -0,0 +1 @@
1
+ import htmlWebpackPlugin from"html-webpack-plugin";import webpack from"webpack";const{Compilation:Compilation}=webpack,PLUGIN_PREFIX="HtmlInlineScriptWebpackPlugin";export class HtmlInlineScriptWebpackPlugin{constructor(t){this.tests=t||[/.+\.js$/]}isFileNeedsToBeInlined(t){return this.tests.some((e=>e.exec(t)))}processScriptTag(t,e,s){if("script"!==s.tagName||!s.attributes?.src)return s;const i=s.attributes.src.replace(t,"");if(!this.isFileNeedsToBeInlined(i))return s;const a=e[i];if(!s)return s;const{src:p,...r}=s.attributes;return{tagName:"script",innerHTML:a.source(),voidTag:!1,attributes:r,meta:{plugin:"html-inline-script-webpack-plugin"}}}apply(t){let e=t.options?.output?.publicPath||"";e&&!e.endsWith("/")&&(e+="/"),t.hooks.compilation.tap(`${PLUGIN_PREFIX}_compilation`,(t=>{htmlWebpackPlugin.getHooks(t).alterAssetTags.tap(`${PLUGIN_PREFIX}_alterAssetTags`,(s=>(s.assetTags.scripts=s.assetTags.scripts.map((s=>this.processScriptTag(e,t.assets,s))),s))),t.hooks.processAssets.tap({name:`${PLUGIN_PREFIX}_PROCESS_ASSETS_STAGE_SUMMARIZE`,stage:Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE},(t=>{Object.keys(t).forEach((e=>{this.isFileNeedsToBeInlined(e)&&delete t[e]}))}))}))}}
@@ -0,0 +1,2 @@
1
+ export * from './html-inject-script-webpack-plugin.js';
2
+ export * from './html-inline-script-webpack-plugin.js';
@@ -0,0 +1 @@
1
+ export*from"./html-inject-script-webpack-plugin.js";export*from"./html-inline-script-webpack-plugin.js";
@@ -1,4 +1,4 @@
1
1
  import { type Compiler } from 'webpack';
2
- export declare class ExternalTemplateRemotesPlugin {
2
+ export declare class ExternalTemplateRemotesWebpackPlugin {
3
3
  apply(compiler: Compiler): void;
4
4
  }
@@ -0,0 +1 @@
1
+ import webpackSources from"webpack-sources";const PLUGIN_NAME="ExternalTemplateRemotesWebpackPlugin",isExternalModule=e=>"ExternalModule"===e.constructor.name;function extractUrlAndGlobal(e){const t=e.indexOf("@");if(t<=0||t===e.length-1)throw new Error(`Invalid request "${e}"`);return[e.substring(t+1),e.substring(0,t)]}export class ExternalTemplateRemotesWebpackPlugin{apply(e){e.hooks.make.tap(PLUGIN_NAME,(e=>{const t=[];e.hooks.buildModule.tap(PLUGIN_NAME,(e=>{isExternalModule(e)&&"script"===e.externalType&&t.push(e)})),e.hooks.afterCodeGeneration.tap(PLUGIN_NAME,(()=>{t.forEach((t=>{const o=extractUrlAndGlobal(t.request)[0],n=toExpression(o),r=e.codeGenerationResults.get(t,void 0).sources,s=r.get("javascript");if(s){const e=new webpackSources.RawSource(s.source().toString().replace(`"${o}"`,n));r.set("javascript",e)}}))}))}))}}function toExpression(e){const t=[],o=[];let n=!1,r=!1;for(const s of e)if("["===s){if(n){r=!0;break}n=!0,o.length&&(t.push(`"${o.join("")}"`),o.length=0)}else if("]"===s){if(!n){r=!0;break}n=!1,o.length&&(t.push(`${o.join("")}`),o.length=0),o.length=0}else o.push(s);if(n||r)throw new Error(`Invalid template URL "${e}"`);return o.length&&t.push(`"${o.join("")}"`),t.join(" + ")}
@@ -0,0 +1,4 @@
1
+ import { type WebpackPluginInstance } from 'webpack';
2
+ import { type EntryMapItem } from '../../../types/types-entry-map.js';
3
+ import { type FlatEvolveOptions } from '../../../types/types-options.js';
4
+ export declare const createModuleFederationWebpackPlugins: (serveMode: boolean, entryMapItemList: EntryMapItem[], evolveOptions: FlatEvolveOptions) => WebpackPluginInstance[];
@@ -0,0 +1 @@
1
+ import{join}from"node:path";import webpack from"webpack";import{ensureSlash}from"@flatjs/common";import{normalizeEvolveEntryName}from"../../../helpers/normalize-entry-map.js";import{injectFederationScripts}from"../../../helpers/script-injects.js";import{HtmlInjectScriptWebpackPlugin}from"../html-inject-scripts/index.js";import{ExternalTemplateRemotesWebpackPlugin}from"./external-template-remotes-webpack-plugin.js";const normalizeWidgetName=(e="")=>e.replace(/[/-]/g,"_").toLowerCase(),remoteFileName=e=>join(e,"micro-remote-module.js");export const createModuleFederationWebpackPlugins=(e,t,o)=>{const r=o.projectVirtualPath,n=o.multiHtmlCdn,i=o.multiHtmlCdnEnvResolver,m=[];for(const o of t){const[t,a]=o,l=a.options?.moduleFederation;if(l){const{remotes:o,exposes:a,...s}=l,p=remoteFileName(t),c=normalizeWidgetName(t),u=(a?Array.isArray(a)?a:[a]:[]).map((e=>{const o={};for(const[r,n]of Object.entries(e))o[r]={...n,name:join(t,n.name.replace(/^\//,""))};return o})),d=(o||[]).map((({name:e,endpoint:t})=>{const o=normalizeEvolveEntryName(e,r),n=normalizeWidgetName(o),i=remoteFileName(o),m=t?ensureSlash(t(e,o),!1):"[window.evolveFetchMicroWidgets()]";return{[n]:`${n}@${m}/${i}`}}));m.push(new webpack.container.ModuleFederationPlugin({...s,name:c,filename:p,remotes:d,exposes:u}),new ExternalTemplateRemotesWebpackPlugin),e||m.unshift(new HtmlInjectScriptWebpackPlugin([injectFederationScripts(n,i)]))}}return m};
@@ -0,0 +1,4 @@
1
+ import { type EntryMapItem } from '../../../types/types-entry-map.js';
2
+ import { type FlatEvolveOptions } from '../../../types/types-options.js';
3
+ import type { WebpackPlugin } from '../../../types/types-webpack.js';
4
+ export declare const createHtmlWebpackPlugins: (serveMode: boolean, entryMapItemList: EntryMapItem[], evolveOptions: FlatEvolveOptions) => WebpackPlugin[];
@@ -0,0 +1 @@
1
+ import{FlatEvolveMultiCdnWebpackPlugin}from"./multi-html-cdn-webpack-plugin.js";import{createMultiHtmlWebpackPlugins}from"./multi-html-webpack-plugins.js";export const createHtmlWebpackPlugins=(t,l,e)=>{const u=[],i=l[0];if(t||i[1]?.options?.output?.library)return u;const n=Object.keys(e.multiHtmlCdn);return u.push(...createMultiHtmlWebpackPlugins(t,e,l,n)),u.push(new FlatEvolveMultiCdnWebpackPlugin(e)),u};
@@ -1,6 +1,6 @@
1
1
  import { type Compiler } from 'webpack';
2
- import { type FlatEvolveOptions } from '../../types/index.js';
3
- export declare class FlatEvolveMultiCdnPlugin {
2
+ import { type FlatEvolveOptions } from '../../../types/index.js';
3
+ export declare class FlatEvolveMultiCdnWebpackPlugin {
4
4
  private pluginName;
5
5
  private requireFn;
6
6
  private config;
@@ -0,0 +1 @@
1
+ import HtmlWebpackPlugin from"html-webpack-plugin";import{basename}from"node:path";import webpack from"webpack";import{ensureSlash}from"@flatjs/common";import{getRuntimeCDNBase}from"../../../helpers/get-runtime-cdn-base.js";import{findEnvCdn,httpUrlJoin}from"../../../helpers/script-injects.js";export class FlatEvolveMultiCdnWebpackPlugin{constructor(e){if(this.pluginName="FlatEvolveMultiCdnWebpackPlugin",this.requireFn=webpack.RuntimeGlobals.publicPath,this.config=e.multiHtmlCdn,this.cdnResolver=e.multiHtmlCdnEnvResolver||function cdnResolver(){},!this.config?.prod)throw new Error("We must setup `prod` for each CDN config node!")}apply(e){e.hooks.thisCompilation.tap(this.pluginName,(e=>{e.mainTemplate.hooks.requireExtensions.tap(this.pluginName,((t,n)=>{const s=[];s.push("// Dynamic assets path override(`@flatjs/evolve`) plugin-multi-html-cdn`)");const i=e.chunkGraph?.getTreeRuntimeRequirements(n);return i&&i.has(webpack.RuntimeGlobals.requireScope)&&s.push(webpack.Template.indent(getRuntimeCDNBase(this.config,this.cdnResolver,this.requireFn))),webpack.Template.asString(s)}))})),e.hooks.compilation.tap(this.pluginName,(e=>{HtmlWebpackPlugin.getHooks(e).beforeAssetTagGeneration.tap(this.pluginName,(e=>{const{assets:t,plugin:n,outputName:s}=e,i=n?.options?.chunks||[],r=Array.isArray(i)?i.find((e=>s.includes(ensureSlash(e,!0)))):i,{userOptions:a}=e.plugin;if(!r)throw new Error("We must have current chunk!");const o=t.js.filter((e=>e.includes(ensureSlash(r,!0)))),l=t.css.filter((e=>e.includes(ensureSlash(r,!0)))),p=a.multiCdn,u=t.publicPath,c=o.map((e=>{if(p.disabled)return basename(e);const t=findEnvCdn(this.config,p.env);return httpUrlJoin(t,e.replace(u,""))})),m=l.map((e=>{if(p.disabled)return basename(e);const t=findEnvCdn(this.config,p.env);return httpUrlJoin(t,e.replace(u,""))}));return e.assets.js=c,e.assets.css=m,e}))}))}}
@@ -0,0 +1,12 @@
1
+ import type { Compiler } from 'webpack';
2
+ import type { EntryMapItem } from '../../../types/types-entry-map.js';
3
+ /**
4
+ * The MultiHtmlModifyPlugin class is responsible for modifying the HTML output of the webpack compiler.
5
+ * It hooks into the compilation process and replaces occurrences of "<%= title %>" with the title specified in the options.
6
+ */
7
+ export declare class MultiHtmlModifyWebpackPlugin {
8
+ private pluginName;
9
+ private entryMapItemList;
10
+ constructor(list: EntryMapItem[]);
11
+ apply(compiler: Compiler): void;
12
+ }
@@ -0,0 +1 @@
1
+ import HtmlWebpackPlugin from"html-webpack-plugin";import{ensureSlash}from"@flatjs/common";const getCurrentEntryOptions=(t=[],e)=>{const i=t.find((t=>e.includes(ensureSlash(t[0],!0))));return i?i[1]?.options:void 0};export class MultiHtmlModifyWebpackPlugin{constructor(t){this.pluginName="MultiHtmlModifyWebpackPlugin",this.entryMapItemList=t}apply(t){t.hooks.compilation.tap(this.pluginName,(t=>{HtmlWebpackPlugin.getHooks(t).beforeEmit.tapAsync(this.pluginName,((t,e)=>{const i=getCurrentEntryOptions(this.entryMapItemList,t.outputName);/<%= title %>/.test(t.html)&&(t.html=t.html.replace(/<%= title %>/g,i?.title||"")),e(null,t)}))}))}}