@depup/webpack 5.109.2-depup.0 → 5.110.1-depup.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 (640) hide show
  1. package/README.md +5 -5
  2. package/changes.json +7 -7
  3. package/lib/APIPlugin.js +123 -17
  4. package/lib/AsyncDependenciesBlock.js +10 -7
  5. package/lib/AutomaticPrefetchPlugin.js +1 -1
  6. package/lib/BannerPlugin.js +10 -6
  7. package/lib/CacheFacade.js +6 -6
  8. package/lib/Chunk.js +14 -11
  9. package/lib/ChunkGraph.js +26 -17
  10. package/lib/ChunkGroup.js +7 -7
  11. package/lib/ChunkTemplate.js +35 -44
  12. package/lib/CircularModulesPlugin.js +205 -28
  13. package/lib/CleanPlugin.js +4 -7
  14. package/lib/CodeGenerationResults.js +11 -8
  15. package/lib/CompatibilityPlugin.js +7 -7
  16. package/lib/Compilation.js +688 -409
  17. package/lib/Compiler.js +53 -38
  18. package/lib/ConcatenationScope.js +117 -8
  19. package/lib/ConditionalInitFragment.js +3 -3
  20. package/lib/ConstPlugin.js +13 -11
  21. package/lib/ContextExclusionPlugin.js +1 -1
  22. package/lib/ContextModule.js +146 -54
  23. package/lib/ContextModuleFactory.js +46 -14
  24. package/lib/ContextReplacementPlugin.js +12 -14
  25. package/lib/DefinePlugin.js +121 -37
  26. package/lib/DependenciesBlock.js +9 -6
  27. package/lib/Dependency.js +36 -16
  28. package/lib/DependencyTemplate.js +11 -12
  29. package/lib/DependencyTemplates.js +3 -3
  30. package/lib/DotenvPlugin.js +50 -13
  31. package/lib/DynamicEntryPlugin.js +8 -4
  32. package/lib/EntryOptionPlugin.js +8 -4
  33. package/lib/EntryPlugin.js +2 -2
  34. package/lib/Entrypoint.js +6 -2
  35. package/lib/EnvironmentPlugin.js +2 -2
  36. package/lib/EvalDevToolModulePlugin.js +8 -4
  37. package/lib/EvalSourceMapDevToolPlugin.js +15 -8
  38. package/lib/ExportsInfo.js +101 -14
  39. package/lib/ExportsInfoApiPlugin.js +2 -4
  40. package/lib/ExternalModule.js +232 -77
  41. package/lib/ExternalModuleFactoryPlugin.js +97 -38
  42. package/lib/ExternalsPlugin.js +10 -6
  43. package/lib/FileSystemInfo.js +44 -70
  44. package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
  45. package/lib/FlagDependencyExportsPlugin.js +76 -19
  46. package/lib/FlagDependencyUsagePlugin.js +32 -47
  47. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  48. package/lib/Generator.js +36 -15
  49. package/lib/HotModuleReplacementPlugin.js +16 -44
  50. package/lib/IgnorePlugin.js +8 -4
  51. package/lib/IgnoreWarningsPlugin.js +2 -2
  52. package/lib/InitFragment.js +8 -4
  53. package/lib/JavascriptMetaInfoPlugin.js +35 -4
  54. package/lib/LazyBarrel.js +3 -4
  55. package/lib/LibraryTemplatePlugin.js +10 -6
  56. package/lib/LoaderOptionsPlugin.js +7 -3
  57. package/lib/LoaderTargetPlugin.js +1 -1
  58. package/lib/MainTemplate.js +49 -42
  59. package/lib/ManifestPlugin.js +12 -11
  60. package/lib/Module.js +62 -33
  61. package/lib/ModuleFactory.js +3 -3
  62. package/lib/ModuleFilenameHelpers.js +9 -4
  63. package/lib/ModuleGraph.js +195 -21
  64. package/lib/ModuleGraphConnection.js +6 -13
  65. package/lib/ModuleInfoHeaderPlugin.js +8 -10
  66. package/lib/ModuleTemplate.js +62 -63
  67. package/lib/MultiCompiler.js +130 -64
  68. package/lib/MultiStats.js +40 -9
  69. package/lib/MultiWatching.js +3 -3
  70. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  71. package/lib/NodeStuffPlugin.js +29 -19
  72. package/lib/NormalModule.js +141 -85
  73. package/lib/NormalModuleFactory.js +555 -110
  74. package/lib/NormalModuleReplacementPlugin.js +5 -8
  75. package/lib/NullFactory.js +6 -2
  76. package/lib/OptionsApply.js +7 -3
  77. package/lib/Parser.js +7 -3
  78. package/lib/PlatformPlugin.js +2 -2
  79. package/lib/PrefetchPlugin.js +1 -1
  80. package/lib/ProgressPlugin.js +16 -13
  81. package/lib/ProvidePlugin.js +3 -5
  82. package/lib/RawModule.js +25 -17
  83. package/lib/RecordIdsPlugin.js +3 -3
  84. package/lib/RequestShortener.js +1 -1
  85. package/lib/ResolverFactory.js +2 -2
  86. package/lib/RuntimeGlobals.js +22 -10
  87. package/lib/RuntimeModule.js +29 -19
  88. package/lib/RuntimePlugin.js +332 -169
  89. package/lib/RuntimeTemplate.js +2792 -352
  90. package/lib/SelfModuleFactory.js +7 -3
  91. package/lib/SourceMapDevToolModuleOptionsPlugin.js +6 -2
  92. package/lib/SourceMapDevToolPlugin.js +30 -20
  93. package/lib/Stats.js +3 -4
  94. package/lib/Template.js +32 -22
  95. package/lib/TemplatedPathPlugin.js +96 -14
  96. package/lib/UseStrictPlugin.js +4 -6
  97. package/lib/WarnCaseSensitiveModulesPlugin.js +4 -4
  98. package/lib/WarnDeprecatedOptionPlugin.js +1 -1
  99. package/lib/WarnNoModeSetPlugin.js +1 -1
  100. package/lib/WatchIgnorePlugin.js +8 -6
  101. package/lib/Watching.js +8 -8
  102. package/lib/WebpackIsIncludedPlugin.js +2 -4
  103. package/lib/WebpackOptionsApply.js +308 -18
  104. package/lib/WebpackOptionsDefaulter.js +6 -2
  105. package/lib/asset/AssetBytesGenerator.js +12 -10
  106. package/lib/asset/AssetBytesParser.js +2 -4
  107. package/lib/asset/AssetGenerator.js +188 -95
  108. package/lib/asset/AssetModule.js +7 -3
  109. package/lib/asset/AssetModulesPlugin.js +110 -38
  110. package/lib/asset/AssetParser.js +9 -7
  111. package/lib/asset/AssetSourceGenerator.js +60 -13
  112. package/lib/asset/AssetSourceParser.js +2 -4
  113. package/lib/asset/RawDataUrlModule.js +24 -16
  114. package/lib/asset/WebManifestGenerator.js +8 -10
  115. package/lib/asset/WebManifestParser.js +24 -10
  116. package/lib/async-modules/AsyncModuleHelpers.js +2 -2
  117. package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
  118. package/lib/async-modules/InferAsyncModulesPlugin.js +2 -2
  119. package/lib/async-modules/isGeneratorLowered.js +4 -4
  120. package/lib/buildChunkGraph.js +36 -27
  121. package/lib/bun/BunTargetPlugin.js +1 -1
  122. package/lib/cache/AddBuildDependenciesPlugin.js +1 -1
  123. package/lib/cache/AddManagedPathsPlugin.js +1 -1
  124. package/lib/cache/IdleFileCachePlugin.js +2 -2
  125. package/lib/cache/MemoryCachePlugin.js +18 -10
  126. package/lib/cache/MemoryWithGcCachePlugin.js +34 -22
  127. package/lib/cache/PackFileCacheStrategy.js +30 -23
  128. package/lib/cache/ResolverCachePlugin.js +38 -18
  129. package/lib/cache/getLazyHashedEtag.js +1 -2
  130. package/lib/cache/mergeEtags.js +1 -1
  131. package/lib/cli.js +1 -3
  132. package/lib/config/browserslistTargetHandler.js +41 -5
  133. package/lib/config/defaults.js +261 -79
  134. package/lib/config/defineConfig.js +10 -2
  135. package/lib/config/getClaimedAssetTypes.js +65 -0
  136. package/lib/config/normalization.js +36 -16
  137. package/lib/config/target.js +46 -3
  138. package/lib/container/ContainerEntryDependency.js +1 -1
  139. package/lib/container/ContainerEntryModule.js +24 -15
  140. package/lib/container/ContainerEntryModuleFactory.js +7 -3
  141. package/lib/container/ContainerPlugin.js +9 -10
  142. package/lib/container/ContainerReferencePlugin.js +6 -2
  143. package/lib/container/FallbackDependency.js +1 -1
  144. package/lib/container/FallbackModule.js +24 -17
  145. package/lib/container/FallbackModuleFactory.js +7 -3
  146. package/lib/container/HoistContainerReferencesPlugin.js +6 -11
  147. package/lib/container/ModuleFederationPlugin.js +7 -24
  148. package/lib/container/RemoteModule.js +27 -19
  149. package/lib/container/RemoteRuntimeModule.js +10 -8
  150. package/lib/container/moduleFederationHooks.js +32 -0
  151. package/lib/css/CssGenerator.js +171 -43
  152. package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
  153. package/lib/css/CssLoadingRuntimeModule.js +57 -24
  154. package/lib/css/CssModule.js +10 -7
  155. package/lib/css/CssModulesPlugin.js +168 -88
  156. package/lib/css/CssParser.js +1113 -568
  157. package/lib/css/CssServerStylesRuntimeModule.js +54 -0
  158. package/lib/css/cssMinify.js +168 -0
  159. package/lib/css/data.js +5324 -0
  160. package/lib/css/syntax.js +9579 -232
  161. package/lib/debug/ProfilingPlugin.js +14 -9
  162. package/lib/deno/DenoTargetPlugin.js +1 -1
  163. package/lib/dependencies/AMDDefineDependency.js +112 -87
  164. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +30 -17
  165. package/lib/dependencies/AMDPlugin.js +9 -7
  166. package/lib/dependencies/AMDRequireArrayDependency.js +5 -5
  167. package/lib/dependencies/AMDRequireContextDependency.js +2 -2
  168. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -1
  169. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +25 -14
  170. package/lib/dependencies/AMDRequireDependency.js +8 -7
  171. package/lib/dependencies/AMDRequireItemDependency.js +1 -1
  172. package/lib/dependencies/AMDRuntimeModules.js +21 -1
  173. package/lib/dependencies/BuildTimeConstDependency.js +102 -0
  174. package/lib/dependencies/CachedConstDependency.js +11 -8
  175. package/lib/dependencies/CommonJsDependencyHelpers.js +67 -46
  176. package/lib/dependencies/CommonJsExportRequireDependency.js +121 -45
  177. package/lib/dependencies/CommonJsExportsDependency.js +53 -49
  178. package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
  179. package/lib/dependencies/CommonJsFullRequireDependency.js +119 -34
  180. package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -50
  181. package/lib/dependencies/CommonJsObjectExportDependency.js +188 -0
  182. package/lib/dependencies/CommonJsPlugin.js +35 -6
  183. package/lib/dependencies/CommonJsRequireContextDependency.js +5 -6
  184. package/lib/dependencies/CommonJsRequireDependency.js +156 -27
  185. package/lib/dependencies/CommonJsSelfReferenceDependency.js +63 -38
  186. package/lib/dependencies/ConstDependency.js +8 -9
  187. package/lib/dependencies/ContextDependency.js +12 -8
  188. package/lib/dependencies/ContextDependencyHelpers.js +14 -9
  189. package/lib/dependencies/ContextDependencyTemplateAsId.js +4 -4
  190. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -4
  191. package/lib/dependencies/ContextElementDependency.js +31 -12
  192. package/lib/dependencies/CreateRequireParserPlugin.js +12 -7
  193. package/lib/dependencies/CreateScriptUrlDependency.js +4 -4
  194. package/lib/dependencies/CssIcssExportDependency.js +56 -28
  195. package/lib/dependencies/CssIcssImportDependency.js +17 -13
  196. package/lib/dependencies/CssIcssSymbolDependency.js +9 -10
  197. package/lib/dependencies/CssImportDependency.js +18 -9
  198. package/lib/dependencies/CssUrlDependency.js +17 -13
  199. package/lib/dependencies/DllEntryDependency.js +1 -1
  200. package/lib/dependencies/DynamicExports.js +2 -2
  201. package/lib/dependencies/ExportBindingInitFragment.js +36 -9
  202. package/lib/dependencies/ExportsInfoDependency.js +7 -8
  203. package/lib/dependencies/ExternalModuleDependency.js +9 -5
  204. package/lib/dependencies/ExternalModuleInitFragment.js +2 -2
  205. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +8 -5
  206. package/lib/dependencies/HarmonyAcceptDependency.js +5 -5
  207. package/lib/dependencies/HarmonyCompatibilityDependency.js +52 -17
  208. package/lib/dependencies/HarmonyDetectionParserPlugin.js +11 -7
  209. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +13 -10
  210. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +78 -12
  211. package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
  212. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
  213. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +143 -63
  214. package/lib/dependencies/HarmonyExportInitFragment.js +18 -6
  215. package/lib/dependencies/HarmonyExportSpecifierDependency.js +51 -14
  216. package/lib/dependencies/HarmonyExports.js +7 -4
  217. package/lib/dependencies/HarmonyImportDependency.js +27 -19
  218. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +31 -24
  219. package/lib/dependencies/HarmonyImportGuard.js +20 -30
  220. package/lib/dependencies/HarmonyImportSideEffectDependency.js +38 -9
  221. package/lib/dependencies/HarmonyImportSpecifierDependency.js +97 -49
  222. package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
  223. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
  224. package/lib/dependencies/HtmlEntryDependency.js +37 -29
  225. package/lib/dependencies/HtmlInlineHtmlDependency.js +7 -8
  226. package/lib/dependencies/HtmlInlineScriptDependency.js +11 -8
  227. package/lib/dependencies/HtmlInlineStyleDependency.js +7 -10
  228. package/lib/dependencies/HtmlSourceDependency.js +22 -14
  229. package/lib/dependencies/ImportContextDependency.js +2 -2
  230. package/lib/dependencies/ImportDependency.js +24 -20
  231. package/lib/dependencies/ImportEagerDependency.js +6 -9
  232. package/lib/dependencies/ImportMetaContextDependency.js +2 -2
  233. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +14 -13
  234. package/lib/dependencies/ImportMetaContextPlugin.js +7 -3
  235. package/lib/dependencies/ImportMetaGlobDependency.js +2 -2
  236. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +2 -3
  237. package/lib/dependencies/ImportMetaGlobHelpers.js +19 -22
  238. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -1
  239. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -1
  240. package/lib/dependencies/ImportMetaPlugin.js +154 -71
  241. package/lib/dependencies/ImportMetaResolveDependency.js +3 -4
  242. package/lib/dependencies/ImportParserPlugin.js +49 -35
  243. package/lib/dependencies/ImportPhase.js +12 -5
  244. package/lib/dependencies/ImportPlugin.js +7 -3
  245. package/lib/dependencies/ImportWeakDependency.js +6 -9
  246. package/lib/dependencies/JsonExportsDependency.js +11 -7
  247. package/lib/dependencies/LoaderDependency.js +2 -2
  248. package/lib/dependencies/LoaderImportDependency.js +2 -2
  249. package/lib/dependencies/LoaderPlugin.js +11 -7
  250. package/lib/dependencies/LocalModuleDependency.js +5 -5
  251. package/lib/dependencies/LocalModulesHelpers.js +1 -1
  252. package/lib/dependencies/ModuleDecoratorDependency.js +6 -7
  253. package/lib/dependencies/ModuleDependency.js +9 -6
  254. package/lib/dependencies/ModuleDependencyTemplateAsId.js +4 -4
  255. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +3 -3
  256. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  257. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -1
  258. package/lib/dependencies/ModuleInitFragmentDependency.js +24 -10
  259. package/lib/dependencies/NullDependency.js +3 -3
  260. package/lib/dependencies/ProvidedDependency.js +14 -10
  261. package/lib/dependencies/PureExpressionDependency.js +9 -10
  262. package/lib/dependencies/RequireContextDependency.js +2 -2
  263. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -4
  264. package/lib/dependencies/RequireContextPlugin.js +8 -4
  265. package/lib/dependencies/RequireEnsureDependenciesBlock.js +2 -2
  266. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +5 -8
  267. package/lib/dependencies/RequireEnsureDependency.js +8 -7
  268. package/lib/dependencies/RequireEnsurePlugin.js +7 -3
  269. package/lib/dependencies/RequireHeaderDependency.js +51 -12
  270. package/lib/dependencies/RequireIncludeDependency.js +6 -6
  271. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +2 -3
  272. package/lib/dependencies/RequireIncludePlugin.js +7 -3
  273. package/lib/dependencies/RequireJsStuffPlugin.js +7 -3
  274. package/lib/dependencies/RequireResolveContextDependency.js +2 -2
  275. package/lib/dependencies/RequireResolveDependency.js +4 -4
  276. package/lib/dependencies/RequireResolveHeaderDependency.js +4 -4
  277. package/lib/dependencies/RuntimeRequirementsDependency.js +5 -6
  278. package/lib/dependencies/StaticExportsDependency.js +2 -2
  279. package/lib/dependencies/SystemPlugin.js +10 -6
  280. package/lib/dependencies/SystemRuntimeModule.js +10 -0
  281. package/lib/dependencies/TopLevelAwaitDependency.js +11 -7
  282. package/lib/dependencies/URLContextDependency.js +2 -2
  283. package/lib/dependencies/URLDependency.js +110 -64
  284. package/lib/dependencies/URLPlugin.js +7 -3
  285. package/lib/dependencies/UnsupportedDependency.js +4 -4
  286. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -4
  287. package/lib/dependencies/WebAssemblyImportDependency.js +5 -5
  288. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -6
  289. package/lib/dependencies/WorkerAndWorkletPlugin.js +46 -28
  290. package/lib/dependencies/WorkerDependency.js +28 -22
  291. package/lib/dependencies/WorkletDependency.js +15 -14
  292. package/lib/dependencies/getFunctionExpression.js +8 -4
  293. package/lib/dependencies/processExportInfo.js +5 -5
  294. package/lib/dll/DelegatedModule.js +34 -22
  295. package/lib/dll/DelegatedModuleFactoryPlugin.js +15 -7
  296. package/lib/dll/DelegatedPlugin.js +2 -2
  297. package/lib/dll/DllEntryPlugin.js +2 -2
  298. package/lib/dll/DllModule.js +22 -15
  299. package/lib/dll/DllModuleFactory.js +7 -3
  300. package/lib/dll/DllPlugin.js +7 -5
  301. package/lib/dll/DllReferencePlugin.js +10 -7
  302. package/lib/dll/LibManifestPlugin.js +5 -5
  303. package/lib/electron/ElectronTargetPlugin.js +53 -49
  304. package/lib/errors/AsyncChunkWaterfallWarning.js +36 -0
  305. package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
  306. package/lib/errors/BroadContextsWarning.js +43 -0
  307. package/lib/errors/BuildCycleError.js +1 -1
  308. package/lib/errors/CacheEffectivenessWarning.js +55 -0
  309. package/lib/errors/ChunkRenderError.js +1 -1
  310. package/lib/errors/CircularDependenciesWarning.js +38 -0
  311. package/lib/errors/CodeGenerationError.js +1 -1
  312. package/lib/errors/CommentCompilationWarning.js +1 -1
  313. package/lib/errors/ConflictingResourceHintsWarning.js +35 -0
  314. package/lib/errors/DuplicateModulesWarning.js +45 -0
  315. package/lib/errors/DynamicExportsWarning.js +30 -0
  316. package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
  317. package/lib/errors/EntrypointOverlapWarning.js +45 -0
  318. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  319. package/lib/errors/EvalUsageWarning.js +28 -0
  320. package/lib/errors/HookWebpackError.js +5 -5
  321. package/lib/errors/HotspotsWarning.js +57 -0
  322. package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
  323. package/lib/errors/InlinedAssetsWarning.js +36 -0
  324. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  325. package/lib/errors/LargeModulesWarning.js +45 -0
  326. package/lib/errors/LegacyJavascriptWarning.js +48 -0
  327. package/lib/errors/MissingSideEffectsWarning.js +36 -0
  328. package/lib/errors/MixedExportsWarning.js +41 -0
  329. package/lib/errors/ModuleDependencyError.js +13 -16
  330. package/lib/errors/ModuleDependencyWarning.js +5 -15
  331. package/lib/errors/ModuleHashingError.js +1 -1
  332. package/lib/errors/ModuleNotFoundError.js +2 -2
  333. package/lib/errors/ModuleParseError.js +1 -2
  334. package/lib/errors/ModuleRestoreError.js +1 -1
  335. package/lib/errors/ModuleStoreError.js +1 -1
  336. package/lib/errors/NodeStuffInWebError.js +1 -1
  337. package/lib/errors/OsDependentRuleWarning.js +31 -0
  338. package/lib/errors/PureAnnotationsWarning.js +36 -0
  339. package/lib/errors/RedundantDynamicImportWarning.js +31 -0
  340. package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
  341. package/lib/errors/SplitChunksCappedWarning.js +41 -0
  342. package/lib/errors/TinyChunksWarning.js +40 -0
  343. package/lib/errors/TopLevelThisWarning.js +34 -0
  344. package/lib/errors/UnsplitVendorsWarning.js +42 -0
  345. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  346. package/lib/errors/UnusedAliasesWarning.js +29 -0
  347. package/lib/errors/UnusedDefinesWarning.js +29 -0
  348. package/lib/errors/UnusedExternalsWarning.js +29 -0
  349. package/lib/errors/UnusedReexportsWarning.js +42 -0
  350. package/lib/errors/UnusedRuleWarning.js +29 -0
  351. package/lib/errors/WebpackError.js +9 -5
  352. package/lib/errors/deriveStackFromNestedError.js +90 -0
  353. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  354. package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
  355. package/lib/esm/ModuleChunkLoadingPlugin.js +89 -51
  356. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +155 -62
  357. package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
  358. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  359. package/lib/hmr/LazyCompilationPlugin.js +45 -24
  360. package/lib/hmr/lazyCompilationBackend.js +9 -6
  361. package/lib/hmr/parserHooks.js +56 -0
  362. package/lib/html/HtmlGenerator.js +277 -77
  363. package/lib/html/HtmlModule.js +7 -3
  364. package/lib/html/HtmlModulesPlugin.js +282 -162
  365. package/lib/html/HtmlParser.js +31 -86
  366. package/lib/html/data.js +1928 -0
  367. package/lib/html/htmlMinify.js +288 -0
  368. package/lib/html/syntax.js +5557 -1155
  369. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
  370. package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
  371. package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
  372. package/lib/ids/HashedModuleIdsPlugin.js +6 -2
  373. package/lib/ids/IdHelpers.js +7 -8
  374. package/lib/ids/NamedChunkIdsPlugin.js +1 -1
  375. package/lib/ids/NamedModuleIdsPlugin.js +1 -1
  376. package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
  377. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  378. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
  379. package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
  380. package/lib/ids/SyncModuleIdsPlugin.js +4 -4
  381. package/lib/index.js +10 -0
  382. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
  383. package/lib/javascript/BasicEvaluatedExpression.js +18 -14
  384. package/lib/javascript/ChunkFormatHelpers.js +6 -6
  385. package/lib/javascript/ChunkHelpers.js +1 -1
  386. package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
  387. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  388. package/lib/javascript/JavascriptGenerator.js +65 -165
  389. package/lib/javascript/JavascriptModule.js +9 -3
  390. package/lib/javascript/JavascriptModulesPlugin.js +98 -113
  391. package/lib/javascript/JavascriptParser.js +242 -99
  392. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  393. package/lib/javascript/ScopeAnalyzer.js +1094 -0
  394. package/lib/javascript/StartupHelpers.js +55 -9
  395. package/lib/javascript/syntax.js +2678 -232
  396. package/lib/json/JsonData.js +8 -4
  397. package/lib/json/JsonGenerator.js +38 -16
  398. package/lib/json/JsonModule.js +7 -3
  399. package/lib/json/JsonModulesPlugin.js +1 -1
  400. package/lib/json/JsonParser.js +5 -6
  401. package/lib/library/AbstractLibraryPlugin.js +20 -14
  402. package/lib/library/AmdLibraryPlugin.js +11 -7
  403. package/lib/library/AssignLibraryPlugin.js +19 -13
  404. package/lib/library/EnableLibraryPlugin.js +2 -2
  405. package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
  406. package/lib/library/JsonpLibraryPlugin.js +11 -7
  407. package/lib/library/ModuleLibraryPlugin.js +256 -64
  408. package/lib/library/SystemLibraryPlugin.js +12 -8
  409. package/lib/library/UmdLibraryPlugin.js +62 -25
  410. package/lib/loaders/LoaderRunner.js +14 -1
  411. package/lib/loaders/loadLoader.js +8 -4
  412. package/lib/logging/createConsoleLogger.js +7 -4
  413. package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
  414. package/lib/node/NodeEnvironmentPlugin.js +17 -3
  415. package/lib/node/NodeSourcePlugin.js +1 -1
  416. package/lib/node/NodeTargetPlugin.js +4 -3
  417. package/lib/node/NodeTemplatePlugin.js +1 -1
  418. package/lib/node/NodeWatchFileSystem.js +70 -9
  419. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
  420. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +72 -19
  421. package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
  422. package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
  423. package/lib/node/nodeConsole.js +7 -3
  424. package/lib/optimize/AggressiveMergingPlugin.js +2 -2
  425. package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
  426. package/lib/optimize/ConcatenatedModule.js +985 -470
  427. package/lib/optimize/ConstExportsPlugin.js +11 -7
  428. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  429. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
  430. package/lib/optimize/InlineExports.js +9 -5
  431. package/lib/optimize/InnerGraph.js +28 -12
  432. package/lib/optimize/InnerGraphPlugin.js +23 -18
  433. package/lib/optimize/LimitChunkCountPlugin.js +7 -3
  434. package/lib/optimize/MangleExportsPlugin.js +7 -8
  435. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
  436. package/lib/optimize/MinChunkSizePlugin.js +7 -3
  437. package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
  438. package/lib/optimize/RealContentHashPlugin.js +10 -6
  439. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  440. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  441. package/lib/optimize/RuntimeChunkPlugin.js +2 -2
  442. package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
  443. package/lib/optimize/SplitChunksPlugin.js +86 -24
  444. package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
  445. package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
  446. package/lib/performance/BroadContextsPlugin.js +142 -0
  447. package/lib/performance/CacheEffectivenessPlugin.js +125 -0
  448. package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
  449. package/lib/performance/DuplicateModulesPlugin.js +93 -0
  450. package/lib/performance/DuplicatePackagesPlugin.js +119 -0
  451. package/lib/performance/DuplicatePackagesWarning.js +84 -0
  452. package/lib/performance/DynamicExportsPlugin.js +120 -0
  453. package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
  454. package/lib/performance/EntrypointOverlapPlugin.js +122 -0
  455. package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
  456. package/lib/performance/EvalUsagePlugin.js +115 -0
  457. package/lib/performance/HotspotsPlugin.js +296 -0
  458. package/lib/performance/InlinedAssetsPlugin.js +99 -0
  459. package/lib/performance/LargeModulesPlugin.js +126 -0
  460. package/lib/performance/LegacyJavascriptPlugin.js +139 -0
  461. package/lib/performance/MissingSideEffectsPlugin.js +138 -0
  462. package/lib/performance/MixedExportsPlugin.js +136 -0
  463. package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
  464. package/lib/performance/PureAnnotationsPlugin.js +219 -0
  465. package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
  466. package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
  467. package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
  468. package/lib/performance/SizeLimitsPlugin.js +139 -7
  469. package/lib/performance/SplitChunksCappedPlugin.js +99 -0
  470. package/lib/performance/TinyChunksPlugin.js +128 -0
  471. package/lib/performance/TopLevelThisPlugin.js +208 -0
  472. package/lib/performance/UnsplitVendorsPlugin.js +112 -0
  473. package/lib/performance/UnusedAliasesPlugin.js +253 -0
  474. package/lib/performance/UnusedDefinesPlugin.js +87 -0
  475. package/lib/performance/UnusedExternalsPlugin.js +110 -0
  476. package/lib/performance/UnusedReexportsPlugin.js +159 -0
  477. package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
  478. package/lib/performance/getModuleSize.js +22 -0
  479. package/lib/performance/getSourceModules.js +22 -0
  480. package/lib/performance/hasOnlyUnusedExports.js +40 -0
  481. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
  482. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
  483. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
  484. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  485. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  486. package/lib/prefetch/ResourceHintPlugin.js +295 -78
  487. package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
  488. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
  489. package/lib/prefetch/parseResourceHintOptions.js +31 -4
  490. package/lib/rules/BasicEffectRulePlugin.js +2 -2
  491. package/lib/rules/BasicMatcherRulePlugin.js +8 -4
  492. package/lib/rules/GlobMatcherRulePlugin.js +68 -0
  493. package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
  494. package/lib/rules/RuleSetCompiler.js +146 -12
  495. package/lib/rules/UseEffectRulePlugin.js +18 -11
  496. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
  497. package/lib/runtime/AsyncModuleRuntimeModule.js +1 -1
  498. package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
  499. package/lib/runtime/BaseUriRuntimeModule.js +33 -7
  500. package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
  501. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
  502. package/lib/runtime/CompatRuntimeModule.js +5 -3
  503. package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
  504. package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
  505. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
  506. package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
  507. package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
  508. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
  509. package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
  510. package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
  511. package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
  512. package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
  513. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
  514. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
  515. package/lib/runtime/GlobalRuntimeModule.js +18 -0
  516. package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
  517. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  518. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +23 -6
  519. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
  520. package/lib/runtime/NonceRuntimeModule.js +10 -0
  521. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
  522. package/lib/runtime/PublicPathRuntimeModule.js +12 -2
  523. package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
  524. package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
  525. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
  526. package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
  527. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
  528. package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
  529. package/lib/runtime/SystemContextRuntimeModule.js +10 -0
  530. package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
  531. package/lib/runtime/WorkerRuntimeModule.js +11 -1
  532. package/lib/runtime/baseUri.js +63 -0
  533. package/lib/schemes/DataUriPlugin.js +1 -1
  534. package/lib/schemes/FileUriPlugin.js +1 -1
  535. package/lib/schemes/HttpUriPlugin.js +24 -15
  536. package/lib/schemes/VirtualUrlPlugin.js +13 -7
  537. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  538. package/lib/serialization/BinaryMiddleware.js +4 -4
  539. package/lib/serialization/ErrorObjectSerializer.js +1 -1
  540. package/lib/serialization/FileMiddleware.js +7 -7
  541. package/lib/serialization/ObjectMiddleware.js +139 -114
  542. package/lib/serialization/PlainObjectSerializer.js +19 -16
  543. package/lib/sharing/ConsumeSharedModule.js +30 -21
  544. package/lib/sharing/ConsumeSharedPlugin.js +18 -10
  545. package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
  546. package/lib/sharing/ProvideSharedModule.js +25 -16
  547. package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
  548. package/lib/sharing/ProvideSharedPlugin.js +8 -4
  549. package/lib/sharing/SharePlugin.js +17 -5
  550. package/lib/sharing/ShareRuntimeModule.js +4 -4
  551. package/lib/sharing/resolveMatchedConfigs.js +9 -6
  552. package/lib/sharing/utils.js +1 -3
  553. package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
  554. package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
  555. package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
  556. package/lib/stats/StatsFactory.js +25 -26
  557. package/lib/stats/StatsPrinter.js +16 -12
  558. package/lib/typescript/TypeScriptPlugin.js +12 -14
  559. package/lib/url/URLParserPlugin.js +26 -13
  560. package/lib/util/AsyncQueue.js +4 -3
  561. package/lib/util/Hash.js +5 -1
  562. package/lib/util/LazySet.js +35 -22
  563. package/lib/util/LocConverter.js +36 -13
  564. package/lib/util/SourceProcessor.js +1050 -24
  565. package/lib/util/StringXor.js +1 -1
  566. package/lib/util/chainedImports.js +9 -5
  567. package/lib/util/cleverMerge.js +1 -1
  568. package/lib/util/comparators.js +45 -14
  569. package/lib/util/concatenate.js +203 -77
  570. package/lib/util/conventions.js +5 -1
  571. package/lib/util/createHash.js +2 -2
  572. package/lib/util/createHooksRegistry.js +8 -10
  573. package/lib/util/dataURL.js +225 -1
  574. package/lib/util/extractSourceMap.js +4 -3
  575. package/lib/util/findCaseMismatch.js +139 -0
  576. package/lib/util/formatLocation.js +1 -2
  577. package/lib/util/fs.js +22 -5
  578. package/lib/util/globUtils.js +298 -24
  579. package/lib/util/hash/BatchedHash.js +5 -1
  580. package/lib/util/hash/BulkUpdateHash.js +5 -1
  581. package/lib/util/hash/DebugHash.js +5 -1
  582. package/lib/util/hash/hash-digest.js +6 -2
  583. package/lib/util/identifier.js +4 -0
  584. package/lib/util/implicitTypeLoaderFallback.js +1 -1
  585. package/lib/util/internalSerializables.js +6 -0
  586. package/lib/util/lazyModule.js +56 -0
  587. package/lib/util/makeSerializable.js +7 -3
  588. package/lib/util/matchAlias.js +25 -0
  589. package/lib/util/mimeTypes.js +11 -5
  590. package/lib/util/nonNumericOnlyHash.js +4 -3
  591. package/lib/util/parseJson.js +5 -3
  592. package/lib/util/preloadModuleType.js +32 -0
  593. package/lib/util/registerExternalSerializer.js +7 -5
  594. package/lib/util/runtime.js +2 -2
  595. package/lib/util/semver.js +1 -1
  596. package/lib/util/serialization.js +28 -28
  597. package/lib/util/source.js +2 -2
  598. package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
  599. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
  600. package/lib/wasm/wasmModuleFilename.js +54 -0
  601. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +41 -21
  602. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +43 -21
  603. package/lib/wasm-async/AsyncWasmModule.js +3 -3
  604. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
  605. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
  606. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
  607. package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
  608. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +34 -8
  609. package/lib/wasm-sync/SyncWasmModule.js +2 -2
  610. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
  611. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
  612. package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
  613. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
  614. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
  615. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
  616. package/lib/wasm-sync/WebAssemblyParser.js +4 -6
  617. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  618. package/lib/web/FetchCompileAsyncWasmPlugin.js +101 -19
  619. package/lib/web/FetchCompileWasmPlugin.js +46 -16
  620. package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
  621. package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
  622. package/lib/web/JsonpTemplatePlugin.js +2 -2
  623. package/lib/webpack.js +22 -11
  624. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
  625. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
  626. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  627. package/module.d.ts +1 -0
  628. package/package.json +32 -25
  629. package/schemas/WebpackOptions.check.js +1 -1
  630. package/schemas/WebpackOptions.json +670 -36
  631. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  632. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  633. package/schemas/plugins/container/ContainerPlugin.json +10 -0
  634. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  635. package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
  636. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  637. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  638. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  639. package/types.d.ts +3144 -454
  640. package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
