@depup/webpack 5.109.0-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 (641) hide show
  1. package/README.md +7 -7
  2. package/bin/webpack.js +12 -0
  3. package/changes.json +10 -10
  4. package/lib/APIPlugin.js +123 -17
  5. package/lib/AsyncDependenciesBlock.js +10 -7
  6. package/lib/AutomaticPrefetchPlugin.js +1 -1
  7. package/lib/BannerPlugin.js +10 -6
  8. package/lib/CacheFacade.js +6 -6
  9. package/lib/Chunk.js +14 -11
  10. package/lib/ChunkGraph.js +43 -32
  11. package/lib/ChunkGroup.js +7 -7
  12. package/lib/ChunkTemplate.js +35 -44
  13. package/lib/CircularModulesPlugin.js +205 -28
  14. package/lib/CleanPlugin.js +15 -16
  15. package/lib/CodeGenerationResults.js +11 -8
  16. package/lib/CompatibilityPlugin.js +38 -7
  17. package/lib/Compilation.js +709 -414
  18. package/lib/Compiler.js +69 -42
  19. package/lib/ConcatenationScope.js +117 -8
  20. package/lib/ConditionalInitFragment.js +3 -3
  21. package/lib/ConstPlugin.js +13 -11
  22. package/lib/ContextExclusionPlugin.js +1 -1
  23. package/lib/ContextModule.js +146 -54
  24. package/lib/ContextModuleFactory.js +46 -14
  25. package/lib/ContextReplacementPlugin.js +12 -14
  26. package/lib/DefinePlugin.js +168 -57
  27. package/lib/DependenciesBlock.js +9 -6
  28. package/lib/Dependency.js +36 -16
  29. package/lib/DependencyTemplate.js +11 -12
  30. package/lib/DependencyTemplates.js +3 -3
  31. package/lib/DotenvPlugin.js +50 -13
  32. package/lib/DynamicEntryPlugin.js +8 -4
  33. package/lib/EntryOptionPlugin.js +8 -4
  34. package/lib/EntryPlugin.js +2 -2
  35. package/lib/Entrypoint.js +6 -2
  36. package/lib/EnvironmentPlugin.js +2 -2
  37. package/lib/EvalDevToolModulePlugin.js +8 -4
  38. package/lib/EvalSourceMapDevToolPlugin.js +15 -8
  39. package/lib/ExportsInfo.js +123 -19
  40. package/lib/ExportsInfoApiPlugin.js +2 -4
  41. package/lib/ExternalModule.js +242 -84
  42. package/lib/ExternalModuleFactoryPlugin.js +97 -38
  43. package/lib/ExternalsPlugin.js +10 -6
  44. package/lib/FileSystemInfo.js +116 -42
  45. package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
  46. package/lib/FlagDependencyExportsPlugin.js +76 -19
  47. package/lib/FlagDependencyUsagePlugin.js +63 -57
  48. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  49. package/lib/Generator.js +36 -15
  50. package/lib/HotModuleReplacementPlugin.js +16 -44
  51. package/lib/IgnorePlugin.js +8 -4
  52. package/lib/IgnoreWarningsPlugin.js +2 -2
  53. package/lib/InitFragment.js +28 -36
  54. package/lib/JavascriptMetaInfoPlugin.js +35 -4
  55. package/lib/LazyBarrel.js +3 -4
  56. package/lib/LibraryTemplatePlugin.js +10 -6
  57. package/lib/LoaderOptionsPlugin.js +7 -3
  58. package/lib/LoaderTargetPlugin.js +1 -1
  59. package/lib/MainTemplate.js +49 -42
  60. package/lib/ManifestPlugin.js +12 -11
  61. package/lib/Module.js +62 -33
  62. package/lib/ModuleFactory.js +3 -3
  63. package/lib/ModuleFilenameHelpers.js +22 -6
  64. package/lib/ModuleGraph.js +195 -21
  65. package/lib/ModuleGraphConnection.js +6 -13
  66. package/lib/ModuleInfoHeaderPlugin.js +8 -10
  67. package/lib/ModuleTemplate.js +62 -63
  68. package/lib/MultiCompiler.js +130 -64
  69. package/lib/MultiStats.js +40 -9
  70. package/lib/MultiWatching.js +3 -3
  71. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  72. package/lib/NodeStuffPlugin.js +29 -19
  73. package/lib/NormalModule.js +221 -156
  74. package/lib/NormalModuleFactory.js +563 -112
  75. package/lib/NormalModuleReplacementPlugin.js +5 -8
  76. package/lib/NullFactory.js +6 -2
  77. package/lib/OptionsApply.js +7 -3
  78. package/lib/Parser.js +7 -3
  79. package/lib/PlatformPlugin.js +2 -2
  80. package/lib/PrefetchPlugin.js +1 -1
  81. package/lib/ProgressPlugin.js +16 -13
  82. package/lib/ProvidePlugin.js +3 -5
  83. package/lib/RawModule.js +25 -17
  84. package/lib/RecordIdsPlugin.js +3 -3
  85. package/lib/RequestShortener.js +1 -1
  86. package/lib/ResolverFactory.js +2 -2
  87. package/lib/RuntimeGlobals.js +22 -10
  88. package/lib/RuntimeModule.js +29 -19
  89. package/lib/RuntimePlugin.js +346 -256
  90. package/lib/RuntimeTemplate.js +2792 -352
  91. package/lib/SelfModuleFactory.js +7 -3
  92. package/lib/SourceMapDevToolModuleOptionsPlugin.js +6 -2
  93. package/lib/SourceMapDevToolPlugin.js +30 -20
  94. package/lib/Stats.js +3 -4
  95. package/lib/Template.js +55 -25
  96. package/lib/TemplatedPathPlugin.js +96 -14
  97. package/lib/UseStrictPlugin.js +4 -6
  98. package/lib/WarnCaseSensitiveModulesPlugin.js +4 -4
  99. package/lib/WarnDeprecatedOptionPlugin.js +1 -1
  100. package/lib/WarnNoModeSetPlugin.js +1 -1
  101. package/lib/WatchIgnorePlugin.js +8 -6
  102. package/lib/Watching.js +8 -8
  103. package/lib/WebpackIsIncludedPlugin.js +2 -4
  104. package/lib/WebpackOptionsApply.js +308 -18
  105. package/lib/WebpackOptionsDefaulter.js +6 -2
  106. package/lib/asset/AssetBytesGenerator.js +12 -10
  107. package/lib/asset/AssetBytesParser.js +2 -4
  108. package/lib/asset/AssetGenerator.js +188 -95
  109. package/lib/asset/AssetModule.js +7 -3
  110. package/lib/asset/AssetModulesPlugin.js +110 -38
  111. package/lib/asset/AssetParser.js +9 -7
  112. package/lib/asset/AssetSourceGenerator.js +60 -13
  113. package/lib/asset/AssetSourceParser.js +2 -4
  114. package/lib/asset/RawDataUrlModule.js +24 -16
  115. package/lib/asset/WebManifestGenerator.js +8 -10
  116. package/lib/asset/WebManifestParser.js +24 -10
  117. package/lib/async-modules/AsyncModuleHelpers.js +2 -2
  118. package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
  119. package/lib/async-modules/InferAsyncModulesPlugin.js +2 -2
  120. package/lib/async-modules/isGeneratorLowered.js +4 -4
  121. package/lib/buildChunkGraph.js +36 -27
  122. package/lib/bun/BunTargetPlugin.js +1 -1
  123. package/lib/cache/AddBuildDependenciesPlugin.js +1 -1
  124. package/lib/cache/AddManagedPathsPlugin.js +1 -1
  125. package/lib/cache/IdleFileCachePlugin.js +2 -2
  126. package/lib/cache/MemoryCachePlugin.js +18 -10
  127. package/lib/cache/MemoryWithGcCachePlugin.js +34 -22
  128. package/lib/cache/PackFileCacheStrategy.js +289 -28
  129. package/lib/cache/ResolverCachePlugin.js +38 -18
  130. package/lib/cache/getLazyHashedEtag.js +1 -2
  131. package/lib/cache/mergeEtags.js +1 -1
  132. package/lib/cli.js +1 -3
  133. package/lib/config/browserslistTargetHandler.js +41 -5
  134. package/lib/config/defaults.js +282 -81
  135. package/lib/config/defineConfig.js +10 -2
  136. package/lib/config/getClaimedAssetTypes.js +65 -0
  137. package/lib/config/normalization.js +36 -16
  138. package/lib/config/target.js +46 -3
  139. package/lib/container/ContainerEntryDependency.js +1 -1
  140. package/lib/container/ContainerEntryModule.js +24 -15
  141. package/lib/container/ContainerEntryModuleFactory.js +7 -3
  142. package/lib/container/ContainerPlugin.js +9 -10
  143. package/lib/container/ContainerReferencePlugin.js +6 -2
  144. package/lib/container/FallbackDependency.js +1 -1
  145. package/lib/container/FallbackModule.js +24 -17
  146. package/lib/container/FallbackModuleFactory.js +7 -3
  147. package/lib/container/HoistContainerReferencesPlugin.js +53 -66
  148. package/lib/container/ModuleFederationPlugin.js +7 -18
  149. package/lib/container/RemoteModule.js +27 -19
  150. package/lib/container/RemoteRuntimeModule.js +10 -8
  151. package/lib/container/moduleFederationHooks.js +32 -0
  152. package/lib/css/CssGenerator.js +178 -44
  153. package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
  154. package/lib/css/CssLoadingRuntimeModule.js +82 -36
  155. package/lib/css/CssModule.js +10 -7
  156. package/lib/css/CssModulesPlugin.js +197 -106
  157. package/lib/css/CssParser.js +1248 -618
  158. package/lib/css/CssServerStylesRuntimeModule.js +54 -0
  159. package/lib/css/cssMinify.js +168 -0
  160. package/lib/css/data.js +5324 -0
  161. package/lib/css/syntax.js +10396 -952
  162. package/lib/debug/ProfilingPlugin.js +14 -9
  163. package/lib/deno/DenoTargetPlugin.js +1 -1
  164. package/lib/dependencies/AMDDefineDependency.js +112 -87
  165. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +30 -17
  166. package/lib/dependencies/AMDPlugin.js +9 -7
  167. package/lib/dependencies/AMDRequireArrayDependency.js +5 -5
  168. package/lib/dependencies/AMDRequireContextDependency.js +2 -2
  169. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -1
  170. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +25 -14
  171. package/lib/dependencies/AMDRequireDependency.js +8 -7
  172. package/lib/dependencies/AMDRequireItemDependency.js +1 -1
  173. package/lib/dependencies/AMDRuntimeModules.js +21 -1
  174. package/lib/dependencies/BuildTimeConstDependency.js +102 -0
  175. package/lib/dependencies/CachedConstDependency.js +11 -8
  176. package/lib/dependencies/CommonJsDependencyHelpers.js +67 -46
  177. package/lib/dependencies/CommonJsExportRequireDependency.js +140 -45
  178. package/lib/dependencies/CommonJsExportsDependency.js +53 -49
  179. package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
  180. package/lib/dependencies/CommonJsFullRequireDependency.js +140 -26
  181. package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -48
  182. package/lib/dependencies/CommonJsObjectExportDependency.js +188 -0
  183. package/lib/dependencies/CommonJsPlugin.js +35 -6
  184. package/lib/dependencies/CommonJsRequireContextDependency.js +5 -6
  185. package/lib/dependencies/CommonJsRequireDependency.js +156 -27
  186. package/lib/dependencies/CommonJsSelfReferenceDependency.js +63 -38
  187. package/lib/dependencies/ConstDependency.js +8 -9
  188. package/lib/dependencies/ContextDependency.js +12 -8
  189. package/lib/dependencies/ContextDependencyHelpers.js +14 -9
  190. package/lib/dependencies/ContextDependencyTemplateAsId.js +4 -4
  191. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -4
  192. package/lib/dependencies/ContextElementDependency.js +31 -12
  193. package/lib/dependencies/CreateRequireParserPlugin.js +12 -7
  194. package/lib/dependencies/CreateScriptUrlDependency.js +4 -4
  195. package/lib/dependencies/CssIcssExportDependency.js +56 -28
  196. package/lib/dependencies/CssIcssImportDependency.js +17 -13
  197. package/lib/dependencies/CssIcssSymbolDependency.js +9 -10
  198. package/lib/dependencies/CssImportDependency.js +18 -9
  199. package/lib/dependencies/CssUrlDependency.js +17 -13
  200. package/lib/dependencies/DllEntryDependency.js +1 -1
  201. package/lib/dependencies/DynamicExports.js +2 -2
  202. package/lib/dependencies/ExportBindingInitFragment.js +36 -9
  203. package/lib/dependencies/ExportsInfoDependency.js +7 -8
  204. package/lib/dependencies/ExternalModuleDependency.js +9 -5
  205. package/lib/dependencies/ExternalModuleInitFragment.js +2 -2
  206. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +8 -5
  207. package/lib/dependencies/HarmonyAcceptDependency.js +5 -5
  208. package/lib/dependencies/HarmonyCompatibilityDependency.js +52 -17
  209. package/lib/dependencies/HarmonyDetectionParserPlugin.js +11 -7
  210. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +15 -11
  211. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +78 -12
  212. package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
  213. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
  214. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +159 -71
  215. package/lib/dependencies/HarmonyExportInitFragment.js +18 -6
  216. package/lib/dependencies/HarmonyExportSpecifierDependency.js +51 -14
  217. package/lib/dependencies/HarmonyExports.js +7 -4
  218. package/lib/dependencies/HarmonyImportDependency.js +28 -20
  219. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +31 -24
  220. package/lib/dependencies/HarmonyImportGuard.js +21 -30
  221. package/lib/dependencies/HarmonyImportSideEffectDependency.js +38 -9
  222. package/lib/dependencies/HarmonyImportSpecifierDependency.js +106 -55
  223. package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
  224. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
  225. package/lib/dependencies/HtmlEntryDependency.js +37 -29
  226. package/lib/dependencies/HtmlInlineHtmlDependency.js +7 -8
  227. package/lib/dependencies/HtmlInlineScriptDependency.js +11 -8
  228. package/lib/dependencies/HtmlInlineStyleDependency.js +7 -10
  229. package/lib/dependencies/HtmlSourceDependency.js +22 -14
  230. package/lib/dependencies/ImportContextDependency.js +2 -2
  231. package/lib/dependencies/ImportDependency.js +24 -20
  232. package/lib/dependencies/ImportEagerDependency.js +6 -9
  233. package/lib/dependencies/ImportMetaContextDependency.js +2 -2
  234. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +14 -13
  235. package/lib/dependencies/ImportMetaContextPlugin.js +7 -3
  236. package/lib/dependencies/ImportMetaGlobDependency.js +2 -2
  237. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +2 -3
  238. package/lib/dependencies/ImportMetaGlobHelpers.js +19 -22
  239. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -1
  240. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -1
  241. package/lib/dependencies/ImportMetaPlugin.js +154 -71
  242. package/lib/dependencies/ImportMetaResolveDependency.js +3 -4
  243. package/lib/dependencies/ImportParserPlugin.js +49 -35
  244. package/lib/dependencies/ImportPhase.js +12 -5
  245. package/lib/dependencies/ImportPlugin.js +7 -3
  246. package/lib/dependencies/ImportWeakDependency.js +6 -9
  247. package/lib/dependencies/JsonExportsDependency.js +11 -7
  248. package/lib/dependencies/LoaderDependency.js +2 -2
  249. package/lib/dependencies/LoaderImportDependency.js +2 -2
  250. package/lib/dependencies/LoaderPlugin.js +11 -7
  251. package/lib/dependencies/LocalModuleDependency.js +5 -5
  252. package/lib/dependencies/LocalModulesHelpers.js +1 -1
  253. package/lib/dependencies/ModuleDecoratorDependency.js +6 -7
  254. package/lib/dependencies/ModuleDependency.js +9 -6
  255. package/lib/dependencies/ModuleDependencyTemplateAsId.js +4 -4
  256. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +3 -3
  257. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  258. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -1
  259. package/lib/dependencies/ModuleInitFragmentDependency.js +24 -10
  260. package/lib/dependencies/NullDependency.js +3 -3
  261. package/lib/dependencies/ProvidedDependency.js +14 -10
  262. package/lib/dependencies/PureExpressionDependency.js +9 -10
  263. package/lib/dependencies/RequireContextDependency.js +2 -2
  264. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -4
  265. package/lib/dependencies/RequireContextPlugin.js +8 -4
  266. package/lib/dependencies/RequireEnsureDependenciesBlock.js +2 -2
  267. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +5 -8
  268. package/lib/dependencies/RequireEnsureDependency.js +8 -7
  269. package/lib/dependencies/RequireEnsurePlugin.js +7 -3
  270. package/lib/dependencies/RequireHeaderDependency.js +51 -12
  271. package/lib/dependencies/RequireIncludeDependency.js +6 -6
  272. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +2 -3
  273. package/lib/dependencies/RequireIncludePlugin.js +7 -3
  274. package/lib/dependencies/RequireJsStuffPlugin.js +7 -3
  275. package/lib/dependencies/RequireResolveContextDependency.js +2 -2
  276. package/lib/dependencies/RequireResolveDependency.js +4 -4
  277. package/lib/dependencies/RequireResolveHeaderDependency.js +4 -4
  278. package/lib/dependencies/RuntimeRequirementsDependency.js +5 -6
  279. package/lib/dependencies/StaticExportsDependency.js +2 -2
  280. package/lib/dependencies/SystemPlugin.js +10 -6
  281. package/lib/dependencies/SystemRuntimeModule.js +10 -0
  282. package/lib/dependencies/TopLevelAwaitDependency.js +11 -7
  283. package/lib/dependencies/URLContextDependency.js +2 -2
  284. package/lib/dependencies/URLDependency.js +110 -64
  285. package/lib/dependencies/URLPlugin.js +7 -3
  286. package/lib/dependencies/UnsupportedDependency.js +4 -4
  287. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -4
  288. package/lib/dependencies/WebAssemblyImportDependency.js +5 -5
  289. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -6
  290. package/lib/dependencies/WorkerAndWorkletPlugin.js +46 -28
  291. package/lib/dependencies/WorkerDependency.js +28 -22
  292. package/lib/dependencies/WorkletDependency.js +15 -14
  293. package/lib/dependencies/getFunctionExpression.js +8 -4
  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/DuplicateModulesWarning.js +45 -0
  316. package/lib/errors/DynamicExportsWarning.js +30 -0
  317. package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
  318. package/lib/errors/EntrypointOverlapWarning.js +45 -0
  319. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  320. package/lib/errors/EvalUsageWarning.js +28 -0
  321. package/lib/errors/HookWebpackError.js +5 -5
  322. package/lib/errors/HotspotsWarning.js +57 -0
  323. package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
  324. package/lib/errors/InlinedAssetsWarning.js +36 -0
  325. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  326. package/lib/errors/LargeModulesWarning.js +45 -0
  327. package/lib/errors/LegacyJavascriptWarning.js +48 -0
  328. package/lib/errors/MissingSideEffectsWarning.js +36 -0
  329. package/lib/errors/MixedExportsWarning.js +41 -0
  330. package/lib/errors/ModuleDependencyError.js +13 -16
  331. package/lib/errors/ModuleDependencyWarning.js +5 -15
  332. package/lib/errors/ModuleHashingError.js +1 -1
  333. package/lib/errors/ModuleNotFoundError.js +2 -2
  334. package/lib/errors/ModuleParseError.js +1 -2
  335. package/lib/errors/ModuleRestoreError.js +1 -1
  336. package/lib/errors/ModuleStoreError.js +1 -1
  337. package/lib/errors/NodeStuffInWebError.js +1 -1
  338. package/lib/errors/OsDependentRuleWarning.js +31 -0
  339. package/lib/errors/PureAnnotationsWarning.js +36 -0
  340. package/lib/errors/RedundantDynamicImportWarning.js +31 -0
  341. package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
  342. package/lib/errors/SplitChunksCappedWarning.js +41 -0
  343. package/lib/errors/TinyChunksWarning.js +40 -0
  344. package/lib/errors/TopLevelThisWarning.js +34 -0
  345. package/lib/errors/UnsplitVendorsWarning.js +42 -0
  346. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  347. package/lib/errors/UnusedAliasesWarning.js +29 -0
  348. package/lib/errors/UnusedDefinesWarning.js +29 -0
  349. package/lib/errors/UnusedExternalsWarning.js +29 -0
  350. package/lib/errors/UnusedReexportsWarning.js +42 -0
  351. package/lib/errors/UnusedRuleWarning.js +29 -0
  352. package/lib/errors/WebpackError.js +9 -5
  353. package/lib/errors/deriveStackFromNestedError.js +90 -0
  354. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  355. package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
  356. package/lib/esm/ModuleChunkLoadingPlugin.js +89 -51
  357. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +170 -71
  358. package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
  359. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  360. package/lib/hmr/LazyCompilationPlugin.js +45 -24
  361. package/lib/hmr/lazyCompilationBackend.js +28 -10
  362. package/lib/hmr/parserHooks.js +56 -0
  363. package/lib/html/HtmlGenerator.js +299 -79
  364. package/lib/html/HtmlModule.js +7 -3
  365. package/lib/html/HtmlModulesPlugin.js +312 -174
  366. package/lib/html/HtmlParser.js +31 -86
  367. package/lib/html/data.js +1928 -0
  368. package/lib/html/htmlMinify.js +288 -0
  369. package/lib/html/syntax.js +7819 -3331
  370. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
  371. package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
  372. package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
  373. package/lib/ids/HashedModuleIdsPlugin.js +6 -2
  374. package/lib/ids/IdHelpers.js +31 -18
  375. package/lib/ids/NamedChunkIdsPlugin.js +1 -1
  376. package/lib/ids/NamedModuleIdsPlugin.js +1 -1
  377. package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
  378. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  379. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
  380. package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
  381. package/lib/ids/SyncModuleIdsPlugin.js +4 -4
  382. package/lib/index.js +10 -0
  383. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
  384. package/lib/javascript/BasicEvaluatedExpression.js +18 -14
  385. package/lib/javascript/ChunkFormatHelpers.js +6 -6
  386. package/lib/javascript/ChunkHelpers.js +1 -1
  387. package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
  388. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  389. package/lib/javascript/JavascriptGenerator.js +65 -165
  390. package/lib/javascript/JavascriptModule.js +9 -3
  391. package/lib/javascript/JavascriptModulesPlugin.js +181 -162
  392. package/lib/javascript/JavascriptParser.js +291 -112
  393. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  394. package/lib/javascript/ScopeAnalyzer.js +1094 -0
  395. package/lib/javascript/StartupHelpers.js +55 -9
  396. package/lib/javascript/syntax.js +3403 -300
  397. package/lib/json/JsonData.js +8 -4
  398. package/lib/json/JsonGenerator.js +38 -16
  399. package/lib/json/JsonModule.js +7 -3
  400. package/lib/json/JsonModulesPlugin.js +1 -1
  401. package/lib/json/JsonParser.js +5 -6
  402. package/lib/library/AbstractLibraryPlugin.js +20 -14
  403. package/lib/library/AmdLibraryPlugin.js +11 -7
  404. package/lib/library/AssignLibraryPlugin.js +19 -13
  405. package/lib/library/EnableLibraryPlugin.js +2 -2
  406. package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
  407. package/lib/library/JsonpLibraryPlugin.js +11 -7
  408. package/lib/library/ModuleLibraryPlugin.js +256 -64
  409. package/lib/library/SystemLibraryPlugin.js +12 -8
  410. package/lib/library/UmdLibraryPlugin.js +62 -25
  411. package/lib/loaders/LoaderRunner.js +14 -1
  412. package/lib/loaders/loadLoader.js +8 -4
  413. package/lib/logging/createConsoleLogger.js +7 -4
  414. package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
  415. package/lib/node/NodeEnvironmentPlugin.js +17 -3
  416. package/lib/node/NodeSourcePlugin.js +1 -1
  417. package/lib/node/NodeTargetPlugin.js +4 -3
  418. package/lib/node/NodeTemplatePlugin.js +1 -1
  419. package/lib/node/NodeWatchFileSystem.js +70 -9
  420. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
  421. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +81 -20
  422. package/lib/node/ReadFileCompileWasmPlugin.js +37 -17
  423. package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
  424. package/lib/node/nodeConsole.js +7 -3
  425. package/lib/optimize/AggressiveMergingPlugin.js +21 -17
  426. package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
  427. package/lib/optimize/ConcatenatedModule.js +996 -477
  428. package/lib/optimize/ConstExportsPlugin.js +11 -7
  429. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  430. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
  431. package/lib/optimize/InlineExports.js +9 -5
  432. package/lib/optimize/InnerGraph.js +28 -12
  433. package/lib/optimize/InnerGraphPlugin.js +23 -18
  434. package/lib/optimize/LimitChunkCountPlugin.js +7 -3
  435. package/lib/optimize/MangleExportsPlugin.js +7 -8
  436. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
  437. package/lib/optimize/MinChunkSizePlugin.js +7 -3
  438. package/lib/optimize/ModuleConcatenationPlugin.js +124 -59
  439. package/lib/optimize/RealContentHashPlugin.js +20 -13
  440. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  441. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  442. package/lib/optimize/RuntimeChunkPlugin.js +2 -2
  443. package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
  444. package/lib/optimize/SplitChunksPlugin.js +232 -68
  445. package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
  446. package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
  447. package/lib/performance/BroadContextsPlugin.js +142 -0
  448. package/lib/performance/CacheEffectivenessPlugin.js +125 -0
  449. package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
  450. package/lib/performance/DuplicateModulesPlugin.js +93 -0
  451. package/lib/performance/DuplicatePackagesPlugin.js +119 -0
  452. package/lib/performance/DuplicatePackagesWarning.js +84 -0
  453. package/lib/performance/DynamicExportsPlugin.js +120 -0
  454. package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
  455. package/lib/performance/EntrypointOverlapPlugin.js +122 -0
  456. package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
  457. package/lib/performance/EvalUsagePlugin.js +115 -0
  458. package/lib/performance/HotspotsPlugin.js +296 -0
  459. package/lib/performance/InlinedAssetsPlugin.js +99 -0
  460. package/lib/performance/LargeModulesPlugin.js +126 -0
  461. package/lib/performance/LegacyJavascriptPlugin.js +139 -0
  462. package/lib/performance/MissingSideEffectsPlugin.js +138 -0
  463. package/lib/performance/MixedExportsPlugin.js +136 -0
  464. package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
  465. package/lib/performance/PureAnnotationsPlugin.js +219 -0
  466. package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
  467. package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
  468. package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
  469. package/lib/performance/SizeLimitsPlugin.js +139 -7
  470. package/lib/performance/SplitChunksCappedPlugin.js +99 -0
  471. package/lib/performance/TinyChunksPlugin.js +128 -0
  472. package/lib/performance/TopLevelThisPlugin.js +208 -0
  473. package/lib/performance/UnsplitVendorsPlugin.js +112 -0
  474. package/lib/performance/UnusedAliasesPlugin.js +253 -0
  475. package/lib/performance/UnusedDefinesPlugin.js +87 -0
  476. package/lib/performance/UnusedExternalsPlugin.js +110 -0
  477. package/lib/performance/UnusedReexportsPlugin.js +159 -0
  478. package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
  479. package/lib/performance/getModuleSize.js +22 -0
  480. package/lib/performance/getSourceModules.js +22 -0
  481. package/lib/performance/hasOnlyUnusedExports.js +40 -0
  482. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
  483. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
  484. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
  485. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  486. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  487. package/lib/prefetch/ResourceHintPlugin.js +377 -136
  488. package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
  489. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
  490. package/lib/prefetch/parseResourceHintOptions.js +31 -4
  491. package/lib/rules/BasicEffectRulePlugin.js +2 -2
  492. package/lib/rules/BasicMatcherRulePlugin.js +8 -4
  493. package/lib/rules/GlobMatcherRulePlugin.js +68 -0
  494. package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
  495. package/lib/rules/RuleSetCompiler.js +146 -12
  496. package/lib/rules/UseEffectRulePlugin.js +18 -11
  497. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
  498. package/lib/runtime/AsyncModuleRuntimeModule.js +1 -1
  499. package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
  500. package/lib/runtime/BaseUriRuntimeModule.js +33 -7
  501. package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
  502. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
  503. package/lib/runtime/CompatRuntimeModule.js +5 -3
  504. package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
  505. package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
  506. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
  507. package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
  508. package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
  509. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
  510. package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
  511. package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
  512. package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
  513. package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
  514. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
  515. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
  516. package/lib/runtime/GlobalRuntimeModule.js +18 -0
  517. package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
  518. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  519. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +23 -6
  520. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
  521. package/lib/runtime/NonceRuntimeModule.js +10 -0
  522. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
  523. package/lib/runtime/PublicPathRuntimeModule.js +12 -2
  524. package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
  525. package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
  526. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
  527. package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
  528. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
  529. package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
  530. package/lib/runtime/SystemContextRuntimeModule.js +10 -0
  531. package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
  532. package/lib/runtime/WorkerRuntimeModule.js +11 -1
  533. package/lib/runtime/baseUri.js +63 -0
  534. package/lib/schemes/DataUriPlugin.js +1 -1
  535. package/lib/schemes/FileUriPlugin.js +1 -1
  536. package/lib/schemes/HttpUriPlugin.js +24 -15
  537. package/lib/schemes/VirtualUrlPlugin.js +13 -7
  538. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  539. package/lib/serialization/BinaryMiddleware.js +274 -942
  540. package/lib/serialization/ErrorObjectSerializer.js +1 -1
  541. package/lib/serialization/FileMiddleware.js +305 -66
  542. package/lib/serialization/ObjectMiddleware.js +139 -114
  543. package/lib/serialization/PlainObjectSerializer.js +19 -16
  544. package/lib/sharing/ConsumeSharedModule.js +30 -21
  545. package/lib/sharing/ConsumeSharedPlugin.js +18 -10
  546. package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
  547. package/lib/sharing/ProvideSharedModule.js +25 -16
  548. package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
  549. package/lib/sharing/ProvideSharedPlugin.js +8 -4
  550. package/lib/sharing/SharePlugin.js +17 -5
  551. package/lib/sharing/ShareRuntimeModule.js +4 -4
  552. package/lib/sharing/resolveMatchedConfigs.js +9 -6
  553. package/lib/sharing/utils.js +1 -3
  554. package/lib/stats/DefaultStatsFactoryPlugin.js +253 -226
  555. package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
  556. package/lib/stats/DefaultStatsPrinterPlugin.js +60 -192
  557. package/lib/stats/StatsFactory.js +56 -35
  558. package/lib/stats/StatsPrinter.js +16 -12
  559. package/lib/typescript/TypeScriptPlugin.js +12 -14
  560. package/lib/url/URLParserPlugin.js +26 -13
  561. package/lib/util/AsyncQueue.js +4 -3
  562. package/lib/util/Hash.js +5 -1
  563. package/lib/util/LazySet.js +35 -22
  564. package/lib/util/LocConverter.js +36 -13
  565. package/lib/util/SourceProcessor.js +1050 -24
  566. package/lib/util/StringXor.js +1 -1
  567. package/lib/util/chainedImports.js +9 -5
  568. package/lib/util/cleverMerge.js +1 -1
  569. package/lib/util/comparators.js +45 -14
  570. package/lib/util/concatenate.js +203 -77
  571. package/lib/util/conventions.js +5 -1
  572. package/lib/util/createHash.js +2 -2
  573. package/lib/util/createHooksRegistry.js +8 -10
  574. package/lib/util/dataURL.js +225 -1
  575. package/lib/util/extractSourceMap.js +4 -3
  576. package/lib/util/findCaseMismatch.js +139 -0
  577. package/lib/util/formatLocation.js +1 -2
  578. package/lib/util/fs.js +22 -5
  579. package/lib/util/globUtils.js +298 -24
  580. package/lib/util/hash/BatchedHash.js +5 -1
  581. package/lib/util/hash/BulkUpdateHash.js +5 -1
  582. package/lib/util/hash/DebugHash.js +5 -1
  583. package/lib/util/hash/hash-digest.js +6 -2
  584. package/lib/util/identifier.js +25 -1
  585. package/lib/util/implicitTypeLoaderFallback.js +1 -1
  586. package/lib/util/internalSerializables.js +6 -0
  587. package/lib/util/lazyModule.js +56 -0
  588. package/lib/util/makeSerializable.js +7 -3
  589. package/lib/util/matchAlias.js +25 -0
  590. package/lib/util/mimeTypes.js +11 -5
  591. package/lib/util/nonNumericOnlyHash.js +4 -3
  592. package/lib/util/parseJson.js +5 -3
  593. package/lib/util/preloadModuleType.js +32 -0
  594. package/lib/util/registerExternalSerializer.js +7 -5
  595. package/lib/util/runtime.js +2 -2
  596. package/lib/util/semver.js +1 -1
  597. package/lib/util/serialization.js +28 -28
  598. package/lib/util/source.js +2 -2
  599. package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
  600. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
  601. package/lib/wasm/wasmModuleFilename.js +54 -0
  602. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +41 -21
  603. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +43 -21
  604. package/lib/wasm-async/AsyncWasmModule.js +3 -3
  605. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
  606. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
  607. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
  608. package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
  609. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +34 -8
  610. package/lib/wasm-sync/SyncWasmModule.js +2 -2
  611. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
  612. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
  613. package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
  614. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
  615. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
  616. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
  617. package/lib/wasm-sync/WebAssemblyParser.js +4 -6
  618. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  619. package/lib/web/FetchCompileAsyncWasmPlugin.js +101 -19
  620. package/lib/web/FetchCompileWasmPlugin.js +46 -16
  621. package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
  622. package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
  623. package/lib/web/JsonpTemplatePlugin.js +2 -2
  624. package/lib/webpack.js +22 -11
  625. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
  626. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
  627. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  628. package/module.d.ts +1 -0
  629. package/package.json +37 -30
  630. package/schemas/WebpackOptions.check.js +1 -1
  631. package/schemas/WebpackOptions.json +780 -91
  632. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  633. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  634. package/schemas/plugins/container/ContainerPlugin.json +10 -0
  635. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  636. package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
  637. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  638. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  639. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  640. package/types.d.ts +4013 -738
  641. package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
