@depup/webpack 5.109.2-depup.0 → 5.110.3-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 (647) 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 +46 -35
  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 +107 -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 +91 -26
  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 +111 -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 +40 -49
  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 +152 -103
  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 +335 -169
  89. package/lib/RuntimeTemplate.js +2761 -316
  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 +12 -6
  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 +270 -78
  134. package/lib/config/defineConfig.js +10 -2
  135. package/lib/config/getClaimedAssetTypes.js +65 -0
  136. package/lib/config/normalization.js +46 -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 +84 -32
  154. package/lib/css/CssModule.js +10 -7
  155. package/lib/css/CssModulesPlugin.js +172 -100
  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 +5334 -0
  160. package/lib/css/syntax.js +9647 -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 +170 -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 +24 -11
  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 +23 -14
  210. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +80 -12
  211. package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
  212. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
  213. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +286 -80
  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 +121 -60
  218. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +124 -38
  219. package/lib/dependencies/HarmonyImportGuard.js +20 -30
  220. package/lib/dependencies/HarmonyImportSideEffectDependency.js +152 -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 +49 -31
  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 +45 -5
  230. package/lib/dependencies/ImportDependency.js +33 -50
  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 +73 -49
  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 +50 -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 +47 -28
  290. package/lib/dependencies/WorkerDependency.js +22 -22
  291. package/lib/dependencies/WorkletDependency.js +18 -21
  292. package/lib/dependencies/getFunctionExpression.js +8 -4
  293. package/lib/dependencies/importOptionsCheck.js +47 -0
  294. package/lib/dependencies/processExportInfo.js +5 -5
  295. package/lib/dll/DelegatedModule.js +34 -22
  296. package/lib/dll/DelegatedModuleFactoryPlugin.js +15 -7
  297. package/lib/dll/DelegatedPlugin.js +2 -2
  298. package/lib/dll/DllEntryPlugin.js +2 -2
  299. package/lib/dll/DllModule.js +22 -15
  300. package/lib/dll/DllModuleFactory.js +7 -3
  301. package/lib/dll/DllPlugin.js +7 -5
  302. package/lib/dll/DllReferencePlugin.js +10 -7
  303. package/lib/dll/LibManifestPlugin.js +5 -5
  304. package/lib/electron/ElectronTargetPlugin.js +53 -49
  305. package/lib/errors/AsyncChunkWaterfallWarning.js +36 -0
  306. package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
  307. package/lib/errors/BroadContextsWarning.js +43 -0
  308. package/lib/errors/BuildCycleError.js +1 -1
  309. package/lib/errors/CacheEffectivenessWarning.js +55 -0
  310. package/lib/errors/ChunkRenderError.js +1 -1
  311. package/lib/errors/CircularDependenciesWarning.js +38 -0
  312. package/lib/errors/CodeGenerationError.js +1 -1
  313. package/lib/errors/CommentCompilationWarning.js +1 -1
  314. package/lib/errors/ConflictingResourceHintsWarning.js +35 -0
  315. package/lib/errors/DotenvFileError.js +29 -0
  316. package/lib/errors/DuplicateModulesWarning.js +45 -0
  317. package/lib/errors/DynamicExportsWarning.js +30 -0
  318. package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
  319. package/lib/errors/EntrypointOverlapWarning.js +45 -0
  320. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  321. package/lib/errors/EvalUsageWarning.js +28 -0
  322. package/lib/errors/HookWebpackError.js +5 -5
  323. package/lib/errors/HotspotsWarning.js +57 -0
  324. package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
  325. package/lib/errors/ImportedBindingAssignmentError.js +30 -0
  326. package/lib/errors/InlinedAssetsWarning.js +36 -0
  327. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  328. package/lib/errors/LargeModulesWarning.js +45 -0
  329. package/lib/errors/LegacyJavascriptWarning.js +48 -0
  330. package/lib/errors/MissingSideEffectsWarning.js +36 -0
  331. package/lib/errors/MixedExportsWarning.js +41 -0
  332. package/lib/errors/ModuleDependencyError.js +13 -16
  333. package/lib/errors/ModuleDependencyWarning.js +5 -15
  334. package/lib/errors/ModuleHashingError.js +1 -1
  335. package/lib/errors/ModuleNotFoundError.js +2 -2
  336. package/lib/errors/ModuleParseError.js +1 -2
  337. package/lib/errors/ModuleRestoreError.js +1 -1
  338. package/lib/errors/ModuleStoreError.js +1 -1
  339. package/lib/errors/NodeStuffInWebError.js +1 -1
  340. package/lib/errors/OsDependentRuleWarning.js +31 -0
  341. package/lib/errors/PureAnnotationsWarning.js +36 -0
  342. package/lib/errors/RedundantDynamicImportWarning.js +31 -0
  343. package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
  344. package/lib/errors/SplitChunksCappedWarning.js +41 -0
  345. package/lib/errors/TinyChunksWarning.js +40 -0
  346. package/lib/errors/TopLevelThisWarning.js +34 -0
  347. package/lib/errors/UnsplitVendorsWarning.js +42 -0
  348. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  349. package/lib/errors/UnusedAliasesWarning.js +29 -0
  350. package/lib/errors/UnusedDefinesWarning.js +29 -0
  351. package/lib/errors/UnusedExternalsWarning.js +29 -0
  352. package/lib/errors/UnusedReexportsWarning.js +42 -0
  353. package/lib/errors/UnusedRuleWarning.js +29 -0
  354. package/lib/errors/WebpackError.js +9 -5
  355. package/lib/errors/deriveStackFromNestedError.js +90 -0
  356. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  357. package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
  358. package/lib/esm/ModuleChunkLoadingPlugin.js +86 -51
  359. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +161 -62
  360. package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
  361. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  362. package/lib/hmr/LazyCompilationPlugin.js +45 -24
  363. package/lib/hmr/lazyCompilationBackend.js +9 -6
  364. package/lib/hmr/parserHooks.js +56 -0
  365. package/lib/html/HtmlGenerator.js +277 -77
  366. package/lib/html/HtmlModule.js +7 -3
  367. package/lib/html/HtmlModulesPlugin.js +366 -200
  368. package/lib/html/HtmlParser.js +31 -86
  369. package/lib/html/data.js +1928 -0
  370. package/lib/html/htmlMinify.js +288 -0
  371. package/lib/html/syntax.js +6034 -1384
  372. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
  373. package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
  374. package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
  375. package/lib/ids/HashedModuleIdsPlugin.js +6 -2
  376. package/lib/ids/IdHelpers.js +7 -8
  377. package/lib/ids/NamedChunkIdsPlugin.js +1 -1
  378. package/lib/ids/NamedModuleIdsPlugin.js +1 -1
  379. package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
  380. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  381. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
  382. package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
  383. package/lib/ids/SyncModuleIdsPlugin.js +4 -4
  384. package/lib/index.js +10 -0
  385. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
  386. package/lib/javascript/BasicEvaluatedExpression.js +18 -14
  387. package/lib/javascript/ChunkFormatHelpers.js +6 -6
  388. package/lib/javascript/ChunkHelpers.js +1 -1
  389. package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
  390. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  391. package/lib/javascript/JavascriptGenerator.js +65 -165
  392. package/lib/javascript/JavascriptModule.js +9 -3
  393. package/lib/javascript/JavascriptModulesPlugin.js +103 -123
  394. package/lib/javascript/JavascriptParser.js +242 -99
  395. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  396. package/lib/javascript/ScopeAnalyzer.js +1094 -0
  397. package/lib/javascript/StartupHelpers.js +55 -9
  398. package/lib/javascript/syntax.js +2678 -232
  399. package/lib/json/JsonData.js +8 -4
  400. package/lib/json/JsonGenerator.js +38 -16
  401. package/lib/json/JsonModule.js +7 -3
  402. package/lib/json/JsonModulesPlugin.js +1 -1
  403. package/lib/json/JsonParser.js +5 -6
  404. package/lib/library/AbstractLibraryPlugin.js +20 -14
  405. package/lib/library/AmdLibraryPlugin.js +11 -7
  406. package/lib/library/AssignLibraryPlugin.js +19 -13
  407. package/lib/library/EnableLibraryPlugin.js +2 -2
  408. package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
  409. package/lib/library/JsonpLibraryPlugin.js +11 -7
  410. package/lib/library/ModuleLibraryPlugin.js +256 -64
  411. package/lib/library/SystemLibraryPlugin.js +12 -8
  412. package/lib/library/UmdLibraryPlugin.js +62 -25
  413. package/lib/loaders/LoaderRunner.js +47 -6
  414. package/lib/loaders/loadLoader.js +8 -4
  415. package/lib/logging/createConsoleLogger.js +7 -4
  416. package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
  417. package/lib/node/NodeEnvironmentPlugin.js +17 -3
  418. package/lib/node/NodeSourcePlugin.js +1 -1
  419. package/lib/node/NodeTargetPlugin.js +4 -3
  420. package/lib/node/NodeTemplatePlugin.js +1 -1
  421. package/lib/node/NodeWatchFileSystem.js +70 -9
  422. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
  423. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +65 -19
  424. package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
  425. package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
  426. package/lib/node/nodeConsole.js +7 -3
  427. package/lib/optimize/AggressiveMergingPlugin.js +2 -2
  428. package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
  429. package/lib/optimize/ConcatenatedModule.js +1030 -476
  430. package/lib/optimize/ConstExportsPlugin.js +16 -7
  431. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  432. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
  433. package/lib/optimize/InlineExports.js +130 -5
  434. package/lib/optimize/InnerGraph.js +28 -12
  435. package/lib/optimize/InnerGraphPlugin.js +23 -18
  436. package/lib/optimize/LimitChunkCountPlugin.js +7 -3
  437. package/lib/optimize/MangleExportsPlugin.js +7 -8
  438. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
  439. package/lib/optimize/MinChunkSizePlugin.js +7 -3
  440. package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
  441. package/lib/optimize/RealContentHashPlugin.js +121 -41
  442. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  443. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  444. package/lib/optimize/RuntimeChunkPlugin.js +2 -2
  445. package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
  446. package/lib/optimize/SplitChunksPlugin.js +86 -24
  447. package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
  448. package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
  449. package/lib/performance/BroadContextsPlugin.js +142 -0
  450. package/lib/performance/CacheEffectivenessPlugin.js +125 -0
  451. package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
  452. package/lib/performance/DuplicateModulesPlugin.js +93 -0
  453. package/lib/performance/DuplicatePackagesPlugin.js +119 -0
  454. package/lib/performance/DuplicatePackagesWarning.js +84 -0
  455. package/lib/performance/DynamicExportsPlugin.js +120 -0
  456. package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
  457. package/lib/performance/EntrypointOverlapPlugin.js +122 -0
  458. package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
  459. package/lib/performance/EvalUsagePlugin.js +115 -0
  460. package/lib/performance/HotspotsPlugin.js +296 -0
  461. package/lib/performance/InlinedAssetsPlugin.js +99 -0
  462. package/lib/performance/LargeModulesPlugin.js +126 -0
  463. package/lib/performance/LegacyJavascriptPlugin.js +139 -0
  464. package/lib/performance/MissingSideEffectsPlugin.js +138 -0
  465. package/lib/performance/MixedExportsPlugin.js +136 -0
  466. package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
  467. package/lib/performance/PureAnnotationsPlugin.js +219 -0
  468. package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
  469. package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
  470. package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
  471. package/lib/performance/SizeLimitsPlugin.js +139 -7
  472. package/lib/performance/SplitChunksCappedPlugin.js +99 -0
  473. package/lib/performance/TinyChunksPlugin.js +128 -0
  474. package/lib/performance/TopLevelThisPlugin.js +208 -0
  475. package/lib/performance/UnsplitVendorsPlugin.js +112 -0
  476. package/lib/performance/UnusedAliasesPlugin.js +253 -0
  477. package/lib/performance/UnusedDefinesPlugin.js +87 -0
  478. package/lib/performance/UnusedExternalsPlugin.js +110 -0
  479. package/lib/performance/UnusedReexportsPlugin.js +159 -0
  480. package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
  481. package/lib/performance/getModuleSize.js +22 -0
  482. package/lib/performance/getSourceModules.js +22 -0
  483. package/lib/performance/hasOnlyUnusedExports.js +40 -0
  484. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
  485. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
  486. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
  487. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  488. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  489. package/lib/prefetch/ResourceHintPlugin.js +295 -79
  490. package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
  491. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
  492. package/lib/prefetch/parseResourceHintOptions.js +31 -4
  493. package/lib/rules/BasicEffectRulePlugin.js +2 -2
  494. package/lib/rules/BasicMatcherRulePlugin.js +8 -4
  495. package/lib/rules/GlobMatcherRulePlugin.js +68 -0
  496. package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
  497. package/lib/rules/RuleSetCompiler.js +146 -12
  498. package/lib/rules/UseEffectRulePlugin.js +18 -11
  499. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
  500. package/lib/runtime/AsyncModuleRuntimeModule.js +6 -2
  501. package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
  502. package/lib/runtime/BaseUriRuntimeModule.js +33 -7
  503. package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
  504. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
  505. package/lib/runtime/CompatRuntimeModule.js +5 -3
  506. package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
  507. package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
  508. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
  509. package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
  510. package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
  511. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
  512. package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
  513. package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
  514. package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
  515. package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
  516. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
  517. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
  518. package/lib/runtime/GlobalRuntimeModule.js +18 -0
  519. package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
  520. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  521. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +34 -7
  522. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
  523. package/lib/runtime/NonceRuntimeModule.js +10 -0
  524. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
  525. package/lib/runtime/PublicPathRuntimeModule.js +12 -2
  526. package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
  527. package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
  528. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
  529. package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
  530. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
  531. package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
  532. package/lib/runtime/SystemContextRuntimeModule.js +10 -0
  533. package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
  534. package/lib/runtime/WorkerRuntimeModule.js +11 -1
  535. package/lib/runtime/baseUri.js +63 -0
  536. package/lib/schemes/DataUriPlugin.js +1 -1
  537. package/lib/schemes/FileUriPlugin.js +1 -1
  538. package/lib/schemes/HttpUriPlugin.js +46 -20
  539. package/lib/schemes/VirtualUrlPlugin.js +13 -7
  540. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  541. package/lib/serialization/BinaryMiddleware.js +4 -4
  542. package/lib/serialization/ErrorObjectSerializer.js +1 -1
  543. package/lib/serialization/FileMiddleware.js +22 -9
  544. package/lib/serialization/ObjectMiddleware.js +139 -114
  545. package/lib/serialization/PlainObjectSerializer.js +19 -16
  546. package/lib/sharing/ConsumeSharedModule.js +30 -21
  547. package/lib/sharing/ConsumeSharedPlugin.js +18 -10
  548. package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
  549. package/lib/sharing/ProvideSharedModule.js +25 -16
  550. package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
  551. package/lib/sharing/ProvideSharedPlugin.js +8 -4
  552. package/lib/sharing/SharePlugin.js +17 -5
  553. package/lib/sharing/ShareRuntimeModule.js +4 -4
  554. package/lib/sharing/resolveMatchedConfigs.js +9 -6
  555. package/lib/sharing/utils.js +1 -3
  556. package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
  557. package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
  558. package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
  559. package/lib/stats/StatsFactory.js +25 -26
  560. package/lib/stats/StatsPrinter.js +16 -12
  561. package/lib/typescript/TypeScriptPlugin.js +20 -24
  562. package/lib/url/URLParserPlugin.js +26 -13
  563. package/lib/util/ArrayQueue.js +3 -3
  564. package/lib/util/AsyncQueue.js +4 -3
  565. package/lib/util/Hash.js +5 -1
  566. package/lib/util/LazySet.js +35 -22
  567. package/lib/util/LocConverter.js +36 -13
  568. package/lib/util/SourceProcessor.js +1066 -24
  569. package/lib/util/StringXor.js +1 -1
  570. package/lib/util/URLAbsoluteSpecifier.js +3 -1
  571. package/lib/util/chainedImports.js +9 -5
  572. package/lib/util/cleverMerge.js +1 -1
  573. package/lib/util/comparators.js +45 -14
  574. package/lib/util/concatenate.js +203 -77
  575. package/lib/util/conventions.js +10 -2
  576. package/lib/util/createHash.js +2 -2
  577. package/lib/util/createHooksRegistry.js +8 -10
  578. package/lib/util/createMappings.js +25 -3
  579. package/lib/util/dataURL.js +225 -1
  580. package/lib/util/extractSourceMap.js +4 -3
  581. package/lib/util/findCaseMismatch.js +139 -0
  582. package/lib/util/formatLocation.js +1 -2
  583. package/lib/util/fs.js +22 -5
  584. package/lib/util/globUtils.js +298 -24
  585. package/lib/util/hash/BatchedHash.js +5 -1
  586. package/lib/util/hash/BulkUpdateHash.js +5 -1
  587. package/lib/util/hash/DebugHash.js +5 -1
  588. package/lib/util/hash/hash-digest.js +6 -2
  589. package/lib/util/identifier.js +4 -0
  590. package/lib/util/implicitTypeLoaderFallback.js +1 -1
  591. package/lib/util/internalSerializables.js +8 -0
  592. package/lib/util/lazyModule.js +56 -0
  593. package/lib/util/makeSerializable.js +7 -3
  594. package/lib/util/matchAlias.js +25 -0
  595. package/lib/util/mimeTypes.js +11 -5
  596. package/lib/util/nonNumericOnlyHash.js +4 -3
  597. package/lib/util/parseJson.js +5 -3
  598. package/lib/util/preloadModuleType.js +32 -0
  599. package/lib/util/registerExternalSerializer.js +7 -5
  600. package/lib/util/removeBOM.js +82 -1
  601. package/lib/util/runtime.js +2 -2
  602. package/lib/util/semver.js +1 -1
  603. package/lib/util/serialization.js +28 -28
  604. package/lib/util/source.js +2 -2
  605. package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
  606. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
  607. package/lib/wasm/wasmModuleFilename.js +54 -0
  608. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +43 -21
  609. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +45 -21
  610. package/lib/wasm-async/AsyncWasmModule.js +3 -3
  611. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
  612. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
  613. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
  614. package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
  615. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +29 -8
  616. package/lib/wasm-sync/SyncWasmModule.js +2 -2
  617. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
  618. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
  619. package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
  620. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
  621. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
  622. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
  623. package/lib/wasm-sync/WebAssemblyParser.js +4 -6
  624. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  625. package/lib/web/FetchCompileAsyncWasmPlugin.js +105 -19
  626. package/lib/web/FetchCompileWasmPlugin.js +48 -16
  627. package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
  628. package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
  629. package/lib/web/JsonpTemplatePlugin.js +2 -2
  630. package/lib/webpack.js +22 -11
  631. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
  632. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
  633. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  634. package/module.d.ts +1 -0
  635. package/package.json +32 -25
  636. package/schemas/WebpackOptions.check.js +1 -1
  637. package/schemas/WebpackOptions.json +667 -34
  638. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  639. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  640. package/schemas/plugins/container/ContainerPlugin.json +10 -0
  641. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  642. package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
  643. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  644. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  645. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  646. package/types.d.ts +3223 -465
  647. package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
