@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,712 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const AsyncDependencyToInitialChunkError = require("./AsyncDependencyToInitialChunkError");
9
+ const GraphHelpers = require("./GraphHelpers");
10
+
11
+ /** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */
12
+ /** @typedef {import("./Chunk")} Chunk */
13
+ /** @typedef {import("./ChunkGroup")} ChunkGroup */
14
+ /** @typedef {import("./Compilation")} Compilation */
15
+ /** @typedef {import("./DependenciesBlock")} DependenciesBlock */
16
+ /** @typedef {import("./Dependency")} Dependency */
17
+ /** @typedef {import("./Entrypoint")} Entrypoint */
18
+ /** @typedef {import("./Module")} Module */
19
+
20
+ /**
21
+ * @typedef {Object} QueueItem
22
+ * @property {number} action
23
+ * @property {DependenciesBlock} block
24
+ * @property {Module} module
25
+ * @property {Chunk} chunk
26
+ * @property {ChunkGroup} chunkGroup
27
+ */
28
+
29
+ /**
30
+ * @typedef {Object} ChunkGroupInfo
31
+ * @property {ChunkGroup} chunkGroup the chunk group
32
+ * @property {Set<Module>} minAvailableModules current minimal set of modules available at this point
33
+ * @property {boolean} minAvailableModulesOwned true, if minAvailableModules is owned and can be modified
34
+ * @property {Set<Module>[]} availableModulesToBeMerged enqueued updates to the minimal set of available modules
35
+ * @property {QueueItem[]} skippedItems queue items that were skipped because module is already available in parent chunks (need to reconsider when minAvailableModules is shrinking)
36
+ * @property {Set<Module>} resultingAvailableModules set of modules available including modules from this chunk group
37
+ * @property {Set<ChunkGroup>} children set of children chunk groups, that will be revisited when availableModules shrink
38
+ */
39
+
40
+ /**
41
+ * @typedef {Object} BlockChunkGroupConnection
42
+ * @property {ChunkGroupInfo} originChunkGroupInfo origin chunk group
43
+ * @property {ChunkGroup} chunkGroup referenced chunk group
44
+ */
45
+
46
+ /**
47
+ * @template T
48
+ * @param {Set<T>} a first set
49
+ * @param {Set<T>} b second set
50
+ * @returns {number} cmp
51
+ */
52
+ const bySetSize = (a, b) => {
53
+ return b.size - a.size;
54
+ };
55
+
56
+ /**
57
+ * Extracts simplified info from the modules and their dependencies
58
+ * @param {Compilation} compilation the compilation
59
+ * @returns {Map<DependenciesBlock, { modules: Iterable<Module>, blocks: AsyncDependenciesBlock[]}>} the mapping block to modules and inner blocks
60
+ */
61
+ const extraceBlockInfoMap = compilation => {
62
+ /** @type {Map<DependenciesBlock, { modules: Iterable<Module>, blocks: AsyncDependenciesBlock[]}>} */
63
+ const blockInfoMap = new Map();
64
+
65
+ /**
66
+ * @param {Dependency} d dependency to iterate over
67
+ * @returns {void}
68
+ */
69
+ const iteratorDependency = d => {
70
+ // We skip Dependencies without Reference
71
+ const ref = compilation.getDependencyReference(currentModule, d);
72
+ if (!ref) {
73
+ return;
74
+ }
75
+ // We skip Dependencies without Module pointer
76
+ const refModule = ref.module;
77
+ if (!refModule) {
78
+ return;
79
+ }
80
+ // We skip weak Dependencies
81
+ if (ref.weak) {
82
+ return;
83
+ }
84
+
85
+ blockInfoModules.add(refModule);
86
+ };
87
+
88
+ /**
89
+ * @param {AsyncDependenciesBlock} b blocks to prepare
90
+ * @returns {void}
91
+ */
92
+ const iteratorBlockPrepare = b => {
93
+ blockInfoBlocks.push(b);
94
+ blockQueue.push(b);
95
+ };
96
+
97
+ /** @type {Module} */
98
+ let currentModule;
99
+ /** @type {DependenciesBlock} */
100
+ let block;
101
+ /** @type {DependenciesBlock[]} */
102
+ let blockQueue;
103
+ /** @type {Set<Module>} */
104
+ let blockInfoModules;
105
+ /** @type {AsyncDependenciesBlock[]} */
106
+ let blockInfoBlocks;
107
+
108
+ for (const module of compilation.modules) {
109
+ blockQueue = [module];
110
+ currentModule = module;
111
+ while (blockQueue.length > 0) {
112
+ block = blockQueue.pop();
113
+ blockInfoModules = new Set();
114
+ blockInfoBlocks = [];
115
+
116
+ if (block.variables) {
117
+ for (const variable of block.variables) {
118
+ for (const dep of variable.dependencies) iteratorDependency(dep);
119
+ }
120
+ }
121
+
122
+ if (block.dependencies) {
123
+ for (const dep of block.dependencies) iteratorDependency(dep);
124
+ }
125
+
126
+ if (block.blocks) {
127
+ for (const b of block.blocks) iteratorBlockPrepare(b);
128
+ }
129
+
130
+ const blockInfo = {
131
+ modules: blockInfoModules,
132
+ blocks: blockInfoBlocks
133
+ };
134
+ blockInfoMap.set(block, blockInfo);
135
+ }
136
+ }
137
+
138
+ return blockInfoMap;
139
+ };
140
+
141
+ /**
142
+ *
143
+ * @param {Compilation} compilation the compilation
144
+ * @param {Entrypoint[]} inputChunkGroups input groups
145
+ * @param {Map<ChunkGroup, ChunkGroupInfo>} chunkGroupInfoMap mapping from chunk group to available modules
146
+ * @param {Map<AsyncDependenciesBlock, BlockChunkGroupConnection[]>} blockConnections connection for blocks
147
+ * @param {Set<DependenciesBlock>} blocksWithNestedBlocks flag for blocks that have nested blocks
148
+ * @param {Set<ChunkGroup>} allCreatedChunkGroups filled with all chunk groups that are created here
149
+ */
150
+ const visitModules = (
151
+ compilation,
152
+ inputChunkGroups,
153
+ chunkGroupInfoMap,
154
+ blockConnections,
155
+ blocksWithNestedBlocks,
156
+ allCreatedChunkGroups
157
+ ) => {
158
+ const logger = compilation.getLogger("webpack.buildChunkGraph.visitModules");
159
+ const { namedChunkGroups } = compilation;
160
+
161
+ logger.time("prepare");
162
+ const blockInfoMap = extraceBlockInfoMap(compilation);
163
+
164
+ /** @type {Map<ChunkGroup, { index: number, index2: number }>} */
165
+ const chunkGroupCounters = new Map();
166
+ for (const chunkGroup of inputChunkGroups) {
167
+ chunkGroupCounters.set(chunkGroup, {
168
+ index: 0,
169
+ index2: 0
170
+ });
171
+ }
172
+
173
+ let nextFreeModuleIndex = 0;
174
+ let nextFreeModuleIndex2 = 0;
175
+
176
+ /** @type {Map<DependenciesBlock, ChunkGroup>} */
177
+ const blockChunkGroups = new Map();
178
+
179
+ const ADD_AND_ENTER_MODULE = 0;
180
+ const ENTER_MODULE = 1;
181
+ const PROCESS_BLOCK = 2;
182
+ const LEAVE_MODULE = 3;
183
+
184
+ /**
185
+ * @param {QueueItem[]} queue the queue array (will be mutated)
186
+ * @param {ChunkGroup} chunkGroup chunk group
187
+ * @returns {QueueItem[]} the queue array again
188
+ */
189
+ const reduceChunkGroupToQueueItem = (queue, chunkGroup) => {
190
+ for (const chunk of chunkGroup.chunks) {
191
+ const module = chunk.entryModule;
192
+ queue.push({
193
+ action: ENTER_MODULE,
194
+ block: module,
195
+ module,
196
+ chunk,
197
+ chunkGroup
198
+ });
199
+ }
200
+ chunkGroupInfoMap.set(chunkGroup, {
201
+ chunkGroup,
202
+ minAvailableModules: new Set(),
203
+ minAvailableModulesOwned: true,
204
+ availableModulesToBeMerged: [],
205
+ skippedItems: [],
206
+ resultingAvailableModules: undefined,
207
+ children: undefined
208
+ });
209
+ return queue;
210
+ };
211
+
212
+ // Start with the provided modules/chunks
213
+ /** @type {QueueItem[]} */
214
+ let queue = inputChunkGroups
215
+ .reduce(reduceChunkGroupToQueueItem, [])
216
+ .reverse();
217
+ /** @type {Map<ChunkGroup, Set<ChunkGroup>>} */
218
+ const queueConnect = new Map();
219
+ /** @type {Set<ChunkGroupInfo>} */
220
+ const outdatedChunkGroupInfo = new Set();
221
+ /** @type {QueueItem[]} */
222
+ let queueDelayed = [];
223
+
224
+ logger.timeEnd("prepare");
225
+
226
+ /** @type {Module} */
227
+ let module;
228
+ /** @type {Chunk} */
229
+ let chunk;
230
+ /** @type {ChunkGroup} */
231
+ let chunkGroup;
232
+ /** @type {ChunkGroupInfo} */
233
+ let chunkGroupInfo;
234
+ /** @type {DependenciesBlock} */
235
+ let block;
236
+ /** @type {Set<Module>} */
237
+ let minAvailableModules;
238
+ /** @type {QueueItem[]} */
239
+ let skippedItems;
240
+
241
+ // For each async Block in graph
242
+ /**
243
+ * @param {AsyncDependenciesBlock} b iterating over each Async DepBlock
244
+ * @returns {void}
245
+ */
246
+ const iteratorBlock = b => {
247
+ // 1. We create a chunk for this Block
248
+ // but only once (blockChunkGroups map)
249
+ let c = blockChunkGroups.get(b);
250
+ if (c === undefined) {
251
+ c = namedChunkGroups.get(b.chunkName);
252
+ if (c && c.isInitial()) {
253
+ compilation.errors.push(
254
+ new AsyncDependencyToInitialChunkError(b.chunkName, module, b.loc)
255
+ );
256
+ c = chunkGroup;
257
+ } else {
258
+ c = compilation.addChunkInGroup(
259
+ b.groupOptions || b.chunkName,
260
+ module,
261
+ b.loc,
262
+ b.request
263
+ );
264
+ chunkGroupCounters.set(c, { index: 0, index2: 0 });
265
+ blockChunkGroups.set(b, c);
266
+ allCreatedChunkGroups.add(c);
267
+ }
268
+ blockConnections.set(b, []);
269
+ } else {
270
+ // TODO webpack 5 remove addOptions check
271
+ if (c.addOptions) c.addOptions(b.groupOptions);
272
+ c.addOrigin(module, b.loc, b.request);
273
+ }
274
+
275
+ // 2. We store the connection for the block
276
+ // to connect it later if needed
277
+ blockConnections.get(b).push({
278
+ originChunkGroupInfo: chunkGroupInfo,
279
+ chunkGroup: c
280
+ });
281
+
282
+ // 3. We create/update the chunk group info
283
+ let connectList = queueConnect.get(chunkGroup);
284
+ if (connectList === undefined) {
285
+ connectList = new Set();
286
+ queueConnect.set(chunkGroup, connectList);
287
+ }
288
+ connectList.add(c);
289
+
290
+ // 4. We enqueue the DependenciesBlock for traversal
291
+ queueDelayed.push({
292
+ action: PROCESS_BLOCK,
293
+ block: b,
294
+ module: module,
295
+ chunk: c.chunks[0],
296
+ chunkGroup: c
297
+ });
298
+ };
299
+
300
+ // Iterative traversal of the Module graph
301
+ // Recursive would be simpler to write but could result in Stack Overflows
302
+ while (queue.length) {
303
+ logger.time("visiting");
304
+ while (queue.length) {
305
+ const queueItem = queue.pop();
306
+ module = queueItem.module;
307
+ block = queueItem.block;
308
+ chunk = queueItem.chunk;
309
+ if (chunkGroup !== queueItem.chunkGroup) {
310
+ chunkGroup = queueItem.chunkGroup;
311
+ chunkGroupInfo = chunkGroupInfoMap.get(chunkGroup);
312
+ minAvailableModules = chunkGroupInfo.minAvailableModules;
313
+ skippedItems = chunkGroupInfo.skippedItems;
314
+ }
315
+
316
+ switch (queueItem.action) {
317
+ case ADD_AND_ENTER_MODULE: {
318
+ if (minAvailableModules.has(module)) {
319
+ // already in parent chunks
320
+ // skip it for now, but enqueue for rechecking when minAvailableModules shrinks
321
+ skippedItems.push(queueItem);
322
+ break;
323
+ }
324
+ // We connect Module and Chunk when not already done
325
+ if (chunk.addModule(module)) {
326
+ module.addChunk(chunk);
327
+ } else {
328
+ // already connected, skip it
329
+ break;
330
+ }
331
+ }
332
+ // fallthrough
333
+ case ENTER_MODULE: {
334
+ if (chunkGroup !== undefined) {
335
+ const index = chunkGroup.getModuleIndex(module);
336
+ if (index === undefined) {
337
+ chunkGroup.setModuleIndex(
338
+ module,
339
+ chunkGroupCounters.get(chunkGroup).index++
340
+ );
341
+ }
342
+ }
343
+
344
+ if (module.index === null) {
345
+ module.index = nextFreeModuleIndex++;
346
+ }
347
+
348
+ queue.push({
349
+ action: LEAVE_MODULE,
350
+ block,
351
+ module,
352
+ chunk,
353
+ chunkGroup
354
+ });
355
+ }
356
+ // fallthrough
357
+ case PROCESS_BLOCK: {
358
+ // get prepared block info
359
+ const blockInfo = blockInfoMap.get(block);
360
+
361
+ // Buffer items because order need to be reverse to get indicies correct
362
+ const skipBuffer = [];
363
+ const queueBuffer = [];
364
+ // Traverse all referenced modules
365
+ for (const refModule of blockInfo.modules) {
366
+ if (chunk.containsModule(refModule)) {
367
+ // skip early if already connected
368
+ continue;
369
+ }
370
+ if (minAvailableModules.has(refModule)) {
371
+ // already in parent chunks, skip it for now
372
+ skipBuffer.push({
373
+ action: ADD_AND_ENTER_MODULE,
374
+ block: refModule,
375
+ module: refModule,
376
+ chunk,
377
+ chunkGroup
378
+ });
379
+ continue;
380
+ }
381
+ // enqueue the add and enter to enter in the correct order
382
+ // this is relevant with circular dependencies
383
+ queueBuffer.push({
384
+ action: ADD_AND_ENTER_MODULE,
385
+ block: refModule,
386
+ module: refModule,
387
+ chunk,
388
+ chunkGroup
389
+ });
390
+ }
391
+ // Add buffered items in reversed order
392
+ for (let i = skipBuffer.length - 1; i >= 0; i--) {
393
+ skippedItems.push(skipBuffer[i]);
394
+ }
395
+ for (let i = queueBuffer.length - 1; i >= 0; i--) {
396
+ queue.push(queueBuffer[i]);
397
+ }
398
+
399
+ // Traverse all Blocks
400
+ for (const block of blockInfo.blocks) iteratorBlock(block);
401
+
402
+ if (blockInfo.blocks.length > 0 && module !== block) {
403
+ blocksWithNestedBlocks.add(block);
404
+ }
405
+ break;
406
+ }
407
+ case LEAVE_MODULE: {
408
+ if (chunkGroup !== undefined) {
409
+ const index = chunkGroup.getModuleIndex2(module);
410
+ if (index === undefined) {
411
+ chunkGroup.setModuleIndex2(
412
+ module,
413
+ chunkGroupCounters.get(chunkGroup).index2++
414
+ );
415
+ }
416
+ }
417
+
418
+ if (module.index2 === null) {
419
+ module.index2 = nextFreeModuleIndex2++;
420
+ }
421
+ break;
422
+ }
423
+ }
424
+ }
425
+ logger.timeEnd("visiting");
426
+
427
+ while (queueConnect.size > 0) {
428
+ logger.time("calculating available modules");
429
+
430
+ // Figure out new parents for chunk groups
431
+ // to get new available modules for these children
432
+ for (const [chunkGroup, targets] of queueConnect) {
433
+ const info = chunkGroupInfoMap.get(chunkGroup);
434
+ let minAvailableModules = info.minAvailableModules;
435
+
436
+ // 1. Create a new Set of available modules at this points
437
+ const resultingAvailableModules = new Set(minAvailableModules);
438
+ for (const chunk of chunkGroup.chunks) {
439
+ for (const m of chunk.modulesIterable) {
440
+ resultingAvailableModules.add(m);
441
+ }
442
+ }
443
+ info.resultingAvailableModules = resultingAvailableModules;
444
+ if (info.children === undefined) {
445
+ info.children = targets;
446
+ } else {
447
+ for (const target of targets) {
448
+ info.children.add(target);
449
+ }
450
+ }
451
+
452
+ // 2. Update chunk group info
453
+ for (const target of targets) {
454
+ let chunkGroupInfo = chunkGroupInfoMap.get(target);
455
+ if (chunkGroupInfo === undefined) {
456
+ chunkGroupInfo = {
457
+ chunkGroup: target,
458
+ minAvailableModules: undefined,
459
+ minAvailableModulesOwned: undefined,
460
+ availableModulesToBeMerged: [],
461
+ skippedItems: [],
462
+ resultingAvailableModules: undefined,
463
+ children: undefined
464
+ };
465
+ chunkGroupInfoMap.set(target, chunkGroupInfo);
466
+ }
467
+ chunkGroupInfo.availableModulesToBeMerged.push(
468
+ resultingAvailableModules
469
+ );
470
+ outdatedChunkGroupInfo.add(chunkGroupInfo);
471
+ }
472
+ }
473
+ queueConnect.clear();
474
+ logger.timeEnd("calculating available modules");
475
+
476
+ if (outdatedChunkGroupInfo.size > 0) {
477
+ logger.time("merging available modules");
478
+ // Execute the merge
479
+ for (const info of outdatedChunkGroupInfo) {
480
+ const availableModulesToBeMerged = info.availableModulesToBeMerged;
481
+ let cachedMinAvailableModules = info.minAvailableModules;
482
+
483
+ // 1. Get minimal available modules
484
+ // It doesn't make sense to traverse a chunk again with more available modules.
485
+ // This step calculates the minimal available modules and skips traversal when
486
+ // the list didn't shrink.
487
+ if (availableModulesToBeMerged.length > 1) {
488
+ availableModulesToBeMerged.sort(bySetSize);
489
+ }
490
+ let changed = false;
491
+ for (const availableModules of availableModulesToBeMerged) {
492
+ if (cachedMinAvailableModules === undefined) {
493
+ cachedMinAvailableModules = availableModules;
494
+ info.minAvailableModules = cachedMinAvailableModules;
495
+ info.minAvailableModulesOwned = false;
496
+ changed = true;
497
+ } else {
498
+ if (info.minAvailableModulesOwned) {
499
+ // We own it and can modify it
500
+ for (const m of cachedMinAvailableModules) {
501
+ if (!availableModules.has(m)) {
502
+ cachedMinAvailableModules.delete(m);
503
+ changed = true;
504
+ }
505
+ }
506
+ } else {
507
+ for (const m of cachedMinAvailableModules) {
508
+ if (!availableModules.has(m)) {
509
+ // cachedMinAvailableModules need to be modified
510
+ // but we don't own it
511
+ // construct a new Set as intersection of cachedMinAvailableModules and availableModules
512
+ /** @type {Set<Module>} */
513
+ const newSet = new Set();
514
+ const iterator = cachedMinAvailableModules[
515
+ Symbol.iterator
516
+ ]();
517
+ /** @type {IteratorResult<Module>} */
518
+ let it;
519
+ while (!(it = iterator.next()).done) {
520
+ const module = it.value;
521
+ if (module === m) break;
522
+ newSet.add(module);
523
+ }
524
+ while (!(it = iterator.next()).done) {
525
+ const module = it.value;
526
+ if (availableModules.has(module)) {
527
+ newSet.add(module);
528
+ }
529
+ }
530
+ cachedMinAvailableModules = newSet;
531
+ info.minAvailableModulesOwned = true;
532
+ info.minAvailableModules = newSet;
533
+
534
+ // Update the cache from the first queue
535
+ // if the chunkGroup is currently cached
536
+ if (chunkGroup === info.chunkGroup) {
537
+ minAvailableModules = cachedMinAvailableModules;
538
+ }
539
+
540
+ changed = true;
541
+ break;
542
+ }
543
+ }
544
+ }
545
+ }
546
+ }
547
+ availableModulesToBeMerged.length = 0;
548
+ if (!changed) continue;
549
+
550
+ // 2. Reconsider skipped items
551
+ for (const queueItem of info.skippedItems) {
552
+ queue.push(queueItem);
553
+ }
554
+ info.skippedItems.length = 0;
555
+
556
+ // 3. Reconsider children chunk groups
557
+ if (info.children !== undefined) {
558
+ const chunkGroup = info.chunkGroup;
559
+ for (const c of info.children) {
560
+ let connectList = queueConnect.get(chunkGroup);
561
+ if (connectList === undefined) {
562
+ connectList = new Set();
563
+ queueConnect.set(chunkGroup, connectList);
564
+ }
565
+ connectList.add(c);
566
+ }
567
+ }
568
+ }
569
+ outdatedChunkGroupInfo.clear();
570
+ logger.timeEnd("merging available modules");
571
+ }
572
+ }
573
+
574
+ // Run queueDelayed when all items of the queue are processed
575
+ // This is important to get the global indicing correct
576
+ // Async blocks should be processed after all sync blocks are processed
577
+ if (queue.length === 0) {
578
+ const tempQueue = queue;
579
+ queue = queueDelayed.reverse();
580
+ queueDelayed = tempQueue;
581
+ }
582
+ }
583
+ };
584
+
585
+ /**
586
+ *
587
+ * @param {Set<DependenciesBlock>} blocksWithNestedBlocks flag for blocks that have nested blocks
588
+ * @param {Map<AsyncDependenciesBlock, BlockChunkGroupConnection[]>} blockConnections connection for blocks
589
+ * @param {Map<ChunkGroup, ChunkGroupInfo>} chunkGroupInfoMap mapping from chunk group to available modules
590
+ */
591
+ const connectChunkGroups = (
592
+ blocksWithNestedBlocks,
593
+ blockConnections,
594
+ chunkGroupInfoMap
595
+ ) => {
596
+ /**
597
+ * Helper function to check if all modules of a chunk are available
598
+ *
599
+ * @param {ChunkGroup} chunkGroup the chunkGroup to scan
600
+ * @param {Set<Module>} availableModules the comparitor set
601
+ * @returns {boolean} return true if all modules of a chunk are available
602
+ */
603
+ const areModulesAvailable = (chunkGroup, availableModules) => {
604
+ for (const chunk of chunkGroup.chunks) {
605
+ for (const module of chunk.modulesIterable) {
606
+ if (!availableModules.has(module)) return false;
607
+ }
608
+ }
609
+ return true;
610
+ };
611
+
612
+ // For each edge in the basic chunk graph
613
+ for (const [block, connections] of blockConnections) {
614
+ // 1. Check if connection is needed
615
+ // When none of the dependencies need to be connected
616
+ // we can skip all of them
617
+ // It's not possible to filter each item so it doesn't create inconsistent
618
+ // connections and modules can only create one version
619
+ // TODO maybe decide this per runtime
620
+ if (
621
+ // TODO is this needed?
622
+ !blocksWithNestedBlocks.has(block) &&
623
+ connections.every(({ chunkGroup, originChunkGroupInfo }) =>
624
+ areModulesAvailable(
625
+ chunkGroup,
626
+ originChunkGroupInfo.resultingAvailableModules
627
+ )
628
+ )
629
+ ) {
630
+ continue;
631
+ }
632
+
633
+ // 2. Foreach edge
634
+ for (let i = 0; i < connections.length; i++) {
635
+ const { chunkGroup, originChunkGroupInfo } = connections[i];
636
+
637
+ // 3. Connect block with chunk
638
+ GraphHelpers.connectDependenciesBlockAndChunkGroup(block, chunkGroup);
639
+
640
+ // 4. Connect chunk with parent
641
+ GraphHelpers.connectChunkGroupParentAndChild(
642
+ originChunkGroupInfo.chunkGroup,
643
+ chunkGroup
644
+ );
645
+ }
646
+ }
647
+ };
648
+
649
+ /**
650
+ * Remove all unconnected chunk groups
651
+ * @param {Compilation} compilation the compilation
652
+ * @param {Iterable<ChunkGroup>} allCreatedChunkGroups all chunk groups that where created before
653
+ */
654
+ const cleanupUnconnectedGroups = (compilation, allCreatedChunkGroups) => {
655
+ for (const chunkGroup of allCreatedChunkGroups) {
656
+ if (chunkGroup.getNumberOfParents() === 0) {
657
+ for (const chunk of chunkGroup.chunks) {
658
+ const idx = compilation.chunks.indexOf(chunk);
659
+ if (idx >= 0) compilation.chunks.splice(idx, 1);
660
+ chunk.remove("unconnected");
661
+ }
662
+ chunkGroup.remove("unconnected");
663
+ }
664
+ }
665
+ };
666
+
667
+ /**
668
+ * This method creates the Chunk graph from the Module graph
669
+ * @param {Compilation} compilation the compilation
670
+ * @param {Entrypoint[]} inputChunkGroups chunk groups which are processed
671
+ * @returns {void}
672
+ */
673
+ const buildChunkGraph = (compilation, inputChunkGroups) => {
674
+ // SHARED STATE
675
+
676
+ /** @type {Map<AsyncDependenciesBlock, BlockChunkGroupConnection[]>} */
677
+ const blockConnections = new Map();
678
+
679
+ /** @type {Set<ChunkGroup>} */
680
+ const allCreatedChunkGroups = new Set();
681
+
682
+ /** @type {Map<ChunkGroup, ChunkGroupInfo>} */
683
+ const chunkGroupInfoMap = new Map();
684
+
685
+ /** @type {Set<DependenciesBlock>} */
686
+ const blocksWithNestedBlocks = new Set();
687
+
688
+ // PART ONE
689
+
690
+ visitModules(
691
+ compilation,
692
+ inputChunkGroups,
693
+ chunkGroupInfoMap,
694
+ blockConnections,
695
+ blocksWithNestedBlocks,
696
+ allCreatedChunkGroups
697
+ );
698
+
699
+ // PART TWO
700
+
701
+ connectChunkGroups(
702
+ blocksWithNestedBlocks,
703
+ blockConnections,
704
+ chunkGroupInfoMap
705
+ );
706
+
707
+ // Cleaup work
708
+
709
+ cleanupUnconnectedGroups(compilation, allCreatedChunkGroups);
710
+ };
711
+
712
+ module.exports = buildChunkGraph;