webpack 5.85.1 → 5.87.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.

Potentially problematic release.


This version of webpack might be problematic. Click here for more details.

Files changed (140) hide show
  1. package/README.md +5 -2
  2. package/lib/APIPlugin.js +150 -99
  3. package/lib/CaseSensitiveModulesWarning.js +3 -1
  4. package/lib/Chunk.js +35 -17
  5. package/lib/ChunkGroup.js +11 -6
  6. package/lib/Compiler.js +4 -3
  7. package/lib/ConcatenationScope.js +2 -2
  8. package/lib/ConditionalInitFragment.js +11 -1
  9. package/lib/ConstPlugin.js +57 -29
  10. package/lib/ContextModule.js +4 -2
  11. package/lib/ContextModuleFactory.js +1 -0
  12. package/lib/DependenciesBlock.js +1 -1
  13. package/lib/DllModule.js +6 -0
  14. package/lib/EvalSourceMapDevToolPlugin.js +2 -1
  15. package/lib/ExternalModule.js +15 -8
  16. package/lib/FlagEntryExportAsUsedPlugin.js +4 -0
  17. package/lib/Module.js +7 -1
  18. package/lib/ModuleDependencyError.js +4 -2
  19. package/lib/ModuleDependencyWarning.js +4 -2
  20. package/lib/ModuleGraph.js +31 -24
  21. package/lib/ModuleGraphConnection.js +19 -6
  22. package/lib/ModuleInfoHeaderPlugin.js +9 -2
  23. package/lib/ModuleNotFoundError.js +5 -2
  24. package/lib/ModuleStoreError.js +2 -1
  25. package/lib/ModuleTypeConstants.js +7 -0
  26. package/lib/MultiWatching.js +4 -0
  27. package/lib/ProgressPlugin.js +71 -15
  28. package/lib/RuntimeGlobals.js +5 -0
  29. package/lib/RuntimePlugin.js +2 -1
  30. package/lib/RuntimeTemplate.js +20 -2
  31. package/lib/WebpackError.js +6 -5
  32. package/lib/WebpackOptionsApply.js +4 -2
  33. package/lib/WebpackOptionsDefaulter.js +10 -3
  34. package/lib/config/defaults.js +31 -2
  35. package/lib/css/CssExportsGenerator.js +9 -0
  36. package/lib/css/CssGenerator.js +1 -1
  37. package/lib/css/CssLoadingRuntimeModule.js +13 -6
  38. package/lib/css/CssModulesPlugin.js +42 -14
  39. package/lib/css/CssParser.js +12 -0
  40. package/lib/dependencies/ConstDependency.js +2 -2
  41. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +19 -0
  42. package/lib/dependencies/ImportParserPlugin.js +25 -1
  43. package/lib/dependencies/JsonExportsDependency.js +1 -1
  44. package/lib/ids/SyncModuleIdsPlugin.js +1 -0
  45. package/lib/javascript/BasicEvaluatedExpression.js +23 -15
  46. package/lib/javascript/CommonJsChunkFormatPlugin.js +6 -2
  47. package/lib/javascript/JavascriptModulesPlugin.js +1 -0
  48. package/lib/javascript/JavascriptParser.js +118 -58
  49. package/lib/javascript/JavascriptParserHelpers.js +37 -15
  50. package/lib/json/JsonData.js +2 -2
  51. package/lib/json/JsonParser.js +25 -12
  52. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +2 -1
  53. package/lib/optimize/AggressiveMergingPlugin.js +8 -0
  54. package/lib/optimize/AggressiveSplittingPlugin.js +9 -2
  55. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -0
  56. package/lib/optimize/FlagIncludedChunksPlugin.js +11 -5
  57. package/lib/optimize/InnerGraph.js +4 -4
  58. package/lib/optimize/LimitChunkCountPlugin.js +29 -4
  59. package/lib/optimize/MangleExportsPlugin.js +1 -1
  60. package/lib/optimize/MinMaxSizeWarning.js +5 -0
  61. package/lib/optimize/ModuleConcatenationPlugin.js +59 -2
  62. package/lib/optimize/RealContentHashPlugin.js +80 -30
  63. package/lib/optimize/RemoveParentModulesPlugin.js +6 -0
  64. package/lib/optimize/RuntimeChunkPlugin.js +9 -1
  65. package/lib/optimize/SideEffectsFlagPlugin.js +10 -1
  66. package/lib/optimize/SplitChunksPlugin.js +71 -31
  67. package/lib/performance/SizeLimitsPlugin.js +7 -4
  68. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +3 -1
  69. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +3 -1
  70. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +5 -2
  71. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +3 -1
  72. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +3 -1
  73. package/lib/rules/BasicEffectRulePlugin.js +4 -0
  74. package/lib/rules/BasicMatcherRulePlugin.js +5 -0
  75. package/lib/rules/RuleSetCompiler.js +3 -3
  76. package/lib/rules/UseEffectRulePlugin.js +6 -4
  77. package/lib/runtime/AsyncModuleRuntimeModule.js +4 -1
  78. package/lib/runtime/AutoPublicPathRuntimeModule.js +3 -1
  79. package/lib/runtime/BaseUriRuntimeModule.js +2 -2
  80. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +4 -1
  81. package/lib/runtime/CompatRuntimeModule.js +6 -1
  82. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +4 -1
  83. package/lib/runtime/CreateScriptRuntimeModule.js +3 -1
  84. package/lib/runtime/CreateScriptUrlRuntimeModule.js +3 -1
  85. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +4 -1
  86. package/lib/runtime/EnsureChunkRuntimeModule.js +14 -3
  87. package/lib/runtime/GetChunkFilenameRuntimeModule.js +5 -9
  88. package/lib/runtime/GetFullHashRuntimeModule.js +3 -2
  89. package/lib/runtime/GetMainFilenameRuntimeModule.js +4 -1
  90. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +3 -1
  91. package/lib/runtime/HasOwnPropertyRuntimeModule.js +4 -1
  92. package/lib/runtime/LoadScriptRuntimeModule.js +63 -47
  93. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +4 -1
  94. package/lib/runtime/OnChunksLoadedRuntimeModule.js +3 -1
  95. package/lib/runtime/PublicPathRuntimeModule.js +3 -1
  96. package/lib/runtime/RelativeUrlRuntimeModule.js +4 -1
  97. package/lib/runtime/RuntimeIdRuntimeModule.js +5 -1
  98. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +8 -2
  99. package/lib/runtime/StartupEntrypointRuntimeModule.js +2 -1
  100. package/lib/serialization/BinaryMiddleware.js +143 -1
  101. package/lib/serialization/ErrorObjectSerializer.js +3 -0
  102. package/lib/serialization/ObjectMiddleware.js +9 -3
  103. package/lib/serialization/types.js +1 -1
  104. package/lib/sharing/ConsumeSharedFallbackDependency.js +3 -0
  105. package/lib/sharing/ConsumeSharedRuntimeModule.js +13 -4
  106. package/lib/sharing/ProvideSharedDependency.js +11 -0
  107. package/lib/sharing/ProvideSharedModule.js +4 -0
  108. package/lib/sharing/ProvideSharedPlugin.js +22 -21
  109. package/lib/sharing/ShareRuntimeModule.js +11 -4
  110. package/lib/sharing/resolveMatchedConfigs.js +1 -1
  111. package/lib/sharing/utils.js +32 -5
  112. package/lib/util/AsyncQueue.js +4 -2
  113. package/lib/util/ParallelismFactorCalculator.js +10 -0
  114. package/lib/util/Semaphore.js +1 -1
  115. package/lib/util/createHash.js +30 -9
  116. package/lib/util/deprecation.js +10 -3
  117. package/lib/util/deterministicGrouping.js +50 -11
  118. package/lib/util/findGraphRoots.js +4 -2
  119. package/lib/util/memoize.js +3 -3
  120. package/lib/util/processAsyncTree.js +7 -1
  121. package/lib/util/registerExternalSerializer.js +1 -1
  122. package/lib/util/runtime.js +14 -1
  123. package/lib/util/smartGrouping.js +1 -1
  124. package/lib/validateSchema.js +6 -2
  125. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +5 -1
  126. package/lib/wasm-async/AsyncWebAssemblyParser.js +7 -3
  127. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +13 -6
  128. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +3 -1
  129. package/lib/wasm-sync/WebAssemblyGenerator.js +1 -0
  130. package/lib/wasm-sync/WebAssemblyParser.js +6 -2
  131. package/lib/web/JsonpChunkLoadingRuntimeModule.js +13 -3
  132. package/lib/webpack.js +11 -2
  133. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +14 -15
  134. package/module.d.ts +1 -0
  135. package/package.json +4 -4
  136. package/schemas/WebpackOptions.check.js +1 -1
  137. package/schemas/WebpackOptions.json +51 -5
  138. package/schemas/plugins/css/CssGeneratorOptions.json +1 -1
  139. package/schemas/plugins/css/CssParserOptions.json +1 -1
  140. package/types.d.ts +476 -218
