@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,225 @@
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 AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
9
+ const Entrypoint = require("../Entrypoint");
10
+ const RedundantDynamicImportWarning = require("../errors/RedundantDynamicImportWarning");
11
+ const { compareStrings } = require("../util/comparators");
12
+ const formatLocation = require("../util/formatLocation");
13
+
14
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
15
+ /** @import Chunk from "../Chunk" */
16
+ /** @import ChunkGroup from "../ChunkGroup" */
17
+ /** @import Compiler from "../Compiler" */
18
+ /** @import DependenciesBlock from "../DependenciesBlock" */
19
+ /** @import Module from "../Module" */
20
+
21
+ const PLUGIN_NAME = "RedundantDynamicImportsPlugin";
22
+
23
+ // Enough to name the offenders without printing every call site.
24
+ const MAX_REPORTED_IMPORTS = 5;
25
+
26
+ class RedundantDynamicImportsPlugin {
27
+ /**
28
+ * Creates an instance of RedundantDynamicImportsPlugin.
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
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
47
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
48
+ const { chunkGraph, moduleGraph, requestShortener } = compilation;
49
+ /** @type {string[]} */
50
+ const descriptions = [];
51
+
52
+ /**
53
+ * The chunks certain to be loaded when `chunk` runs: itself, plus what
54
+ * every entrypoint able to reach it brings. Entrypoints are alternative
55
+ * load paths, so they are intersected — one that carries the target says
56
+ * nothing about a page that loads another. A shared runtime name is not
57
+ * enough either: with `runtimeChunk: "single"` two entrypoints share one
58
+ * runtime while neither loads the other's initial chunks.
59
+ * @param {Chunk} chunk the chunk the importer runs in
60
+ * @returns {Set<Chunk>} the chunks loaded before it runs
61
+ */
62
+ const computeLoadedChunks = (chunk) => {
63
+ const chunks = new Set([chunk]);
64
+ /** @type {Set<ChunkGroup>} */
65
+ const entrypoints = new Set();
66
+ /** @type {Set<ChunkGroup>} */
67
+ const queue = new Set(chunk.groupsIterable);
68
+
69
+ for (const group of queue) {
70
+ // An entrypoint is a load path in itself and carries nothing of
71
+ // what reaches it: an async one — a worker — starts from its own
72
+ // chunks, however much the module spawning it had loaded.
73
+ if (group.isInitial() || group instanceof Entrypoint) {
74
+ entrypoints.add(group);
75
+ continue;
76
+ }
77
+
78
+ // Only initial chunks are certain: an async ancestor is loaded on
79
+ // the path taken, and a group can be reached by several.
80
+ for (const parent of group.getParents()) queue.add(parent);
81
+ }
82
+
83
+ if (entrypoints.size === 0) return chunks;
84
+
85
+ /** @type {Set<Chunk> | undefined} */
86
+ let common;
87
+
88
+ for (const entrypoint of entrypoints) {
89
+ /** @type {Set<Chunk>} */
90
+ const loaded = new Set();
91
+ /** @type {Set<ChunkGroup>} */
92
+ const chain = new Set([entrypoint]);
93
+
94
+ // An entrypoint reached through `dependOn` is loaded first too, so
95
+ // within one path they add up rather than cancel each other out.
96
+ for (const group of chain) {
97
+ for (const member of group.chunks) loaded.add(member);
98
+ for (const parent of group.getParents()) chain.add(parent);
99
+ }
100
+
101
+ if (common === undefined) {
102
+ common = loaded;
103
+ continue;
104
+ }
105
+
106
+ for (const member of common) {
107
+ if (!loaded.has(member)) common.delete(member);
108
+ }
109
+ }
110
+
111
+ for (const member of /** @type {Set<Chunk>} */ (common)) {
112
+ chunks.add(member);
113
+ }
114
+
115
+ return chunks;
116
+ };
117
+
118
+ // The answer depends on the chunk alone, and every module sharing one
119
+ // asks the same question. Dropped with the hook it is built in.
120
+ /** @type {Map<Chunk, Set<Chunk>>} */
121
+ const loadedChunks = new Map();
122
+
123
+ /**
124
+ * @param {Chunk} chunk the chunk the importer runs in
125
+ * @returns {Set<Chunk>} the chunks loaded before it runs
126
+ */
127
+ const getLoadedChunks = (chunk) => {
128
+ let loaded = loadedChunks.get(chunk);
129
+
130
+ if (loaded === undefined) {
131
+ loaded = computeLoadedChunks(chunk);
132
+ loadedChunks.set(chunk, loaded);
133
+ }
134
+
135
+ return loaded;
136
+ };
137
+
138
+ /**
139
+ * @param {DependenciesBlock} block the block to walk
140
+ * @param {Module} importer the module the block belongs to
141
+ * @param {Set<Chunk>[]} contexts what is loaded in each place it runs
142
+ * @returns {void}
143
+ */
144
+ const walk = (block, importer, contexts) => {
145
+ for (const nested of block.blocks) {
146
+ if (nested instanceof AsyncDependenciesBlock) {
147
+ for (const dependency of nested.dependencies) {
148
+ const target = moduleGraph.getModule(dependency);
149
+
150
+ if (!target) continue;
151
+
152
+ // Redundant only where it is redundant everywhere: a shared
153
+ // importer still defers for an entry that lacks the target.
154
+ let redundant = true;
155
+
156
+ for (const loaded of contexts) {
157
+ let present = false;
158
+
159
+ for (const chunk of chunkGraph.getModuleChunksIterable(
160
+ target
161
+ )) {
162
+ if (loaded.has(chunk)) {
163
+ present = true;
164
+ break;
165
+ }
166
+ }
167
+
168
+ if (!present) {
169
+ redundant = false;
170
+ break;
171
+ }
172
+ }
173
+
174
+ if (!redundant) continue;
175
+
176
+ descriptions.push(
177
+ `${importer.readableIdentifier(requestShortener)}${
178
+ nested.loc ? ` ${formatLocation(nested.loc)}` : ""
179
+ } imports ${target.readableIdentifier(requestShortener)}`
180
+ );
181
+ }
182
+ }
183
+
184
+ walk(nested, importer, contexts);
185
+ }
186
+ };
187
+
188
+ for (const module of compilation.modules) {
189
+ if (module.blocks.length === 0) continue;
190
+
191
+ /** @type {Set<Chunk>[]} */
192
+ const contexts = [];
193
+
194
+ for (const chunk of chunkGraph.getModuleChunksIterable(module)) {
195
+ contexts.push(getLoadedChunks(chunk));
196
+ }
197
+
198
+ if (contexts.length === 0) continue;
199
+
200
+ walk(module, module, contexts);
201
+ }
202
+
203
+ if (descriptions.length === 0) return;
204
+
205
+ // Module order is not stable across runtimes, so the reported subset
206
+ // would otherwise differ between them.
207
+ descriptions.sort(compareStrings);
208
+
209
+ const warning = new RedundantDynamicImportWarning(
210
+ descriptions.slice(0, MAX_REPORTED_IMPORTS)
211
+ );
212
+
213
+ if (hints === "error") {
214
+ compilation.errors.push(warning);
215
+ } else if (hints === "stats") {
216
+ compilation.hints.push(warning);
217
+ } else {
218
+ compilation.warnings.push(warning);
219
+ }
220
+ });
221
+ });
222
+ }
223
+ }
224
+
225
+ module.exports = RedundantDynamicImportsPlugin;
@@ -0,0 +1,27 @@
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
+ class RuntimeInLargeChunkWarning extends WebpackError {
11
+ /**
12
+ * Creates an instance of RuntimeInLargeChunkWarning.
13
+ * @param {string[]} entrypoints names of the entrypoints carrying the runtime
14
+ */
15
+ constructor(entrypoints) {
16
+ super(
17
+ `webpack performance recommendations: \nThe runtime is part of the initial chunk of ${entrypoints.join(
18
+ ", "
19
+ )}. It describes every other chunk, so a change anywhere in the build rewrites these assets and clients download them again.\nSet 'optimization.runtimeChunk' to emit the runtime as its own chunk.\nFor more info visit https://webpack.js.org/configuration/optimization/#optimizationruntimechunk`
20
+ );
21
+
22
+ /** @type {string} */
23
+ this.name = "RuntimeInLargeChunkWarning";
24
+ }
25
+ }
26
+
27
+ module.exports = RuntimeInLargeChunkWarning;
@@ -0,0 +1,164 @@
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 ScopeHoistingBailoutsWarning = require("../errors/ScopeHoistingBailoutsWarning");
9
+ const {
10
+ BAILOUT_PREFIX,
11
+ REJECTED_PREFIX
12
+ } = require("../optimize/ModuleConcatenationPlugin");
13
+ const { compareStrings } = require("../util/comparators");
14
+ const getModuleSize = require("./getModuleSize");
15
+
16
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
17
+ /** @import Compiler from "../Compiler" */
18
+ /** @import Module from "../Module" */
19
+ /** @import RequestShortener from "../RequestShortener" */
20
+ /**
21
+ * @import {
22
+ * ScopeHoistingBailoutGroup
23
+ * } from "../errors/ScopeHoistingBailoutsWarning"
24
+ */
25
+
26
+ const PLUGIN_NAME = "ScopeHoistingBailoutsPlugin";
27
+
28
+ // Reasons repeat far more than they differ, so a few name the problem.
29
+ const MAX_REPORTED_REASONS = 5;
30
+
31
+ // Enough per reason to recognize the offenders without listing every module.
32
+ const MAX_REPORTED_NAMES = 3;
33
+
34
+ // A source position makes two identical reasons look like two problems.
35
+ const POSITION_REGEXP = / at \d+:\d+-\d+$/;
36
+
37
+ /**
38
+ * The module's own reasons for staying out of a scope, without the ones it
39
+ * only carries because something it imports bailed out.
40
+ * @param {(string | ((requestShortener: RequestShortener) => string))[]} bailouts what the module graph recorded
41
+ * @param {RequestShortener} requestShortener the request shortener
42
+ * @returns {string[]} the reasons, stripped of their prefix and position
43
+ */
44
+ const getOwnReasons = (bailouts, requestShortener) => {
45
+ /** @type {string[]} */
46
+ const reasons = [];
47
+
48
+ for (const bailout of bailouts) {
49
+ const message =
50
+ typeof bailout === "function" ? bailout(requestShortener) : bailout;
51
+
52
+ if (!message.startsWith(BAILOUT_PREFIX)) continue;
53
+
54
+ const reason = message.slice(BAILOUT_PREFIX.length);
55
+
56
+ // One root lists every module it could not take in; each of those
57
+ // modules reports the same problem itself.
58
+ if (reason.startsWith(REJECTED_PREFIX)) continue;
59
+
60
+ reasons.push(reason.replace(POSITION_REGEXP, ""));
61
+ }
62
+
63
+ return reasons;
64
+ };
65
+
66
+ class ScopeHoistingBailoutsPlugin {
67
+ /**
68
+ * Creates an instance of ScopeHoistingBailoutsPlugin.
69
+ * @param {PerformanceOptions} options the plugin options
70
+ */
71
+ constructor(options) {
72
+ /** @type {PerformanceOptions["hints"]} */
73
+ this.hints = options.hints;
74
+ }
75
+
76
+ /**
77
+ * Applies the plugin by registering its hooks on the compiler.
78
+ * @param {Compiler} compiler the compiler instance
79
+ * @returns {void}
80
+ */
81
+ apply(compiler) {
82
+ const hints = this.hints;
83
+
84
+ if (!hints) return;
85
+
86
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
87
+ // After seal: a module that was hoisted is gone from `modules` by now,
88
+ // absorbed into the concatenation that took it.
89
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
90
+ const { chunkGraph, moduleGraph, requestShortener } = compilation;
91
+ /** @type {Map<string, { size: number, name: string }[]>} */
92
+ const byReason = new Map();
93
+ /** @type {Set<Module>} */
94
+ const affected = new Set();
95
+
96
+ for (const module of compilation.modules) {
97
+ // One webpack left out was never a candidate.
98
+ if (chunkGraph.getNumberOfModuleChunks(module) === 0) continue;
99
+
100
+ const reasons = getOwnReasons(
101
+ moduleGraph.getOptimizationBailout(module),
102
+ requestShortener
103
+ );
104
+
105
+ if (reasons.length === 0) continue;
106
+
107
+ affected.add(module);
108
+
109
+ const entry = {
110
+ name: module.readableIdentifier(requestShortener),
111
+ size: getModuleSize(module)
112
+ };
113
+
114
+ for (const reason of new Set(reasons)) {
115
+ const modules = byReason.get(reason);
116
+
117
+ if (modules === undefined) {
118
+ byReason.set(reason, [entry]);
119
+ } else {
120
+ modules.push(entry);
121
+ }
122
+ }
123
+ }
124
+
125
+ if (affected.size === 0) return;
126
+
127
+ /** @type {ScopeHoistingBailoutGroup[]} */
128
+ const groups = [];
129
+
130
+ for (const [reason, modules] of byReason) {
131
+ // Ties break by name: module order is not stable across runtimes.
132
+ modules.sort(
133
+ (a, b) => b.size - a.size || compareStrings(a.name, b.name)
134
+ );
135
+
136
+ groups.push({
137
+ reason,
138
+ count: modules.length,
139
+ names: modules.slice(0, MAX_REPORTED_NAMES).map((m) => m.name)
140
+ });
141
+ }
142
+
143
+ groups.sort(
144
+ (a, b) => b.count - a.count || compareStrings(a.reason, b.reason)
145
+ );
146
+
147
+ const warning = new ScopeHoistingBailoutsWarning(
148
+ groups.slice(0, MAX_REPORTED_REASONS),
149
+ affected.size
150
+ );
151
+
152
+ if (hints === "error") {
153
+ compilation.errors.push(warning);
154
+ } else if (hints === "stats") {
155
+ compilation.hints.push(warning);
156
+ } else {
157
+ compilation.warnings.push(warning);
158
+ }
159
+ });
160
+ });
161
+ }
162
+ }
163
+
164
+ module.exports = ScopeHoistingBailoutsPlugin;
@@ -5,24 +5,40 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ const RuntimeGlobals = require("../RuntimeGlobals");
9
+ const RuntimeModule = require("../RuntimeModule");
8
10
  const { find } = require("../util/SetHelpers");