@@ -0,0 +1,296 @@
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 NormalModule = require("../NormalModule");
9
+ const HotspotsWarning = require("../errors/HotspotsWarning");
10
+ const { LOADER_TIMING } = require("../loaders/LoaderRunner");
11
+ const { compareStrings } = require("../util/comparators");
12
+ const { contextify } = require("../util/identifier");
13
+
14
+ /** @typedef {import("tapable").FullTap} FullTap */
15
+ /** @typedef {import("../../declarations/WebpackOptions").PerformanceOptions} PerformanceOptions */
16
+ /** @typedef {import("../Compiler")} Compiler */
17
+ /** @typedef {import("../errors/HotspotsWarning").HookDetails} HookDetails */
18
+ /** @typedef {import("../errors/HotspotsWarning").HotspotDetails} HotspotDetails */
19
+
20
+ const PLUGIN_NAME = "HotspotsPlugin";
21
+
22
+ // Enough to name the offenders without listing the whole build.
23
+ const MAX_REPORTED_HOTSPOTS = 5;
24
+ const MAX_REPORTED_HOOKS = 3;
25
+
26
+ // Below this nothing is waiting on it, and naming it would bury what is.
27
+ const MIN_REPORTED_MS = 100;
28
+
29
+ // Ahead of every other `compilation` tap: the counters are reset there, and
30
+ // anything measured before that reset would be thrown away by it.
31
+ const INTERCEPT_STAGE = -10000;
32
+
33
+ const NS_PER_MS = 1e6;
34
+ const MS_PER_SECOND = 1000;
35
+
36
+ /**
37
+ * @param {[number, number]} start what `process.hrtime()` returned
38
+ * @returns {number} milliseconds since then
39
+ */
40
+ const msSince = (start) => {
41
+ const [seconds, nanoseconds] = process.hrtime(start);
42
+
43
+ return seconds * MS_PER_SECOND + nanoseconds / NS_PER_MS;
44
+ };
45
+
46
+ /**
47
+ * @param {Map<string, { ms: number, runs: number }>} map where the time is kept
48
+ * @param {string} key what ran
49
+ * @param {number} ms how long its own code took
50
+ * @returns {void}
51
+ */
52
+ const charge = (map, key, ms) => {
53
+ const spent = map.get(key);
54
+
55
+ if (spent === undefined) {
56
+ map.set(key, { ms, runs: 1 });
57
+ return;
58
+ }
59
+
60
+ spent.ms += ms;
61
+ spent.runs++;
62
+ };
63
+
64
+ class HotspotsPlugin {
65
+ /**
66
+ * Creates an instance of HotspotsPlugin.
67
+ * @param {PerformanceOptions} options the plugin options
68
+ */
69
+ constructor(options) {
70
+ /** @type {PerformanceOptions["hints"]} */
71
+ this.hints = options.hints;
72
+ }
73
+
74
+ /**
75
+ * Applies the plugin by registering its hooks on the compiler.
76
+ * @param {Compiler} compiler the compiler instance
77
+ * @returns {void}
78
+ */
79
+ apply(compiler) {
80
+ const hints = this.hints;
81
+
82
+ if (!hints) return;
83
+
84
+ /** @typedef {{ ms: number, runs: number }} Spent */
85
+ // Kept per kind: a loader and a plugin could otherwise share a name and
86
+ // have their runs counted together.
87
+ /** @type {Map<string, Spent>} */
88
+ const pluginTime = new Map();
89
+ /** @type {Map<string, Spent>} */
90
+ const loaderTime = new Map();
91
+ /** @type {Map<string, number>} */
92
+ const hookTime = new Map();
93
+ // One frame per thing currently running, innermost last. Only the innermost
94
+ // is charged, so whatever calls out to something else is not billed for it.
95
+ /** @type {{ child: number }[]} */
96
+ const running = [];
97
+
98
+ /**
99
+ * Runs one loader or tap, charging it its own work alone.
100
+ * @template T
101
+ * @param {Map<string, { ms: number, runs: number }>} map where its time is kept
102
+ * @param {string} name what is running
103
+ * @param {string | undefined} hookName the hook it runs under, if any
104
+ * @param {() => T} run the work, already bound to its arguments
105
+ * @returns {T} whatever it returned
106
+ */
107
+ const measure = (map, name, hookName, run) => {
108
+ const frame = { child: 0 };
109
+
110
+ running.push(frame);
111
+
112
+ const start = process.hrtime();
113
+
114
+ try {
115
+ return run();
116
+ } finally {
117
+ const elapsed = msSince(start);
118
+ const own = elapsed - frame.child;
119
+
120
+ running.pop();
121
+ charge(map, name, own);
122
+
123
+ if (hookName !== undefined) {
124
+ hookTime.set(hookName, (hookTime.get(hookName) || 0) + own);
125
+ }
126
+
127
+ if (running.length > 0) {
128
+ running[running.length - 1].child += elapsed;
129
+ }
130
+ }
131
+ };
132
+
133
+ /**
134
+ * @param {string} hookName the hook being tapped
135
+ * @returns {(tapInfo: FullTap) => FullTap} an interceptor for it
136
+ */
137
+ const registerFor = (hookName) => (tapInfo) => {
138
+ const { name, type, fn } = tapInfo;
139
+
140
+ if (name === PLUGIN_NAME) return tapInfo;
141
+
142
+ if (type === "async") {
143
+ return {
144
+ ...tapInfo,
145
+ /**
146
+ * @param {EXPECTED_ANY[]} args the tap's arguments, callback last
147
+ * @returns {EXPECTED_ANY} whatever the tap returned
148
+ */
149
+ fn: (...args) => {
150
+ const callback = args.pop();
151
+
152
+ /**
153
+ * @param {EXPECTED_ANY[]} result what the tap reported
154
+ * @returns {EXPECTED_ANY} whatever the callback returned
155
+ */
156
+ const finish = (...result) =>
157
+ measure(pluginTime, name, hookName, () => callback(...result));
158
+
159
+ // The completion callback is the plugin's own code as well, so it
160
+ // is charged to the plugin rather than to whoever resumed it.
161
+ return measure(pluginTime, name, hookName, () =>
162
+ /** @type {EXPECTED_FUNCTION} */ (fn)(...args, finish)
163
+ );
164
+ }
165
+ };
166
+ }
167
+
168
+ return {
169
+ ...tapInfo,
170
+ /**
171
+ * @param {EXPECTED_ANY[]} args the tap's arguments
172
+ * @returns {EXPECTED_ANY} whatever the tap returned
173
+ */
174
+ fn: (...args) =>
175
+ measure(pluginTime, name, hookName, () =>
176
+ /** @type {EXPECTED_FUNCTION} */ (fn)(...args)
177
+ )
178
+ };
179
+ };
180
+
181
+ /**
182
+ * @param {EXPECTED_ANY} instance anything carrying tapable hooks
183
+ * @returns {void}
184
+ */
185
+ const interceptAll = (instance) => {
186
+ for (const hookName of Object.keys(instance.hooks)) {
187
+ const descriptor = Object.getOwnPropertyDescriptor(
188
+ instance.hooks,
189
+ hookName
190
+ );
191
+
192
+ // A hook kept only as an alias for one that moved is an accessor, and
193
+ // reading it is what prints the deprecation — so it is never read.
194
+ if (!descriptor || descriptor.get) continue;
195
+
196
+ const hook = descriptor.value;
197
+
198
+ // A deprecated hook kept as a stand-in throws when intercepted.
199
+ if (hook && !hook._fakeHook && typeof hook.intercept === "function") {
200
+ hook.intercept({ register: registerFor(hookName) });
201
+ }
202
+ }
203
+ };
204
+
205
+ interceptAll(compiler);
206
+
207
+ compiler.hooks.compilation.tap(
208
+ { name: PLUGIN_NAME, stage: INTERCEPT_STAGE },
209
+ (compilation, { normalModuleFactory, contextModuleFactory }) => {
210
+ // Each build reports its own time. Watching keeps the compiler, so
211
+ // without this every rebuild would add to the one before it.
212
+ pluginTime.clear();
213
+ loaderTime.clear();
214
+ hookTime.clear();
215
+ running.length = 0;
216
+
217
+ interceptAll(compilation);
218
+ interceptAll(normalModuleFactory);
219
+ interceptAll(contextModuleFactory);
220
+
221
+ const context = compiler.context;
222
+
223
+ // Loaders are not taps, so they are measured where they run instead.
224
+ NormalModule.getCompilationHooks(compilation).loader.tap(
225
+ PLUGIN_NAME,
226
+ (loaderContext) => {
227
+ /** @type {EXPECTED_ANY} */
228
+ (loaderContext)[LOADER_TIMING] =
229
+ /**
230
+ * @param {{ path: string }} loader the loader about to run
231
+ * @param {() => EXPECTED_ANY} run its own execution
232
+ * @returns {EXPECTED_ANY} whatever it returned
233
+ */
234
+ (loader, run) =>
235
+ measure(
236
+ loaderTime,
237
+ contextify(context, loader.path, compiler.root),
238
+ undefined,
239
+ run
240
+ );
241
+ }
242
+ );
243
+ }
244
+ );
245
+
246
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
247
+ // `afterSeal` is past the hash, which folds every message into it — a
248
+ // hint reported earlier would change the build's identity.
249
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
250
+ /** @type {HotspotDetails[]} */
251
+ const hotspots = [];
252
+
253
+ // Loaders and plugins never name the same thing, so one ranking over
254
+ // both double counts nothing.
255
+ for (const [kind, map] of /** @type {const} */ ([
256
+ ["loader", loaderTime],
257
+ ["plugin", pluginTime]
258
+ ])) {
259
+ for (const [name, spent] of map) {
260
+ if (spent.ms < MIN_REPORTED_MS) continue;
261
+
262
+ hotspots.push({ kind, name, ms: spent.ms, runs: spent.runs });
263
+ }
264
+ }
265
+
266
+ if (hotspots.length === 0) return;
267
+
268
+ // Ties break by name, though two rarely take the same time.
269
+ hotspots.sort((a, b) => b.ms - a.ms || compareStrings(a.name, b.name));
270
+
271
+ /** @type {HookDetails[]} */
272
+ const hooks = [...hookTime]
273
+ .filter(([, ms]) => ms >= MIN_REPORTED_MS)
274
+ .map(([name, ms]) => ({ name, ms }))
275
+ .sort((a, b) => b.ms - a.ms || compareStrings(a.name, b.name))
276
+ .slice(0, MAX_REPORTED_HOOKS);
277
+
278
+ const warning = new HotspotsWarning(
279
+ hotspots.slice(0, MAX_REPORTED_HOTSPOTS),
280
+ hotspots.length,
281
+ hooks
282
+ );
283
+
284
+ if (hints === "error") {
285
+ compilation.errors.push(warning);
286
+ } else if (hints === "stats") {
287
+ compilation.hints.push(warning);
288
+ } else {
289
+ compilation.warnings.push(warning);
290
+ }
291
+ });
292
+ });
293
+ }
294
+ }
295
+
296
+ module.exports = HotspotsPlugin;
@@ -0,0 +1,99 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const InlinedAssetsWarning = require("../errors/InlinedAssetsWarning");
9
+ const { compareStrings } = require("../util/comparators");
10
+ const getModuleSize = require("./getModuleSize");
11
+
12
+ /** @import { AssetModuleBuildInfo } from "../asset/AssetModule" */
13
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
14
+ /** @import Compiler from "../Compiler" */
15
+ /** @import { InlinedAssetDetails } from "../errors/InlinedAssetsWarning" */
16
+
17
+ const PLUGIN_NAME = "InlinedAssetsPlugin";
18
+
19
+ // Enough to name the offenders without listing every icon.
20
+ const MAX_REPORTED_ASSETS = 5;
21
+
22
+ // What the asset modules default `dataUrlCondition.maxSize` is: below it,
23
+ // inlining saves a request for less than it costs in bytes.
24
+ const DEFAULT_MAX_SIZE = 8096;
25
+
26
+ class InlinedAssetsPlugin {
27
+ /**
28
+ * Creates an instance of InlinedAssetsPlugin.
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
+ // `afterSeal` is past the hash, which folds every message into it — a
48
+ // hint reported earlier would change the build's identity.
49
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
50
+ /** @type {InlinedAssetDetails[]} */
51
+ const assets = [];
52
+ let total = 0;
53
+
54
+ for (const module of compilation.modules) {
55
+ // The parser records whether it inlined, so this asks rather than
56
+ // deciding from the module's type what it must have done.
57
+ const buildInfo =
58
+ /** @type {AssetModuleBuildInfo} */
59
+ (module.buildInfo);
60
+
61
+ if (!buildInfo.dataUrl) continue;
62
+
63
+ // Module sizes are estimates and come back fractional.
64
+ const size = Math.round(getModuleSize(module));
65
+
66
+ if (size <= DEFAULT_MAX_SIZE) continue;
67
+
68
+ total += size;
69
+ assets.push({
70
+ name: module.readableIdentifier(compilation.requestShortener),
71
+ size
72
+ });
73
+ }
74
+
75
+ if (assets.length === 0) return;
76
+
77
+ // Largest first; ties break by name, module order is not stable.
78
+ assets.sort(
79
+ (a, b) => b.size - a.size || compareStrings(a.name, b.name)
80
+ );
81
+
82
+ const warning = new InlinedAssetsWarning(
83
+ assets.slice(0, MAX_REPORTED_ASSETS),
84
+ total
85
+ );
86
+
87
+ if (hints === "error") {
88
+ compilation.errors.push(warning);
89
+ } else if (hints === "stats") {
90
+ compilation.hints.push(warning);
91
+ } else {
92
+ compilation.warnings.push(warning);
93
+ }
94
+ });
95
+ });
96
+ }
97
+ }
98
+
99
+ module.exports = InlinedAssetsPlugin;
@@ -0,0 +1,126 @@
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 LargeModulesWarning = require("../errors/LargeModulesWarning");
9
+ const { compareStrings } = require("../util/comparators");
10
+ const getModuleSize = require("./getModuleSize");
11
+ const getSourceModules = require("./getSourceModules");
12
+
13
+ /** @typedef {import("../../declarations/WebpackOptions").PerformanceOptions} PerformanceOptions */
14
+ /** @typedef {import("../Compiler")} Compiler */
15
+ /** @typedef {import("../Module")} Module */
16
+ /** @typedef {import("../errors/LargeModulesWarning").LargeModuleDetails} LargeModuleDetails */
17
+
18
+ const PLUGIN_NAME = "LargeModulesPlugin";
19
+
20
+ // Enough to name the offenders without listing the module graph.
21
+ const MAX_REPORTED_MODULES = 5;
22
+
23
+ // Half of a chunk in a single module is where the chunk really is that module.
24
+ // Below it the weight is spread around and there is nothing single to act on.
25
+ const DOMINANT_SHARE = 0.5;
26
+
27
+ // Scaled to the asset budget rather than fixed, so raising `maxAssetSize`
28
+ // raises what counts as big enough to be worth naming.
29
+ const MIN_SHARE_OF_ASSET_LIMIT = 0.2;
30
+
31
+ class LargeModulesPlugin {
32
+ /**
33
+ * Creates an instance of LargeModulesPlugin.
34
+ * @param {PerformanceOptions} options the plugin options
35
+ */
36
+ constructor(options) {
37
+ /** @type {PerformanceOptions["hints"]} */
38
+ this.hints = options.hints;
39
+ /** @type {PerformanceOptions["maxAssetSize"]} */
40
+ this.maxAssetSize = options.maxAssetSize;
41
+ }
42
+
43
+ /**
44
+ * Applies the plugin by registering its hooks on the compiler.
45
+ * @param {Compiler} compiler the compiler instance
46
+ * @returns {void}
47
+ */
48
+ apply(compiler) {
49
+ const hints = this.hints;
50
+
51
+ if (!hints) return;
52
+
53
+ const minSize =
54
+ /** @type {number} */ (this.maxAssetSize) * MIN_SHARE_OF_ASSET_LIMIT;
55
+
56
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
57
+ // `afterSeal` is past the hash, which folds every message into it — a
58
+ // hint reported earlier would change the build's identity.
59
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
60
+ const { chunkGraph, requestShortener } = compilation;
61
+ /** @type {Map<Module, LargeModuleDetails>} */
62
+ const worst = new Map();
63
+
64
+ for (const chunk of compilation.chunks) {
65
+ const chunkName = chunk.name || `${chunk.id}`;
66
+ /** @type {Map<Module, number>} */
67
+ const sizes = new Map();
68
+ let chunkSize = 0;
69
+
70
+ for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
71
+ // Through scope hoisting one module stands for the several it
72
+ // absorbed, and it is those the report has to name.
73
+ for (const inner of getSourceModules(module)) {
74
+ const size = getModuleSize(inner);
75
+
76
+ sizes.set(inner, (sizes.get(inner) || 0) + size);
77
+ chunkSize += size;
78
+ }
79
+ }
80
+
81
+ for (const [module, size] of sizes) {
82
+ if (size < minSize) continue;
83
+ if (size < chunkSize * DOMINANT_SHARE) continue;
84
+
85
+ const previous = worst.get(module);
86
+
87
+ // A module weighs the same in every chunk holding it, so the one
88
+ // named is the first by name — chunk order is not stable.
89
+ if (previous && compareStrings(previous.chunk, chunkName) <= 0) {
90
+ continue;
91
+ }
92
+
93
+ worst.set(module, {
94
+ name: module.readableIdentifier(requestShortener),
95
+ chunk: chunkName,
96
+ size,
97
+ chunkSize
98
+ });
99
+ }
100
+ }
101
+
102
+ if (worst.size === 0) return;
103
+
104
+ const large = [...worst.values()];
105
+
106
+ // Ties break by name: chunk iteration order is not stable.
107
+ large.sort((a, b) => b.size - a.size || compareStrings(a.name, b.name));
108
+
109
+ const warning = new LargeModulesWarning(
110
+ large.slice(0, MAX_REPORTED_MODULES),
111
+ large.length
112
+ );
113
+
114
+ if (hints === "error") {
115
+ compilation.errors.push(warning);
116
+ } else if (hints === "stats") {
117
+ compilation.hints.push(warning);
118
+ } else {
119
+ compilation.warnings.push(warning);
120
+ }
121
+ });
122
+ });
123
+ }
124
+ }
125
+
126
+ module.exports = LargeModulesPlugin;
@@ -0,0 +1,139 @@
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 LegacyJavascriptWarning = require("../errors/LegacyJavascriptWarning");
9
+ const { compareStrings } = require("../util/comparators");
10
+ const { WINDOWS_PATH_SEPARATOR_REGEXP } = require("../util/identifier");
11
+ const getModuleSize = require("./getModuleSize");
12
+ const getSourceModules = require("./getSourceModules");
13
+
14
+ /** @import { Environment, PerformanceOptions } from "../../declarations/WebpackOptions" */
15
+ /** @import Compiler from "../Compiler" */
16
+ /** @import { LegacyPackageDetails } from "../errors/LegacyJavascriptWarning" */
17
+
18
+ const PLUGIN_NAME = "LegacyJavascriptPlugin";
19
+
20
+ // Packages that exist to emulate syntax. `core-js` is absent on purpose: it
21
+ // polyfills APIs, which `output.environment` says nothing about.
22
+ const EMULATING_PACKAGES = ["regenerator-runtime", "@babel/runtime"];
23
+
24
+ // The syntax the report leans on: each is what one of those packages exists to
25
+ // lower, so a target with all of them needs none of the lowering.
26
+ /** @type {(keyof Environment)[]} */
27
+ const NATIVE_FEATURES = [
28
+ "arrowFunction",
29
+ "asyncFunction",
30
+ "const",
31
+ "destructuring",
32
+ "forOf",
33
+ "generator",
34
+ "templateLiteral"
35
+ ];
36
+
37
+ /**
38
+ * The emulating package a module belongs to, if it is in one.
39
+ * @param {string} resource the module's path
40
+ * @returns {string | undefined} the package, or undefined when it is not one
41
+ */
42
+ const emulatingPackage = (resource) => {
43
+ // Separators normalized so one check serves both platforms, and matched
44
+ // against the path so an alias or re-export is still recognized.
45
+ const path = resource.replace(WINDOWS_PATH_SEPARATOR_REGEXP, "/");
46
+
47
+ for (const name of EMULATING_PACKAGES) {
48
+ if (path.includes(`node_modules/${name}/`)) return name;
49
+ }
50
+
51
+ return undefined;
52
+ };
53
+
54
+ class LegacyJavascriptPlugin {
55
+ /**
56
+ * Creates an instance of LegacyJavascriptPlugin.
57
+ * @param {PerformanceOptions} options the plugin options
58
+ */
59
+ constructor(options) {
60
+ /** @type {PerformanceOptions["hints"]} */
61
+ this.hints = options.hints;
62
+ }
63
+
64
+ /**
65
+ * Applies the plugin by registering its hooks on the compiler.
66
+ * @param {Compiler} compiler the compiler instance
67
+ * @returns {void}
68
+ */
69
+ apply(compiler) {
70
+ const hints = this.hints;
71
+
72
+ if (!hints) return;
73
+
74
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
75
+ // `afterSeal` is past the hash, which folds every message into it — a
76
+ // hint reported earlier would change the build's identity.
77
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
78
+ const environment = compilation.outputOptions.environment;
79
+
80
+ // Reported only when the target has every one of them: emulating a
81
+ // feature the target is missing is the polyfill doing its job.
82
+ for (const feature of NATIVE_FEATURES) {
83
+ if (!environment[feature]) return;
84
+ }
85
+
86
+ /** @type {Map<string, LegacyPackageDetails>} */
87
+ const found = new Map();
88
+ let totalSize = 0;
89
+
90
+ for (const module of compilation.modules) {
91
+ for (const inner of getSourceModules(module)) {
92
+ const resource = inner.nameForCondition();
93
+
94
+ if (!resource) continue;
95
+
96
+ const name = emulatingPackage(resource);
97
+
98
+ if (!name) continue;
99
+
100
+ const size = getModuleSize(inner);
101
+ const details = found.get(name);
102
+
103
+ totalSize += size;
104
+
105
+ if (details === undefined) {
106
+ found.set(name, { name, modules: 1, size });
107
+ } else {
108
+ details.modules++;
109
+ details.size += size;
110
+ }
111
+ }
112
+ }
113
+
114
+ if (found.size === 0) return;
115
+
116
+ // Ties break by name: module order is not stable across runs.
117
+ const packages = [...found.values()].sort(
118
+ (a, b) => b.size - a.size || compareStrings(a.name, b.name)
119
+ );
120
+
121
+ const warning = new LegacyJavascriptWarning(
122
+ packages,
123
+ totalSize,
124
+ NATIVE_FEATURES
125
+ );
126
+
127
+ if (hints === "error") {
128
+ compilation.errors.push(warning);
129
+ } else if (hints === "stats") {
130
+ compilation.hints.push(warning);
131
+ } else {
132
+ compilation.warnings.push(warning);
133
+ }
134
+ });
135
+ });
136
+ }
137
+ }
138
+
139
+ module.exports = LegacyJavascriptPlugin;