@@ -13,12 +13,18 @@ const { compareSelect, compareStrings } = require("../util/comparators");
13
13
  const createHash = require("../util/createHash");
14
14
 
15
15
  /** @typedef {import("webpack-sources").Source} Source */
16
+ /** @typedef {import("../Cache").Etag} Etag */
16
17
  /** @typedef {import("../Compilation").AssetInfo} AssetInfo */
17
18
  /** @typedef {import("../Compiler")} Compiler */
18
19
  /** @typedef {typeof import("../util/Hash")} Hash */
19
20
 
20
21
  const EMPTY_SET = new Set();
21
22
 
23
+ /**
24
+ * @template T
25
+ * @param {T | T[]} itemOrItems item or items
26
+ * @param {Set<T>} list list
27
+ */
22
28
  const addToList = (itemOrItems, list) => {
23
29
  if (Array.isArray(itemOrItems)) {
24
30
  for (const item of itemOrItems) {
@@ -61,6 +67,10 @@ const quoteMeta = str => {
61
67
 
62
68
  const cachedSourceMap = new WeakMap();
63
69
 
70
+ /**
71
+ * @param {Source} source source
72
+ * @returns {CachedSource} cached source
73
+ */
64
74
  const toCachedSource = source => {
65
75
  if (source instanceof CachedSource) {
66
76
  return source;
@@ -72,6 +82,10 @@ const toCachedSource = source => {
72
82
  return newSource;
73
83
  };
74
84
 
85
+ /** @typedef {Set<string>} OwnHashes */
86
+ /** @typedef {Set<string>} ReferencedHashes */
87
+ /** @typedef {Set<string>} Hashes */
88
+
75
89
  /**
76
90
  * @typedef {Object} AssetInfoForRealContentHash
77
91
  * @property {string} name
@@ -80,11 +94,11 @@ const toCachedSource = source => {
80
94
  * @property {RawSource | undefined} newSource
81
95
  * @property {RawSource | undefined} newSourceWithoutOwn
82
96
  * @property {string} content
83
- * @property {Set<string>} ownHashes
84
- * @property {Promise} contentComputePromise
85
- * @property {Promise} contentComputeWithoutOwnPromise
86
- * @property {Set<string>} referencedHashes
87
- * @property {Set<string>} hashes
97
+ * @property {OwnHashes | undefined} ownHashes
98
+ * @property {Promise<void> | undefined} contentComputePromise
99
+ * @property {Promise<void> | undefined} contentComputeWithoutOwnPromise
100
+ * @property {ReferencedHashes | undefined} referencedHashes
101
+ * @property {Hashes} hashes
88
102
  */
89
103
 
90
104
  /**
@@ -149,27 +163,25 @@ class RealContentHashPlugin {
149
163
  const assets = compilation.getAssets();
150
164
  /** @type {AssetInfoForRealContentHash[]} */
151
165
  const assetsWithInfo = [];
166
+ /** @type {Map<string, [AssetInfoForRealContentHash]>} */
152
167
  const hashToAssets = new Map();
153
168
  for (const { source, info, name } of assets) {
154
169
  const cachedSource = toCachedSource(source);
155
- const content = cachedSource.source();
156
- /** @type {Set<string>} */
170
+ const content = /** @type {string} */ (cachedSource.source());
171
+ /** @type {Hashes} */
157
172
  const hashes = new Set();
158
173
  addToList(info.contenthash, hashes);
174
+ /** @type {AssetInfoForRealContentHash} */
159
175
  const data = {
160
176
  name,
161
177
  info,
162
178
  source: cachedSource,
163
- /** @type {RawSource | undefined} */
164
179
  newSource: undefined,
165
- /** @type {RawSource | undefined} */
166
180
  newSourceWithoutOwn: undefined,
167
181
  content,
168
- /** @type {Set<string>} */
169
182
  ownHashes: undefined,
170
183
  contentComputePromise: undefined,
171
184
  contentComputeWithoutOwnPromise: undefined,
172
- /** @type {Set<string>} */
173
185
  referencedHashes: undefined,
174
186
  hashes
175
187
  };
@@ -218,11 +230,17 @@ class RealContentHashPlugin {
218
230
  });
219
231
  })
220
232
  );
233
+ /**
234
+ * @param {string} hash the hash
235
+ * @returns {undefined | ReferencedHashes} the referenced hashes
236
+ */
221
237
  const getDependencies = hash => {
222
238
  const assets = hashToAssets.get(hash);
223
239
  if (!assets) {
224
240
  const referencingAssets = assetsWithInfo.filter(asset =>
225
- asset.referencedHashes.has(hash)
241
+ /** @type {ReferencedHashes} */ (asset.referencedHashes).has(
242
+ hash
243
+ )
226
244
  );
227
245
  const err = new WebpackError(`RealContentHashPlugin
228
246
  Some kind of unexpected caching problem occurred.
@@ -242,23 +260,36 @@ ${referencingAssets
242
260
  }
243
261
  const hashes = new Set();
244
262
  for (const { referencedHashes, ownHashes } of assets) {
245
- if (!ownHashes.has(hash)) {
246
- for (const hash of ownHashes) {
263
+ if (!(/** @type {OwnHashes} */ (ownHashes).has(hash))) {
264
+ for (const hash of /** @type {OwnHashes} */ (ownHashes)) {
247
265
  hashes.add(hash);
248
266
  }
249
267
  }
250
- for (const hash of referencedHashes) {
268
+ for (const hash of /** @type {ReferencedHashes} */ (
269
+ referencedHashes
270
+ )) {
251
271
  hashes.add(hash);
252
272
  }
253
273
  }
254
274
  return hashes;
255
275
  };
276
+ /**
277
+ * @param {string} hash the hash
278
+ * @returns {string} the hash info
279
+ */
256
280
  const hashInfo = hash => {
257
281
  const assets = hashToAssets.get(hash);
258
- return `${hash} (${Array.from(assets, a => a.name)})`;
282
+ return `${hash} (${Array.from(
283
+ /** @type {AssetInfoForRealContentHash[]} */ (assets),
284
+ a => a.name
285
+ )})`;
259
286
  };
260
287
  const hashesInOrder = new Set();
261
288
  for (const hash of hashToAssets.keys()) {
289
+ /**
290
+ * @param {string} hash the hash
291
+ * @param {Set<string>} stack stack of hashes
292
+ */
262
293
  const add = (hash, stack) => {
263
294
  const deps = getDependencies(hash);
264
295
  if (!deps) return;
@@ -282,21 +313,31 @@ ${referencingAssets
282
313
  add(hash, new Set());
283
314
  }
284
315
  const hashToNewHash = new Map();
316
+ /**
317
+ * @param {AssetInfoForRealContentHash} asset asset info
318
+ * @returns {Etag} etag
319
+ */
285
320
  const getEtag = asset =>
286
321
  cacheGenerate.mergeEtags(
287
322
  cacheGenerate.getLazyHashedEtag(asset.source),
288
- Array.from(asset.referencedHashes, hash =>
289
- hashToNewHash.get(hash)
323
+ Array.from(
324
+ /** @type {ReferencedHashes} */ (asset.referencedHashes),
325
+ hash => hashToNewHash.get(hash)
290
326
  ).join("|")
291
327
  );
328
+ /**
329
+ * @param {AssetInfoForRealContentHash} asset asset info
330
+ * @returns {Promise<void>}
331
+ */
292
332
  const computeNewContent = asset => {
293
333
  if (asset.contentComputePromise) return asset.contentComputePromise;
294
334
  return (asset.contentComputePromise = (async () => {
295
335
  if (
296
- asset.ownHashes.size > 0 ||
297
- Array.from(asset.referencedHashes).some(
298
- hash => hashToNewHash.get(hash) !== hash
299
- )
336
+ /** @type {OwnHashes} */ (asset.ownHashes).size > 0 ||
337
+ Array.from(
338
+ /** @type {ReferencedHashes} */
339
+ (asset.referencedHashes)
340
+ ).some(hash => hashToNewHash.get(hash) !== hash)
300
341
  ) {
301
342
  const identifier = asset.name;
302
343
  const etag = getEtag(asset);
@@ -313,15 +354,20 @@ ${referencingAssets
313
354
  }
314
355
  })());
315
356
  };
357
+ /**
358
+ * @param {AssetInfoForRealContentHash} asset asset info
359
+ * @returns {Promise<void>}
360
+ */
316
361
  const computeNewContentWithoutOwn = asset => {
317
362
  if (asset.contentComputeWithoutOwnPromise)
318
363
  return asset.contentComputeWithoutOwnPromise;
319
364
  return (asset.contentComputeWithoutOwnPromise = (async () => {
320
365
  if (
321
- asset.ownHashes.size > 0 ||
322
- Array.from(asset.referencedHashes).some(
323
- hash => hashToNewHash.get(hash) !== hash
324
- )
366
+ /** @type {OwnHashes} */ (asset.ownHashes).size > 0 ||
367
+ Array.from(
368
+ /** @type {ReferencedHashes} */
369
+ (asset.referencedHashes)
370
+ ).some(hash => hashToNewHash.get(hash) !== hash)
325
371
  ) {
326
372
  const identifier = asset.name + "|without-own";
327
373
  const etag = getEtag(asset);
@@ -332,7 +378,9 @@ ${referencingAssets
332
378
  const newContent = asset.content.replace(
333
379
  hashRegExp,
334
380
  hash => {
335
- if (asset.ownHashes.has(hash)) {
381
+ if (
382
+ /** @type {OwnHashes} */ (asset.ownHashes).has(hash)
383
+ ) {
336
384
  return "";
337
385
  }
338
386
  return hashToNewHash.get(hash);
@@ -346,17 +394,19 @@ ${referencingAssets
346
394
  };
347
395
  const comparator = compareSelect(a => a.name, compareStrings);
348
396
  for (const oldHash of hashesInOrder) {
349
- const assets = hashToAssets.get(oldHash);
397
+ const assets =
398
+ /** @type {AssetInfoForRealContentHash[]} */
399
+ (hashToAssets.get(oldHash));
350
400
  assets.sort(comparator);
351
401
  await Promise.all(
352
402
  assets.map(asset =>
353
- asset.ownHashes.has(oldHash)
403
+ /** @type {OwnHashes} */ (asset.ownHashes).has(oldHash)
354
404
  ? computeNewContentWithoutOwn(asset)
355
405
  : computeNewContent(asset)
356
406
  )
357
407
  );
358
408
  const assetsContent = mapAndDeduplicateBuffers(assets, asset => {
359
- if (asset.ownHashes.has(oldHash)) {
409
+ if (/** @type {OwnHashes} */ (asset.ownHashes).has(oldHash)) {
360
410
  return asset.newSourceWithoutOwn
361
411
  ? asset.newSourceWithoutOwn.buffer()
362
412
  : asset.source.buffer();
@@ -9,6 +9,8 @@ const { STAGE_BASIC } = require("../OptimizationStages");
9
9
  const Queue = require("../util/Queue");
10
10
  const { intersect } = require("../util/SetHelpers");
11
11
 
12
+ /** @typedef {import("../Chunk")} Chunk */
13
+ /** @typedef {import("../ChunkGroup")} ChunkGroup */
12
14
  /** @typedef {import("../Compiler")} Compiler */
13
15
 
14
16
  class RemoveParentModulesPlugin {
@@ -18,6 +20,10 @@ class RemoveParentModulesPlugin {
18
20
  */
19
21
  apply(compiler) {
20
22
  compiler.hooks.compilation.tap("RemoveParentModulesPlugin", compilation => {
23
+ /**
24
+ * @param {Iterable<Chunk>} chunks the chunks
25
+ * @param {ChunkGroup[]} chunkGroups the chunk groups
26
+ */
21
27
  const handler = (chunks, chunkGroups) => {
22
28
  const chunkGraph = compilation.chunkGraph;
23
29
  const queue = new Queue();
@@ -5,11 +5,17 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ /** @typedef {import("../Compilation").EntryData} EntryData */
8
9
  /** @typedef {import("../Compiler")} Compiler */
10
+ /** @typedef {import("../Entrypoint")} Entrypoint */
9
11
 
10
12
  class RuntimeChunkPlugin {
11
13
  constructor(options) {
12
14
  this.options = {
15
+ /**
16
+ * @param {Entrypoint} entrypoint entrypoint name
17
+ * @returns {string} runtime chunk name
18
+ */
13
19
  name: entrypoint => `runtime~${entrypoint.name}`,
14
20
  ...options
15
21
  };
@@ -26,7 +32,9 @@ class RuntimeChunkPlugin {
26
32
  "RuntimeChunkPlugin",
27
33
  (_, { name: entryName }) => {
28
34
  if (entryName === undefined) return;
29
- const data = compilation.entries.get(entryName);
35
+ const data =
36
+ /** @type {EntryData} */
37
+ (compilation.entries.get(entryName));
30
38
  if (data.options.runtime === undefined && !data.options.dependOn) {
31
39
  // Determine runtime chunk name
32
40
  let name = this.options.name;
@@ -16,6 +16,8 @@ const HarmonyExportImportedSpecifierDependency = require("../dependencies/Harmon
16
16
  const HarmonyImportSpecifierDependency = require("../dependencies/HarmonyImportSpecifierDependency");
17
17
  const formatLocation = require("../formatLocation");
18
18
 
19
+ /** @typedef {import("estree").ModuleDeclaration} ModuleDeclaration */
20
+ /** @typedef {import("estree").Statement} Statement */
19
21
  /** @typedef {import("../Compiler")} Compiler */
20
22
  /** @typedef {import("../Dependency")} Dependency */
21
23
  /** @typedef {import("../Module")} Module */
@@ -117,6 +119,7 @@ class SideEffectsFlagPlugin {
117
119
  * @returns {void}
118
120
  */
119
121
  const parserHandler = parser => {
122
+ /** @type {undefined | Statement | ModuleDeclaration} */
120
123
  let sideEffectsStatement;
121
124
  parser.hooks.program.tap(PLUGIN_NAME, () => {
122
125
  sideEffectsStatement = undefined;
@@ -258,7 +261,7 @@ class SideEffectsFlagPlugin {
258
261
  // TODO improve for export *
259
262
  if (isReexport && dep.name) {
260
263
  const exportInfo = moduleGraph.getExportInfo(
261
- connection.originModule,
264
+ /** @type {Module} */ (connection.originModule),
262
265
  dep.name
263
266
  );
264
267
  exportInfo.moveTarget(
@@ -319,6 +322,12 @@ class SideEffectsFlagPlugin {
319
322
  );
320
323
  }
321
324
 
325
+ /**
326
+ * @param {string} moduleName the module name
327
+ * @param {undefined | boolean | string | string[]} flagValue the flag value
328
+ * @param {Map<string, RegExp>} cache cache for glob to regexp
329
+ * @returns {boolean | undefined} true, when the module has side effects, undefined or false when not
330
+ */
322
331
  static moduleHasSideEffects(moduleName, flagValue, cache) {
323
332
  switch (typeof flagValue) {
324
333
  case "undefined":
@@ -41,7 +41,7 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
41
41
  /**
42
42
  * @callback ChunkFilterFunction
43
43
  * @param {Chunk} chunk
44
- * @returns {boolean}
44
+ * @returns {boolean | undefined}
45
45
  */
46
46
 
47
47
  /**
@@ -69,7 +69,7 @@ const MinMaxSizeWarning = require("./MinMaxSizeWarning");
69
69
  * @property {number=} maxInitialRequests
70
70
  * @property {(string | function(PathData, AssetInfo=): string)=} filename
71
71
  * @property {string=} idHint
72
- * @property {string} automaticNameDelimiter
72
+ * @property {string=} automaticNameDelimiter
73
73
  * @property {boolean=} reuseExistingChunk
74
74
  * @property {boolean=} usedExports
75
75
  */
@@ -254,12 +254,24 @@ const compareEntries = (a, b) => {
254
254
  return compareModuleIterables(modulesA, modulesB);
255
255
  };
256
256
 
257
+ /**
258
+ * @param {Chunk} chunk the chunk
259
+ * @returns {boolean} true, if the chunk is an entry chunk
260
+ */
257
261
  const INITIAL_CHUNK_FILTER = chunk => chunk.canBeInitial();
262
+ /**
263
+ * @param {Chunk} chunk the chunk
264
+ * @returns {boolean} true, if the chunk is an async chunk
265
+ */
258
266
  const ASYNC_CHUNK_FILTER = chunk => !chunk.canBeInitial();
267
+ /**
268
+ * @param {Chunk} chunk the chunk
269
+ * @returns {boolean} always true
270
+ */
259
271
  const ALL_CHUNK_FILTER = chunk => true;
260
272
 
261
273
  /**
262
- * @param {OptimizationSplitChunksSizes} value the sizes
274
+ * @param {OptimizationSplitChunksSizes | undefined} value the sizes
263
275
  * @param {string[]} defaultSizeTypes the default size types
264
276
  * @returns {SplitChunksSizes} normalized representation
265
277
  */
@@ -386,8 +398,8 @@ const totalSize = sizes => {
386
398
  };
387
399
 
388
400
  /**
389
- * @param {false|string|Function} name the chunk name
390
- * @returns {GetName} a function to get the name of the chunk
401
+ * @param {false|string|Function|undefined} name the chunk name
402
+ * @returns {GetName | undefined} a function to get the name of the chunk
391
403
  */
392
404
  const normalizeName = name => {
393
405
  if (typeof name === "string") {
@@ -412,6 +424,11 @@ const normalizeChunksFilter = chunks => {
412
424
  if (chunks === "all") {
413
425
  return ALL_CHUNK_FILTER;
414
426
  }
427
+ if (chunks instanceof RegExp) {
428
+ return chunk => {
429
+ return chunk.name ? chunks.test(chunk.name) : false;
430
+ };
431
+ }
415
432
  if (typeof chunks === "function") {
416
433
  return chunks;
417
434
  }
@@ -839,6 +856,10 @@ module.exports = class SplitChunksPlugin {
839
856
  }
840
857
  return key;
841
858
  };
859
+ /**
860
+ * @param {bigint | Chunk} key key of the chunks
861
+ * @returns {string} stringified key
862
+ */
842
863
  const keyToString = key => {
843
864
  if (typeof key === "bigint") return key.toString(16);
844
865
  return chunkIndexMap.get(key).toString(16);
@@ -910,6 +931,10 @@ module.exports = class SplitChunksPlugin {
910
931
  // group these set of chunks by count
911
932
  // to allow to check less sets via isSubset
912
933
  // (only smaller sets can be subset)
934
+ /**
935
+ * @param {IterableIterator<Set<Chunk>>} chunkSets set of sets of chunks
936
+ * @returns {Map<number, Array<Set<Chunk>>>} map of sets of chunks by count
937
+ */
913
938
  const groupChunkSetsByCount = chunkSets => {
914
939
  /** @type {Map<number, Array<Set<Chunk>>>} */
915
940
  const chunkSetsByCount = new Map();
@@ -1019,8 +1044,9 @@ module.exports = class SplitChunksPlugin {
1019
1044
  entry = new WeakMap();
1020
1045
  selectedChunksCacheByChunksSet.set(chunks, entry);
1021
1046
  }
1022
- /** @type {SelectedChunksResult} */
1023
- let entry2 = entry.get(chunkFilter);
1047
+ let entry2 =
1048
+ /** @type {SelectedChunksResult} */
1049
+ (entry.get(chunkFilter));
1024
1050
  if (entry2 === undefined) {
1025
1051
  /** @type {Chunk[]} */
1026
1052
  const selectedChunks = [];
@@ -1068,11 +1094,9 @@ module.exports = class SplitChunksPlugin {
1068
1094
  // Break if minimum number of chunks is not reached
1069
1095
  if (selectedChunks.length < cacheGroup.minChunks) return;
1070
1096
  // Determine name for split chunk
1071
- const name = cacheGroup.getName(
1072
- module,
1073
- selectedChunks,
1074
- cacheGroup.key
1075
- );
1097
+ const name =
1098
+ /** @type {string} */
1099
+ (cacheGroup.getName(module, selectedChunks, cacheGroup.key));
1076
1100
  // Check if the name is ok
1077
1101
  const existingChunk = compilation.namedChunks.get(name);
1078
1102
  if (existingChunk) {
@@ -1139,7 +1163,7 @@ module.exports = class SplitChunksPlugin {
1139
1163
  ? ` name:${name}`
1140
1164
  : ` chunks:${keyToString(selectedChunksKey)}`);
1141
1165
  // Add module to maps
1142
- let info = chunksInfoMap.get(key);
1166
+ let info = /** @type {ChunksInfoItem} */ (chunksInfoMap.get(key));
1143
1167
  if (info === undefined) {
1144
1168
  chunksInfoMap.set(
1145
1169
  key,
@@ -1204,7 +1228,9 @@ module.exports = class SplitChunksPlugin {
1204
1228
  getExportsChunkSetsInGraph();
1205
1229
  /** @type {Set<Set<Chunk> | Chunk>} */
1206
1230
  const set = new Set();
1207
- const groupedByUsedExports = groupedByExportsMap.get(module);
1231
+ const groupedByUsedExports =
1232
+ /** @type {Iterable<Chunk[]>} */
1233
+ (groupedByExportsMap.get(module));
1208
1234
  for (const chunks of groupedByUsedExports) {
1209
1235
  const chunksKey = getKey(chunks);
1210
1236
  for (const comb of getExportsCombinations(chunksKey))
@@ -1228,7 +1254,10 @@ module.exports = class SplitChunksPlugin {
1228
1254
  if (count < cacheGroup.minChunks) continue;
1229
1255
  // Select chunks by configuration
1230
1256
  const { chunks: selectedChunks, key: selectedChunksKey } =
1231
- getSelectedChunks(chunkCombination, cacheGroup.chunksFilter);
1257
+ getSelectedChunks(
1258
+ chunkCombination,
1259
+ /** @type {ChunkFilterFunction} */ (cacheGroup.chunksFilter)
1260
+ );
1232
1261
 
1233
1262
  addModuleToChunksInfoMap(
1234
1263
  cacheGroup,
@@ -1320,12 +1349,13 @@ module.exports = class SplitChunksPlugin {
1320
1349
  }
1321
1350
  }
1322
1351
 
1323
- const item = bestEntry;
1324
- chunksInfoMap.delete(bestEntryKey);
1352
+ const item = /** @type {ChunksInfoItem} */ (bestEntry);
1353
+ chunksInfoMap.delete(/** @type {string} */ (bestEntryKey));
1325
1354
 
1355
+ /** @type {Chunk["name"] | undefined} */
1326
1356
  let chunkName = item.name;
1327
1357
  // Variable for the new chunk (lazy created)
1328
- /** @type {Chunk} */
1358
+ /** @type {Chunk | undefined} */
1329
1359
  let newChunk;
1330
1360
  // When no chunk name, check if we can reuse a chunk instead of creating a new one
1331
1361
  let isExistingChunk = false;
@@ -1394,14 +1424,18 @@ module.exports = class SplitChunksPlugin {
1394
1424
  ) {
1395
1425
  for (const chunk of usedChunks) {
1396
1426
  // respect max requests
1397
- const maxRequests = chunk.isOnlyInitial()
1398
- ? item.cacheGroup.maxInitialRequests
1399
- : chunk.canBeInitial()
1400
- ? Math.min(
1401
- item.cacheGroup.maxInitialRequests,
1402
- item.cacheGroup.maxAsyncRequests
1403
- )
1404
- : item.cacheGroup.maxAsyncRequests;
1427
+ const maxRequests = /** @type {number} */ (
1428
+ chunk.isOnlyInitial()
1429
+ ? item.cacheGroup.maxInitialRequests
1430
+ : chunk.canBeInitial()
1431
+ ? Math.min(
1432
+ /** @type {number} */
1433
+ (item.cacheGroup.maxInitialRequests),
1434
+ /** @type {number} */
1435
+ (item.cacheGroup.maxAsyncRequests)
1436
+ )
1437
+ : item.cacheGroup.maxAsyncRequests
1438
+ );
1405
1439
  if (
1406
1440
  isFinite(maxRequests) &&
1407
1441
  getRequests(chunk) >= maxRequests
@@ -1421,8 +1455,12 @@ module.exports = class SplitChunksPlugin {
1421
1455
  // Were some (invalid) chunks removed from usedChunks?
1422
1456
  // => readd all modules to the queue, as things could have been changed
1423
1457
  if (usedChunks.size < item.chunks.size) {
1424
- if (isExistingChunk) usedChunks.add(newChunk);
1425
- if (usedChunks.size >= item.cacheGroup.minChunks) {
1458
+ if (isExistingChunk)
1459
+ usedChunks.add(/** @type {Chunk} */ (newChunk));
1460
+ if (
1461
+ /** @type {number} */ (usedChunks.size) >=
1462
+ /** @type {number} */ (item.cacheGroup.minChunks)
1463
+ ) {
1426
1464
  const chunksArr = Array.from(usedChunks);
1427
1465
  for (const module of item.modules) {
1428
1466
  addModuleToChunksInfoMap(
@@ -1466,7 +1504,7 @@ module.exports = class SplitChunksPlugin {
1466
1504
  ) {
1467
1505
  // queue this item again to be processed again
1468
1506
  // without violating modules
1469
- chunksInfoMap.set(bestEntryKey, item);
1507
+ chunksInfoMap.set(/** @type {string} */ (bestEntryKey), item);
1470
1508
  }
1471
1509
  continue;
1472
1510
  }
@@ -1696,7 +1734,9 @@ module.exports = class SplitChunksPlugin {
1696
1734
  hashFilename(name, outputOptions);
1697
1735
  }
1698
1736
  if (i !== results.length - 1) {
1699
- const newPart = compilation.addChunk(name);
1737
+ const newPart = compilation.addChunk(
1738
+ /** @type {Chunk["name"]} */ (name)
1739
+ );
1700
1740
  chunk.split(newPart);
1701
1741
  newPart.chunkReason = chunk.chunkReason;
1702
1742
  // Add all modules to the new chunk
@@ -1711,7 +1751,7 @@ module.exports = class SplitChunksPlugin {
1711
1751
  }
1712
1752
  } else {
1713
1753
  // change the chunk to be a part
1714
- chunk.name = name;
1754
+ chunk.name = /** @type {Chunk["name"]} */ (name);
1715
1755
  }
1716
1756
  }
1717
1757
  }
@@ -95,7 +95,7 @@ module.exports = class SizeLimitsPlugin {
95
95
  }
96
96
 
97
97
  const size = info.size || source.size();
98
- if (size > assetSizeLimit) {
98
+ if (size > /** @type {number} */ (assetSizeLimit)) {
99
99
  assetsOverSizeLimit.push({
100
100
  name,
101
101
  size
@@ -114,7 +114,7 @@ module.exports = class SizeLimitsPlugin {
114
114
  for (const [name, entry] of compilation.entrypoints) {
115
115
  const size = getEntrypointSize(entry);
116
116
 
117
- if (size > entrypointSizeLimit) {
117
+ if (size > /** @type {number} */ (entrypointSizeLimit)) {
118
118
  entrypointsOverLimit.push({
119
119
  name: name,
120
120
  size: size,
@@ -131,14 +131,17 @@ module.exports = class SizeLimitsPlugin {
131
131
  // if !1, then 2, if !2 return
132
132
  if (assetsOverSizeLimit.length > 0) {
133
133
  warnings.push(
134
- new AssetsOverSizeLimitWarning(assetsOverSizeLimit, assetSizeLimit)
134
+ new AssetsOverSizeLimitWarning(
135
+ assetsOverSizeLimit,
136
+ /** @type {number} */ (assetSizeLimit)
137
+ )
135
138
  );
136
139
  }
137
140
  if (entrypointsOverLimit.length > 0) {
138
141
  warnings.push(
139
142
  new EntrypointsOverSizeLimitWarning(
140
143
  entrypointsOverLimit,
141
- entrypointSizeLimit
144
+ /** @type {number} */ (entrypointSizeLimit)
142
145
  )
143
146
  );
144
147
  }
@@ -7,6 +7,7 @@
7
7
  const RuntimeModule = require("../RuntimeModule");
8
8
  const Template = require("../Template");
9
9
 
10
+ /** @typedef {import("../Compilation")} Compilation */
10
11
  /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
11
12
 
12
13
  class ChunkPrefetchFunctionRuntimeModule extends RuntimeModule {
@@ -27,7 +28,8 @@ class ChunkPrefetchFunctionRuntimeModule extends RuntimeModule {
27
28
  */
28
29
  generate() {
29
30
  const { runtimeFunction, runtimeHandlers } = this;
30
- const { runtimeTemplate } = this.compilation;
31
+ const compilation = /** @type {Compilation} */ (this.compilation);
32
+ const { runtimeTemplate } = compilation;
31
33
  return Template.asString([
32
34
  `${runtimeHandlers} = {};`,
33
35
  `${runtimeFunction} = ${runtimeTemplate.basicFunction("chunkId", [
@@ -11,6 +11,8 @@ const ChunkPrefetchStartupRuntimeModule = require("./ChunkPrefetchStartupRuntime
11
11
  const ChunkPrefetchTriggerRuntimeModule = require("./ChunkPrefetchTriggerRuntimeModule");
12
12
  const ChunkPreloadTriggerRuntimeModule = require("./ChunkPreloadTriggerRuntimeModule");
13
13
 
14
+ /** @typedef {import("../Chunk")} Chunk */
15
+ /** @typedef {import("../ChunkGroup").RawChunkGroupOptions} RawChunkGroupOptions */
14
16
  /** @typedef {import("../Compiler")} Compiler */
15
17
 
16
18
  class ChunkPrefetchPreloadPlugin {
@@ -43,7 +45,7 @@ class ChunkPrefetchPreloadPlugin {
43
45
  compilation.hooks.additionalTreeRuntimeRequirements.tap(
44
46
  "ChunkPrefetchPreloadPlugin",
45
47
  (chunk, set, { chunkGraph }) => {
46
- const chunkMap = chunk.getChildIdsByOrdersMap(chunkGraph, false);
48
+ const chunkMap = chunk.getChildIdsByOrdersMap(chunkGraph);
47
49
 
48
50
  if (chunkMap.prefetch) {
49
51
  set.add(RuntimeGlobals.prefetchChunk);
@@ -9,6 +9,7 @@ const RuntimeModule = require("../RuntimeModule");
9
9
  const Template = require("../Template");
10
10
 
11
11
  /** @typedef {import("../Chunk")} Chunk */
12
+ /** @typedef {import("../Compilation")} Compilation */
12
13
  /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
13
14
 
14
15
  class ChunkPrefetchStartupRuntimeModule extends RuntimeModule {
@@ -24,8 +25,10 @@ class ChunkPrefetchStartupRuntimeModule extends RuntimeModule {
24
25
  * @returns {string} runtime code
25
26
  */
26
27
  generate() {
27
- const { startupChunks, chunk } = this;
28
- const { runtimeTemplate } = this.compilation;
28
+ const { startupChunks } = this;
29
+ const compilation = /** @type {Compilation} */ (this.compilation);
30
+ const chunk = /** @type {Chunk} */ (this.chunk);
31
+ const { runtimeTemplate } = compilation;
29
32
  return Template.asString(
30
33
  startupChunks.map(
31
34
  ({ onChunks, chunks }) =>
@@ -8,6 +8,7 @@ const RuntimeGlobals = require("../RuntimeGlobals");
8
8
  const RuntimeModule = require("../RuntimeModule");
9
9
  const Template = require("../Template");
10
10
 
11
+ /** @typedef {import("../Compilation")} Compilation */
11
12
  /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
12
13
 
13
14
  class ChunkPrefetchTriggerRuntimeModule extends RuntimeModule {
@@ -24,7 +25,8 @@ class ChunkPrefetchTriggerRuntimeModule extends RuntimeModule {
24
25
  */
25
26
  generate() {
26
27
  const { chunkMap } = this;
27
- const { runtimeTemplate } = this.compilation;
28
+ const compilation = /** @type {Compilation} */ (this.compilation);
29
+ const { runtimeTemplate } = compilation;
28
30
  const body = [
29
31
  "var chunks = chunkToChildrenMap[chunkId];",
30
32
  `Array.isArray(chunks) && chunks.map(${RuntimeGlobals.prefetchChunk});`