@depup/webpack 5.110.3-depup.0 → 5.111.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 (283) hide show
  1. package/README.md +7 -8
  2. package/changes.json +7 -11
  3. package/lib/APIPlugin.js +26 -11
  4. package/lib/AutomaticPrefetchPlugin.js +1 -1
  5. package/lib/Cache.js +8 -3
  6. package/lib/CacheFacade.js +1 -1
  7. package/lib/CircularModulesPlugin.js +157 -55
  8. package/lib/CleanPlugin.js +2 -2
  9. package/lib/CompatibilityPlugin.js +3 -4
  10. package/lib/Compilation.js +336 -337
  11. package/lib/Compiler.js +213 -51
  12. package/lib/ConstPlugin.js +16 -132
  13. package/lib/CopyPlugin.js +1054 -0
  14. package/lib/DefinePlugin.js +24 -8
  15. package/lib/DependencyTemplate.js +2 -1
  16. package/lib/DotenvPlugin.js +24 -28
  17. package/lib/ErrorHelpers.js +113 -0
  18. package/lib/ExportsInfo.js +20 -16
  19. package/lib/ExternalModule.js +47 -22
  20. package/lib/FileSystemInfo.js +17 -14
  21. package/lib/FlagDependencyExportsPlugin.js +53 -34
  22. package/lib/FlagDependencyUsagePlugin.js +9 -13
  23. package/lib/Generator.js +24 -2
  24. package/lib/HotModuleReplacementPlugin.js +55 -7
  25. package/lib/IgnorePlugin.js +1 -1
  26. package/lib/JavascriptMetaInfoPlugin.js +5 -3
  27. package/lib/LoaderOptionsPlugin.js +1 -1
  28. package/lib/MainTemplate.js +5 -1
  29. package/lib/Module.js +19 -10
  30. package/lib/ModuleGraph.js +6 -9
  31. package/lib/MultiCompiler.js +7 -17
  32. package/lib/MultiWatching.js +1 -1
  33. package/lib/NormalModule.js +135 -50
  34. package/lib/NormalModuleFactory.js +1 -1
  35. package/lib/RuntimeGlobals.js +21 -7
  36. package/lib/RuntimeModule.js +28 -12
  37. package/lib/RuntimePlugin.js +30 -3
  38. package/lib/RuntimeTemplate.js +813 -518
  39. package/lib/SourceMapDevToolPlugin.js +54 -104
  40. package/lib/TemplatedPathPlugin.js +16 -59
  41. package/lib/Watching.js +9 -0
  42. package/lib/WebpackOptionsApply.js +84 -91
  43. package/lib/asset/AssetBytesGenerator.js +7 -1
  44. package/lib/asset/AssetGenerator.js +50 -24
  45. package/lib/asset/AssetModule.js +3 -0
  46. package/lib/asset/AssetSourceGenerator.js +7 -1
  47. package/lib/asset/WebManifestParser.js +7 -5
  48. package/lib/buildChunkGraph.js +11 -15
  49. package/lib/cache/AddBuildDependenciesPlugin.js +33 -4
  50. package/lib/cache/IdleFileCachePlugin.js +2 -2
  51. package/lib/cache/MemoryCachePlugin.js +4 -4
  52. package/lib/cache/MemoryWithGcCachePlugin.js +7 -8
  53. package/lib/cache/PackFileCacheStrategy.js +17 -19
  54. package/lib/cache/getLazyHashedEtag.js +3 -5
  55. package/lib/config/browserslistTargetHandler.js +17 -4
  56. package/lib/config/defaults.js +138 -128
  57. package/lib/config/getClaimedAssetTypes.js +10 -11
  58. package/lib/config/normalization.js +82 -12
  59. package/lib/config/target.js +13 -4
  60. package/lib/container/ContainerReferencePlugin.js +6 -0
  61. package/lib/container/RemoteRuntimeModule.js +9 -0
  62. package/lib/container/declaredRemotes.js +39 -0
  63. package/lib/{ContextExclusionPlugin.js → context/ContextExclusionPlugin.js} +1 -1
  64. package/lib/{ContextModule.js → context/ContextModule.js} +54 -115
  65. package/lib/{ContextModuleFactory.js → context/ContextModuleFactory.js} +19 -21
  66. package/lib/{ContextReplacementPlugin.js → context/ContextReplacementPlugin.js} +4 -4
  67. package/lib/css/CssGenerator.js +27 -11
  68. package/lib/css/CssInjectStyleRuntimeModule.js +9 -0
  69. package/lib/css/CssLoadingRuntimeModule.js +94 -36
  70. package/lib/css/CssModule.js +1 -1
  71. package/lib/css/CssModulesPlugin.js +7 -6
  72. package/lib/css/CssParser.js +162 -31
  73. package/lib/css/CssServerStylesRuntimeModule.js +9 -0
  74. package/lib/css/cssMinify.js +43 -32
  75. package/lib/css/data.js +3514 -869
  76. package/lib/css/syntax.js +6370 -1220
  77. package/lib/debug/ProfilingPlugin.js +7 -4
  78. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +6 -3
  79. package/lib/dependencies/AMDRuntimeModules.js +18 -0
  80. package/lib/dependencies/CommonJsExportRequireDependency.js +13 -12
  81. package/lib/dependencies/CommonJsExportsParserPlugin.js +12 -13
  82. package/lib/dependencies/CommonJsImportsParserPlugin.js +5 -5
  83. package/lib/dependencies/CommonJsPlugin.js +19 -3
  84. package/lib/dependencies/CommonJsRequireDependency.js +14 -5
  85. package/lib/dependencies/CommonJsSelfReferenceDependency.js +2 -4
  86. package/lib/dependencies/ContextDependency.js +1 -1
  87. package/lib/dependencies/ContextDependencyHelpers.js +3 -9
  88. package/lib/dependencies/ContextElementDependency.js +1 -1
  89. package/lib/dependencies/CssIcssExportDependency.js +13 -9
  90. package/lib/dependencies/CssIcssImportDependency.js +3 -6
  91. package/lib/dependencies/CssUrlDependency.js +3 -5
  92. package/lib/dependencies/HarmonyCompatibilityDependency.js +67 -22
  93. package/lib/dependencies/HarmonyDetectionParserPlugin.js +3 -4
  94. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +10 -7
  95. package/lib/dependencies/HarmonyExportExpressionDependency.js +47 -33
  96. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +74 -17
  97. package/lib/dependencies/HarmonyExportInitFragment.js +110 -23
  98. package/lib/dependencies/HarmonyExportSpecifierDependency.js +25 -58
  99. package/lib/dependencies/HarmonyImportBareSideEffectDependency.js +59 -0
  100. package/lib/dependencies/HarmonyImportDependency.js +6 -1
  101. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +111 -17
  102. package/lib/dependencies/HarmonyImportSideEffectDependency.js +3 -4
  103. package/lib/dependencies/HarmonyImportSpecifierDependency.js +40 -3
  104. package/lib/dependencies/HarmonyModulesPlugin.js +20 -0
  105. package/lib/dependencies/HtmlEntryDependency.js +124 -102
  106. package/lib/dependencies/HtmlInlineScriptDependency.js +3 -4
  107. package/lib/dependencies/HtmlInlineStyleDependency.js +3 -4
  108. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +1 -1
  109. package/lib/dependencies/ImportMetaGlobHelpers.js +1 -1
  110. package/lib/dependencies/ImportMetaMainDependency.js +104 -0
  111. package/lib/dependencies/ImportMetaPlugin.js +67 -25
  112. package/lib/dependencies/ImportParserPlugin.js +1 -1
  113. package/lib/dependencies/LoaderPlugin.js +26 -1
  114. package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
  115. package/lib/dependencies/SystemRuntimeModule.js +9 -0
  116. package/lib/dependencies/URLContextDependency.js +1 -1
  117. package/lib/dependencies/URLDependency.js +6 -5
  118. package/lib/dependencies/WorkerAndWorkletPlugin.js +15 -21
  119. package/lib/dependencies/WorkerDependency.js +7 -7
  120. package/lib/dependencies/WorkletDependency.js +7 -11
  121. package/lib/dll/DelegatedModule.js +18 -1
  122. package/lib/dll/DllReferencePlugin.js +11 -8
  123. package/lib/dll/LibManifestPlugin.js +1 -1
  124. package/lib/errors/AnalyzableBailoutsWarning.js +41 -0
  125. package/lib/errors/DuplicateModulesWarning.js +12 -7
  126. package/lib/errors/EmptyCopyPatternWarning.js +26 -0
  127. package/lib/errors/ExternalStarReexportError.js +44 -0
  128. package/lib/errors/HookWebpackError.js +3 -2
  129. package/lib/errors/MissingSourceMapsWarning.js +36 -0
  130. package/lib/errors/ModuleParseError.js +2 -1
  131. package/lib/errors/UnusedAssetsWarning.js +36 -0
  132. package/lib/errors/UnusedFederationWarning.js +35 -0
  133. package/lib/errors/UnusedModulesWarning.js +38 -0
  134. package/lib/esm/ExportWebpackRequireRuntimeModule.js +9 -0
  135. package/lib/esm/ModuleChunkFormatPlugin.js +28 -3
  136. package/lib/esm/ModuleChunkLoadingPlugin.js +30 -11
  137. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +92 -60
  138. package/lib/hmr/HotModuleReplacement.runtime.js +8 -2
  139. package/lib/hmr/HotModuleReplacementRuntimeModule.js +9 -0
  140. package/lib/hmr/LazyCompilationPlugin.js +3 -5
  141. package/lib/html/HtmlGenerator.js +72 -87
  142. package/lib/html/HtmlModulesPlugin.js +418 -200
  143. package/lib/html/HtmlParser.js +110 -147
  144. package/lib/html/builtinEmbeddedRenderer.js +107 -0
  145. package/lib/html/data.js +142 -7
  146. package/lib/html/htmlMinify.js +92 -122
  147. package/lib/html/syntax.js +1618 -1391
  148. package/lib/ids/HashedModuleIdsPlugin.js +2 -1
  149. package/lib/index.js +49 -3
  150. package/lib/javascript/ChunkFormatHelpers.js +4 -3
  151. package/lib/javascript/JavascriptGenerator.js +8 -1
  152. package/lib/javascript/JavascriptModule.js +1 -0
  153. package/lib/javascript/JavascriptModulesPlugin.js +73 -72
  154. package/lib/javascript/JavascriptParser.js +1970 -900
  155. package/lib/javascript/StartupHelpers.js +27 -3
  156. package/lib/javascript/data.js +172 -0
  157. package/lib/javascript/grammar.js +5546 -0
  158. package/lib/javascript/parser.js +1500 -0
  159. package/lib/javascript/regexp.js +1762 -0
  160. package/lib/javascript/regexpData.js +51 -0
  161. package/lib/javascript/syntax.js +9061 -5262
  162. package/lib/json/JsonGenerator.js +7 -1
  163. package/lib/library/ModuleLibraryPlugin.js +171 -132
  164. package/lib/loaders/LoaderRunner.js +137 -9
  165. package/lib/node/NodeWatchFileSystem.js +3 -9
  166. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +22 -0
  167. package/lib/node/RequireChunkLoadingRuntimeModule.js +22 -0
  168. package/lib/optimize/AggressiveMergingPlugin.js +3 -5
  169. package/lib/optimize/ConcatenatedModule.js +178 -120
  170. package/lib/optimize/ConstExportsPlugin.js +50 -39
  171. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -11
  172. package/lib/optimize/InlineExports.js +20 -123
  173. package/lib/optimize/InnerGraphPlugin.js +7 -13
  174. package/lib/optimize/LimitChunkCountPlugin.js +5 -8
  175. package/lib/optimize/MangleExportsPlugin.js +13 -4
  176. package/lib/optimize/ModuleConcatenationPlugin.js +27 -5
  177. package/lib/optimize/RealContentHashPlugin.js +68 -9
  178. package/lib/optimize/SideEffectsFlagPlugin.js +24 -28
  179. package/lib/optimize/SplitChunksPlugin.js +2 -4
  180. package/lib/performance/AnalyzableBailoutsPlugin.js +115 -0
  181. package/lib/performance/BroadContextsPlugin.js +1 -1
  182. package/lib/performance/CacheEffectivenessPlugin.js +7 -7
  183. package/lib/performance/DuplicateModulesPlugin.js +57 -13
  184. package/lib/performance/EvalUsagePlugin.js +5 -2
  185. package/lib/performance/MissingSourceMapsPlugin.js +115 -0
  186. package/lib/performance/PureAnnotationsPlugin.js +6 -3
  187. package/lib/performance/SizeLimitsPlugin.js +2 -4
  188. package/lib/performance/TopLevelThisPlugin.js +5 -4
  189. package/lib/performance/UnusedAssetsPlugin.js +109 -0
  190. package/lib/performance/UnusedFederationPlugin.js +147 -0
  191. package/lib/performance/UnusedModulesPlugin.js +141 -0
  192. package/lib/performance/UnusedReexportsPlugin.js +1 -55
  193. package/lib/performance/isOnlyReexported.js +65 -0
  194. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +25 -5
  195. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +8 -8
  196. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +9 -0
  197. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +9 -0
  198. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +9 -0
  199. package/lib/prefetch/ResourceHintPlugin.js +18 -23
  200. package/lib/prefetch/ResourceHintRuntimeModule.js +9 -0
  201. package/lib/prefetch/StartupAssetHintRuntimeModule.js +16 -10
  202. package/lib/rules/RuleSetCompiler.js +211 -4
  203. package/lib/runtime/AsyncModuleRuntimeModule.js +98 -66
  204. package/lib/runtime/AutoPublicPathRuntimeModule.js +9 -0
  205. package/lib/runtime/BaseUriRuntimeModule.js +9 -0
  206. package/lib/runtime/ChunkNameRuntimeModule.js +9 -0
  207. package/lib/runtime/EnsureChunkRuntimeModule.js +35 -16
  208. package/lib/runtime/GetChunkFilenameRuntimeModule.js +12 -4
  209. package/lib/runtime/GetFullHashRuntimeModule.js +9 -0
  210. package/lib/runtime/GetMainFilenameRuntimeModule.js +9 -0
  211. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +9 -0
  212. package/lib/runtime/GlobalRuntimeModule.js +11 -4
  213. package/lib/runtime/HasOwnPropertyRuntimeModule.js +9 -0
  214. package/lib/runtime/HelperRuntimeModule.js +10 -0
  215. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +305 -224
  216. package/lib/runtime/NonceRuntimeModule.js +9 -0
  217. package/lib/runtime/OnChunksLoadedRuntimeModule.js +67 -20
  218. package/lib/runtime/PublicPathRuntimeModule.js +9 -0
  219. package/lib/runtime/RuntimeIdRuntimeModule.js +9 -0
  220. package/lib/runtime/SpecNamespaceObjectRuntimeModule.js +90 -0
  221. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +9 -0
  222. package/lib/runtime/StartupEntrypointRuntimeModule.js +9 -0
  223. package/lib/runtime/SystemContextRuntimeModule.js +9 -0
  224. package/lib/runtime/ToBinaryRuntimeModule.js +9 -0
  225. package/lib/schemes/DataUriPlugin.js +3 -6
  226. package/lib/schemes/VirtualUrlPlugin.js +1 -1
  227. package/lib/serialization/BinaryMiddleware.js +9 -9
  228. package/lib/serialization/FileMiddleware.js +16 -16
  229. package/lib/serialization/ObjectMiddleware.js +168 -139
  230. package/lib/sharing/ConsumeSharedPlugin.js +12 -0
  231. package/lib/sharing/ConsumeSharedRuntimeModule.js +11 -0
  232. package/lib/sharing/ShareRuntimeModule.js +9 -0
  233. package/lib/sharing/declaredShared.js +47 -0
  234. package/lib/stats/DefaultStatsFactoryPlugin.js +6 -5
  235. package/lib/stats/DefaultStatsPrinterPlugin.js +3 -0
  236. package/lib/typescript/TypeScriptPlugin.js +2 -3
  237. package/lib/url/URLParserPlugin.js +6 -8
  238. package/lib/util/LocConverter.js +4 -7
  239. package/lib/util/SourceProcessor.js +91 -91
  240. package/lib/util/async.js +292 -0
  241. package/lib/util/buildDiagnostics.js +69 -0
  242. package/lib/util/chainedImports.js +3 -4
  243. package/lib/util/concatenate.js +4 -4
  244. package/lib/util/createHooksRegistry.js +1 -2
  245. package/lib/util/dataURL.js +2 -3
  246. package/lib/util/deterministicGrouping.js +8 -13
  247. package/lib/util/findGraphRoots.js +6 -13
  248. package/lib/util/fs.js +27 -1
  249. package/lib/util/globUtils.js +1 -1
  250. package/lib/util/handlerKeys.js +40 -0
  251. package/lib/util/hash/wasm-hash.js +3 -4
  252. package/lib/util/identifier.js +20 -0
  253. package/lib/util/internalSerializables.js +5 -1
  254. package/lib/util/registerExternalSerializer.js +6 -45
  255. package/lib/util/semver.js +5 -3
  256. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +9 -0
  257. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +9 -0
  258. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -1
  259. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +5 -1
  260. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +12 -4
  261. package/lib/wasm-sync/WebAssemblyGenerator.js +6 -1
  262. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -1
  263. package/lib/wasm-sync/WebAssemblyUtils.js +2 -4
  264. package/lib/web/JsonpChunkLoadingRuntimeModule.js +36 -0
  265. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +19 -0
  266. package/package.json +55 -46
  267. package/schemas/WebpackOptions.check.js +1 -1
  268. package/schemas/WebpackOptions.json +379 -66
  269. package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -1
  270. package/schemas/plugins/ManifestPlugin.check.js +1 -1
  271. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  272. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  273. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  274. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  275. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  276. package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -1
  277. package/schemas/plugins/dll/DllReferencePlugin.check.js +1 -1
  278. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +1 -1
  279. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  280. package/types.d.ts +1723 -604
  281. package/lib/dependencies/ExportBindingInitFragment.js +0 -191
  282. package/lib/errors/EntrypointOverlapWarning.js +0 -45
  283. package/lib/performance/EntrypointOverlapPlugin.js +0 -122