11
+ const { compareStrings } = require("../util/comparators");
9
12
  const AssetsOverSizeLimitWarning = require("./AssetsOverSizeLimitWarning");
10
13
  const EntrypointsOverSizeLimitWarning = require("./EntrypointsOverSizeLimitWarning");
11
14
  const NoAsyncChunksWarning = require("./NoAsyncChunksWarning");
15
+ const RuntimeInLargeChunkWarning = require("./RuntimeInLargeChunkWarning");
16
+ const getModuleSize = require("./getModuleSize");
12
17
 
13
- /** @typedef {import("webpack-sources").Source} Source */
14
- /** @typedef {import("../../declarations/WebpackOptions").PerformanceOptions} PerformanceOptions */
15
- /** @typedef {import("../ChunkGroup")} ChunkGroup */
16
- /** @typedef {import("../Compilation").Asset} Asset */
17
- /** @typedef {import("../Compiler")} Compiler */
18
- /** @typedef {import("../Entrypoint")} Entrypoint */
19
- /** @typedef {import("../errors/WebpackError")} WebpackError */
18
+ /** @import { Source } from "webpack-sources" */
19
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
20
+ /** @import Chunk from "../Chunk" */
21
+ /** @import ChunkGraph from "../ChunkGraph" */
22
+ /** @import ChunkGroup from "../ChunkGroup" */
23
+ /** @import Compilation, { Asset } from "../Compilation" */
24
+ /** @import Compiler from "../Compiler" */
25
+ /** @import Module from "../Module" */
26
+ /** @import Entrypoint from "../Entrypoint" */
27
+ /** @import WebpackError from "../errors/WebpackError" */
28
+
29
+ /**
30
+ * Defines the module details type used by this module.
31
+ * @typedef {object} ModuleDetails
32
+ * @property {string} name
33
+ * @property {number} size
34
+ */
20
35
 
