@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
@@ -5,13 +5,13 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const asyncLib = require("neo-async");
9
8
  const { ConcatSource, RawSource } = require("webpack-sources");
10
9
  const Compilation = require("./Compilation");
11
10
  const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
12
11
  const ProgressPlugin = require("./ProgressPlugin");
13
12
  const SourceMapDevToolModuleOptionsPlugin = require("./SourceMapDevToolModuleOptionsPlugin");
14
13
  const { getPresentKinds } = require("./TemplatedPathPlugin");
14
+ const asyncLib = require("./util/async");
15
15
  const createHash = require("./util/createHash");
16
16
  const { dirname, relative } = require("./util/fs");
17
17
  const generateDebugId = require("./util/generateDebugId");
@@ -152,11 +152,9 @@ const extractSourceAndMap = (file, asset, options, registry) => {
152
152
  if (!registry.has(file)) registry.set(file, asset);
153
153
  return { source, sourceMap, mapSource: asset };
154
154
  }
155
- // The current asset (typically a `RawSource` left by an earlier
156
- // SourceMapDevToolPlugin instance) has no internal map. Re-extract
157
- // the map from the original Source we pinned earlier. We keep using
158
- // `source` from the current asset so that any prior wrappers (e.g.
159
- // appended sourceMappingURL comments) are preserved.
155
+ // The current asset, typically a `RawSource` an earlier instance left, has no
156
+ // internal map, so re-extract one from the pinned original. `source` still
157
+ // comes from the current asset, preserving any wrappers it gained.
160
158
  const original = registry.get(file);
161
159
  if (!original) return;
162
160
  sourceMap = original.sourceAndMap