@@ -15,6 +15,10 @@ const HarmonyExportImportedSpecifierDependency = require("../dependencies/Harmon
15
15
  const HarmonyImportDependency = require("../dependencies/HarmonyImportDependency");
16
16
  const HarmonyImportSpecifierDependency = require("../dependencies/HarmonyImportSpecifierDependency");
17
17
  const { ImportPhaseUtils } = require("../dependencies/ImportPhase");
18
+ const {
19
+ getBuildDiagnostics,
20
+ recordOptimizationBailout
21
+ } = require("../util/buildDiagnostics");
18
22
  const formatLocation = require("../util/formatLocation");
19
23
  const { dirname, join, readJson, relative } = require("../util/fs");
20
24
  const { getGlobToRegExpSource } = require("../util/globUtils");
@@ -35,7 +39,7 @@ const { CompilerHintNotationRegExp } = require("../util/magicComment");
35
39
  * } from "estree"
36
40
  */
37
41
  /** @import Compiler from "../Compiler" */
38
- /** @import Module, { BuildMeta } from "../Module" */
42
+ /** @import Module, { BuildMeta, BuildInfo } from "../Module" */
39
43
  /**
40
44
  * @import {
41
45
  * JavascriptModuleBuildInfo
@@ -546,14 +550,18 @@ class SideEffectsFlagPlugin {
546
550
  } else {
547
551
  const type = sideEffectsStatement.type;
548
552
  const loc = parser.getLocation(sideEffectsStatement);
549
- moduleGraph
550
- .getOptimizationBailout(parser.state.module)
551
- .push(
552
- () =>
553
- `Statement (${type}) with side effects in source code at ${formatLocation(
554
- loc
555
- )}`
556
- );
553
+ const at = formatLocation(loc);
554
+
555
+ const buildInfo = /** @type {BuildInfo} */ (
556
+ parser.state.module.buildInfo
557
+ );
558
+ recordOptimizationBailout(
559
+ buildInfo,
560
+ `Statement (${type}) with side effects in source code at ${at}`
561
+ );
562
+ // `performance.unusedModules` names the statement, so it is kept typed too.
563
+ getBuildDiagnostics(buildInfo).sideEffectStatement =
564
+ `${type} at ${at}`;
557
565
  }