@@ -0,0 +1,142 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const ContextModule = require("../ContextModule");
9
+ const BroadContextsWarning = require("../errors/BroadContextsWarning");
10
+ const { compareStrings } = require("../util/comparators");
11
+ const getModuleSize = require("./getModuleSize");
12
+
13
+ /** @typedef {import("../../declarations/WebpackOptions").PerformanceOptions} PerformanceOptions */
14
+ /** @typedef {import("../Compiler")} Compiler */
15
+ /** @typedef {import("../Dependency")} Dependency */
16
+ /** @typedef {import("../Module")} Module */
17
+ /** @typedef {import("../errors/BroadContextsWarning").BroadContextDetails} BroadContextDetails */
18
+
19
+ const PLUGIN_NAME = "BroadContextsPlugin";
20
+
21
+ // Enough to name the offenders without printing every context in the build.
22
+ const MAX_REPORTED_CONTEXTS = 5;
23
+
24
+ // A directory holding a handful of files costs little however it is matched,
25
+ // and warning about it would bury the contexts that do carry weight.
26
+ const MIN_REPORTED_MODULES = 20;
27
+
28
+ // A bare leading wildcard takes every name in the directory, whether it is
29
+ // `require.context`'s default or one webpack derived from an expression.
30
+ const WILDCARD_PREFIX = "^\\.\\/.*";
31
+
32
+ /**
33
+ * Whether a context takes whatever the directory holds. A pattern that narrows
34
+ * by anything other than a leading wildcard is left alone, as is one webpack
35
+ * cannot read — an unrecognized filter is never guessed at.
36
+ * @param {ContextModule} module a context module
37
+ * @returns {boolean} true when nothing narrows it
38
+ */
39
+ const isBroad = (module) => {
40
+ const { regExp, include, exclude } = module.options;
41
+
42
+ if (include || exclude) return false;
43
+
44
+ return (
45
+ Boolean(regExp) &&
46
+ /** @type {RegExp} */ (regExp).source.startsWith(WILDCARD_PREFIX)
47
+ );
48
+ };
49
+
50
+ class BroadContextsPlugin {
51
+ /**
52
+ * Creates an instance of BroadContextsPlugin.
53
+ * @param {PerformanceOptions} options the plugin options
54
+ */
55
+ constructor(options) {
56
+ /** @type {PerformanceOptions["hints"]} */
57
+ this.hints = options.hints;
58
+ }
59
+
60
+ /**
61
+ * Applies the plugin by registering its hooks on the compiler.
62
+ * @param {Compiler} compiler the compiler instance
63
+ * @returns {void}
64
+ */
65
+ apply(compiler) {
66
+ const hints = this.hints;
67
+
68
+ if (!hints) return;
69
+
70
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
71
+ // `afterSeal` is past the hash, which folds every message into it — a
72
+ // hint reported earlier would change the build's identity.
73
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
74
+ const { moduleGraph, requestShortener } = compilation;
75
+ /** @type {BroadContextDetails[]} */
76
+ const broad = [];
77
+
78
+ for (const module of compilation.modules) {
79
+ if (!(module instanceof ContextModule)) continue;
80
+ if (!isBroad(module)) continue;
81
+
82
+ // One file is reached under several requests — with and without its
83
+ // extension — so the dependencies outnumber what is really matched.
84
+ /** @type {Set<Module>} */
85
+ const matched = new Set();
86
+
87
+ /**
88
+ * @param {Dependency[]} dependencies the dependencies to walk
89
+ * @returns {void}
90
+ */
91
+ const collect = (dependencies) => {
92
+ for (const dependency of dependencies) {
93
+ const matchedModule = moduleGraph.getModule(dependency);
94
+
95
+ if (matchedModule) matched.add(matchedModule);
96
+ }
97
+ };
98
+
99
+ collect(module.dependencies);
100
+
101
+ // A lazy context keeps each match in a block of its own, so reading
102
+ // only `dependencies` would report it as matching nothing.
103
+ for (const block of module.blocks) collect(block.dependencies);
104
+
105
+ if (matched.size < MIN_REPORTED_MODULES) continue;
106
+
107
+ let size = 0;
108
+
109
+ for (const matchedModule of matched) {
110
+ size += getModuleSize(matchedModule);
111
+ }
112
+
113
+ broad.push({
114
+ name: module.readableIdentifier(requestShortener),
115
+ modules: matched.size,
116
+ size
117
+ });
118
+ }
119
+
120
+ if (broad.length === 0) return;
121
+
122
+ // Ties break by name: module order is not stable across runs.
123
+ broad.sort((a, b) => b.size - a.size || compareStrings(a.name, b.name));
124
+
125
+ const warning = new BroadContextsWarning(
126
+ broad.slice(0, MAX_REPORTED_CONTEXTS),
127
+ broad.length
128
+ );
129
+
130
+ if (hints === "error") {
131
+ compilation.errors.push(warning);
132
+ } else if (hints === "stats") {
133
+ compilation.hints.push(warning);
134
+ } else {
135
+ compilation.warnings.push(warning);
136
+ }
137
+ });
138
+ });
139
+ }
140
+ }
141
+
142
+ module.exports = BroadContextsPlugin;
@@ -0,0 +1,125 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const RuntimeModule = require("../RuntimeModule");
9
+ const CacheEffectivenessWarning = require("../errors/CacheEffectivenessWarning");
10
+
11
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
12
+ /** @import Compiler from "../Compiler" */
13
+ /** @import { BuildInfo } from "../Module" */
14
+
15
+ const PLUGIN_NAME = "CacheEffectivenessPlugin";
16
+
17
+ // A reason shared by many modules is the one worth fixing, so report the
18
+ // frequent ones and count the rest.
19
+ const MAX_REPORTED_REASONS = 3;
20
+
21
+ const UNSPECIFIED_REASON = "reason not stated";
22
+
23
+ class CacheEffectivenessPlugin {
24
+ /**
25
+ * Creates an instance of CacheEffectivenessPlugin.
26
+ * @param {PerformanceOptions} options the plugin options
27
+ */
28
+ constructor(options) {
29
+ /** @type {PerformanceOptions["hints"]} */
30
+ this.hints = options.hints;
31
+ }
32
+
33
+ /**
34
+ * Applies the plugin by registering its hooks on the compiler.
35
+ * @param {Compiler} compiler the compiler instance
36
+ * @returns {void}
37
+ */
38
+ apply(compiler) {
39
+ const hints = this.hints;
40
+
41
+ if (!hints) return;
42
+
43
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
44
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
45
+ let total = 0;
46
+ let rebuilt = 0;
47
+ let uncacheable = 0;
48
+ /** @type {Map<string, number>} */
49
+ const modulesByReason = new Map();
50
+
51
+ for (const module of compilation.modules) {
52
+ // Runtime modules are generated per compilation, never built and
53
+ // never cached, so counting them makes a cold build look warm.
54
+ if (module instanceof RuntimeModule) continue;
55
+
56
+ total++;
57
+
58
+ if (compilation.builtModules.has(module)) rebuilt++;
59
+
60
+ // Every built module carries one; `cacheable` being `undefined` is
61
+ // the module never reporting either way, not it opting out.
62
+ const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
63
+
64
+ if (buildInfo.cacheable !== false) continue;
65
+
66
+ uncacheable++;
67
+
68
+ const reasons =
69
+ buildInfo.notCacheableReasons &&
70
+ buildInfo.notCacheableReasons.length > 0
71
+ ? buildInfo.notCacheableReasons
72
+ : [UNSPECIFIED_REASON];
73
+
74
+ for (const reason of reasons) {
75
+ modulesByReason.set(reason, (modulesByReason.get(reason) || 0) + 1);
76
+ }
77
+ }
78
+
79
+ // Work redone despite a warm cache needs both ends: everything rebuilt
80
+ // is a cold build, nothing rebuilt is the cache working.
81
+ const warmRebuild = rebuilt > 0 && rebuilt < total;
82
+
83
+ if (!warmRebuild && uncacheable === 0) return;
84
+
85
+ // Most frequent first, and by reason where two are as frequent: the
86
+ // map is keyed in the order the modules were walked, which is not the
87
+ // same twice, and only three reasons are reported — so an unbroken tie
88
+ // would vary which of them a build names at all.
89
+ const sorted = [...modulesByReason].sort(
90
+ (a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)
91
+ );
92
+ const reasons = sorted
93
+ .slice(0, MAX_REPORTED_REASONS)
94
+ .map(
95
+ ([reason, modules]) =>
96
+ `${reason} (${modules} ${modules === 1 ? "module" : "modules"})`
97
+ );
98
+ const remaining = sorted.length - reasons.length;
99
+
100
+ if (remaining > 0) {
101
+ reasons.push(
102
+ `and ${remaining} other ${remaining === 1 ? "reason" : "reasons"}`
103
+ );
104
+ }
105
+
106
+ const warning = new CacheEffectivenessWarning({
107
+ total,
108
+ rebuilt,
109
+ uncacheable,
110
+ reasons
111
+ });
112
+
113
+ if (hints === "error") {
114
+ compilation.errors.push(warning);
115
+ } else if (hints === "stats") {
116
+ compilation.hints.push(warning);
117
+ } else {
118
+ compilation.warnings.push(warning);
119
+ }
120
+ });
121
+ });
122
+ }
123
+ }
124
+
125
+ module.exports = CacheEffectivenessPlugin;
@@ -0,0 +1,99 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const ConflictingResourceHintsWarning = require("../errors/ConflictingResourceHintsWarning");
9
+ const { compareStrings } = require("../util/comparators");
10
+
11
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
12
+ /** @import ChunkGroup from "../ChunkGroup" */
13
+ /** @import Compiler from "../Compiler" */
14
+ /**
15
+ * @import {
16
+ * ConflictingResourceHintDetails
17
+ * } from "../errors/ConflictingResourceHintsWarning"
18
+ */
19
+
20
+ const PLUGIN_NAME = "ConflictingResourceHintsPlugin";
21
+
22
+ /**
23
+ * Names a chunk group for a message, falling back to its chunks: an `import()`
24
+ * without `webpackChunkName` produces a group with no name of its own.
25
+ * @param {ChunkGroup} chunkGroup a chunk group
26
+ * @returns {string} a name for it
27
+ */
28
+ const getChunkGroupName = (chunkGroup) =>
29
+ chunkGroup.name ||
30
+ chunkGroup.chunks.map((chunk) => chunk.name || `${chunk.id}`).join(", ");
31
+
32
+ class ConflictingResourceHintsPlugin {
33
+ /**
34
+ * Creates an instance of ConflictingResourceHintsPlugin.
35
+ * @param {PerformanceOptions} options the plugin options
36
+ */
37
+ constructor(options) {
38
+ /** @type {PerformanceOptions["hints"]} */
39
+ this.hints = options.hints;
40
+ }
41
+
42
+ /**
43
+ * Applies the plugin by registering its hooks on the compiler.
44
+ * @param {Compiler} compiler the compiler instance
45
+ * @returns {void}
46
+ */
47
+ apply(compiler) {
48
+ const hints = this.hints;
49
+
50
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
51
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
52
+ const { chunkGraph, moduleGraph } = compilation;
53
+ /** @type {ConflictingResourceHintDetails[]} */
54
+ const links = [];
55
+
56
+ for (const chunkGroup of compilation.chunkGroups) {
57
+ const children = chunkGroup.getChildrenByOrders(
58
+ moduleGraph,
59
+ chunkGraph
60
+ );
61
+
62
+ if (!children.prefetch || !children.preload) continue;
63
+
64
+ const preloaded = new Set(children.preload);
65
+
66
+ for (const child of children.prefetch) {
67
+ if (!preloaded.has(child)) continue;
68
+
69
+ links.push({
70
+ parent: getChunkGroupName(chunkGroup),
71
+ child: getChunkGroupName(child)
72
+ });
73
+ }
74
+ }
75
+
76
+ if (links.length === 0) return;
77
+
78
+ // Chunk group iteration order is not stable across runs.
79
+ links.sort(
80
+ (a, b) =>
81
+ compareStrings(a.parent, b.parent) ||
82
+ compareStrings(a.child, b.child)
83
+ );
84
+
85
+ const warning = new ConflictingResourceHintsWarning(links);
86
+
87
+ if (hints === "error") {
88
+ compilation.errors.push(warning);
89
+ } else if (hints === "stats") {
90
+ compilation.hints.push(warning);
91
+ } else {
92
+ compilation.warnings.push(warning);
93
+ }
94
+ });
95
+ });
96
+ }
97
+ }
98
+
99
+ module.exports = ConflictingResourceHintsPlugin;
@@ -0,0 +1,93 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const DuplicateModulesWarning = require("../errors/DuplicateModulesWarning");
9
+ const { compareStrings } = require("../util/comparators");
10
+ const getModuleSize = require("./getModuleSize");
11
+
12
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
13
+ /** @import Compiler from "../Compiler" */
14
+ /**
15
+ * @import {
16
+ * DuplicateModuleDetails
17
+ * } from "../errors/DuplicateModulesWarning"
18
+ */
19
+
20
+ const PLUGIN_NAME = "DuplicateModulesPlugin";
21
+
22
+ // Enough to name the offenders without printing the module graph.
23
+ const MAX_REPORTED_MODULES = 5;
24
+
25
+ class DuplicateModulesPlugin {
26
+ /**
27
+ * Creates an instance of DuplicateModulesPlugin.
28
+ * @param {PerformanceOptions} options the plugin options
29
+ */
30
+ constructor(options) {
31
+ /** @type {PerformanceOptions["hints"]} */
32
+ this.hints = options.hints;
33
+ }
34
+
35
+ /**
36
+ * Applies the plugin by registering its hooks on the compiler.
37
+ * @param {Compiler} compiler the compiler instance
38
+ * @returns {void}
39
+ */
40
+ apply(compiler) {
41
+ const hints = this.hints;
42
+
43
+ if (!hints) return;
44
+
45
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
46
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
47
+ const { chunkGraph, requestShortener } = compilation;
48
+ /** @type {DuplicateModuleDetails[]} */
49
+ const duplicated = [];
50
+ let wasted = 0;
51
+
52
+ for (const module of compilation.modules) {
53
+ const chunks = chunkGraph.getNumberOfModuleChunks(module);
54
+
55
+ if (chunks < 2) continue;
56
+
57
+ // The first copy is the one that had to be emitted; the rest are
58
+ // what a shared chunk would save.
59
+ const extra = getModuleSize(module) * (chunks - 1);
60
+
61
+ wasted += extra;
62
+ duplicated.push({
63
+ name: module.readableIdentifier(requestShortener),
64
+ chunks,
65
+ wasted: extra
66
+ });
67
+ }
68
+
69
+ if (duplicated.length === 0) return;
70
+
71
+ // Ties break by name: which modules finish first is not stable.
72
+ duplicated.sort(
73
+ (a, b) => b.wasted - a.wasted || compareStrings(a.name, b.name)
74
+ );
75
+
76
+ const warning = new DuplicateModulesWarning(
77
+ duplicated.slice(0, MAX_REPORTED_MODULES),
78
+ wasted
79
+ );
80
+
81
+ if (hints === "error") {
82
+ compilation.errors.push(warning);
83
+ } else if (hints === "stats") {
84
+ compilation.hints.push(warning);
85
+ } else {
86
+ compilation.warnings.push(warning);
87
+ }
88
+ });
89
+ });
90
+ }
91
+ }
92
+
93
+ module.exports = DuplicateModulesPlugin;
@@ -0,0 +1,119 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const DuplicatePackagesWarning = require("./DuplicatePackagesWarning");
9
+
10
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
11
+ /** @import Compiler from "../Compiler" */
12
+ /** @import Module from "../Module" */
13
+ /** @import NormalModule from "../NormalModule" */
14
+
15
+ /**
16
+ * One copy of a package, identified by the directory its description file
17
+ * (usually `package.json`) lives in.
18
+ * @typedef {object} PackageCopy
19
+ * @property {string} version version of this copy
20
+ * @property {string} path directory of this copy
21
+ * @property {Module[]} modules modules included from this copy
22
+ */
23
+
24
+ const PLUGIN_NAME = "DuplicatePackagesPlugin";
25
+
26
+ class DuplicatePackagesPlugin {
27
+ /**
28
+ * Creates an instance of DuplicatePackagesPlugin.
29
+ * @param {PerformanceOptions} options the plugin options
30
+ */
31
+ constructor(options) {
32
+ /** @type {PerformanceOptions["hints"]} */
33
+ this.hints = options.hints;
34
+ }
35
+
36
+ /**
37
+ * Applies the plugin by registering its hooks on the compiler.
38
+ * @param {Compiler} compiler the compiler instance
39
+ * @returns {void}
40
+ */
41
+ apply(compiler) {
42
+ const hints = this.hints;
43
+
44
+ if (!hints) return;
45
+
46
+ // `thisCompilation` keeps the hint to the root build, as child
47
+ // compilations report the copies of their parent a second time
48
+ compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
49
+ /** @type {DuplicatePackagesWarning[]} */
50
+ const warnings = [];
51
+
52
+ compilation.hooks.seal.tap(PLUGIN_NAME, () => {
53
+ /** @type {Map<string, Map<string, PackageCopy>>} */
54
+ const packages = new Map();
55
+ for (const module of compilation.modules) {
56
+ const resolveData =
57
+ /** @type {NormalModule} */
58
+ (module).resourceResolveData;
59
+ if (resolveData === undefined) continue;
60
+ const { descriptionFileData, descriptionFileRoot } = resolveData;
61
+ if (descriptionFileData === undefined) continue;
62
+ const { name, version } = descriptionFileData;
63
+ // Only a named and versioned package can be compared with another copy
64
+ if (
65
+ typeof name !== "string" ||
66
+ typeof version !== "string" ||
67
+ descriptionFileRoot === undefined
68
+ ) {
69
+ continue;
70
+ }
71
+ let copies = packages.get(name);
72
+ if (copies === undefined) {
73
+ copies = new Map();
74
+ packages.set(name, copies);
75
+ }
76
+ const copy = copies.get(descriptionFileRoot);
77
+ if (copy === undefined) {
78
+ copies.set(descriptionFileRoot, {
79
+ version,
80
+ path: descriptionFileRoot,
81
+ modules: [module]
82
+ });
83
+ } else {
84
+ copy.modules.push(module);
85
+ }
86
+ }
87
+ for (const name of [...packages.keys()].sort()) {
88
+ const copies = /** @type {Map<string, PackageCopy>} */ (
89
+ packages.get(name)
90
+ );
91
+ if (copies.size < 2) continue;
92
+ const warning = new DuplicatePackagesWarning(
93
+ name,
94
+ [...copies.values()].sort((a, b) => (a.path < b.path ? -1 : 1)),
95
+ compilation.moduleGraph,
96
+ compilation.requestShortener
97
+ );
98
+ warnings.push(warning);
99
+ }
100
+ });
101
+
102
+ // Reported past the hash: `createHash` folds every message into it, so
103
+ // a hint pushed earlier would change the build's identity.
104
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
105
+ for (const warning of warnings) {
106
+ if (hints === "error") {
107
+ compilation.errors.push(warning);
108
+ } else if (hints === "stats") {
109
+ compilation.hints.push(warning);
110
+ } else {
111
+ compilation.warnings.push(warning);
112
+ }
113
+ }
114
+ });
115
+ });
116
+ }
117
+ }
118
+
119
+ module.exports = DuplicatePackagesPlugin;
@@ -0,0 +1,84 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const WebpackError = require("../errors/WebpackError");
9
+
10
+ /** @import Module from "../Module" */
11
+ /** @import ModuleGraph from "../ModuleGraph" */
12
+ /** @import NormalModule from "../NormalModule" */
13
+ /** @import RequestShortener from "../RequestShortener" */
14
+ /** @import { PackageCopy } from "./DuplicatePackagesPlugin" */
15
+
16
+ /**
17
+ * @param {Module} module the module
18
+ * @returns {string | undefined} directory of the package the module belongs to
19
+ */
20
+ const getPackagePath = (module) => {
21
+ const resolveData =
22
+ /** @type {NormalModule} */
23
+ (module).resourceResolveData;
24
+ return resolveData && resolveData.descriptionFileRoot;
25
+ };
26
+
27
+ /**
28
+ * Finds a module outside of the copy that pulled it into the build, so the
29
+ * warning can name the dependency responsible for this copy.
30
+ * @param {PackageCopy} copy the copy
31
+ * @param {ModuleGraph} moduleGraph the module graph
32
+ * @returns {Module | undefined} a module importing this copy, when there is one
33
+ */
34
+ const findImporter = (copy, moduleGraph) => {
35
+ for (const module of copy.modules) {
36
+ for (const origin of moduleGraph
37
+ .getIncomingConnectionsByOriginModule(module)
38
+ .keys()) {
39
+ if (origin && getPackagePath(origin) !== copy.path) return origin;
40
+ }
41
+ }
42
+ };
43
+
44
+ /**
45
+ * Warning emitted when one package is included more than once in a build,
46
+ * either in different versions or as several copies of the same version.
47
+ */
48
+ class DuplicatePackagesWarning extends WebpackError {
49
+ /**
50
+ * @param {string} name name of the package
51
+ * @param {PackageCopy[]} copies copies of the package, sorted by path
52
+ * @param {ModuleGraph} moduleGraph the module graph
53
+ * @param {RequestShortener} requestShortener the request shortener
54
+ */
55
+ constructor(name, copies, moduleGraph, requestShortener) {
56
+ const versions = new Set(copies.map((copy) => copy.version));
57
+ const headline =
58
+ versions.size > 1
59
+ ? `Multiple versions of the package "${name}" (${[...versions].join(", ")}) are included in this build:`
60
+ : `The package "${name}" (${copies[0].version}) is included ${copies.length} times in this build:`;
61
+ const copiesList = copies
62
+ .map((copy) => {
63
+ const importer = findImporter(copy, moduleGraph);
64
+ let message = `* ${copy.version} from ${requestShortener.shorten(copy.path)}, ${copy.modules.length} module(s)`;
65
+ if (importer !== undefined) {
66
+ message += `\n Included by ${importer.readableIdentifier(requestShortener)}`;
67
+ }
68
+ return message;
69
+ })
70
+ .join("\n");
71
+ super(`webpack performance recommendations:
72
+ ${headline}
73
+ ${copiesList}
74
+ Every copy is bundled separately and has its own module state, which increases the output size and can break \`instanceof\` checks and configuration shared through the package.
75
+ Align the version ranges requiring this package, or force a single version with "resolutions"/"overrides" in your package.json.`);
76
+
77
+ /** @type {string} */
78
+ this.name = "DuplicatePackagesWarning";
79
+ /** @type {Module} */
80
+ this.module = copies[0].modules[0];
81
+ }
82
+ }
83
+
84
+ module.exports = DuplicatePackagesWarning;