21
36
  /**
22
37
  * Defines the asset details type used by this module.
23
38
  * @typedef {object} AssetDetails
24
39
  * @property {string} name
25
40
  * @property {number} size
41
+ * @property {ModuleDetails[]=} modules
26
42
  */
27
43
 
28
44
  /**
@@ -41,6 +57,108 @@ const isOverSizeLimitSet = new WeakSet();
41
57
  /** @type {AssetFilter} */
42
58
  const excludeSourceMap = (name, source, info) => !info.development;
43
59
 
60
+ // Runtime globals whose generated code describes the other chunks, so the chunk
61
+ // holding them is rewritten whenever anything else in the build changes.
62
+ const BUILD_WIDE_RUNTIME_GLOBALS = [
63
+ RuntimeGlobals.getChunkScriptFilename,
64
+ RuntimeGlobals.getChunkCssFilename,
65
+ RuntimeGlobals.getChunkUpdateScriptFilename,
66
+ RuntimeGlobals.getFullHash,
67
+ RuntimeGlobals.getUpdateManifestFilename
68
+ ];
69
+
70
+ /**
71
+ * Tells whether an entrypoint ships its runtime inside a chunk that also carries
72
+ * modules, and that runtime describes the rest of the build. Only then does
73
+ * `optimization.runtimeChunk` win anything.
74
+ * @param {ChunkGraph} chunkGraph the chunk graph
75
+ * @param {Entrypoint} entrypoint an entrypoint
76
+ * @returns {boolean} true when splitting the runtime off would keep the chunk stable
77
+ */
78
+ const hasEmbeddedRuntime = (chunkGraph, entrypoint) => {
79
+ const runtimeChunk = entrypoint.getRuntimeChunk();
80
+ if (!runtimeChunk) return false;
81
+ // A chunk of its own carries the runtime modules and nothing else. Asking each
82
+ // module beats counting, which depends on runtime modules being counted twice.
83
+ let carriesCode = false;
84
+ for (const module of chunkGraph.getChunkModulesIterable(runtimeChunk)) {
85
+ if (!(module instanceof RuntimeModule)) {
86
+ carriesCode = true;
87
+ break;
88
+ }
89
+ }
90
+ if (!carriesCode) return false;
91
+ // The tree requirements are the ones the emitted runtime modules answer to.
92
+ const runtimeRequirements =
93
+ chunkGraph.getTreeRuntimeRequirements(runtimeChunk);
94
+ // A global nothing here names stays silent, so a new one costs a hint, not a wrong one.
95
+ return BUILD_WIDE_RUNTIME_GLOBALS.some((runtimeGlobal) =>
96
+ runtimeRequirements.has(runtimeGlobal)
97
+ );
98
+ };
99
+
100
+ // Enough to point at the culprit without turning the hint into a report.
101
+ const MAX_REPORTED_MODULES = 3;
102
+
103
+ /**
104
+ * Names the largest modules inside each oversized asset. "This file is too big"
105
+ * is only actionable once you know what fills it.
106
+ * @param {Compilation} compilation the compilation
107
+ * @param {AssetDetails[]} assetsOverSizeLimit the oversized assets, annotated in place
108
+ * @returns {void}
109
+ */
110
+ const addLargestModules = (compilation, assetsOverSizeLimit) => {
111
+ const { chunkGraph, requestShortener } = compilation;
112
+ /** @type {Map<string, Chunk[]>} */
113
+ const chunksByFile = new Map();
114
+
115
+ for (const chunk of compilation.chunks) {
116
+ // A chunk emitting several files (javascript plus extracted css, …) gives
117
+ // no way to tell which module ended up in which, so it names none.
118
+ if (chunk.files.size !== 1) continue;
119
+
120
+ for (const file of chunk.files) {
121
+ const chunks = chunksByFile.get(file);
122
+
123
+ if (chunks === undefined) {
124
+ chunksByFile.set(file, [chunk]);
125
+ } else {
126
+ chunks.push(chunk);
127
+ }
128
+ }
129
+ }
130
+
131
+ for (const asset of assetsOverSizeLimit) {
132
+ const chunks = chunksByFile.get(asset.name);
133
+
134
+ // An asset a loader or plugin emitted belongs to no chunk, so nothing
135
+ // describes its contents; likewise one whose chunk emits several files.
136
+ if (chunks === undefined) continue;
137
+
138
+ /** @type {Set<Module>} */
139
+ const seen = new Set();
140
+ /** @type {ModuleDetails[]} */
141
+ const modules = [];
142
+
143
+ for (const chunk of chunks) {
144
+ for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
145
+ if (seen.has(module)) continue;
146
+ seen.add(module);
147
+ modules.push({
148
+ name: module.readableIdentifier(requestShortener),
149
+ size: getModuleSize(module)
150
+ });
151
+ }
152
+ }
153
+
154
+ if (modules.length === 0) continue;
155
+
156
+ // Ties break by name: which modules finish first is not stable.
157
+ modules.sort((a, b) => b.size - a.size || compareStrings(a.name, b.name));
158
+ asset.modules = modules.slice(0, MAX_REPORTED_MODULES);
159
+ }
160
+ };
161
+
44
162
  const PLUGIN_NAME = "SizeLimitsPlugin";