558
566
  });
559
567
  };
@@ -588,12 +596,8 @@ class SideEffectsFlagPlugin {
588
596
  pureFunctions.add(name);
589
597
  };
590
598
 
591
- // Detect on function declarations
592
- // Covers:
593
- // 1. function foo
594
- // 2. export function foo
595
- // 3. export default function foo
596
- // 4. export default function / export default () => {} (anonymous)
599
+ // Covers a plain `function foo`, an exported one, and an
600
+ // `export default` function whether named or anonymous.
597
601
  parser.hooks.preStatementByType
598
602
  .for("FunctionDeclaration")
599
603
  .tap(PLUGIN_NAME, (statement) => {
@@ -609,13 +613,10 @@ class SideEffectsFlagPlugin {
609
613
  markPure(name);
610
614
  return;
611
615
  }
612
- const commentsStart = parser.prevStatement
613
- ? /** @type {Range} */ (parser.prevStatement.range)[1]
614
- : 0;
615
616
  if (
616
617
  hasNoSideEffectsNotation(
617
618
  parser,
618
- commentsStart,
619
+ parser.getAttachedCommentsStart(statement),
619
620
  /** @type {Range} */ (statement.range)[0]
620
621
  )
621
622
  ) {
@@ -640,12 +641,9 @@ class SideEffectsFlagPlugin {
640
641
  let hasAnnotation = false;
641
642
  // Before the VariableDeclaration (only for const)
642
643
  if (statement.kind === "const") {
643
- const commentsStart = parser.prevStatement
644
- ? /** @type {Range} */ (parser.prevStatement.range)[1]
645
- : 0;
646
644
  hasAnnotation = hasNoSideEffectsNotation(
647
645
  parser,
648
- commentsStart,
646
+ parser.getAttachedCommentsStart(statement),
649
647
  /** @type {Range} */ (statement.range)[0]
650
648
  );
651
649
  }
@@ -893,11 +891,9 @@ class SideEffectsFlagPlugin {
893
891
  }
894
892
  if (!target) continue;
895
893
 
896
- // A deferred re-export must keep its side-effect-free
897
- // barrel: collapsing it here would turn the cached
898
- // deferred namespace (`.z`) into an eager import of the
899
- // source module, breaking deferred-namespace identity
900
- // and evaluation semantics.
894
+ // A deferred re-export keeps its side-effect-free barrel:
895
+ // collapsing it would turn the cached deferred namespace into
896
+ // an eager import, losing both identity and semantics.
901
897
  if (
902
898
  deferEnabled &&
903
899
  isDeferredTargetConnection(target.connection)
@@ -1390,10 +1390,8 @@ class SplitChunksPlugin {
1390
1390
  }
1391
1391
  }
1392
1392
  }
1393
- // Create key for maps
1394
- // When it has a name we use the name as key
1395
- // Otherwise we create the key from chunks and cache group key
1396
- // This automatically merges equal names
1393
+ // A named group keys on its name, which merges equal names by itself;
1394
+ // an unnamed one keys on its chunks and cache group.
1397
1395
  const key = name
1398
1396
  ? `${cacheGroup.key} name:${name}`
1399
1397
  : getUnnamedKey(cacheGroup, selectedChunksKey);
@@ -0,0 +1,115 @@
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 AnalyzableBailoutsWarning = require("../errors/AnalyzableBailoutsWarning");
9
+
10
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
11
+ /** @import Compiler from "../Compiler" */
12
+ /** @import Module from "../Module" */
13
+ /** @import { BailoutDetails } from "../errors/AnalyzableBailoutsWarning" */
14
+
15
+ const PLUGIN_NAME = "AnalyzableBailoutsPlugin";
16
+
17
+ // Enough to point at the offenders without listing every module of a build.
18
+ const MAX_REPORTED_MODULES = 5;
19
+
20
+ class AnalyzableBailoutsPlugin {
21
+ /**
22
+ * Creates an instance of AnalyzableBailoutsPlugin.
23
+ * @param {PerformanceOptions} options the plugin options
24
+ */
25
+ constructor(options) {
26
+ /** @type {PerformanceOptions["hints"]} */
27
+ this.hints = options.hints;
28
+ }
29
+
30
+ /**
31
+ * Applies the plugin by registering its hooks on the compiler.
32
+ * @param {Compiler} compiler the compiler instance
33
+ * @returns {void}
34
+ */
35
+ apply(compiler) {
36
+ const hints = this.hints;
37
+
38
+ if (!hints) return;
39
+
40
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
41
+ // `afterSeal` is past the hash, which folds every message into it — and
42
+ // past the runtime modules, which record their reasons while being hashed.
43
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
44
+ const { chunkGraph, runtimeTemplate, requestShortener } = compilation;
45
+
46
+ // Nothing is recorded outside ESM output, so there is nothing to walk.
47
+ if (!runtimeTemplate.isModule()) return;
48
+
49
+ /** @type {Map<string, Set<string>>} */
50
+ const modulesByReason = new Map();
51
+
52
+ /**
53
+ * Files the reasons recorded on a module under its printed name.
54
+ * @param {Module} module the module, a runtime module included
55
+ * @returns {void}
56
+ */
57
+ const collect = (module) => {
58
+ const reasons = runtimeTemplate.analyzableBailoutsOf(module);
59
+ if (reasons.length === 0) return;
60
+ const name = module.readableIdentifier(requestShortener);
61
+ for (const reason of reasons) {
62
+ let modules = modulesByReason.get(reason);
63
+ if (modules === undefined) {
64
+ modules = new Set();
65
+ modulesByReason.set(reason, modules);
66
+ }
67
+ modules.add(name);
68
+ }
69
+ };
70
+
71
+ for (const module of compilation.modules) collect(module);
72
+ for (const chunk of compilation.chunks) {
73
+ for (const module of chunkGraph.getChunkRuntimeModulesIterable(
74
+ chunk
75
+ )) {
76
+ collect(module);
77
+ }
78
+ }
79
+
80
+ if (modulesByReason.size === 0) return;
81
+
82
+ /** @type {BailoutDetails[]} */
83
+ const bailouts = [];
84
+ let references = 0;
85
+
86
+ for (const [reason, modules] of modulesByReason) {
87
+ const names = [...modules].sort();
88
+ references += names.length;
89
+ bailouts.push({
90
+ reason,
91
+ modules: names.slice(0, MAX_REPORTED_MODULES),
92
+ count: names.length
93
+ });
94
+ }
95
+
96
+ // The reason holding the most modules leads; ties read in one order.
97
+ bailouts.sort(
98
+ (a, b) => b.count - a.count || (a.reason < b.reason ? -1 : 1)
99
+ );
100
+
101
+ const warning = new AnalyzableBailoutsWarning(bailouts, references);
102
+
103
+ if (hints === "error") {
104
+ compilation.errors.push(warning);
105
+ } else if (hints === "stats") {
106
+ compilation.hints.push(warning);
107
+ } else {
108
+ compilation.warnings.push(warning);
109
+ }
110
+ });
111
+ });
112
+ }
113
+ }
114
+
115
+ module.exports = AnalyzableBailoutsPlugin;
@@ -5,7 +5,7 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const ContextModule = require("../ContextModule");
8
+ const ContextModule = require("../context/ContextModule");
9
9
  const BroadContextsWarning = require("../errors/BroadContextsWarning");