@@ -262,12 +260,9 @@ class SourceMapDevToolPlugin {
262
260
  this.namespace = options.namespace || "";
263
261
  /** @type {SourceMapDevToolPluginOptions} */
264
262
  this.options = options;
265
- // Cache salt derived from output-affecting options, so that two
266
- // SourceMapDevToolPlugin instances (or `devtool` + a plugin) operating
267
- // on the same asset don't share a cache entry. We serialize via
268
- // `JSON.stringify` rather than a homemade separator so that any
269
- // special characters (e.g. `|` inside a publicPath or sourceRoot)
270
- // can't accidentally make two different option sets collide.
263
+ // Salt from the output-affecting options, so two instances on the same asset
264
+ // never share a cache entry. Serialized with `JSON.stringify` rather than a
265
+ // separator, which a `|` in a publicPath could collide through.
271
266
  /** @type {string} */
272
267
  this._cacheSalt = JSON.stringify([
273
268
  toCacheKeyValue(options.filename),
@@ -326,12 +321,9 @@ class SourceMapDevToolPlugin {
326
321
  compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
327
322
  new SourceMapDevToolModuleOptionsPlugin(options).apply(compilation);
328
323
 
329
- // All SourceMapDevToolPlugin instances on the same compilation share
330
- // a registry of pristine asset sources, so the second instance to
331
- // run can still recover the original map after the first instance
332
- // has replaced the asset with a `RawSource`. The registry lives on a
333
- // module-scoped `WeakMap` keyed by compilation so it is released
334
- // automatically and never pollutes the compilation object.
324
+ // Every instance on a compilation shares this registry of pristine
325
+ // sources, so a later one still recovers the original map after the first
326
+ // replaced the asset. Keyed by compilation, so it releases on its own.
335
327
  const originalSources = getOriginalSourceRegistry(compilation);
336
328
 
337
329
  compilation.hooks.processAssets.tapAsync(
@@ -372,23 +364,12 @@ class SourceMapDevToolPlugin {
372
364
  const tasks = [];
373
365
  let fileIndex = 0;
374
366
 
375
- // Shared deduplication set for `Source#clearCache` calls below.
376
- // Webpack chunks routinely share module-level `CachedSource`
377
- // instances. A per-call WeakSet would re-walk those shared
378
- // subtrees once per chunk — 50 chunks × thousands of shared
379
- // modules in dev/non-minified setups — and worse, every
380
- // chunk's `sourceAndMap` would have to recompute the cleared
381
- // caches, churning allocations (measured: +700 MB peak RSS,
382
- // +6 s wall time on a 50×1000 synthetic build).
383
- //
384
- // Sharing one set lets each shared subtree be walked exactly
385
- // once. The trade-off is that subsequent chunks' `sourceAndMap`
386
- // calls can repopulate a shared module's `_cachedMaps` after
387
- // its own clear was skipped (because the module is already in
388
- // the visited set), leaving at most one populated cache entry
389
- // per shared module at the end of the run — bounded to a few
390
- // MB even at the scale of #20961. That's strictly preferable
391
- // to the alternative's hundreds of MB of transient peak RSS.
367
+ // WHY: chunks share module-level `CachedSource` instances, so a
368
+ // per-call set re-walks each shared subtree once per chunk and every
369
+ // `sourceAndMap` then recomputes the cleared caches — measured at
370
+ // +700 MB peak RSS and +6 s on a 50×1000 build. One shared set walks
371
+ // each subtree once, at the cost of leaving at most one populated
372
+ // cache entry per shared module, a few MB even at #20961's scale.
392
373
  const clearCacheVisited = new WeakSet();
393
374
 
394
375
  asyncLib.each(
@@ -403,14 +384,12 @@ class SourceMapDevToolPlugin {
403
384
  chunk
404
385
  });
405
386
 
406
- // The cache item identifier must include the per-instance
407
- // salt so two SourceMapDevToolPlugin instances that target
408
- // the same `file` don't collide in the persistent cache —
409
- // they'd otherwise write different content to the same key
410
- // and invalidate every pack on each build. We encode via
411
- // `JSON.stringify` so that special characters (e.g. `|`)
412
- // in an asset filename can't be spoofed to collide with the
413
- // salt portion of the identifier.
387
+ // WHY: the cache item identifier carries the per-instance salt, or
388
+ // two SourceMapDevToolPlugin instances targeting the same `file`
389
+ // would write different content to one key and invalidate every pack
390
+ // on each build. `JSON.stringify` encodes it, so a special character
391
+ // such as `|` in an asset filename cannot be spoofed to collide with
392
+ // the salt portion.
414
393
  const cacheItem = cache.getItemCache(
415
394
  JSON.stringify([file, this._cacheSalt]),
416
395
  cache.mergeEtags(
@@ -427,12 +406,9 @@ class SourceMapDevToolPlugin {
427
406
  * If presented in cache, reassigns assets. Cache assets already have source maps.
428
407
  */
429
408
  if (cacheEntry) {
430
- // Pin the still-unwrapped asset source in the registry
431
- // before `compilation.updateAsset` replaces it. This is a
432
- // pointer assignment — no source-map extraction work — and
433
- // it lets a subsequent SourceMapDevToolPlugin instance
434
- // extract the original map on demand even though the
435
- // persistent cache hit lets us skip processing here.
409
+ // Pin the still-unwrapped source before `updateAsset` replaces
410
+ // it — a pointer assignment, no extraction — so a later
411
+ // instance can still reach the original map past this cache hit.
436
412
  if (!originalSources.has(file)) {
437
413
  originalSources.set(file, asset.source);
438
414
  }
@@ -489,33 +465,21 @@ class SourceMapDevToolPlugin {
489
465
  originalSources
490
466
  );
491
467
 
492
- // Release the per-instance caches that `sourceAndMap`
493
- // just populated. The composed map (and, for
494
- // `SourceMapSource`, the parsed `_sourceMapAsObject` /
495
- // `_innerSourceMapAsObject`) otherwise sit on the
496
- // CachedSource — and every shared child — until phase
497
- // 2 replaces the asset, which is what causes the OOM
498
- // spike on builds with thousands of chunks
499
- // (webpack#20961). Keep `source` since downstream
500
- // consumers reading the original asset still need it;
501
- // `hash`/`size` default to retained because they're
502
- // cheap to keep but expensive to rebuild.
503
- // `clearCacheVisited` is shared across every call (see
504
- // its declaration above for the rationale).
468
+ // WHY: the map `sourceAndMap` just composed otherwise sits on
469
+ // the CachedSource and every shared child until phase 2
470
+ // replaces the asset, which is the OOM spike of webpack#20961
471
+ // on builds with thousands of chunks. `source` is kept for
472
+ // downstream consumers, `hash` and `size` because they are
473
+ // cheap to hold and expensive to rebuild.
505
474
  //
506
- // Target `task.mapSource` (not `asset.source`): when
507
- // `extractSourceAndMap` falls back to the pinned
508
- // original (the current asset is a `RawSource` left
509
- // by an earlier plugin instance), the `sourceAndMap`
510
- // call populated the original's caches, not the
511
- // current asset's.
512
- //
513
- // Feature-detected: `clearCache` landed in
514
- // `webpack-sources` 3.5, but `compilation.assets` may
515
- // hold `Source`-like instances from a third-party
516
- // plugin built against an older copy of
517
- // `webpack-sources` (or a hand-rolled implementation).
518
- // Calling it unconditionally would throw on those.
475
+ // `task.mapSource`, not `asset.source`: where the fallback to
476
+ // the pinned original ran — the current asset being a
477
+ // `RawSource` an earlier instance left — the original's caches
478
+ // are the ones `extractSourceAndMap` populated.
479
+
480
+ // Feature-detected, since `clearCache` landed in
481
+ // `webpack-sources` 3.5 and a third-party plugin may hand us a
482
+ // `Source` built against an older copy.
519
483
  if (task && typeof task.mapSource.clearCache === "function") {
520
484
  task.mapSource.clearCache(
521
485
  {
@@ -660,14 +624,9 @@ class SourceMapDevToolPlugin {
660
624
  const moduleFilenames =
661
625
  /** @type {string[]} */
662
626
  (modules.map((m) => moduleToSourceNameMapping.get(m)));
663
- // We deliberately do NOT mutate `sourceMap` in place: the
664
- // task's `sourceMap` reference may be shared with a
665
- // `SourceMapSource` whose internal map cache is the same
666
- // object (webpack-sources keeps it cached). A second
667
- // `SourceMapDevToolPlugin` instance that reads the original
668
- // source through the registry would otherwise see our
669
- // rewrites. Instead we build a fresh `outputSourceMap` for
670
- // the .map file and leave the original alone.
627
+ // `sourceMap` is never mutated in place: the reference may be
628
+ // the same object a `SourceMapSource` has cached, so a second
629
+ // instance reading through the registry would see the rewrites.
671
630
  /** @type {number[] | undefined} */
672
631
  let ignoreList;
673
632
  if (options.ignoreList) {
@@ -736,10 +695,9 @@ class SourceMapDevToolPlugin {
736
695
  } else if (
737
696
  typeof currentSourceMappingURLComment === "function"
738
697
  ) {
739
- // Wrap the user's append function so the debug-id
740
- // comment is prepended at call time. Template-string
741
- // concatenation would coerce the function to a string
742
- // and lose its dynamic behavior.
698
+ // Wrap the user's append function so the debug-id comment is
699
+ // prepended at call time; concatenating would coerce the
700
+ // function to a string and lose its behavior.
743
701
  const wrappedFn = currentSourceMappingURLComment;
744
702
  currentSourceMappingURLComment = (pathData, assetInfo) =>
745
703
  `${debugIdComment}${wrappedFn(pathData, assetInfo)}`;
@@ -766,14 +724,9 @@ class SourceMapDevToolPlugin {
766
724
  }
767
725
 
768
726
  if (sourceMapFilename) {
769
- // External `.map` file: hold the serialized map as a
770
- // `Buffer` instead of a V8 string. `RawSource` accepts
771
- // a buffer directly, and the emitted asset stays in
772
- // `compilation.assets` until the build finishes — so
773
- // storing the bytes off the V8 heap (where Buffers
774
- // live, accounted as `external` memory) avoids keeping
775
- // a large V8 string alive for the rest of the build
776
- // and reduces heap pressure on `--max-old-space-size`.
727
+ // Hold the serialized map as a `Buffer`, which `RawSource`
728
+ // takes directly: the asset lives in `compilation.assets`
729
+ // until the build ends, and these bytes stay off the V8 heap.
777
730
  const sourceMapBuffer = Buffer.from(
778
731
  JSON.stringify(outputSourceMap),
779
732
  "utf8"
@@ -820,10 +773,9 @@ class SourceMapDevToolPlugin {
820
773
  })
821
774
  );
822
775
  }
823
- // Preserve any existing related.sourceMap entries from
824
- // earlier SourceMapDevToolPlugin runs on the same asset so
825
- // that all generated maps remain discoverable via asset
826
- // info (the schema allows string or string[]).
776
+ // Preserve the `related.sourceMap` entries earlier runs left on
777
+ // this asset, so every generated map stays discoverable; the
778
+ // schema allows a string or an array.
827
779
  const existingSourceMap =
828
780
  task.assetInfo.related &&
829
781
  task.assetInfo.related.sourceMap;
@@ -879,11 +831,9 @@ class SourceMapDevToolPlugin {
879
831
  `${PLUGIN_NAME}: append can't be a function when no filename is provided`
880
832
  );
881
833
  }
882
- // Inline data-URL form: `[map]` gets the raw JSON, `[url]`
883
- // gets the same JSON base64-encoded. `URL_COMMENT_REGEXP`
884
- // is a `/g` regex, so a user `append` template with more
885
- // than one `[url]` placeholder would otherwise re-encode
886
- // the same JSON per match. Pre-compute both once.
834
+ // Inline data-URL form: `[map]` takes the raw JSON and `[url]`
835
+ // the same base64-encoded. Both are precomputed, or a template
836
+ // with two `[url]`s would re-encode per match.
887
837
  const sourceMapString = JSON.stringify(outputSourceMap);
888
838
  const sourceMapBase64 = Buffer.from(
889
839
  sourceMapString,
@@ -77,10 +77,9 @@ const getPresentKinds = (path) => {
77
77
  return kinds;
78
78
  };
79
79
 
80
- // `[fullhash:<digest>]`/`[hash:<digest>]` — a non-numeric first argument is a digest
81
- // (a numeric one is just a length). A digest re-encodes the hash rather than reading
82
- // it, so no stand-in or runtime expression can take its place: the settled value has
83
- // to be inlined instead.
80
+ // In `[fullhash:<arg>]` a non-numeric argument names a digest, a numeric one just
81
+ // a length. A digest re-encodes the hash rather than reading it, so no stand-in
82
+ // can stand for it and the settled value must be inlined.
84
83
  const FULL_HASH_DIGEST_REGEXP = /\[(?:fullhash|hash):(?!\d+\])\w/;
85
84
 
86
85
  /**
@@ -408,11 +407,9 @@ const interpolate = (path, data, assetInfo) => {
408
407
  return path;
409
408
  }
410
409
 
411
- // Only build replacers for placeholders the template actually uses — most
412
- // templates reference a handful, so building the whole table per call is
413
- // wasted work. Replacer construction has no side effects (those fire only
414
- // when a replacer is invoked, which happens for present kinds), so this is
415
- // output-identical.
410
+ // Build replacers only for the placeholders a template uses, since most use a
411
+ // handful. Construction has no side effects — those fire on invocation — so
412
+ // the output is identical either way.
416
413
  const presentKinds = getPresentKinds(path);
417
414
 
418
415
  const chunkGraph = data.chunkGraph;
@@ -422,21 +419,9 @@ const interpolate = (path, data, assetInfo) => {
422
419
  /** @type {Map<string, Replacer>} */
423
420
  const replacements = new Map();
424
421
 
425
- // Filename context
426
- //
427
- // Placeholders
428
- //
429
- // for /some/path/file.js?query#fragment:
430
- // [file] - /some/path/file.js
431
- // [query] - ?query
432
- // [fragment] - #fragment
433
- // [base] - file.js
434
- // [path] - /some/path/
435
- // [name] - file
436
- // [ext] - .js
437
- //
438
- // [containedfile] and [containedpath] are [file] and [path] kept inside
439
- // `output.path`
422
+ // Filename context. Of `/some/path/file.js?query#fragment`, `[file]` is the
423
+ // path without query or fragment, `[base]` its basename, `[path]` its
424
+ // directory, `[name]`/`[ext]` its halves; `contained*` stay under `output.path`.
440
425
  if (
441
426
  typeof data.filename === "string" &&
442
427
  (presentKinds.has("file") ||
@@ -534,15 +519,7 @@ const interpolate = (path, data, assetInfo) => {
534
519
  }
535
520
  }
536
521
 
537
- // Compilation context
538
- //
539
- // Placeholders
540
- //
541
- // [fullhash] - data.hash (3a4b5c6e7f)
542
- //
543
- // Legacy Placeholders
544
- //
545
- // [hash] - data.hash (3a4b5c6e7f)
522
+ // Compilation context: `[fullhash]`, with `[hash]` as its legacy spelling.
546
523
  if (data.hash && (presentKinds.has("fullhash") || presentKinds.has("hash"))) {
547
524
  const hashReplacer = hashLength(
548
525
  replacer(data.hash),
@@ -574,14 +551,8 @@ const interpolate = (path, data, assetInfo) => {
574
551
  }
575
552
  }
576
553
 
577
- // Chunk Context
578
- //
579
- // Placeholders
580
- //
581
- // [id] - chunk.id (0.js)
582
- // [name] - chunk.name (app.js)
583
- // [chunkhash] - chunk.hash (7823t4t4.js)
584
- // [contenthash] - chunk.contentHash[type] (3256u3zg.js)
554
+ // Chunk context: `[id]`, `[name]`, `[chunkhash]`, and `[contenthash]` for the
555
+ // chunk's content hash of the requested type.
585
556
  if (data.chunk) {
586
557
  const chunk = data.chunk;
587
558
 
@@ -638,17 +609,8 @@ const interpolate = (path, data, assetInfo) => {
638
609
  }
639
610
  }
640
611
 
641
- // Module Context
642
- //
643
- // Placeholders
644
- //
645
- // [id] - module.id (2.png)
646
- // [hash] - module.hash (6237543873.png)
647
- //
648
- // Legacy Placeholders
649
- //
650
- // [moduleid] - module.id (2.png)
651
- // [modulehash] - module.hash (6237543873.png)
612
+ // Module context: `[id]` and `[hash]`, with `[moduleid]` and `[modulehash]` as
613
+ // their legacy spellings.
652
614
  if (data.module) {
653
615
  const module = data.module;
654
616
  const needId = presentKinds.has("id");
@@ -739,13 +701,8 @@ const interpolate = (path, data, assetInfo) => {
739
701
  }
740
702
  }
741
703
 
742
- // Other things
743
- //
744
- // Placeholders
745
- //
746
- // [url] - data.url
747
- // [uniqueName] - data.uniqueName (output.uniqueName)
748
- // [uniquename] - alias of [uniqueName]
704
+ // Everything else: `[url]`, and `[uniqueName]` from `output.uniqueName`, which
705
+ // `[uniquename]` aliases.
749
706
  if (data.url && presentKinds.has("url")) {
750
707
  replacements.set("url", replacer(data.url));
751
708
  }
package/lib/Watching.js CHANGED
@@ -307,6 +307,7 @@ class Watching {
307
307
  logger.time("storeBuildDependencies");
308
308
  this.compiler.cache.storeBuildDependencies(
309
309
  compilation.buildDependencies,
310
+ compilation.optionalBuildDependencies,
310
311
  (err) => {
311
312
  logger.timeEnd("storeBuildDependencies");
312
313
  if (err) return handleError(err);
@@ -338,6 +339,8 @@ class Watching {
338
339
  this.compiler.cache.storeBuildDependencies(
339
340
  /** @type {Compilation} */
340
341
  (compilation).buildDependencies,
342
+ /** @type {Compilation} */
343
+ (compilation).optionalBuildDependencies,
341
344
  (err) => {
342
345
  logger.timeEnd("storeBuildDependencies");
343
346
  if (err) return handleError(err, cbs);
@@ -359,6 +362,11 @@ class Watching {
359
362
  });
360
363
  for (const cb of cbs) cb(null);
361
364
  this.compiler.hooks.afterDone.call(/** @type {Stats} */ (stats));
365
+ // A watch run goes idle here rather than closing, so seal-only
366
+ // data would be held until the next build starts.
367
+ this.compiler._releaseUnusedCompilationData(
368
+ /** @type {Compilation} */ (compilation)
369
+ );
362
370
  }
363
371
  );
364
372
  });
@@ -518,6 +526,7 @@ class Watching {
518
526
  logger.time("storeBuildDependencies");
519
527
  this.compiler.cache.storeBuildDependencies(
520
528
  compilation.buildDependencies,
529
+ compilation.optionalBuildDependencies,
521
530
  (err2) => {
522
531
  logger.timeEnd("storeBuildDependencies");
523
532
  shutdown(err || err2);