@@ -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;
@@ -0,0 +1,120 @@
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 DynamicExportsWarning = require("../errors/DynamicExportsWarning");
9
+ const { compareStrings } = require("../util/comparators");
10
+ const getModuleSize = require("./getModuleSize");
11
+
12
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
13
+ /** @import Compiler from "../Compiler" */
14
+ /** @import Module from "../Module" */
15
+ /** @import ModuleGraph from "../ModuleGraph" */
16
+ /** @import { DynamicExportsDetails } from "../errors/DynamicExportsWarning" */
17
+
18
+ /**
19
+ * Tells whether another module imports this one.
20
+ * @param {Module} module the module to look up
21
+ * @param {ModuleGraph} moduleGraph the module graph
22
+ * @returns {boolean} true when at least one module imports it
23
+ */
24
+ const hasImporter = (module, moduleGraph) => {
25
+ for (const connection of moduleGraph.getIncomingConnections(module)) {
26
+ if (connection.originModule) return true;
27
+ }
28
+
29
+ return false;
30
+ };
31
+
32
+ const PLUGIN_NAME = "DynamicExportsPlugin";
33
+
34
+ // Enough to name the offenders without listing every CommonJS dependency.
35
+ const MAX_REPORTED_MODULES = 5;
36
+
37
+ class DynamicExportsPlugin {
38
+ /**
39
+ * Creates an instance of DynamicExportsPlugin.
40
+ * @param {PerformanceOptions} options the plugin options
41
+ */
42
+ constructor(options) {
43
+ /** @type {PerformanceOptions["hints"]} */
44
+ this.hints = options.hints;
45
+ }
46
+
47
+ /**
48
+ * Applies the plugin by registering its hooks on the compiler.
49
+ * @param {Compiler} compiler the compiler instance
50
+ * @returns {void}
51
+ */
52
+ apply(compiler) {
53
+ const hints = this.hints;
54
+
55
+ if (!hints) return;
56
+
57
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
58
+ /** @type {DynamicExportsWarning | undefined} */
59
+ let warning;
60
+
61
+ // Exports are settled here, and concatenation has not merged the
62
+ // modules away yet, so each one can still be named and measured.
63
+ compilation.hooks.optimizeModules.tap(PLUGIN_NAME, (modules) => {
64
+ const { chunkGraph, moduleGraph, requestShortener } = compilation;
65
+ /** @type {DynamicExportsDetails[]} */
66
+ const unknown = [];
67
+
68
+ for (const module of modules) {
69
+ // One webpack already left out costs nothing.
70
+ if (chunkGraph.getNumberOfModuleChunks(module) === 0) continue;
71
+
72
+ // `null` is the third state: not "no other exports" but "there
73
+ // may be more, and they cannot be read from the source".
74
+ if (
75
+ moduleGraph.getExportsInfo(module).otherExportsInfo.provided !==
76
+ null
77
+ ) {
78
+ continue;
79
+ }
80
+
81
+ // The cost lands on whoever imports it, so an entry pays nothing.
82
+ if (!hasImporter(module, moduleGraph)) continue;
83
+
84
+ unknown.push({
85
+ name: module.readableIdentifier(requestShortener),
86
+ size: getModuleSize(module)
87
+ });
88
+ }
89
+
90
+ if (unknown.length === 0) return;
91
+
92
+ // Ties break by name: module order is not stable across runtimes.
93
+ unknown.sort(
94
+ (a, b) => b.size - a.size || compareStrings(a.name, b.name)
95
+ );
96
+
97
+ warning = new DynamicExportsWarning(
98
+ unknown.slice(0, MAX_REPORTED_MODULES),
99
+ unknown.length
100
+ );
101
+ });
102
+
103
+ // Reported past the hash: `createHash` folds every message into it, so
104
+ // a hint pushed earlier would change the build's identity.
105
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
106
+ if (warning === undefined) return;
107
+
108
+ if (hints === "error") {
109
+ compilation.errors.push(warning);
110
+ } else if (hints === "stats") {
111
+ compilation.hints.push(warning);
112
+ } else {
113
+ compilation.warnings.push(warning);
114
+ }
115
+ });
116
+ });
117
+ }
118
+ }
119
+
120
+ module.exports = DynamicExportsPlugin;
@@ -0,0 +1,71 @@
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 EmbeddedSourceMapsWarning = require("../errors/EmbeddedSourceMapsWarning");
9
+
10
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
11
+ /** @import Compiler from "../Compiler" */
12
+
13
+ const PLUGIN_NAME = "EmbeddedSourceMapsPlugin";
14
+
15
+ // The two families that put the map inside the bundle rather than beside it:
16
+ // `eval` carries one per module, `inline` appends the whole map as a data url.
17
+ const EMBEDS_MAP_REGEXP = /^eval|inline/;
18
+
19
+ class EmbeddedSourceMapsPlugin {
20
+ /**
21
+ * Creates an instance of EmbeddedSourceMapsPlugin.
22
+ * @param {PerformanceOptions} options the plugin options
23
+ */
24
+ constructor(options) {
25
+ /** @type {PerformanceOptions["hints"]} */
26
+ this.hints = options.hints;
27
+ }
28
+
29
+ /**
30
+ * Applies the plugin by registering its hooks on the compiler.
31
+ * @param {Compiler} compiler the compiler instance
32
+ * @returns {void}
33
+ */
34
+ apply(compiler) {
35
+ const hints = this.hints;
36
+
37
+ if (!hints) return;
38
+
39
+ const { devtool, mode } = compiler.options;
40
+
41
+ // Only production: embedding is what these devtools are for everywhere
42
+ // else, and the cost is only paid by the people loading the site.
43
+ if (mode !== "production" || !devtool) return;
44
+
45
+ // One devtool, or one per source type — either way it is the setting
46
+ // that embeds which the report has to name.
47
+ const embedding = (
48
+ typeof devtool === "string" ? [devtool] : devtool.map((it) => it.use)
49
+ ).find((it) => typeof it === "string" && EMBEDS_MAP_REGEXP.test(it));
50
+
51
+ if (!embedding) return;
52
+
53
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
54
+ // `afterSeal` is past the hash, which folds every message into it — a
55
+ // hint reported earlier would change the build's identity.
56
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
57
+ const warning = new EmbeddedSourceMapsWarning(embedding);
58
+
59
+ if (hints === "error") {
60
+ compilation.errors.push(warning);
61
+ } else if (hints === "stats") {
62
+ compilation.hints.push(warning);
63
+ } else {
64
+ compilation.warnings.push(warning);
65
+ }
66
+ });
67
+ });
68
+ }
69
+ }
70
+
71
+ module.exports = EmbeddedSourceMapsPlugin;
@@ -0,0 +1,122 @@
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 EntrypointOverlapWarning = require("../errors/EntrypointOverlapWarning");
9
+ const { compareStrings } = require("../util/comparators");
10
+ const getModuleSize = require("./getModuleSize");
11
+ const getSourceModules = require("./getSourceModules");
12
+
13
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
14
+ /** @import Chunk from "../Chunk" */
15
+ /** @import Compiler from "../Compiler" */
16
+ /** @import Module from "../Module" */
17
+ /**
18
+ * @import {
19
+ * EntrypointOverlapDetails
20
+ * } from "../errors/EntrypointOverlapWarning"
21
+ */
22
+
23
+ const PLUGIN_NAME = "EntrypointOverlapPlugin";
24
+
25
+ // Enough to name the offenders without printing the module graph.
26
+ const MAX_REPORTED_MODULES = 5;
27
+
28
+ class EntrypointOverlapPlugin {
29
+ /**
30
+ * Creates an instance of EntrypointOverlapPlugin.
31
+ * @param {PerformanceOptions} options the plugin options
32
+ */
33
+ constructor(options) {
34
+ /** @type {PerformanceOptions["hints"]} */
35
+ this.hints = options.hints;
36
+ }
37
+
38
+ /**
39
+ * Applies the plugin by registering its hooks on the compiler.
40
+ * @param {Compiler} compiler the compiler instance
41
+ * @returns {void}
42
+ */
43
+ apply(compiler) {
44
+ const hints = this.hints;
45
+
46
+ if (!hints) return;
47
+
48
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
49
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
50
+ const { chunkGraph, entrypoints, requestShortener } = compilation;
51
+
52
+ if (entrypoints.size < 2) return;
53
+
54
+ /** @type {Map<Module, { chunks: Set<Chunk>, entrypoints: Set<string> }>} */
55
+ const reach = new Map();
56
+
57
+ for (const [name, entrypoint] of entrypoints) {
58
+ for (const chunk of entrypoint.chunks) {
59
+ for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
60
+ // Through scope hoisting: two entrypoints concatenating the same
61
+ // file produce two modules, so the chunk graph alone shows none.
62
+ for (const inner of getSourceModules(module)) {
63
+ let entry = reach.get(inner);
64
+
65
+ if (entry === undefined) {
66
+ reach.set(
67
+ inner,
68
+ (entry = { chunks: new Set(), entrypoints: new Set() })
69
+ );
70
+ }
71
+
72
+ entry.chunks.add(chunk);
73
+ entry.entrypoints.add(name);
74
+ }
75
+ }
76
+ }
77
+ }
78
+
79
+ /** @type {EntrypointOverlapDetails[]} */
80
+ const overlapping = [];
81
+ let wasted = 0;
82
+
83
+ for (const [module, { chunks, entrypoints: names }] of reach) {
84
+ // One chunk reached from several entrypoints is downloaded once, so
85
+ // only separate copies cost anything.
86
+ if (chunks.size < 2 || names.size < 2) continue;
87
+
88
+ const extra = getModuleSize(module) * (chunks.size - 1);
89
+
90
+ wasted += extra;
91
+ overlapping.push({
92
+ name: module.readableIdentifier(requestShortener),
93
+ entrypoints: [...names].sort(compareStrings),
94
+ wasted: extra
95
+ });
96
+ }
97
+
98
+ if (overlapping.length === 0) return;
99
+
100
+ // Ties break by name: which modules finish first is not stable.
101
+ overlapping.sort(
102
+ (a, b) => b.wasted - a.wasted || compareStrings(a.name, b.name)
103
+ );
104
+
105
+ const warning = new EntrypointOverlapWarning(
106
+ overlapping.slice(0, MAX_REPORTED_MODULES),
107
+ wasted
108
+ );
109
+
110
+ if (hints === "error") {
111
+ compilation.errors.push(warning);
112
+ } else if (hints === "stats") {
113
+ compilation.hints.push(warning);
114
+ } else {
115
+ compilation.warnings.push(warning);
116
+ }
117
+ });
118
+ });
119
+ }
120
+ }
121
+
122
+ module.exports = EntrypointOverlapPlugin;
@@ -8,7 +8,7 @@
8
8
  const WebpackError = require("../errors/WebpackError");
9
9
  const formatSize = require("../util/formatSize");
10
10
 
11
- /** @typedef {import("./SizeLimitsPlugin").EntrypointDetails} EntrypointDetails */
11
+ /** @import { EntrypointDetails } from "./SizeLimitsPlugin" */
12
12
 
13
13
  class EntrypointsOverSizeLimitWarning extends WebpackError {
14
14
  /**