10
10
  const { compareStrings } = require("../util/comparators");
11
11
  const getModuleSize = require("./getModuleSize");
@@ -65,10 +65,11 @@ class CacheEffectivenessPlugin {
65
65
 
66
66
  uncacheable++;
67
67
 
68
+ const notCacheableReasons =
69
+ buildInfo.diagnostics && buildInfo.diagnostics.notCacheableReasons;
68
70
  const reasons =
69
- buildInfo.notCacheableReasons &&
70
- buildInfo.notCacheableReasons.length > 0
71
- ? buildInfo.notCacheableReasons
71
+ notCacheableReasons && notCacheableReasons.length > 0
72
+ ? notCacheableReasons
72
73
  : [UNSPECIFIED_REASON];
73
74
 
74
75
  for (const reason of reasons) {
@@ -82,10 +83,9 @@ class CacheEffectivenessPlugin {
82
83
 
83
84
  if (!warmRebuild && uncacheable === 0) return;
84
85
 
85
- // Most frequent first, and by reason where two are as frequent: the
86
- // map is keyed in the order the modules were walked, which is not the
87
- // same twice, and only three reasons are reported — so an unbroken tie
88
- // would vary which of them a build names at all.
86
+ // Most frequent first, then by reason: the map is keyed in walk order,
87
+ // which differs between builds, and only three reasons are reported, so
88
+ // an unbroken tie would vary which of them a build names.
89
89
  const sorted = [...modulesByReason].sort(
90
90
  (a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)
91
91
  );
@@ -8,18 +8,17 @@
8
8
  const DuplicateModulesWarning = require("../errors/DuplicateModulesWarning");
9
9
  const { compareStrings } = require("../util/comparators");
10
10
  const getModuleSize = require("./getModuleSize");
11
+ const getSourceModules = require("./getSourceModules");
11
12
 
12
13
  /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
14
+ /** @import Chunk from "../Chunk" */
13
15
  /** @import Compiler from "../Compiler" */
14
- /**
15
- * @import {
16
- * DuplicateModuleDetails
17
- * } from "../errors/DuplicateModulesWarning"
18
- */
16
+ /** @import Module from "../Module" */
17
+ /** @import { DuplicateModuleDetails } from "../errors/DuplicateModulesWarning" */
19
18
 
20
19
  const PLUGIN_NAME = "DuplicateModulesPlugin";
21
20
 
22
- // Enough to name the offenders without printing the module graph.
21
+ // Enough to name the costliest without listing every shared module.
23
22
  const MAX_REPORTED_MODULES = 5;
24
23
 
25
24
  class DuplicateModulesPlugin {
@@ -44,24 +43,69 @@ class DuplicateModulesPlugin {
44
43
 
45
44
  compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
46
45
  compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
47
- const { chunkGraph, requestShortener } = compilation;
46
+ const { chunkGraph, entrypoints, requestShortener } = compilation;
47
+
48
+ // The entrypoints a chunk is reached from, so a copy can be blamed on
49
+ // the pages that pay for it.
50
+ /** @type {Map<Chunk, Set<string>>} */
51
+ const chunkEntrypoints = new Map();
52
+
53
+ for (const [name, entrypoint] of entrypoints) {
54
+ for (const chunk of entrypoint.chunks) {
55
+ const names = chunkEntrypoints.get(chunk);
56
+
57
+ if (names === undefined) {
58
+ chunkEntrypoints.set(chunk, new Set([name]));
59
+ } else {
60
+ names.add(name);
61
+ }
62
+ }
63
+ }
64
+
65
+ /** @type {Map<Module, { chunks: Set<Chunk>, entrypoints: Set<string> }>} */
66
+ const copies = new Map();
67
+
68
+ for (const chunk of compilation.chunks) {
69
+ const names = chunkEntrypoints.get(chunk);
70
+
71
+ for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
72
+ // Scope hoisting makes several modules into one, so a module
73
+ // concatenated into two chunks is in neither on its own.
74
+ for (const inner of getSourceModules(module)) {
75
+ let entry = copies.get(inner);
76
+
77
+ if (entry === undefined) {
78
+ copies.set(
79
+ inner,
80
+ (entry = { chunks: new Set(), entrypoints: new Set() })
81
+ );
82
+ }
83
+
84
+ entry.chunks.add(chunk);
85
+
86
+ if (names !== undefined) {
87
+ for (const name of names) entry.entrypoints.add(name);
88
+ }
89
+ }
90
+ }
91
+ }
92
+
48
93
  /** @type {DuplicateModuleDetails[]} */
49
94
  const duplicated = [];
50
95
  let wasted = 0;
51
96
 
52
- for (const module of compilation.modules) {
53
- const chunks = chunkGraph.getNumberOfModuleChunks(module);
54
-
55
- if (chunks < 2) continue;
97
+ for (const [module, { chunks, entrypoints: names }] of copies) {
98
+ if (chunks.size < 2) continue;
56
99
 
57
100
  // The first copy is the one that had to be emitted; the rest are
58
101
  // what a shared chunk would save.
59
- const extra = getModuleSize(module) * (chunks - 1);
102
+ const extra = getModuleSize(module) * (chunks.size - 1);
60
103
 
61
104
  wasted += extra;
62
105
  duplicated.push({
63
106
  name: module.readableIdentifier(requestShortener),
64
- chunks,
107
+ chunks: chunks.size,
108
+ entrypoints: [...names].sort(compareStrings),
65
109
  wasted: extra
66
110
  });
67
111
  }
@@ -11,6 +11,7 @@ const {
11
11
  JAVASCRIPT_MODULE_TYPE_ESM
12
12
  } = require("../ModuleTypeConstants");
13
13
  const EvalUsageWarning = require("../errors/EvalUsageWarning");
14
+ const { getBuildDiagnostics } = require("../util/buildDiagnostics");
14
15
  const { compareStrings } = require("../util/comparators");
15
16
 
16
17
  /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
@@ -59,7 +60,7 @@ class EvalUsagePlugin {
59
60
  parser.state.module.buildInfo
60
61
  );
61
62
 
62
- buildInfo.usesEval = true;
63
+ getBuildDiagnostics(buildInfo).usesEval = true;
63
64
  });
64
65
  };
65
66
 
@@ -84,7 +85,9 @@ class EvalUsagePlugin {
84
85
  // Every built module carries one, so only the field is in question.
85
86
  const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
86
87
 
87
- if (!buildInfo.usesEval) continue;
88
+ if (!buildInfo.diagnostics || !buildInfo.diagnostics.usesEval) {
89
+ continue;
90
+ }
88
91
 
89
92
  callers.push(module.readableIdentifier(requestShortener));
90
93
  }
@@ -0,0 +1,115 @@
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 { SourceMapSource } = require("webpack-sources");
9
+ const NormalModule = require("../NormalModule");
10
+ const MissingSourceMapsWarning = require("../errors/MissingSourceMapsWarning");
11
+ const { compareStrings } = require("../util/comparators");
12
+ const getSourceModules = require("./getSourceModules");
13
+
14
+ /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
15
+ /** @import Compiler from "../Compiler" */
16
+ /** @import Module from "../Module" */
17
+ /** @import RequestShortener from "../RequestShortener" */
18
+ /** @import { MissingSourceMapDetails } from "../errors/MissingSourceMapsWarning" */
19
+
20
+ const PLUGIN_NAME = "MissingSourceMapsPlugin";
21
+
22
+ // Enough to name the offenders without listing every module a loader touched.
23
+ const MAX_REPORTED_MODULES = 5;
24
+
25
+ /**
26
+ * The loaders that ran on a module, shortened for reading.
27
+ * @param {NormalModule} module the module
28
+ * @param {RequestShortener} requestShortener the request shortener
29
+ * @returns {string[]} what to call them
30
+ */
31
+ const loaderNames = (module, requestShortener) =>
32
+ module.loaders.map((it) => requestShortener.shorten(it.loader) || it.loader);
33
+
34
+ class MissingSourceMapsPlugin {
35
+ /**
36
+ * Creates an instance of MissingSourceMapsPlugin.
37
+ * @param {PerformanceOptions} options the plugin options
38
+ */
39
+ constructor(options) {
40
+ /** @type {PerformanceOptions["hints"]} */
41
+ this.hints = options.hints;
42
+ }
43
+
44
+ /**
45
+ * Applies the plugin by registering its hooks on the compiler.
46
+ * @param {Compiler} compiler the compiler instance
47
+ * @returns {void}
48
+ */
49
+ apply(compiler) {
50
+ const hints = this.hints;
51
+
52
+ if (!hints) return;
53
+
54
+ compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
55
+ // `afterSeal` is past the hash, which folds every message into it — a
56
+ // hint reported earlier would change the build's identity.
57
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
58
+ const { requestShortener } = compilation;
59
+ /** @type {MissingSourceMapDetails[]} */
60
+ const found = [];
61
+
62
+ // A module can be reached both on its own and inside a
63
+ // concatenation, so it is only counted the first time.
64
+ /** @type {Set<Module>} */
65
+ const seen = new Set();
66
+
67
+ for (const parent of compilation.modules) {
68
+ // Scope hoisting makes several modules into one, and each of them
69
+ // kept the source its own loaders produced.
70
+ for (const module of getSourceModules(parent)) {
71
+ if (seen.has(module)) continue;
72
+
73
+ seen.add(module);
74
+
75
+ if (!(module instanceof NormalModule)) continue;
76
+
77
+ // Only where a real map was asked for: the cheap devtools map to
78
+ // the loader output by design, so nothing is lost there.
79
+ if (!module.useSourceMap) continue;
80
+ if (module.loaders.length === 0) continue;
81
+
82
+ // A loader that returned a map produces a `SourceMapSource`;
83
+ // falling back to any other source is the map being dropped.
84
+ if (module.originalSource() instanceof SourceMapSource) continue;
85
+
86
+ found.push({
87
+ name: module.readableIdentifier(requestShortener),
88
+ loaders: loaderNames(module, requestShortener)
89
+ });
90
+ }
91
+ }
92
+
93
+ if (found.length === 0) return;
94
+
95
+ // By name: module order is not stable across runs.
96
+ found.sort((a, b) => compareStrings(a.name, b.name));
97
+
98
+ const warning = new MissingSourceMapsWarning(
99
+ found.slice(0, MAX_REPORTED_MODULES),
100
+ found.length
101
+ );
102
+
103
+ if (hints === "error") {
104
+ compilation.errors.push(warning);
105
+ } else if (hints === "stats") {
106
+ compilation.hints.push(warning);
107
+ } else {
108
+ compilation.warnings.push(warning);
109
+ }
110
+ });
111
+ });
112
+ }
113
+ }
114
+
115
+ module.exports = MissingSourceMapsPlugin;
@@ -11,6 +11,7 @@ const {
11
11
  JAVASCRIPT_MODULE_TYPE_ESM
12
12
  } = require("../ModuleTypeConstants");