45
163
 
46
164
  module.exports = class SizeLimitsPlugin {
@@ -132,6 +250,8 @@ module.exports = class SizeLimitsPlugin {
132
250
 
133
251
  /** @type {EntrypointDetails[]} */
134
252
  const entrypointsOverLimit = [];
253
+ /** @type {string[]} */
254
+ const entrypointsWithEmbeddedRuntime = [];
135
255
  for (const [name, entry] of compilation.entrypoints) {
136
256
  const size = getEntrypointSize(entry);
137
257
 
@@ -142,6 +262,9 @@ module.exports = class SizeLimitsPlugin {
142
262
  files: entry.getFiles().filter(fileFilter)
143
263
  });
144
264
  isOverSizeLimitSet.add(entry);
265
+ if (hasEmbeddedRuntime(compilation.chunkGraph, entry)) {
266
+ entrypointsWithEmbeddedRuntime.push(name);
267
+ }
145
268
  }
146
269
  }
147
270
 
@@ -151,6 +274,7 @@ module.exports = class SizeLimitsPlugin {
151
274
  // 3. No Async Chunks
152
275
  // if !1, then 2, if !2 return
153
276
  if (assetsOverSizeLimit.length > 0) {
277
+ addLargestModules(compilation, assetsOverSizeLimit);
154
278
  warnings.push(
155
279
  new AssetsOverSizeLimitWarning(
156
280
  assetsOverSizeLimit,
@@ -177,8 +301,16 @@ module.exports = class SizeLimitsPlugin {
177
301
  warnings.push(new NoAsyncChunksWarning());
178
302
  }
179
303
 
304
+ if (entrypointsWithEmbeddedRuntime.length > 0) {
305
+ warnings.push(
306
+ new RuntimeInLargeChunkWarning(entrypointsWithEmbeddedRuntime)
307
+ );
308
+ }
309
+
180
310
  if (hints === "error") {
181
311
  compilation.errors.push(...warnings);
312
+ } else if (hints === "stats") {
313
+ compilation.hints.push(...warnings);
182
314
  } else {
183
315
  compilation.warnings.push(...warnings);
184
316
  }