@eriche/webpack 4.47.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 (361) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +784 -0
  3. package/SECURITY.md +9 -0
  4. package/bin/webpack.js +171 -0
  5. package/buildin/amd-define.js +3 -0
  6. package/buildin/amd-options.js +2 -0
  7. package/buildin/global.js +20 -0
  8. package/buildin/harmony-module.js +24 -0
  9. package/buildin/module.js +22 -0
  10. package/buildin/system.js +7 -0
  11. package/declarations/WebpackOptions.d.ts +1466 -0
  12. package/declarations/plugins/BannerPlugin.d.ts +49 -0
  13. package/declarations/plugins/DllPlugin.d.ts +32 -0
  14. package/declarations/plugins/DllReferencePlugin.d.ts +126 -0
  15. package/declarations/plugins/HashedModuleIdsPlugin.d.ts +24 -0
  16. package/declarations/plugins/IgnorePlugin.d.ts +27 -0
  17. package/declarations/plugins/LoaderOptionsPlugin.d.ts +27 -0
  18. package/declarations/plugins/ProgressPlugin.d.ts +42 -0
  19. package/declarations/plugins/SourceMapDevToolPlugin.d.ts +94 -0
  20. package/declarations/plugins/WatchIgnorePlugin.d.ts +10 -0
  21. package/declarations/plugins/debug/ProfilingPlugin.d.ts +12 -0
  22. package/declarations/plugins/optimize/AggressiveSplittingPlugin.d.ts +24 -0
  23. package/declarations/plugins/optimize/LimitChunkCountPlugin.d.ts +16 -0
  24. package/declarations/plugins/optimize/MinChunkSizePlugin.d.ts +12 -0
  25. package/declarations/plugins/optimize/OccurrenceOrderChunkIdsPlugin.d.ts +12 -0
  26. package/declarations/plugins/optimize/OccurrenceOrderModuleIdsPlugin.d.ts +12 -0
  27. package/hot/dev-server.js +61 -0
  28. package/hot/emitter.js +2 -0
  29. package/hot/log-apply-result.js +44 -0
  30. package/hot/log.js +59 -0
  31. package/hot/only-dev-server.js +102 -0
  32. package/hot/poll.js +37 -0
  33. package/hot/signal.js +62 -0
  34. package/lib/APIPlugin.js +84 -0
  35. package/lib/AbstractMethodError.js +43 -0
  36. package/lib/AmdMainTemplatePlugin.js +106 -0
  37. package/lib/AsyncDependenciesBlock.js +110 -0
  38. package/lib/AsyncDependencyToInitialChunkError.js +31 -0
  39. package/lib/AutomaticPrefetchPlugin.js +57 -0
  40. package/lib/BannerPlugin.js +122 -0
  41. package/lib/BasicEvaluatedExpression.js +248 -0
  42. package/lib/CachePlugin.js +100 -0
  43. package/lib/CaseSensitiveModulesWarning.js +67 -0
  44. package/lib/Chunk.js +875 -0
  45. package/lib/ChunkGroup.js +513 -0
  46. package/lib/ChunkRenderError.js +32 -0
  47. package/lib/ChunkTemplate.js +87 -0
  48. package/lib/CommentCompilationWarning.js +32 -0
  49. package/lib/CommonJsStuffPlugin.js +116 -0
  50. package/lib/CompatibilityPlugin.js +70 -0
  51. package/lib/Compilation.js +2327 -0
  52. package/lib/Compiler.js +735 -0
  53. package/lib/ConcurrentCompilationError.js +19 -0
  54. package/lib/ConstPlugin.js +348 -0
  55. package/lib/ContextExclusionPlugin.js +28 -0
  56. package/lib/ContextModule.js +872 -0
  57. package/lib/ContextModuleFactory.js +262 -0
  58. package/lib/ContextReplacementPlugin.js +133 -0
  59. package/lib/DefinePlugin.js +289 -0
  60. package/lib/DelegatedModule.js +114 -0
  61. package/lib/DelegatedModuleFactoryPlugin.js +95 -0
  62. package/lib/DelegatedPlugin.js +39 -0
  63. package/lib/DependenciesBlock.js +124 -0
  64. package/lib/DependenciesBlockVariable.js +72 -0
  65. package/lib/Dependency.js +89 -0
  66. package/lib/DllEntryPlugin.js +54 -0
  67. package/lib/DllModule.js +60 -0
  68. package/lib/DllModuleFactory.js +29 -0
  69. package/lib/DllPlugin.js +49 -0
  70. package/lib/DllReferencePlugin.js +156 -0
  71. package/lib/DynamicEntryPlugin.js +94 -0
  72. package/lib/EntryModuleNotFoundError.js +21 -0
  73. package/lib/EntryOptionPlugin.js +46 -0
  74. package/lib/Entrypoint.js +64 -0
  75. package/lib/EnvironmentPlugin.js +72 -0
  76. package/lib/ErrorHelpers.js +60 -0
  77. package/lib/EvalDevToolModulePlugin.js +27 -0
  78. package/lib/EvalDevToolModuleTemplatePlugin.js +61 -0
  79. package/lib/EvalSourceMapDevToolModuleTemplatePlugin.js +120 -0
  80. package/lib/EvalSourceMapDevToolPlugin.js +41 -0
  81. package/lib/ExportPropertyMainTemplatePlugin.js +53 -0
  82. package/lib/ExtendedAPIPlugin.js +88 -0
  83. package/lib/ExternalModule.js +179 -0
  84. package/lib/ExternalModuleFactoryPlugin.js +110 -0
  85. package/lib/ExternalsPlugin.js +23 -0
  86. package/lib/FlagAllModulesAsUsedPlugin.js +38 -0
  87. package/lib/FlagDependencyExportsPlugin.js +174 -0
  88. package/lib/FlagDependencyUsagePlugin.js +116 -0
  89. package/lib/FlagInitialModulesAsUsedPlugin.js +36 -0
  90. package/lib/FunctionModulePlugin.js +19 -0
  91. package/lib/FunctionModuleTemplatePlugin.js +102 -0
  92. package/lib/Generator.js +60 -0
  93. package/lib/GraphHelpers.js +65 -0
  94. package/lib/HarmonyLinkingError.js +17 -0
  95. package/lib/HashedModuleIdsPlugin.js +63 -0
  96. package/lib/HotModuleReplacement.runtime.js +721 -0
  97. package/lib/HotModuleReplacementPlugin.js +425 -0
  98. package/lib/HotUpdateChunk.js +17 -0
  99. package/lib/HotUpdateChunkTemplate.js +78 -0
  100. package/lib/IgnorePlugin.js +91 -0
  101. package/lib/JavascriptGenerator.js +229 -0
  102. package/lib/JavascriptModulesPlugin.js +185 -0
  103. package/lib/JsonGenerator.js +57 -0
  104. package/lib/JsonModulesPlugin.js +30 -0
  105. package/lib/JsonParser.js +27 -0
  106. package/lib/LibManifestPlugin.js +90 -0
  107. package/lib/LibraryTemplatePlugin.js +186 -0
  108. package/lib/LoaderOptionsPlugin.js +58 -0
  109. package/lib/LoaderTargetPlugin.js +24 -0
  110. package/lib/MainTemplate.js +568 -0
  111. package/lib/MemoryOutputFileSystem.js +5 -0
  112. package/lib/Module.js +435 -0
  113. package/lib/ModuleBuildError.js +52 -0
  114. package/lib/ModuleDependencyError.js +35 -0
  115. package/lib/ModuleDependencyWarning.js +25 -0
  116. package/lib/ModuleError.js +36 -0
  117. package/lib/ModuleFilenameHelpers.js +179 -0
  118. package/lib/ModuleNotFoundError.js +23 -0
  119. package/lib/ModuleParseError.js +67 -0
  120. package/lib/ModuleReason.js +48 -0
  121. package/lib/ModuleTemplate.js +93 -0
  122. package/lib/ModuleWarning.js +36 -0
  123. package/lib/MultiCompiler.js +290 -0
  124. package/lib/MultiEntryPlugin.js +80 -0
  125. package/lib/MultiModule.js +87 -0
  126. package/lib/MultiModuleFactory.js +23 -0
  127. package/lib/MultiStats.js +92 -0
  128. package/lib/MultiWatching.js +50 -0
  129. package/lib/NamedChunksPlugin.js +29 -0
  130. package/lib/NamedModulesPlugin.js +58 -0
  131. package/lib/NoEmitOnErrorsPlugin.js +20 -0
  132. package/lib/NoModeWarning.js +23 -0
  133. package/lib/NodeStuffPlugin.js +118 -0
  134. package/lib/NormalModule.js +582 -0
  135. package/lib/NormalModuleFactory.js +528 -0
  136. package/lib/NormalModuleReplacementPlugin.js +51 -0
  137. package/lib/NullFactory.js +12 -0
  138. package/lib/OptionsApply.js +10 -0
  139. package/lib/OptionsDefaulter.js +141 -0
  140. package/lib/Parser.js +2454 -0
  141. package/lib/ParserHelpers.js +103 -0
  142. package/lib/PrefetchPlugin.js +37 -0
  143. package/lib/ProgressPlugin.js +307 -0
  144. package/lib/ProvidePlugin.js +86 -0
  145. package/lib/RawModule.js +56 -0
  146. package/lib/RecordIdsPlugin.js +236 -0
  147. package/lib/RemovedPluginError.js +11 -0
  148. package/lib/RequestShortener.js +83 -0
  149. package/lib/RequireJsStuffPlugin.js +66 -0
  150. package/lib/ResolverFactory.js +74 -0
  151. package/lib/RuleSet.js +567 -0
  152. package/lib/RuntimeTemplate.js +336 -0
  153. package/lib/SetVarMainTemplatePlugin.js +69 -0
  154. package/lib/SingleEntryPlugin.js +63 -0
  155. package/lib/SizeFormatHelpers.js +24 -0
  156. package/lib/SourceMapDevToolModuleOptionsPlugin.js +49 -0
  157. package/lib/SourceMapDevToolPlugin.js +418 -0
  158. package/lib/Stats.js +1685 -0
  159. package/lib/SystemMainTemplatePlugin.js +137 -0
  160. package/lib/Template.js +291 -0
  161. package/lib/TemplatedPathPlugin.js +188 -0
  162. package/lib/UmdMainTemplatePlugin.js +305 -0
  163. package/lib/UnsupportedFeatureWarning.js +30 -0
  164. package/lib/UseStrictPlugin.js +54 -0
  165. package/lib/WarnCaseSensitiveModulesPlugin.js +37 -0
  166. package/lib/WarnNoModeSetPlugin.js +17 -0
  167. package/lib/WatchIgnorePlugin.js +106 -0
  168. package/lib/Watching.js +211 -0
  169. package/lib/WebpackError.js +31 -0
  170. package/lib/WebpackOptionsApply.js +546 -0
  171. package/lib/WebpackOptionsDefaulter.js +391 -0
  172. package/lib/WebpackOptionsValidationError.js +390 -0
  173. package/lib/buildChunkGraph.js +712 -0
  174. package/lib/compareLocations.js +52 -0
  175. package/lib/debug/ProfilingPlugin.js +442 -0
  176. package/lib/dependencies/AMDDefineDependency.js +137 -0
  177. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +336 -0
  178. package/lib/dependencies/AMDPlugin.js +249 -0
  179. package/lib/dependencies/AMDRequireArrayDependency.js +49 -0
  180. package/lib/dependencies/AMDRequireContextDependency.js +20 -0
  181. package/lib/dependencies/AMDRequireDependenciesBlock.js +47 -0
  182. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +274 -0
  183. package/lib/dependencies/AMDRequireDependency.js +135 -0
  184. package/lib/dependencies/AMDRequireItemDependency.js +22 -0
  185. package/lib/dependencies/CommonJsPlugin.js +158 -0
  186. package/lib/dependencies/CommonJsRequireContextDependency.js +23 -0
  187. package/lib/dependencies/CommonJsRequireDependency.js +22 -0
  188. package/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +138 -0
  189. package/lib/dependencies/ConstDependency.js +33 -0
  190. package/lib/dependencies/ContextDependency.js +68 -0
  191. package/lib/dependencies/ContextDependencyHelpers.js +232 -0
  192. package/lib/dependencies/ContextDependencyTemplateAsId.js +43 -0
  193. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +39 -0
  194. package/lib/dependencies/ContextElementDependency.js +21 -0
  195. package/lib/dependencies/CriticalDependencyWarning.js +20 -0
  196. package/lib/dependencies/DelegatedExportsDependency.js +33 -0
  197. package/lib/dependencies/DelegatedSourceDependency.js +18 -0
  198. package/lib/dependencies/DependencyReference.js +64 -0
  199. package/lib/dependencies/DllEntryDependency.js +20 -0
  200. package/lib/dependencies/HarmonyAcceptDependency.js +48 -0
  201. package/lib/dependencies/HarmonyAcceptImportDependency.js +23 -0
  202. package/lib/dependencies/HarmonyCompatibilityDependency.js +31 -0
  203. package/lib/dependencies/HarmonyDetectionParserPlugin.js +96 -0
  204. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +154 -0
  205. package/lib/dependencies/HarmonyExportExpressionDependency.js +58 -0
  206. package/lib/dependencies/HarmonyExportHeaderDependency.js +30 -0
  207. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +659 -0
  208. package/lib/dependencies/HarmonyExportSpecifierDependency.js +54 -0
  209. package/lib/dependencies/HarmonyImportDependency.js +109 -0
  210. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +222 -0
  211. package/lib/dependencies/HarmonyImportSideEffectDependency.js +31 -0
  212. package/lib/dependencies/HarmonyImportSpecifierDependency.js +163 -0
  213. package/lib/dependencies/HarmonyInitDependency.js +60 -0
  214. package/lib/dependencies/HarmonyModulesPlugin.js +143 -0
  215. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +26 -0
  216. package/lib/dependencies/ImportContextDependency.js +23 -0
  217. package/lib/dependencies/ImportDependenciesBlock.js +18 -0
  218. package/lib/dependencies/ImportDependency.js +34 -0
  219. package/lib/dependencies/ImportEagerDependency.js +32 -0
  220. package/lib/dependencies/ImportParserPlugin.js +248 -0
  221. package/lib/dependencies/ImportPlugin.js +79 -0
  222. package/lib/dependencies/ImportWeakDependency.js +34 -0
  223. package/lib/dependencies/JsonExportsDependency.js +26 -0
  224. package/lib/dependencies/LoaderDependency.js +21 -0
  225. package/lib/dependencies/LoaderPlugin.js +115 -0
  226. package/lib/dependencies/LocalModule.js +23 -0
  227. package/lib/dependencies/LocalModuleDependency.js +28 -0
  228. package/lib/dependencies/LocalModulesHelpers.js +52 -0
  229. package/lib/dependencies/ModuleDependency.js +23 -0
  230. package/lib/dependencies/ModuleDependencyTemplateAsId.js +17 -0
  231. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +17 -0
  232. package/lib/dependencies/ModuleHotAcceptDependency.js +23 -0
  233. package/lib/dependencies/ModuleHotDeclineDependency.js +23 -0
  234. package/lib/dependencies/MultiEntryDependency.js +25 -0
  235. package/lib/dependencies/NullDependency.js +20 -0
  236. package/lib/dependencies/PrefetchDependency.js +18 -0
  237. package/lib/dependencies/RequireContextDependency.js +22 -0
  238. package/lib/dependencies/RequireContextDependencyParserPlugin.js +56 -0
  239. package/lib/dependencies/RequireContextPlugin.js +143 -0
  240. package/lib/dependencies/RequireEnsureDependenciesBlock.js +33 -0
  241. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +116 -0
  242. package/lib/dependencies/RequireEnsureDependency.js +58 -0
  243. package/lib/dependencies/RequireEnsureItemDependency.js +21 -0
  244. package/lib/dependencies/RequireEnsurePlugin.js +74 -0
  245. package/lib/dependencies/RequireHeaderDependency.js +26 -0
  246. package/lib/dependencies/RequireIncludeDependency.js +39 -0
  247. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +23 -0
  248. package/lib/dependencies/RequireIncludePlugin.js +61 -0
  249. package/lib/dependencies/RequireResolveContextDependency.js +23 -0
  250. package/lib/dependencies/RequireResolveDependency.js +22 -0
  251. package/lib/dependencies/RequireResolveDependencyParserPlugin.js +86 -0
  252. package/lib/dependencies/RequireResolveHeaderDependency.js +26 -0
  253. package/lib/dependencies/SingleEntryDependency.js +21 -0
  254. package/lib/dependencies/SystemPlugin.js +122 -0
  255. package/lib/dependencies/UnsupportedDependency.js +27 -0
  256. package/lib/dependencies/WebAssemblyExportImportedDependency.js +31 -0
  257. package/lib/dependencies/WebAssemblyImportDependency.js +54 -0
  258. package/lib/dependencies/WebpackMissingModule.js +20 -0
  259. package/lib/dependencies/getFunctionExpression.js +52 -0
  260. package/lib/formatLocation.js +75 -0
  261. package/lib/logging/Logger.js +128 -0
  262. package/lib/logging/createConsoleLogger.js +210 -0
  263. package/lib/logging/runtime.js +36 -0
  264. package/lib/logging/truncateArgs.js +76 -0
  265. package/lib/node/NodeChunkTemplatePlugin.js +31 -0
  266. package/lib/node/NodeEnvironmentPlugin.js +44 -0
  267. package/lib/node/NodeHotUpdateChunkTemplatePlugin.js +36 -0
  268. package/lib/node/NodeMainTemplate.runtime.js +32 -0
  269. package/lib/node/NodeMainTemplateAsync.runtime.js +50 -0
  270. package/lib/node/NodeMainTemplatePlugin.js +321 -0
  271. package/lib/node/NodeOutputFileSystem.js +22 -0
  272. package/lib/node/NodeSourcePlugin.js +141 -0
  273. package/lib/node/NodeTargetPlugin.js +19 -0
  274. package/lib/node/NodeTemplatePlugin.js +31 -0
  275. package/lib/node/NodeWatchFileSystem.js +109 -0
  276. package/lib/node/ReadFileCompileWasmTemplatePlugin.js +61 -0
  277. package/lib/node/nodeConsole.js +135 -0
  278. package/lib/optimize/AggressiveMergingPlugin.js +87 -0
  279. package/lib/optimize/AggressiveSplittingPlugin.js +294 -0
  280. package/lib/optimize/ChunkModuleIdRangePlugin.js +66 -0
  281. package/lib/optimize/ConcatenatedModule.js +1477 -0
  282. package/lib/optimize/EnsureChunkConditionsPlugin.js +70 -0
  283. package/lib/optimize/FlagIncludedChunksPlugin.js +99 -0
  284. package/lib/optimize/LimitChunkCountPlugin.js +231 -0
  285. package/lib/optimize/MergeDuplicateChunksPlugin.js +78 -0
  286. package/lib/optimize/MinChunkSizePlugin.js +82 -0
  287. package/lib/optimize/MinMaxSizeWarning.js +29 -0
  288. package/lib/optimize/ModuleConcatenationPlugin.js +485 -0
  289. package/lib/optimize/NaturalChunkOrderPlugin.js +41 -0
  290. package/lib/optimize/OccurrenceChunkOrderPlugin.js +66 -0
  291. package/lib/optimize/OccurrenceModuleOrderPlugin.js +112 -0
  292. package/lib/optimize/OccurrenceOrderPlugin.js +135 -0
  293. package/lib/optimize/RemoveEmptyChunksPlugin.js +42 -0
  294. package/lib/optimize/RemoveParentModulesPlugin.js +127 -0
  295. package/lib/optimize/RuntimeChunkPlugin.js +41 -0
  296. package/lib/optimize/SideEffectsFlagPlugin.js +352 -0
  297. package/lib/optimize/SplitChunksPlugin.js +971 -0
  298. package/lib/performance/AssetsOverSizeLimitWarning.js +30 -0
  299. package/lib/performance/EntrypointsOverSizeLimitWarning.js +30 -0
  300. package/lib/performance/NoAsyncChunksWarning.js +21 -0
  301. package/lib/performance/SizeLimitsPlugin.js +125 -0
  302. package/lib/util/LazyBucketSortedSet.js +235 -0
  303. package/lib/util/Queue.js +46 -0
  304. package/lib/util/Semaphore.js +53 -0
  305. package/lib/util/SetHelpers.js +48 -0
  306. package/lib/util/SortableSet.js +140 -0
  307. package/lib/util/StackedSetMap.js +142 -0
  308. package/lib/util/TrackingSet.js +35 -0
  309. package/lib/util/cachedMerge.js +35 -0
  310. package/lib/util/cleverMerge.js +77 -0
  311. package/lib/util/createHash.js +174 -0
  312. package/lib/util/deterministicGrouping.js +274 -0
  313. package/lib/util/hash/BatchedHash.js +71 -0
  314. package/lib/util/hash/md4.js +25 -0
  315. package/lib/util/hash/wasm-hash.js +174 -0
  316. package/lib/util/identifier.js +127 -0
  317. package/lib/util/objectToMap.js +16 -0
  318. package/lib/validateSchema.js +67 -0
  319. package/lib/wasm/UnsupportedWebAssemblyFeatureError.js +17 -0
  320. package/lib/wasm/WasmFinalizeExportsPlugin.js +69 -0
  321. package/lib/wasm/WasmMainTemplatePlugin.js +341 -0
  322. package/lib/wasm/WebAssemblyGenerator.js +458 -0
  323. package/lib/wasm/WebAssemblyInInitialChunkError.js +88 -0
  324. package/lib/wasm/WebAssemblyJavascriptGenerator.js +152 -0
  325. package/lib/wasm/WebAssemblyModulesPlugin.js +128 -0
  326. package/lib/wasm/WebAssemblyParser.js +175 -0
  327. package/lib/wasm/WebAssemblyUtils.js +59 -0
  328. package/lib/web/FetchCompileWasmTemplatePlugin.js +37 -0
  329. package/lib/web/JsonpChunkTemplatePlugin.js +71 -0
  330. package/lib/web/JsonpExportMainTemplatePlugin.js +50 -0
  331. package/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +39 -0
  332. package/lib/web/JsonpMainTemplate.runtime.js +71 -0
  333. package/lib/web/JsonpMainTemplatePlugin.js +615 -0
  334. package/lib/web/JsonpTemplatePlugin.js +23 -0
  335. package/lib/web/WebEnvironmentPlugin.js +18 -0
  336. package/lib/webpack.js +206 -0
  337. package/lib/webpack.web.js +31 -0
  338. package/lib/webworker/WebWorkerChunkTemplatePlugin.js +35 -0
  339. package/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +40 -0
  340. package/lib/webworker/WebWorkerMainTemplate.runtime.js +73 -0
  341. package/lib/webworker/WebWorkerMainTemplatePlugin.js +192 -0
  342. package/lib/webworker/WebWorkerTemplatePlugin.js +25 -0
  343. package/package.json +211 -0
  344. package/schemas/WebpackOptions.json +2285 -0
  345. package/schemas/ajv.absolutePath.js +57 -0
  346. package/schemas/plugins/BannerPlugin.json +101 -0
  347. package/schemas/plugins/DllPlugin.json +36 -0
  348. package/schemas/plugins/DllReferencePlugin.json +205 -0
  349. package/schemas/plugins/HashedModuleIdsPlugin.json +26 -0
  350. package/schemas/plugins/IgnorePlugin.json +37 -0
  351. package/schemas/plugins/LoaderOptionsPlugin.json +27 -0
  352. package/schemas/plugins/ProgressPlugin.json +52 -0
  353. package/schemas/plugins/SourceMapDevToolPlugin.json +185 -0
  354. package/schemas/plugins/WatchIgnorePlugin.json +18 -0
  355. package/schemas/plugins/debug/ProfilingPlugin.json +13 -0
  356. package/schemas/plugins/optimize/AggressiveSplittingPlugin.json +23 -0
  357. package/schemas/plugins/optimize/LimitChunkCountPlugin.json +16 -0
  358. package/schemas/plugins/optimize/MinChunkSizePlugin.json +12 -0
  359. package/schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json +11 -0
  360. package/schemas/plugins/optimize/OccurrenceOrderModuleIdsPlugin.json +11 -0
  361. package/web_modules/node-libs-browser.js +0 -0