13
13
  const PureAnnotationsWarning = require("../errors/PureAnnotationsWarning");
14
+ const { getBuildDiagnostics } = require("../util/buildDiagnostics");
14
15
  const { compareStrings } = require("../util/comparators");
15
16
  const { CompilerHintNotationRegExp } = require("../util/magicComment");
16
17
 
@@ -154,7 +155,7 @@ class PureAnnotationsPlugin {
154
155
  parser.state.module.buildInfo
155
156
  );
156
157
 
157
- buildInfo.ineffectivePureAnnotations = wasted;
158
+ getBuildDiagnostics(buildInfo).ineffectivePureAnnotations = wasted;
158
159
  });
159
160
  };
160
161
 
@@ -180,9 +181,11 @@ class PureAnnotationsPlugin {
180
181
  // Every built module carries one, so only the field is in question.
181
182
  const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
182
183
 
183
- if (!buildInfo.ineffectivePureAnnotations) continue;
184
+ const count =
185
+ buildInfo.diagnostics &&
186
+ buildInfo.diagnostics.ineffectivePureAnnotations;
184
187
 
185
- const count = buildInfo.ineffectivePureAnnotations;
188
+ if (!count) continue;
186
189
 
187
190
  total += count;
188
191
  wasteful.push({
@@ -269,10 +269,8 @@ module.exports = class SizeLimitsPlugin {
269
269
  }
270
270
 
271
271
  if (hints) {
272
- // 1. Individual Chunk: Size < 250kb
273
- // 2. Collective Initial Chunks [entrypoint] (Each Set?): Size < 250kb
274
- // 3. No Async Chunks
275
- // if !1, then 2, if !2 return
272
+ // Each asset is checked against the limit first, then each entrypoint's
273
+ // initial chunks together; async chunks count towards neither.
276
274
  if (assetsOverSizeLimit.length > 0) {
277
275
  addLargestModules(compilation, assetsOverSizeLimit);
278
276
  warnings.push(
@@ -11,14 +11,14 @@ const {
11
11
  JAVASCRIPT_MODULE_TYPE_ESM
12
12
  } = require("../ModuleTypeConstants");
13
13
  const TopLevelThisWarning = require("../errors/TopLevelThisWarning");
14
+ const { getBuildDiagnostics } = require("../util/buildDiagnostics");
14
15
  const { compareStrings } = require("../util/comparators");
15
16
  const getSourceModules = require("./getSourceModules");
16
17
 
17
18
  /** @import { Program } from "estree" */
18
19
  /** @import { PerformanceOptions } from "../../declarations/WebpackOptions" */
19
20
  /** @import Compiler from "../Compiler" */
20
- /** @import Module from "../Module" */
21
- /** @import { BuildInfo } from "../Module" */
21
+ /** @import Module, { BuildInfo } from "../Module" */
22
22
  /** @import JavascriptParser from "../javascript/JavascriptParser" */
23
23
  /** @import { TopLevelThisDetails } from "../errors/TopLevelThisWarning" */
24
24
 
@@ -133,7 +133,7 @@ class TopLevelThisPlugin {
133
133
  /** @type {BuildInfo} */
134
134
  (parser.state.module.buildInfo);
135
135
 
136
- buildInfo.topLevelThis = count;
136
+ getBuildDiagnostics(buildInfo).topLevelThis = count;
137
137
  });
138
138
  };
139
139
 
@@ -168,7 +168,8 @@ class TopLevelThisPlugin {
168
168
  seen.add(module);
169
169
 
170
170
  const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
171
- const count = buildInfo.topLevelThis;
171
+ const count =
172
+ buildInfo.diagnostics && buildInfo.diagnostics.topLevelThis;
172
173
 
173
174
  if (!count) continue;
174
175