@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
package/lib/Chunk.js ADDED
@@ -0,0 +1,875 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+ "use strict";
6
+
7
+ const util = require("util");
8
+ const SortableSet = require("./util/SortableSet");
9
+ const intersect = require("./util/SetHelpers").intersect;
10
+ const GraphHelpers = require("./GraphHelpers");
11
+ const Entrypoint = require("./Entrypoint");
12
+ let debugId = 1000;
13
+ const ERR_CHUNK_ENTRY = "Chunk.entry was removed. Use hasRuntime()";
14
+ const ERR_CHUNK_INITIAL =
15
+ "Chunk.initial was removed. Use canBeInitial/isOnlyInitial()";
16
+
17
+ /** @typedef {import("./Module")} Module */
18
+ /** @typedef {import("./ChunkGroup")} ChunkGroup */
19
+ /** @typedef {import("./ModuleReason")} ModuleReason */
20
+ /** @typedef {import("webpack-sources").Source} Source */
21
+ /** @typedef {import("./util/createHash").Hash} Hash */
22
+
23
+ /**
24
+ * @typedef {Object} WithId an object who has an id property *
25
+ * @property {string | number} id the id of the object
26
+ */
27
+
28
+ /**
29
+ * Compare two Modules based on their ids for sorting
30
+ * @param {Module} a module
31
+ * @param {Module} b module
32
+ * @returns {-1|0|1} sort value
33
+ */
34
+
35
+ // TODO use @callback
36
+ /** @typedef {(a: Module, b: Module) => -1|0|1} ModuleSortPredicate */
37
+ /** @typedef {(m: Module) => boolean} ModuleFilterPredicate */
38
+ /** @typedef {(c: Chunk) => boolean} ChunkFilterPredicate */
39
+
40
+ const sortModuleById = (a, b) => {
41
+ if (a.id < b.id) return -1;
42
+ if (b.id < a.id) return 1;
43
+ return 0;
44
+ };
45
+
46
+ /**
47
+ * Compare two ChunkGroups based on their ids for sorting
48
+ * @param {ChunkGroup} a chunk group
49
+ * @param {ChunkGroup} b chunk group
50
+ * @returns {-1|0|1} sort value
51
+ */
52
+ const sortChunkGroupById = (a, b) => {
53
+ if (a.id < b.id) return -1;
54
+ if (b.id < a.id) return 1;
55
+ return 0;
56
+ };
57
+
58
+ /**
59
+ * Compare two Identifiables , based on their ids for sorting
60
+ * @param {Module} a first object with ident fn
61
+ * @param {Module} b second object with ident fn
62
+ * @returns {-1|0|1} The order number of the sort
63
+ */
64
+ const sortByIdentifier = (a, b) => {
65
+ if (a.identifier() > b.identifier()) return 1;
66
+ if (a.identifier() < b.identifier()) return -1;
67
+ return 0;
68
+ };
69
+
70
+ /**
71
+ * @returns {string} a concatenation of module identifiers sorted
72
+ * @param {SortableSet} set to pull module identifiers from
73
+ */
74
+ const getModulesIdent = set => {
75
+ set.sort();
76
+ let str = "";
77
+ for (const m of set) {
78
+ str += m.identifier() + "#";
79
+ }
80
+ return str;
81
+ };
82
+
83
+ /**
84
+ * @template T
85
+ * @param {SortableSet<T>} set the sortable set to convert to array
86
+ * @returns {Array<T>} the array returned from Array.from(set)
87
+ */
88
+ const getArray = set => Array.from(set);
89
+
90
+ /**
91
+ * @param {SortableSet<Module>} set the sortable Set to get the count/size of
92
+ * @returns {number} the size of the modules
93
+ */
94
+ const getModulesSize = set => {
95
+ let size = 0;
96
+ for (const module of set) {
97
+ size += module.size();
98
+ }
99
+ return size;
100
+ };
101
+
102
+ /**
103
+ * A Chunk is a unit of encapsulation for Modules.
104
+ * Chunks are "rendered" into bundles that get emitted when the build completes.
105
+ */
106
+ class Chunk {
107
+ /**
108
+ * @param {string=} name of chunk being created, is optional (for subclasses)
109
+ */
110
+ constructor(name) {
111
+ /** @type {number | null} */
112
+ this.id = null;
113
+ /** @type {number[] | null} */
114
+ this.ids = null;
115
+ /** @type {number} */
116
+ this.debugId = debugId++;
117
+ /** @type {string} */
118
+ this.name = name;
119
+ /** @type {boolean} */
120
+ this.preventIntegration = false;
121
+ /** @type {Module=} */
122
+ this.entryModule = undefined;
123
+ /** @private @type {SortableSet<Module>} */
124
+ this._modules = new SortableSet(undefined, sortByIdentifier);
125
+ /** @type {string?} */
126
+ this.filenameTemplate = undefined;
127
+ /** @private @type {SortableSet<ChunkGroup>} */
128
+ this._groups = new SortableSet(undefined, sortChunkGroupById);
129
+ /** @type {string[]} */
130
+ this.files = [];
131
+ /** @type {boolean} */
132
+ this.rendered = false;
133
+ /** @type {string=} */
134
+ this.hash = undefined;
135
+ /** @type {Object} */
136
+ this.contentHash = Object.create(null);
137
+ /** @type {string=} */
138
+ this.renderedHash = undefined;
139
+ /** @type {string=} */
140
+ this.chunkReason = undefined;
141
+ /** @type {boolean} */
142
+ this.extraAsync = false;
143
+ this.removedModules = undefined;
144
+ }
145
+
146
+ /**
147
+ * @deprecated Chunk.entry has been deprecated. Please use .hasRuntime() instead
148
+ * @returns {never} Throws an error trying to access this property
149
+ */
150
+ get entry() {
151
+ throw new Error(ERR_CHUNK_ENTRY);
152
+ }
153
+
154
+ /**
155
+ * @deprecated .entry has been deprecated. Please use .hasRuntime() instead
156
+ * @param {never} data The data that was attempting to be set
157
+ * @returns {never} Throws an error trying to access this property
158
+ */
159
+ set entry(data) {
160
+ throw new Error(ERR_CHUNK_ENTRY);
161
+ }
162
+
163
+ /**
164
+ * @deprecated Chunk.initial was removed. Use canBeInitial/isOnlyInitial()
165
+ * @returns {never} Throws an error trying to access this property
166
+ */
167
+ get initial() {
168
+ throw new Error(ERR_CHUNK_INITIAL);
169
+ }
170
+
171
+ /**
172
+ * @deprecated Chunk.initial was removed. Use canBeInitial/isOnlyInitial()
173
+ * @param {never} data The data attempting to be set
174
+ * @returns {never} Throws an error trying to access this property
175
+ */
176
+ set initial(data) {
177
+ throw new Error(ERR_CHUNK_INITIAL);
178
+ }
179
+
180
+ /**
181
+ * @returns {boolean} whether or not the Chunk will have a runtime
182
+ */
183
+ hasRuntime() {
184
+ for (const chunkGroup of this._groups) {
185
+ if (
186
+ chunkGroup.isInitial() &&
187
+ chunkGroup instanceof Entrypoint &&
188
+ chunkGroup.getRuntimeChunk() === this
189
+ ) {
190
+ return true;
191
+ }
192
+ }
193
+ return false;
194
+ }
195
+
196
+ /**
197
+ * @returns {boolean} whether or not this chunk can be an initial chunk
198
+ */
199
+ canBeInitial() {
200
+ for (const chunkGroup of this._groups) {
201
+ if (chunkGroup.isInitial()) return true;
202
+ }
203
+ return false;
204
+ }
205
+
206
+ /**
207
+ * @returns {boolean} whether this chunk can only be an initial chunk
208
+ */
209
+ isOnlyInitial() {
210
+ if (this._groups.size <= 0) return false;
211
+ for (const chunkGroup of this._groups) {
212
+ if (!chunkGroup.isInitial()) return false;
213
+ }
214
+ return true;
215
+ }
216
+
217
+ /**
218
+ * @returns {boolean} if this chunk contains the entry module
219
+ */
220
+ hasEntryModule() {
221
+ return !!this.entryModule;
222
+ }
223
+
224
+ /**
225
+ * @param {Module} module the module that will be added to this chunk.
226
+ * @returns {boolean} returns true if the chunk doesn't have the module and it was added
227
+ */
228
+ addModule(module) {
229
+ if (!this._modules.has(module)) {
230
+ this._modules.add(module);
231
+ return true;
232
+ }
233
+ return false;
234
+ }
235
+
236
+ /**
237
+ * @param {Module} module the module that will be removed from this chunk
238
+ * @returns {boolean} returns true if chunk exists and is successfully deleted
239
+ */
240
+ removeModule(module) {
241
+ if (this._modules.delete(module)) {
242
+ module.removeChunk(this);
243
+ return true;
244
+ }
245
+ return false;
246
+ }
247
+
248
+ /**
249
+ * @param {Module[]} modules the new modules to be set
250
+ * @returns {void} set new modules to this chunk and return nothing
251
+ */
252
+ setModules(modules) {
253
+ this._modules = new SortableSet(modules, sortByIdentifier);
254
+ }
255
+
256
+ /**
257
+ * @returns {number} the amount of modules in chunk
258
+ */
259
+ getNumberOfModules() {
260
+ return this._modules.size;
261
+ }
262
+
263
+ /**
264
+ * @returns {SortableSet} return the modules SortableSet for this chunk
265
+ */
266
+ get modulesIterable() {
267
+ return this._modules;
268
+ }
269
+
270
+ /**
271
+ * @param {ChunkGroup} chunkGroup the chunkGroup the chunk is being added
272
+ * @returns {boolean} returns true if chunk is not apart of chunkGroup and is added successfully
273
+ */
274
+ addGroup(chunkGroup) {
275
+ if (this._groups.has(chunkGroup)) return false;
276
+ this._groups.add(chunkGroup);
277
+ return true;
278
+ }
279
+
280
+ /**
281
+ * @param {ChunkGroup} chunkGroup the chunkGroup the chunk is being removed from
282
+ * @returns {boolean} returns true if chunk does exist in chunkGroup and is removed
283
+ */
284
+ removeGroup(chunkGroup) {
285
+ if (!this._groups.has(chunkGroup)) return false;
286
+ this._groups.delete(chunkGroup);
287
+ return true;
288
+ }
289
+
290
+ /**
291
+ * @param {ChunkGroup} chunkGroup the chunkGroup to check
292
+ * @returns {boolean} returns true if chunk has chunkGroup reference and exists in chunkGroup
293
+ */
294
+ isInGroup(chunkGroup) {
295
+ return this._groups.has(chunkGroup);
296
+ }
297
+
298
+ /**
299
+ * @returns {number} the amount of groups said chunk is in
300
+ */
301
+ getNumberOfGroups() {
302
+ return this._groups.size;
303
+ }
304
+
305
+ /**
306
+ * @returns {SortableSet<ChunkGroup>} the chunkGroups that said chunk is referenced in
307
+ */
308
+ get groupsIterable() {
309
+ return this._groups;
310
+ }
311
+
312
+ /**
313
+ * @param {Chunk} otherChunk the chunk to compare itself with
314
+ * @returns {-1|0|1} this is a comparitor function like sort and returns -1, 0, or 1 based on sort order
315
+ */
316
+ compareTo(otherChunk) {
317
+ if (this.name && !otherChunk.name) return -1;
318
+ if (!this.name && otherChunk.name) return 1;
319
+ if (this.name < otherChunk.name) return -1;
320
+ if (this.name > otherChunk.name) return 1;
321
+ if (this._modules.size > otherChunk._modules.size) return -1;
322
+ if (this._modules.size < otherChunk._modules.size) return 1;
323
+ this._modules.sort();
324
+ otherChunk._modules.sort();
325
+ const a = this._modules[Symbol.iterator]();
326
+ const b = otherChunk._modules[Symbol.iterator]();
327
+ // eslint-disable-next-line no-constant-condition
328
+ while (true) {
329
+ const aItem = a.next();
330
+ if (aItem.done) return 0;
331
+ const bItem = b.next();
332
+ const aModuleIdentifier = aItem.value.identifier();
333
+ const bModuleIdentifier = bItem.value.identifier();
334
+ if (aModuleIdentifier < bModuleIdentifier) return -1;
335
+ if (aModuleIdentifier > bModuleIdentifier) return 1;
336
+ }
337
+ }
338
+
339
+ /**
340
+ * @param {Module} module Module to check
341
+ * @returns {boolean} returns true if module does exist in this chunk
342
+ */
343
+ containsModule(module) {
344
+ return this._modules.has(module);
345
+ }
346
+
347
+ /**
348
+ * @returns {Module[]} an array of modules (do not modify)
349
+ */
350
+ getModules() {
351
+ return this._modules.getFromCache(getArray);
352
+ }
353
+
354
+ getModulesIdent() {
355
+ return this._modules.getFromUnorderedCache(getModulesIdent);
356
+ }
357
+
358
+ /**
359
+ * @param {string=} reason reason why chunk is removed
360
+ * @returns {void}
361
+ */
362
+ remove(reason) {
363
+ // cleanup modules
364
+ // Array.from is used here to create a clone, because removeChunk modifies this._modules
365
+ for (const module of Array.from(this._modules)) {
366
+ module.removeChunk(this);
367
+ }
368
+ for (const chunkGroup of this._groups) {
369
+ chunkGroup.removeChunk(this);
370
+ }
371
+ }
372
+
373
+ /**
374
+ *
375
+ * @param {Module} module module to move
376
+ * @param {Chunk} otherChunk other chunk to move it to
377
+ * @returns {void}
378
+ */
379
+ moveModule(module, otherChunk) {
380
+ GraphHelpers.disconnectChunkAndModule(this, module);
381
+ GraphHelpers.connectChunkAndModule(otherChunk, module);
382
+ module.rewriteChunkInReasons(this, [otherChunk]);
383
+ }
384
+
385
+ /**
386
+ *
387
+ * @param {Chunk} otherChunk the chunk to integrate with
388
+ * @param {string} reason reason why the module is being integrated
389
+ * @returns {boolean} returns true or false if integration succeeds or fails
390
+ */
391
+ integrate(otherChunk, reason) {
392
+ if (!this.canBeIntegrated(otherChunk)) {
393
+ return false;
394
+ }
395
+
396
+ // Pick a new name for the integrated chunk
397
+ if (this.name && otherChunk.name) {
398
+ if (this.hasEntryModule() === otherChunk.hasEntryModule()) {
399
+ // When both chunks have entry modules or none have one, use
400
+ // shortest name
401
+ if (this.name.length !== otherChunk.name.length) {
402
+ this.name =
403
+ this.name.length < otherChunk.name.length
404
+ ? this.name
405
+ : otherChunk.name;
406
+ } else {
407
+ this.name = this.name < otherChunk.name ? this.name : otherChunk.name;
408
+ }
409
+ } else if (otherChunk.hasEntryModule()) {
410
+ // Pick the name of the chunk with the entry module
411
+ this.name = otherChunk.name;
412
+ }
413
+ } else if (otherChunk.name) {
414
+ this.name = otherChunk.name;
415
+ }
416
+
417
+ // Array.from is used here to create a clone, because moveModule modifies otherChunk._modules
418
+ for (const module of Array.from(otherChunk._modules)) {
419
+ otherChunk.moveModule(module, this);
420
+ }
421
+ otherChunk._modules.clear();
422
+
423
+ if (otherChunk.entryModule) {
424
+ this.entryModule = otherChunk.entryModule;
425
+ }
426
+
427
+ for (const chunkGroup of otherChunk._groups) {
428
+ chunkGroup.replaceChunk(otherChunk, this);
429
+ this.addGroup(chunkGroup);
430
+ }
431
+ otherChunk._groups.clear();
432
+
433
+ return true;
434
+ }
435
+
436
+ /**
437
+ * @param {Chunk} newChunk the new chunk that will be split out of the current chunk
438
+ * @returns {void}
439
+ */
440
+ split(newChunk) {
441
+ for (const chunkGroup of this._groups) {
442
+ chunkGroup.insertChunk(newChunk, this);
443
+ newChunk.addGroup(chunkGroup);
444
+ }
445
+ }
446
+
447
+ isEmpty() {
448
+ return this._modules.size === 0;
449
+ }
450
+
451
+ updateHash(hash) {
452
+ hash.update(`${this.id} `);
453
+ hash.update(this.ids ? this.ids.join(",") : "");
454
+ hash.update(`${this.name || ""} `);
455
+ for (const m of this._modules) {
456
+ hash.update(m.hash);
457
+ }
458
+ }
459
+
460
+ canBeIntegrated(otherChunk) {
461
+ if (this.preventIntegration || otherChunk.preventIntegration) {
462
+ return false;
463
+ }
464
+
465
+ /**
466
+ * @param {Chunk} a chunk
467
+ * @param {Chunk} b chunk
468
+ * @returns {boolean} true, if a is always available when b is reached
469
+ */
470
+ const isAvailable = (a, b) => {
471
+ const queue = new Set(b.groupsIterable);
472
+ for (const chunkGroup of queue) {
473
+ if (a.isInGroup(chunkGroup)) continue;
474
+ if (chunkGroup.isInitial()) return false;
475
+ for (const parent of chunkGroup.parentsIterable) {
476
+ queue.add(parent);
477
+ }
478
+ }
479
+ return true;
480
+ };
481
+
482
+ const selfHasRuntime = this.hasRuntime();
483
+ const otherChunkHasRuntime = otherChunk.hasRuntime();
484
+
485
+ if (selfHasRuntime !== otherChunkHasRuntime) {
486
+ if (selfHasRuntime) {
487
+ return isAvailable(this, otherChunk);
488
+ } else if (otherChunkHasRuntime) {
489
+ return isAvailable(otherChunk, this);
490
+ } else {
491
+ return false;
492
+ }
493
+ }
494
+
495
+ if (this.hasEntryModule() || otherChunk.hasEntryModule()) {
496
+ return false;
497
+ }
498
+
499
+ return true;
500
+ }
501
+
502
+ /**
503
+ *
504
+ * @param {number} size the size
505
+ * @param {Object} options the options passed in
506
+ * @returns {number} the multiplier returned
507
+ */
508
+ addMultiplierAndOverhead(size, options) {
509
+ const overhead =
510
+ typeof options.chunkOverhead === "number" ? options.chunkOverhead : 10000;
511
+ const multiplicator = this.canBeInitial()
512
+ ? options.entryChunkMultiplicator || 10
513
+ : 1;
514
+
515
+ return size * multiplicator + overhead;
516
+ }
517
+
518
+ /**
519
+ * @returns {number} the size of all modules
520
+ */
521
+ modulesSize() {
522
+ return this._modules.getFromUnorderedCache(getModulesSize);
523
+ }
524
+
525
+ /**
526
+ * @param {Object} options the size display options
527
+ * @returns {number} the chunk size
528
+ */
529
+ size(options = {}) {
530
+ return this.addMultiplierAndOverhead(this.modulesSize(), options);
531
+ }
532
+
533
+ /**
534
+ * @param {Chunk} otherChunk the other chunk
535
+ * @param {TODO} options the options for this function
536
+ * @returns {number | false} the size, or false if it can't be integrated
537
+ */
538
+ integratedSize(otherChunk, options) {
539
+ // Chunk if it's possible to integrate this chunk
540
+ if (!this.canBeIntegrated(otherChunk)) {
541
+ return false;
542
+ }
543
+
544
+ let integratedModulesSize = this.modulesSize();
545
+ // only count modules that do not exist in this chunk!
546
+ for (const otherModule of otherChunk._modules) {
547
+ if (!this._modules.has(otherModule)) {
548
+ integratedModulesSize += otherModule.size();
549
+ }
550
+ }
551
+
552
+ return this.addMultiplierAndOverhead(integratedModulesSize, options);
553
+ }
554
+
555
+ /**
556
+ * @param {function(Module, Module): -1|0|1=} sortByFn a predicate function used to sort modules
557
+ * @returns {void}
558
+ */
559
+ sortModules(sortByFn) {
560
+ this._modules.sortWith(sortByFn || sortModuleById);
561
+ }
562
+
563
+ sortItems() {
564
+ this.sortModules();
565
+ }
566
+
567
+ /**
568
+ * @returns {Set<Chunk>} a set of all the async chunks
569
+ */
570
+ getAllAsyncChunks() {
571
+ const queue = new Set();
572
+ const chunks = new Set();
573
+
574
+ const initialChunks = intersect(
575
+ Array.from(this.groupsIterable, g => new Set(g.chunks))
576
+ );
577
+
578
+ for (const chunkGroup of this.groupsIterable) {
579
+ for (const child of chunkGroup.childrenIterable) {
580
+ queue.add(child);
581
+ }
582
+ }
583
+
584
+ for (const chunkGroup of queue) {
585
+ for (const chunk of chunkGroup.chunks) {
586
+ if (!initialChunks.has(chunk)) {
587
+ chunks.add(chunk);
588
+ }
589
+ }
590
+ for (const child of chunkGroup.childrenIterable) {
591
+ queue.add(child);
592
+ }
593
+ }
594
+
595
+ return chunks;
596
+ }
597
+
598
+ /**
599
+ * @typedef {Object} ChunkMaps
600
+ * @property {Record<string|number, string>} hash
601
+ * @property {Record<string|number, Record<string, string>>} contentHash
602
+ * @property {Record<string|number, string>} name
603
+ */
604
+
605
+ /**
606
+ * @param {boolean} realHash should the full hash or the rendered hash be used
607
+ * @returns {ChunkMaps} the chunk map information
608
+ */
609
+ getChunkMaps(realHash) {
610
+ /** @type {Record<string|number, string>} */
611
+ const chunkHashMap = Object.create(null);
612
+ /** @type {Record<string|number, Record<string, string>>} */
613
+ const chunkContentHashMap = Object.create(null);
614
+ /** @type {Record<string|number, string>} */
615
+ const chunkNameMap = Object.create(null);
616
+
617
+ for (const chunk of this.getAllAsyncChunks()) {
618
+ chunkHashMap[chunk.id] = realHash ? chunk.hash : chunk.renderedHash;
619
+ for (const key of Object.keys(chunk.contentHash)) {
620
+ if (!chunkContentHashMap[key]) {
621
+ chunkContentHashMap[key] = Object.create(null);
622
+ }
623
+ chunkContentHashMap[key][chunk.id] = chunk.contentHash[key];
624
+ }
625
+ if (chunk.name) {
626
+ chunkNameMap[chunk.id] = chunk.name;
627
+ }
628
+ }
629
+
630
+ return {
631
+ hash: chunkHashMap,
632
+ contentHash: chunkContentHashMap,
633
+ name: chunkNameMap
634
+ };
635
+ }
636
+
637
+ /**
638
+ * @returns {Record<string, Set<TODO>[]>} a record object of names to lists of child ids(?)
639
+ */
640
+ getChildIdsByOrders() {
641
+ const lists = new Map();
642
+ for (const group of this.groupsIterable) {
643
+ if (group.chunks[group.chunks.length - 1] === this) {
644
+ for (const childGroup of group.childrenIterable) {
645
+ // TODO webpack 5 remove this check for options
646
+ if (typeof childGroup.options === "object") {
647
+ for (const key of Object.keys(childGroup.options)) {
648
+ if (key.endsWith("Order")) {
649
+ const name = key.substr(0, key.length - "Order".length);
650
+ let list = lists.get(name);
651
+ if (list === undefined) lists.set(name, (list = []));
652
+ list.push({
653
+ order: childGroup.options[key],
654
+ group: childGroup
655
+ });
656
+ }
657
+ }
658
+ }
659
+ }
660
+ }
661
+ }
662
+ const result = Object.create(null);
663
+ for (const [name, list] of lists) {
664
+ list.sort((a, b) => {
665
+ const cmp = b.order - a.order;
666
+ if (cmp !== 0) return cmp;
667
+ // TODO webpack 5 remove this check of compareTo
668
+ if (a.group.compareTo) {
669
+ return a.group.compareTo(b.group);
670
+ }
671
+ return 0;
672
+ });
673
+ result[name] = Array.from(
674
+ list.reduce((set, item) => {
675
+ for (const chunk of item.group.chunks) {
676
+ set.add(chunk.id);
677
+ }
678
+ return set;
679
+ }, new Set())
680
+ );
681
+ }
682
+ return result;
683
+ }
684
+
685
+ getChildIdsByOrdersMap(includeDirectChildren) {
686
+ const chunkMaps = Object.create(null);
687
+
688
+ const addChildIdsByOrdersToMap = chunk => {
689
+ const data = chunk.getChildIdsByOrders();
690
+ for (const key of Object.keys(data)) {
691
+ let chunkMap = chunkMaps[key];
692
+ if (chunkMap === undefined) {
693
+ chunkMaps[key] = chunkMap = Object.create(null);
694
+ }
695
+ chunkMap[chunk.id] = data[key];
696
+ }
697
+ };
698
+
699
+ if (includeDirectChildren) {
700
+ const chunks = new Set();
701
+ for (const chunkGroup of this.groupsIterable) {
702
+ for (const chunk of chunkGroup.chunks) {
703
+ chunks.add(chunk);
704
+ }
705
+ }
706
+ for (const chunk of chunks) {
707
+ addChildIdsByOrdersToMap(chunk);
708
+ }
709
+ }
710
+
711
+ for (const chunk of this.getAllAsyncChunks()) {
712
+ addChildIdsByOrdersToMap(chunk);
713
+ }
714
+
715
+ return chunkMaps;
716
+ }
717
+
718
+ /**
719
+ * @typedef {Object} ChunkModuleMaps
720
+ * @property {Record<string|number, (string|number)[]>} id
721
+ * @property {Record<string|number, string>} hash
722
+ */
723
+
724
+ /**
725
+ * @param {ModuleFilterPredicate} filterFn function used to filter modules
726
+ * @returns {ChunkModuleMaps} module map information
727
+ */
728
+ getChunkModuleMaps(filterFn) {
729
+ /** @type {Record<string|number, (string|number)[]>} */
730
+ const chunkModuleIdMap = Object.create(null);
731
+ /** @type {Record<string|number, string>} */
732
+ const chunkModuleHashMap = Object.create(null);
733
+
734
+ for (const chunk of this.getAllAsyncChunks()) {
735
+ /** @type {(string|number)[]} */
736
+ let array;
737
+ for (const module of chunk.modulesIterable) {
738
+ if (filterFn(module)) {
739
+ if (array === undefined) {
740
+ array = [];
741
+ chunkModuleIdMap[chunk.id] = array;
742
+ }
743
+ array.push(module.id);
744
+ chunkModuleHashMap[module.id] = module.renderedHash;
745
+ }
746
+ }
747
+ if (array !== undefined) {
748
+ array.sort();
749
+ }
750
+ }
751
+
752
+ return {
753
+ id: chunkModuleIdMap,
754
+ hash: chunkModuleHashMap
755
+ };
756
+ }
757
+
758
+ /**
759
+ *
760
+ * @param {function(Module): boolean} filterFn predicate function used to filter modules
761
+ * @param {function(Chunk): boolean} filterChunkFn predicate function used to filter chunks
762
+ * @returns {boolean} return true if module exists in graph
763
+ */
764
+ hasModuleInGraph(filterFn, filterChunkFn) {
765
+ const queue = new Set(this.groupsIterable);
766
+ const chunksProcessed = new Set();
767
+
768
+ for (const chunkGroup of queue) {
769
+ for (const chunk of chunkGroup.chunks) {
770
+ if (!chunksProcessed.has(chunk)) {
771
+ chunksProcessed.add(chunk);
772
+ if (!filterChunkFn || filterChunkFn(chunk)) {
773
+ for (const module of chunk.modulesIterable) {
774
+ if (filterFn(module)) {
775
+ return true;
776
+ }
777
+ }
778
+ }
779
+ }
780
+ }
781
+ for (const child of chunkGroup.childrenIterable) {
782
+ queue.add(child);
783
+ }
784
+ }
785
+ return false;
786
+ }
787
+
788
+ toString() {
789
+ return `Chunk[${Array.from(this._modules).join()}]`;
790
+ }
791
+ }
792
+
793
+ // TODO remove in webpack 5
794
+ Object.defineProperty(Chunk.prototype, "forEachModule", {
795
+ configurable: false,
796
+ value: util.deprecate(
797
+ /**
798
+ * @deprecated
799
+ * @this {Chunk}
800
+ * @typedef {function(any, any, Set<any>): void} ForEachModuleCallback
801
+ * @param {ForEachModuleCallback} fn Callback function
802
+ * @returns {void}
803
+ */
804
+ function(fn) {
805
+ this._modules.forEach(fn);
806
+ },
807
+ "Chunk.forEachModule: Use for(const module of chunk.modulesIterable) instead"
808
+ )
809
+ });
810
+
811
+ // TODO remove in webpack 5
812
+ Object.defineProperty(Chunk.prototype, "mapModules", {
813
+ configurable: false,
814
+ value: util.deprecate(
815
+ /**
816
+ * @deprecated
817
+ * @this {Chunk}
818
+ * @typedef {function(any, number): any} MapModulesCallback
819
+ * @param {MapModulesCallback} fn Callback function
820
+ * @returns {TODO[]} result of mapped modules
821
+ */
822
+ function(fn) {
823
+ return Array.from(this._modules, fn);
824
+ },
825
+ "Chunk.mapModules: Use Array.from(chunk.modulesIterable, fn) instead"
826
+ )
827
+ });
828
+
829
+ // TODO remove in webpack 5
830
+ Object.defineProperty(Chunk.prototype, "chunks", {
831
+ configurable: false,
832
+ get() {
833
+ throw new Error("Chunk.chunks: Use ChunkGroup.getChildren() instead");
834
+ },
835
+ set() {
836
+ throw new Error("Chunk.chunks: Use ChunkGroup.add/removeChild() instead");
837
+ }
838
+ });
839
+
840
+ // TODO remove in webpack 5
841
+ Object.defineProperty(Chunk.prototype, "parents", {
842
+ configurable: false,
843
+ get() {
844
+ throw new Error("Chunk.parents: Use ChunkGroup.getParents() instead");
845
+ },
846
+ set() {
847
+ throw new Error("Chunk.parents: Use ChunkGroup.add/removeParent() instead");
848
+ }
849
+ });
850
+
851
+ // TODO remove in webpack 5
852
+ Object.defineProperty(Chunk.prototype, "blocks", {
853
+ configurable: false,
854
+ get() {
855
+ throw new Error("Chunk.blocks: Use ChunkGroup.getBlocks() instead");
856
+ },
857
+ set() {
858
+ throw new Error("Chunk.blocks: Use ChunkGroup.add/removeBlock() instead");
859
+ }
860
+ });
861
+
862
+ // TODO remove in webpack 5
863
+ Object.defineProperty(Chunk.prototype, "entrypoints", {
864
+ configurable: false,
865
+ get() {
866
+ throw new Error(
867
+ "Chunk.entrypoints: Use Chunks.groupsIterable and filter by instanceof Entrypoint instead"
868
+ );
869
+ },
870
+ set() {
871
+ throw new Error("Chunk.entrypoints: Use Chunks.addGroup instead");
872
+ }
873
+ });
874
+
875
+ module.exports = Chunk;