@@ -0,0 +1,971 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+ "use strict";
6
+
7
+ const SortableSet = require("../util/SortableSet");
8
+ const GraphHelpers = require("../GraphHelpers");
9
+ const { isSubset } = require("../util/SetHelpers");
10
+ const deterministicGrouping = require("../util/deterministicGrouping");
11
+ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
12
+ const contextify = require("../util/identifier").contextify;
13
+ const createHash = require("../util/createHash");
14
+
15
+ /** @typedef {import("../Compiler")} Compiler */
16
+ /** @typedef {import("../Chunk")} Chunk */
17
+ /** @typedef {import("../Module")} Module */
18
+ /** @typedef {import("../util/deterministicGrouping").Options<Module>} DeterministicGroupingOptionsForModule */
19
+ /** @typedef {import("../util/deterministicGrouping").GroupedItems<Module>} DeterministicGroupingGroupedItemsForModule */
20
+
21
+ const deterministicGroupingForModules = /** @type {function(DeterministicGroupingOptionsForModule): DeterministicGroupingGroupedItemsForModule[]} */ (deterministicGrouping);
22
+
23
+ const hashFilename = name => {
24
+ return createHash("md4")
25
+ .update(name)
26
+ .digest("hex")
27
+ .slice(0, 8);
28
+ };
29
+
30
+ const sortByIdentifier = (a, b) => {
31
+ if (a.identifier() > b.identifier()) return 1;
32
+ if (a.identifier() < b.identifier()) return -1;
33
+ return 0;
34
+ };
35
+
36
+ const getRequests = chunk => {
37
+ let requests = 0;
38
+ for (const chunkGroup of chunk.groupsIterable) {
39
+ requests = Math.max(requests, chunkGroup.chunks.length);
40
+ }
41
+ return requests;
42
+ };
43
+
44
+ const getModulesSize = modules => {
45
+ let sum = 0;
46
+ for (const m of modules) {
47
+ sum += m.size();
48
+ }
49
+ return sum;
50
+ };
51
+
52
+ /**
53
+ * @template T
54
+ * @param {Set<T>} a set
55
+ * @param {Set<T>} b other set
56
+ * @returns {boolean} true if at least one item of a is in b
57
+ */
58
+ const isOverlap = (a, b) => {
59
+ for (const item of a) {
60
+ if (b.has(item)) return true;
61
+ }
62
+ return false;
63
+ };
64
+
65
+ const compareEntries = (a, b) => {
66
+ // 1. by priority
67
+ const diffPriority = a.cacheGroup.priority - b.cacheGroup.priority;
68
+ if (diffPriority) return diffPriority;
69
+ // 2. by number of chunks
70
+ const diffCount = a.chunks.size - b.chunks.size;
71
+ if (diffCount) return diffCount;
72
+ // 3. by size reduction
73
+ const aSizeReduce = a.size * (a.chunks.size - 1);
74
+ const bSizeReduce = b.size * (b.chunks.size - 1);
75
+ const diffSizeReduce = aSizeReduce - bSizeReduce;
76
+ if (diffSizeReduce) return diffSizeReduce;
77
+ // 4. by cache group index
78
+ const indexDiff = b.cacheGroupIndex - a.cacheGroupIndex;
79
+ if (indexDiff) return indexDiff;
80
+ // 5. by number of modules (to be able to compare by identifier)
81
+ const modulesA = a.modules;
82
+ const modulesB = b.modules;
83
+ const diff = modulesA.size - modulesB.size;
84
+ if (diff) return diff;
85
+ // 6. by module identifiers
86
+ modulesA.sort();
87
+ modulesB.sort();
88
+ const aI = modulesA[Symbol.iterator]();
89
+ const bI = modulesB[Symbol.iterator]();
90
+ // eslint-disable-next-line no-constant-condition
91
+ while (true) {
92
+ const aItem = aI.next();
93
+ const bItem = bI.next();
94
+ if (aItem.done) return 0;
95
+ const aModuleIdentifier = aItem.value.identifier();
96
+ const bModuleIdentifier = bItem.value.identifier();
97
+ if (aModuleIdentifier > bModuleIdentifier) return -1;
98
+ if (aModuleIdentifier < bModuleIdentifier) return 1;
99
+ }
100
+ };
101
+
102
+ const compareNumbers = (a, b) => a - b;
103
+
104
+ const INITIAL_CHUNK_FILTER = chunk => chunk.canBeInitial();
105
+ const ASYNC_CHUNK_FILTER = chunk => !chunk.canBeInitial();
106
+ const ALL_CHUNK_FILTER = chunk => true;
107
+
108
+ module.exports = class SplitChunksPlugin {
109
+ constructor(options) {
110
+ this.options = SplitChunksPlugin.normalizeOptions(options);
111
+ }
112
+
113
+ static normalizeOptions(options = {}) {
114
+ return {
115
+ chunksFilter: SplitChunksPlugin.normalizeChunksFilter(
116
+ options.chunks || "all"
117
+ ),
118
+ minSize: options.minSize || 0,
119
+ enforceSizeThreshold: options.enforceSizeThreshold || 0,
120
+ maxSize: options.maxSize || 0,
121
+ minChunks: options.minChunks || 1,
122
+ maxAsyncRequests: options.maxAsyncRequests || 1,
123
+ maxInitialRequests: options.maxInitialRequests || 1,
124
+ hidePathInfo: options.hidePathInfo || false,
125
+ filename: options.filename || undefined,
126
+ getCacheGroups: SplitChunksPlugin.normalizeCacheGroups({
127
+ cacheGroups: options.cacheGroups,
128
+ name: options.name,
129
+ automaticNameDelimiter: options.automaticNameDelimiter,
130
+ automaticNameMaxLength: options.automaticNameMaxLength
131
+ }),
132
+ automaticNameDelimiter: options.automaticNameDelimiter,
133
+ automaticNameMaxLength: options.automaticNameMaxLength || 109,
134
+ fallbackCacheGroup: SplitChunksPlugin.normalizeFallbackCacheGroup(
135
+ options.fallbackCacheGroup || {},
136
+ options
137
+ )
138
+ };
139
+ }
140
+
141
+ static normalizeName({
142
+ name,
143
+ automaticNameDelimiter,
144
+ automaticNamePrefix,
145
+ automaticNameMaxLength
146
+ }) {
147
+ if (name === true) {
148
+ /** @type {WeakMap<Chunk[], Record<string, string>>} */
149
+ const cache = new WeakMap();
150
+ const fn = (module, chunks, cacheGroup) => {
151
+ let cacheEntry = cache.get(chunks);
152
+ if (cacheEntry === undefined) {
153
+ cacheEntry = {};
154
+ cache.set(chunks, cacheEntry);
155
+ } else if (cacheGroup in cacheEntry) {
156
+ return cacheEntry[cacheGroup];
157
+ }
158
+ const names = chunks.map(c => c.name);
159
+ if (!names.every(Boolean)) {
160
+ cacheEntry[cacheGroup] = undefined;
161
+ return;
162
+ }
163
+ names.sort();
164
+ const prefix =
165
+ typeof automaticNamePrefix === "string"
166
+ ? automaticNamePrefix
167
+ : cacheGroup;
168
+ const namePrefix = prefix ? prefix + automaticNameDelimiter : "";
169
+ let name = namePrefix + names.join(automaticNameDelimiter);
170
+ // Filenames and paths can't be too long otherwise an
171
+ // ENAMETOOLONG error is raised. If the generated name if too
172
+ // long, it is truncated and a hash is appended. The limit has
173
+ // been set to 109 to prevent `[name].[chunkhash].[ext]` from
174
+ // generating a 256+ character string.
175
+ if (name.length > automaticNameMaxLength) {
176
+ const hashedFilename = hashFilename(name);
177
+ const sliceLength =
178
+ automaticNameMaxLength -
179
+ (automaticNameDelimiter.length + hashedFilename.length);
180
+ name =
181
+ name.slice(0, sliceLength) +
182
+ automaticNameDelimiter +
183
+ hashedFilename;
184
+ }
185
+ cacheEntry[cacheGroup] = name;
186
+ return name;
187
+ };
188
+ return fn;
189
+ }
190
+ if (typeof name === "string") {
191
+ const fn = () => {
192
+ return name;
193
+ };
194
+ return fn;
195
+ }
196
+ if (typeof name === "function") return name;
197
+ }
198
+
199
+ static normalizeChunksFilter(chunks) {
200
+ if (chunks === "initial") {
201
+ return INITIAL_CHUNK_FILTER;
202
+ }
203
+ if (chunks === "async") {
204
+ return ASYNC_CHUNK_FILTER;
205
+ }
206
+ if (chunks === "all") {
207
+ return ALL_CHUNK_FILTER;
208
+ }
209
+ if (typeof chunks === "function") return chunks;
210
+ }
211
+
212
+ static normalizeFallbackCacheGroup(
213
+ {
214
+ minSize = undefined,
215
+ maxSize = undefined,
216
+ automaticNameDelimiter = undefined
217
+ },
218
+ {
219
+ minSize: defaultMinSize = undefined,
220
+ maxSize: defaultMaxSize = undefined,
221
+ automaticNameDelimiter: defaultAutomaticNameDelimiter = undefined
222
+ }
223
+ ) {
224
+ return {
225
+ minSize: typeof minSize === "number" ? minSize : defaultMinSize || 0,
226
+ maxSize: typeof maxSize === "number" ? maxSize : defaultMaxSize || 0,
227
+ automaticNameDelimiter:
228
+ automaticNameDelimiter || defaultAutomaticNameDelimiter || "~"
229
+ };
230
+ }
231
+
232
+ static normalizeCacheGroups({
233
+ cacheGroups,
234
+ name,
235
+ automaticNameDelimiter,
236
+ automaticNameMaxLength
237
+ }) {
238
+ if (typeof cacheGroups === "function") {
239
+ // TODO webpack 5 remove this
240
+ if (cacheGroups.length !== 1) {
241
+ return module => cacheGroups(module, module.getChunks());
242
+ }
243
+ return cacheGroups;
244
+ }
245
+ if (cacheGroups && typeof cacheGroups === "object") {
246
+ const fn = module => {
247
+ let results;
248
+ for (const key of Object.keys(cacheGroups)) {
249
+ let option = cacheGroups[key];
250
+ if (option === false) continue;
251
+ if (option instanceof RegExp || typeof option === "string") {
252
+ option = {
253
+ test: option
254
+ };
255
+ }
256
+ if (typeof option === "function") {
257
+ let result = option(module);
258
+ if (result) {
259
+ if (results === undefined) results = [];
260
+ for (const r of Array.isArray(result) ? result : [result]) {
261
+ const result = Object.assign({ key }, r);
262
+ if (result.name) result.getName = () => result.name;
263
+ if (result.chunks) {
264
+ result.chunksFilter = SplitChunksPlugin.normalizeChunksFilter(
265
+ result.chunks
266
+ );
267
+ }
268
+ results.push(result);
269
+ }
270
+ }
271
+ } else if (SplitChunksPlugin.checkTest(option.test, module)) {
272
+ if (results === undefined) results = [];
273
+ results.push({
274
+ key: key,
275
+ priority: option.priority,
276
+ getName:
277
+ SplitChunksPlugin.normalizeName({
278
+ name: option.name || name,
279
+ automaticNameDelimiter:
280
+ typeof option.automaticNameDelimiter === "string"
281
+ ? option.automaticNameDelimiter
282
+ : automaticNameDelimiter,
283
+ automaticNamePrefix: option.automaticNamePrefix,
284
+ automaticNameMaxLength:
285
+ option.automaticNameMaxLength || automaticNameMaxLength
286
+ }) || (() => {}),
287
+ chunksFilter: SplitChunksPlugin.normalizeChunksFilter(
288
+ option.chunks
289
+ ),
290
+ enforce: option.enforce,
291
+ minSize: option.minSize,
292
+ enforceSizeThreshold: option.enforceSizeThreshold,
293
+ maxSize: option.maxSize,
294
+ minChunks: option.minChunks,
295
+ maxAsyncRequests: option.maxAsyncRequests,
296
+ maxInitialRequests: option.maxInitialRequests,
297
+ filename: option.filename,
298
+ reuseExistingChunk: option.reuseExistingChunk
299
+ });
300
+ }
301
+ }
302
+ return results;
303
+ };
304
+ return fn;
305
+ }
306
+ const fn = () => {};
307
+ return fn;
308
+ }
309
+
310
+ static checkTest(test, module) {
311
+ if (test === undefined) return true;
312
+ if (typeof test === "function") {
313
+ if (test.length !== 1) {
314
+ return test(module, module.getChunks());
315
+ }
316
+ return test(module);
317
+ }
318
+ if (typeof test === "boolean") return test;
319
+ if (typeof test === "string") {
320
+ if (
321
+ module.nameForCondition &&
322
+ module.nameForCondition().startsWith(test)
323
+ ) {
324
+ return true;
325
+ }
326
+ for (const chunk of module.chunksIterable) {
327
+ if (chunk.name && chunk.name.startsWith(test)) {
328
+ return true;
329
+ }
330
+ }
331
+ return false;
332
+ }
333
+ if (test instanceof RegExp) {
334
+ if (module.nameForCondition && test.test(module.nameForCondition())) {
335
+ return true;
336
+ }
337
+ for (const chunk of module.chunksIterable) {
338
+ if (chunk.name && test.test(chunk.name)) {
339
+ return true;
340
+ }
341
+ }
342
+ return false;
343
+ }
344
+ return false;
345
+ }
346
+
347
+ /**
348
+ * @param {Compiler} compiler webpack compiler
349
+ * @returns {void}
350
+ */
351
+ apply(compiler) {
352
+ compiler.hooks.thisCompilation.tap("SplitChunksPlugin", compilation => {
353
+ let alreadyOptimized = false;
354
+ compilation.hooks.unseal.tap("SplitChunksPlugin", () => {
355
+ alreadyOptimized = false;
356
+ });
357
+ compilation.hooks.optimizeChunksAdvanced.tap(
358
+ "SplitChunksPlugin",
359
+ chunks => {
360
+ if (alreadyOptimized) return;
361
+ alreadyOptimized = true;
362
+ // Give each selected chunk an index (to create strings from chunks)
363
+ const indexMap = new Map();
364
+ let index = 1;
365
+ for (const chunk of chunks) {
366
+ indexMap.set(chunk, index++);
367
+ }
368
+ const getKey = chunks => {
369
+ return Array.from(chunks, c => indexMap.get(c))
370
+ .sort(compareNumbers)
371
+ .join();
372
+ };
373
+ /** @type {Map<string, Set<Chunk>>} */
374
+ const chunkSetsInGraph = new Map();
375
+ for (const module of compilation.modules) {
376
+ const chunksKey = getKey(module.chunksIterable);
377
+ if (!chunkSetsInGraph.has(chunksKey)) {
378
+ chunkSetsInGraph.set(chunksKey, new Set(module.chunksIterable));
379
+ }
380
+ }
381
+
382
+ // group these set of chunks by count
383
+ // to allow to check less sets via isSubset
384
+ // (only smaller sets can be subset)
385
+ /** @type {Map<number, Array<Set<Chunk>>>} */
386
+ const chunkSetsByCount = new Map();
387
+ for (const chunksSet of chunkSetsInGraph.values()) {
388
+ const count = chunksSet.size;
389
+ let array = chunkSetsByCount.get(count);
390
+ if (array === undefined) {
391
+ array = [];
392
+ chunkSetsByCount.set(count, array);
393
+ }
394
+ array.push(chunksSet);
395
+ }
396
+
397
+ // Create a list of possible combinations
398
+ const combinationsCache = new Map(); // Map<string, Set<Chunk>[]>
399
+
400
+ const getCombinations = key => {
401
+ const chunksSet = chunkSetsInGraph.get(key);
402
+ var array = [chunksSet];
403
+ if (chunksSet.size > 1) {
404
+ for (const [count, setArray] of chunkSetsByCount) {
405
+ // "equal" is not needed because they would have been merge in the first step
406
+ if (count < chunksSet.size) {
407
+ for (const set of setArray) {
408
+ if (isSubset(chunksSet, set)) {
409
+ array.push(set);
410
+ }
411
+ }
412
+ }
413
+ }
414
+ }
415
+ return array;
416
+ };
417
+
418
+ /**
419
+ * @typedef {Object} SelectedChunksResult
420
+ * @property {Chunk[]} chunks the list of chunks
421
+ * @property {string} key a key of the list
422
+ */
423
+
424
+ /**
425
+ * @typedef {function(Chunk): boolean} ChunkFilterFunction
426
+ */
427
+
428
+ /** @type {WeakMap<Set<Chunk>, WeakMap<ChunkFilterFunction, SelectedChunksResult>>} */
429
+ const selectedChunksCacheByChunksSet = new WeakMap();
430
+
431
+ /**
432
+ * get list and key by applying the filter function to the list
433
+ * It is cached for performance reasons
434
+ * @param {Set<Chunk>} chunks list of chunks
435
+ * @param {ChunkFilterFunction} chunkFilter filter function for chunks
436
+ * @returns {SelectedChunksResult} list and key
437
+ */
438
+ const getSelectedChunks = (chunks, chunkFilter) => {
439
+ let entry = selectedChunksCacheByChunksSet.get(chunks);
440
+ if (entry === undefined) {
441
+ entry = new WeakMap();
442
+ selectedChunksCacheByChunksSet.set(chunks, entry);
443
+ }
444
+ /** @type {SelectedChunksResult} */
445
+ let entry2 = entry.get(chunkFilter);
446
+ if (entry2 === undefined) {
447
+ /** @type {Chunk[]} */
448
+ const selectedChunks = [];
449
+ for (const chunk of chunks) {
450
+ if (chunkFilter(chunk)) selectedChunks.push(chunk);
451
+ }
452
+ entry2 = {
453
+ chunks: selectedChunks,
454
+ key: getKey(selectedChunks)
455
+ };
456
+ entry.set(chunkFilter, entry2);
457
+ }
458
+ return entry2;
459
+ };
460
+
461
+ /**
462
+ * @typedef {Object} ChunksInfoItem
463
+ * @property {SortableSet} modules
464
+ * @property {TODO} cacheGroup
465
+ * @property {number} cacheGroupIndex
466
+ * @property {string} name
467
+ * @property {number} size
468
+ * @property {Set<Chunk>} chunks
469
+ * @property {Set<Chunk>} reuseableChunks
470
+ * @property {Set<string>} chunksKeys
471
+ */
472
+
473
+ // Map a list of chunks to a list of modules
474
+ // For the key the chunk "index" is used, the value is a SortableSet of modules
475
+ /** @type {Map<string, ChunksInfoItem>} */
476
+ const chunksInfoMap = new Map();
477
+
478
+ /**
479
+ * @param {TODO} cacheGroup the current cache group
480
+ * @param {number} cacheGroupIndex the index of the cache group of ordering
481
+ * @param {Chunk[]} selectedChunks chunks selected for this module
482
+ * @param {string} selectedChunksKey a key of selectedChunks
483
+ * @param {Module} module the current module
484
+ * @returns {void}
485
+ */
486
+ const addModuleToChunksInfoMap = (
487
+ cacheGroup,
488
+ cacheGroupIndex,
489
+ selectedChunks,
490
+ selectedChunksKey,
491
+ module
492
+ ) => {
493
+ // Break if minimum number of chunks is not reached
494
+ if (selectedChunks.length < cacheGroup.minChunks) return;
495
+ // Determine name for split chunk
496
+ const name = cacheGroup.getName(
497
+ module,
498
+ selectedChunks,
499
+ cacheGroup.key
500
+ );
501
+ // Create key for maps
502
+ // When it has a name we use the name as key
503
+ // Elsewise we create the key from chunks and cache group key
504
+ // This automatically merges equal names
505
+ const key =
506
+ cacheGroup.key +
507
+ (name ? ` name:${name}` : ` chunks:${selectedChunksKey}`);
508
+ // Add module to maps
509
+ let info = chunksInfoMap.get(key);
510
+ if (info === undefined) {
511
+ chunksInfoMap.set(
512
+ key,
513
+ (info = {
514
+ modules: new SortableSet(undefined, sortByIdentifier),
515
+ cacheGroup,
516
+ cacheGroupIndex,
517
+ name,
518
+ size: 0,
519
+ chunks: new Set(),
520
+ reuseableChunks: new Set(),
521
+ chunksKeys: new Set()
522
+ })
523
+ );
524
+ }
525
+ const oldSize = info.modules.size;
526
+ info.modules.add(module);
527
+ if (info.modules.size !== oldSize) {
528
+ info.size += module.size();
529
+ }
530
+ const oldChunksKeysSize = info.chunksKeys.size;
531
+ info.chunksKeys.add(selectedChunksKey);
532
+ if (oldChunksKeysSize !== info.chunksKeys.size) {
533
+ for (const chunk of selectedChunks) {
534
+ info.chunks.add(chunk);
535
+ }
536
+ }
537
+ };
538
+
539
+ // Walk through all modules
540
+ for (const module of compilation.modules) {
541
+ // Get cache group
542
+ let cacheGroups = this.options.getCacheGroups(module);
543
+ if (!Array.isArray(cacheGroups) || cacheGroups.length === 0) {
544
+ continue;
545
+ }
546
+
547
+ // Prepare some values
548
+ const chunksKey = getKey(module.chunksIterable);
549
+ let combs = combinationsCache.get(chunksKey);
550
+ if (combs === undefined) {
551
+ combs = getCombinations(chunksKey);
552
+ combinationsCache.set(chunksKey, combs);
553
+ }
554
+
555
+ let cacheGroupIndex = 0;
556
+ for (const cacheGroupSource of cacheGroups) {
557
+ const minSize =
558
+ cacheGroupSource.minSize !== undefined
559
+ ? cacheGroupSource.minSize
560
+ : cacheGroupSource.enforce
561
+ ? 0
562
+ : this.options.minSize;
563
+ const enforceSizeThreshold =
564
+ cacheGroupSource.enforceSizeThreshold !== undefined
565
+ ? cacheGroupSource.enforceSizeThreshold
566
+ : cacheGroupSource.enforce
567
+ ? 0
568
+ : this.options.enforceSizeThreshold;
569
+ const cacheGroup = {
570
+ key: cacheGroupSource.key,
571
+ priority: cacheGroupSource.priority || 0,
572
+ chunksFilter:
573
+ cacheGroupSource.chunksFilter || this.options.chunksFilter,
574
+ minSize,
575
+ minSizeForMaxSize:
576
+ cacheGroupSource.minSize !== undefined
577
+ ? cacheGroupSource.minSize
578
+ : this.options.minSize,
579
+ enforceSizeThreshold,
580
+ maxSize:
581
+ cacheGroupSource.maxSize !== undefined
582
+ ? cacheGroupSource.maxSize
583
+ : cacheGroupSource.enforce
584
+ ? 0
585
+ : this.options.maxSize,
586
+ minChunks:
587
+ cacheGroupSource.minChunks !== undefined
588
+ ? cacheGroupSource.minChunks
589
+ : cacheGroupSource.enforce
590
+ ? 1
591
+ : this.options.minChunks,
592
+ maxAsyncRequests:
593
+ cacheGroupSource.maxAsyncRequests !== undefined
594
+ ? cacheGroupSource.maxAsyncRequests
595
+ : cacheGroupSource.enforce
596
+ ? Infinity
597
+ : this.options.maxAsyncRequests,
598
+ maxInitialRequests:
599
+ cacheGroupSource.maxInitialRequests !== undefined
600
+ ? cacheGroupSource.maxInitialRequests
601
+ : cacheGroupSource.enforce
602
+ ? Infinity
603
+ : this.options.maxInitialRequests,
604
+ getName:
605
+ cacheGroupSource.getName !== undefined
606
+ ? cacheGroupSource.getName
607
+ : this.options.getName,
608
+ filename:
609
+ cacheGroupSource.filename !== undefined
610
+ ? cacheGroupSource.filename
611
+ : this.options.filename,
612
+ automaticNameDelimiter:
613
+ cacheGroupSource.automaticNameDelimiter !== undefined
614
+ ? cacheGroupSource.automaticNameDelimiter
615
+ : this.options.automaticNameDelimiter,
616
+ reuseExistingChunk: cacheGroupSource.reuseExistingChunk,
617
+ _validateSize: minSize > 0,
618
+ _conditionalEnforce: enforceSizeThreshold > 0
619
+ };
620
+ // For all combination of chunk selection
621
+ for (const chunkCombination of combs) {
622
+ // Break if minimum number of chunks is not reached
623
+ if (chunkCombination.size < cacheGroup.minChunks) continue;
624
+ // Select chunks by configuration
625
+ const {
626
+ chunks: selectedChunks,
627
+ key: selectedChunksKey
628
+ } = getSelectedChunks(
629
+ chunkCombination,
630
+ cacheGroup.chunksFilter
631
+ );
632
+
633
+ addModuleToChunksInfoMap(
634
+ cacheGroup,
635
+ cacheGroupIndex,
636
+ selectedChunks,
637
+ selectedChunksKey,
638
+ module
639
+ );
640
+ }
641
+ cacheGroupIndex++;
642
+ }
643
+ }
644
+
645
+ // Filter items were size < minSize
646
+ for (const pair of chunksInfoMap) {
647
+ const info = pair[1];
648
+ if (
649
+ info.cacheGroup._validateSize &&
650
+ info.size < info.cacheGroup.minSize
651
+ ) {
652
+ chunksInfoMap.delete(pair[0]);
653
+ }
654
+ }
655
+
656
+ /** @type {Map<Chunk, {minSize: number, maxSize: number, automaticNameDelimiter: string, keys: string[]}>} */
657
+ const maxSizeQueueMap = new Map();
658
+
659
+ while (chunksInfoMap.size > 0) {
660
+ // Find best matching entry
661
+ let bestEntryKey;
662
+ let bestEntry;
663
+ for (const pair of chunksInfoMap) {
664
+ const key = pair[0];
665
+ const info = pair[1];
666
+ if (bestEntry === undefined) {
667
+ bestEntry = info;
668
+ bestEntryKey = key;
669
+ } else if (compareEntries(bestEntry, info) < 0) {
670
+ bestEntry = info;
671
+ bestEntryKey = key;
672
+ }
673
+ }
674
+
675
+ const item = bestEntry;
676
+ chunksInfoMap.delete(bestEntryKey);
677
+
678
+ let chunkName = item.name;
679
+ // Variable for the new chunk (lazy created)
680
+ /** @type {Chunk} */
681
+ let newChunk;
682
+ // When no chunk name, check if we can reuse a chunk instead of creating a new one
683
+ let isReused = false;
684
+ if (item.cacheGroup.reuseExistingChunk) {
685
+ outer: for (const chunk of item.chunks) {
686
+ if (chunk.getNumberOfModules() !== item.modules.size) continue;
687
+ if (chunk.hasEntryModule()) continue;
688
+ for (const module of item.modules) {
689
+ if (!chunk.containsModule(module)) continue outer;
690
+ }
691
+ if (!newChunk || !newChunk.name) {
692
+ newChunk = chunk;
693
+ } else if (
694
+ chunk.name &&
695
+ chunk.name.length < newChunk.name.length
696
+ ) {
697
+ newChunk = chunk;
698
+ } else if (
699
+ chunk.name &&
700
+ chunk.name.length === newChunk.name.length &&
701
+ chunk.name < newChunk.name
702
+ ) {
703
+ newChunk = chunk;
704
+ }
705
+ chunkName = undefined;
706
+ isReused = true;
707
+ }
708
+ }
709
+ // Check if maxRequests condition can be fulfilled
710
+
711
+ const selectedChunks = Array.from(item.chunks).filter(chunk => {
712
+ // skip if we address ourself
713
+ return (
714
+ (!chunkName || chunk.name !== chunkName) && chunk !== newChunk
715
+ );
716
+ });
717
+
718
+ const enforced =
719
+ item.cacheGroup._conditionalEnforce &&
720
+ item.size >= item.cacheGroup.enforceSizeThreshold;
721
+
722
+ // Skip when no chunk selected
723
+ if (selectedChunks.length === 0) continue;
724
+
725
+ const usedChunks = new Set(selectedChunks);
726
+
727
+ // Check if maxRequests condition can be fulfilled
728
+ if (
729
+ !enforced &&
730
+ (Number.isFinite(item.cacheGroup.maxInitialRequests) ||
731
+ Number.isFinite(item.cacheGroup.maxAsyncRequests))
732
+ ) {
733
+ for (const chunk of usedChunks) {
734
+ // respect max requests
735
+ const maxRequests = chunk.isOnlyInitial()
736
+ ? item.cacheGroup.maxInitialRequests
737
+ : chunk.canBeInitial()
738
+ ? Math.min(
739
+ item.cacheGroup.maxInitialRequests,
740
+ item.cacheGroup.maxAsyncRequests
741
+ )
742
+ : item.cacheGroup.maxAsyncRequests;
743
+ if (
744
+ isFinite(maxRequests) &&
745
+ getRequests(chunk) >= maxRequests
746
+ ) {
747
+ usedChunks.delete(chunk);
748
+ }
749
+ }
750
+ }
751
+
752
+ outer: for (const chunk of usedChunks) {
753
+ for (const module of item.modules) {
754
+ if (chunk.containsModule(module)) continue outer;
755
+ }
756
+ usedChunks.delete(chunk);
757
+ }
758
+
759
+ // Were some (invalid) chunks removed from usedChunks?
760
+ // => readd all modules to the queue, as things could have been changed
761
+ if (usedChunks.size < selectedChunks.length) {
762
+ if (usedChunks.size >= item.cacheGroup.minChunks) {
763
+ const chunksArr = Array.from(usedChunks);
764
+ for (const module of item.modules) {
765
+ addModuleToChunksInfoMap(
766
+ item.cacheGroup,
767
+ item.cacheGroupIndex,
768
+ chunksArr,
769
+ getKey(usedChunks),
770
+ module
771
+ );
772
+ }
773
+ }
774
+ continue;
775
+ }
776
+
777
+ // Create the new chunk if not reusing one
778
+ if (!isReused) {
779
+ newChunk = compilation.addChunk(chunkName);
780
+ }
781
+ // Walk through all chunks
782
+ for (const chunk of usedChunks) {
783
+ // Add graph connections for splitted chunk
784
+ chunk.split(newChunk);
785
+ }
786
+
787
+ // Add a note to the chunk
788
+ newChunk.chunkReason = isReused
789
+ ? "reused as split chunk"
790
+ : "split chunk";
791
+ if (item.cacheGroup.key) {
792
+ newChunk.chunkReason += ` (cache group: ${item.cacheGroup.key})`;
793
+ }
794
+ if (chunkName) {
795
+ newChunk.chunkReason += ` (name: ${chunkName})`;
796
+ // If the chosen name is already an entry point we remove the entry point
797
+ const entrypoint = compilation.entrypoints.get(chunkName);
798
+ if (entrypoint) {
799
+ compilation.entrypoints.delete(chunkName);
800
+ entrypoint.remove();
801
+ newChunk.entryModule = undefined;
802
+ }
803
+ }
804
+ if (item.cacheGroup.filename) {
805
+ if (!newChunk.isOnlyInitial()) {
806
+ throw new Error(
807
+ "SplitChunksPlugin: You are trying to set a filename for a chunk which is (also) loaded on demand. " +
808
+ "The runtime can only handle loading of chunks which match the chunkFilename schema. " +
809
+ "Using a custom filename would fail at runtime. " +
810
+ `(cache group: ${item.cacheGroup.key})`
811
+ );
812
+ }
813
+ newChunk.filenameTemplate = item.cacheGroup.filename;
814
+ }
815
+ if (!isReused) {
816
+ // Add all modules to the new chunk
817
+ for (const module of item.modules) {
818
+ if (typeof module.chunkCondition === "function") {
819
+ if (!module.chunkCondition(newChunk)) continue;
820
+ }
821
+ // Add module to new chunk
822
+ GraphHelpers.connectChunkAndModule(newChunk, module);
823
+ // Remove module from used chunks
824
+ for (const chunk of usedChunks) {
825
+ chunk.removeModule(module);
826
+ module.rewriteChunkInReasons(chunk, [newChunk]);
827
+ }
828
+ }
829
+ } else {
830
+ // Remove all modules from used chunks
831
+ for (const module of item.modules) {
832
+ for (const chunk of usedChunks) {
833
+ chunk.removeModule(module);
834
+ module.rewriteChunkInReasons(chunk, [newChunk]);
835
+ }
836
+ }
837
+ }
838
+
839
+ if (item.cacheGroup.maxSize > 0) {
840
+ const oldMaxSizeSettings = maxSizeQueueMap.get(newChunk);
841
+ maxSizeQueueMap.set(newChunk, {
842
+ minSize: Math.max(
843
+ oldMaxSizeSettings ? oldMaxSizeSettings.minSize : 0,
844
+ item.cacheGroup.minSizeForMaxSize
845
+ ),
846
+ maxSize: Math.min(
847
+ oldMaxSizeSettings ? oldMaxSizeSettings.maxSize : Infinity,
848
+ item.cacheGroup.maxSize
849
+ ),
850
+ automaticNameDelimiter: item.cacheGroup.automaticNameDelimiter,
851
+ keys: oldMaxSizeSettings
852
+ ? oldMaxSizeSettings.keys.concat(item.cacheGroup.key)
853
+ : [item.cacheGroup.key]
854
+ });
855
+ }
856
+
857
+ // remove all modules from other entries and update size
858
+ for (const [key, info] of chunksInfoMap) {
859
+ if (isOverlap(info.chunks, usedChunks)) {
860
+ // update modules and total size
861
+ // may remove it from the map when < minSize
862
+ const oldSize = info.modules.size;
863
+ for (const module of item.modules) {
864
+ info.modules.delete(module);
865
+ }
866
+ if (info.modules.size !== oldSize) {
867
+ if (info.modules.size === 0) {
868
+ chunksInfoMap.delete(key);
869
+ continue;
870
+ }
871
+ info.size = getModulesSize(info.modules);
872
+ if (
873
+ info.cacheGroup._validateSize &&
874
+ info.size < info.cacheGroup.minSize
875
+ ) {
876
+ chunksInfoMap.delete(key);
877
+ }
878
+ if (info.modules.size === 0) {
879
+ chunksInfoMap.delete(key);
880
+ }
881
+ }
882
+ }
883
+ }
884
+ }
885
+
886
+ const incorrectMinMaxSizeSet = new Set();
887
+
888
+ // Make sure that maxSize is fulfilled
889
+ for (const chunk of compilation.chunks.slice()) {
890
+ const { minSize, maxSize, automaticNameDelimiter, keys } =
891
+ maxSizeQueueMap.get(chunk) || this.options.fallbackCacheGroup;
892
+ if (!maxSize) continue;
893
+ if (minSize > maxSize) {
894
+ const warningKey = `${keys && keys.join()} ${minSize} ${maxSize}`;
895
+ if (!incorrectMinMaxSizeSet.has(warningKey)) {
896
+ incorrectMinMaxSizeSet.add(warningKey);
897
+ compilation.warnings.push(
898
+ new MinMaxSizeWarning(keys, minSize, maxSize)
899
+ );
900
+ }
901
+ }
902
+ const results = deterministicGroupingForModules({
903
+ maxSize: Math.max(minSize, maxSize),
904
+ minSize,
905
+ items: chunk.modulesIterable,
906
+ getKey(module) {
907
+ const ident = contextify(
908
+ compilation.options.context,
909
+ module.identifier()
910
+ );
911
+ const name = module.nameForCondition
912
+ ? contextify(
913
+ compilation.options.context,
914
+ module.nameForCondition()
915
+ )
916
+ : ident.replace(/^.*!|\?[^?!]*$/g, "");
917
+ const fullKey =
918
+ name + automaticNameDelimiter + hashFilename(ident);
919
+ return fullKey.replace(/[\\/?]/g, "_");
920
+ },
921
+ getSize(module) {
922
+ return module.size();
923
+ }
924
+ });
925
+ results.sort((a, b) => {
926
+ if (a.key < b.key) return -1;
927
+ if (a.key > b.key) return 1;
928
+ return 0;
929
+ });
930
+ for (let i = 0; i < results.length; i++) {
931
+ const group = results[i];
932
+ const key = this.options.hidePathInfo
933
+ ? hashFilename(group.key)
934
+ : group.key;
935
+ let name = chunk.name
936
+ ? chunk.name + automaticNameDelimiter + key
937
+ : null;
938
+ if (name && name.length > 100) {
939
+ name =
940
+ name.slice(0, 100) +
941
+ automaticNameDelimiter +
942
+ hashFilename(name);
943
+ }
944
+ let newPart;
945
+ if (i !== results.length - 1) {
946
+ newPart = compilation.addChunk(name);
947
+ chunk.split(newPart);
948
+ newPart.chunkReason = chunk.chunkReason;
949
+ // Add all modules to the new chunk
950
+ for (const module of group.items) {
951
+ if (typeof module.chunkCondition === "function") {
952
+ if (!module.chunkCondition(newPart)) continue;
953
+ }
954
+ // Add module to new chunk
955
+ GraphHelpers.connectChunkAndModule(newPart, module);
956
+ // Remove module from used chunks
957
+ chunk.removeModule(module);
958
+ module.rewriteChunkInReasons(chunk, [newPart]);
959
+ }
960
+ } else {
961
+ // change the chunk to be a part
962
+ newPart = chunk;
963
+ chunk.name = name;
964
+ }
965
+ }
966
+ }
967
+ }
968
+ );
969
+ });
970
+ }
971
+ };