webpack 5.57.1 → 5.59.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.

@@ -466,49 +466,68 @@ class NormalModuleFactory extends ModuleFactory {
466
466
  : "") +
467
467
  stringifyLoadersAndResource(loaders, resourceData.resource);
468
468
 
469
- const resourceDataForRules = matchResourceData || resourceData;
470
- const result = this.ruleSet.exec({
471
- resource: resourceDataForRules.path,
472
- realResource: resourceData.path,
473
- resourceQuery: resourceDataForRules.query,
474
- resourceFragment: resourceDataForRules.fragment,
475
- scheme,
476
- assertions,
477
- mimetype: matchResourceData ? "" : resourceData.data.mimetype || "",
478
- dependency: dependencyType,
479
- descriptionData: matchResourceData
480
- ? undefined
481
- : resourceData.data.descriptionFileData,
482
- issuer: contextInfo.issuer,
483
- compiler: contextInfo.compiler,
484
- issuerLayer: contextInfo.issuerLayer || ""
485
- });
486
469
  const settings = {};
487
470
  const useLoadersPost = [];
488
471
  const useLoaders = [];
489
472
  const useLoadersPre = [];
490
- for (const r of result) {
491
- if (r.type === "use") {
492
- if (!noAutoLoaders && !noPrePostAutoLoaders) {
493
- useLoaders.push(r.value);
494
- }
495
- } else if (r.type === "use-post") {
496
- if (!noPrePostAutoLoaders) {
497
- useLoadersPost.push(r.value);
498
- }
499
- } else if (r.type === "use-pre") {
500
- if (!noPreAutoLoaders && !noPrePostAutoLoaders) {
501
- useLoadersPre.push(r.value);
473
+
474
+ // handle .webpack[] suffix
475
+ let resource;
476
+ let match;
477
+ if (
478
+ matchResourceData &&
479
+ typeof (resource = matchResourceData.resource) === "string" &&
480
+ (match = /\.webpack\[([^\]]+)\]$/.exec(resource))
481
+ ) {
482
+ settings.type = match[1];
483
+ matchResourceData.resource = matchResourceData.resource.slice(
484
+ 0,
485
+ -settings.type.length - 10
486
+ );
487
+ } else {
488
+ settings.type = "javascript/auto";
489
+ const resourceDataForRules = matchResourceData || resourceData;
490
+ const result = this.ruleSet.exec({
491
+ resource: resourceDataForRules.path,
492
+ realResource: resourceData.path,
493
+ resourceQuery: resourceDataForRules.query,
494
+ resourceFragment: resourceDataForRules.fragment,
495
+ scheme,
496
+ assertions,
497
+ mimetype: matchResourceData
498
+ ? ""
499
+ : resourceData.data.mimetype || "",
500
+ dependency: dependencyType,
501
+ descriptionData: matchResourceData
502
+ ? undefined
503
+ : resourceData.data.descriptionFileData,
504
+ issuer: contextInfo.issuer,
505
+ compiler: contextInfo.compiler,
506
+ issuerLayer: contextInfo.issuerLayer || ""
507
+ });
508
+ for (const r of result) {
509
+ if (r.type === "use") {
510
+ if (!noAutoLoaders && !noPrePostAutoLoaders) {
511
+ useLoaders.push(r.value);
512
+ }
513
+ } else if (r.type === "use-post") {
514
+ if (!noPrePostAutoLoaders) {
515
+ useLoadersPost.push(r.value);
516
+ }
517
+ } else if (r.type === "use-pre") {
518
+ if (!noPreAutoLoaders && !noPrePostAutoLoaders) {
519
+ useLoadersPre.push(r.value);
520
+ }
521
+ } else if (
522
+ typeof r.value === "object" &&
523
+ r.value !== null &&
524
+ typeof settings[r.type] === "object" &&
525
+ settings[r.type] !== null
526
+ ) {
527
+ settings[r.type] = cachedCleverMerge(settings[r.type], r.value);
528
+ } else {
529
+ settings[r.type] = r.value;
502
530
  }
503
- } else if (
504
- typeof r.value === "object" &&
505
- r.value !== null &&
506
- typeof settings[r.type] === "object" &&
507
- settings[r.type] !== null
508
- ) {
509
- settings[r.type] = cachedCleverMerge(settings[r.type], r.value);
510
- } else {
511
- settings[r.type] = r.value;
512
531
  }
513
532
  }
514
533
 
@@ -528,23 +547,6 @@ class NormalModuleFactory extends ModuleFactory {
528
547
  }
529
548
  for (const loader of preLoaders) allLoaders.push(loader);
530
549
  let type = settings.type;
531
- if (!type) {
532
- let resource;
533
- let match;
534
- if (
535
- matchResourceData &&
536
- typeof (resource = matchResourceData.resource) === "string" &&
537
- (match = /\.webpack\[([^\]]+)\]$/.exec(resource))
538
- ) {
539
- type = match[1];
540
- matchResourceData.resource = matchResourceData.resource.slice(
541
- 0,
542
- -type.length - 10
543
- );
544
- } else {
545
- type = "javascript/auto";
546
- }
547
- }
548
550
  const resolveOptions = settings.resolve;
549
551
  const layer = settings.layer;
550
552
  if (layer !== undefined && !layers) {
@@ -807,7 +807,7 @@ class RuntimeTemplate {
807
807
  ? `(0,${access})`
808
808
  : asiSafe === false
809
809
  ? `;(0,${access})`
810
- : `Object(${access})`;
810
+ : `/*#__PURE__*/Object(${access})`;
811
811
  }
812
812
  return access;
813
813
  } else {
@@ -279,8 +279,6 @@ class WebpackOptionsApply extends OptionsApply {
279
279
  if (options.experiments.buildHttp) {
280
280
  const HttpUriPlugin = require("./schemes/HttpUriPlugin");
281
281
  const httpOptions = options.experiments.buildHttp;
282
- if (httpOptions === true)
283
- throw new Error("Unexpected due to normalization");
284
282
  new HttpUriPlugin(httpOptions).apply(compiler);
285
283
  }
286
284
 
@@ -43,7 +43,7 @@ const { getEntryRuntime, mergeRuntime } = require("./util/runtime");
43
43
  * @property {boolean} minAvailableModulesOwned true, if minAvailableModules is owned and can be modified
44
44
  * @property {ModuleSetPlus[]} availableModulesToBeMerged enqueued updates to the minimal set of available modules
45
45
  * @property {Set<Module>=} skippedItems modules that were skipped because module is already available in parent chunks (need to reconsider when minAvailableModules is shrinking)
46
- * @property {Set<[Module, ModuleGraphConnection[]]>=} skippedModuleConnections referenced modules that where skipped because they were not active in this runtime
46
+ * @property {Set<[Module, ConnectionState]>=} skippedModuleConnections referenced modules that where skipped because they were not active in this runtime
47
47
  * @property {ModuleSetPlus} resultingAvailableModules set of modules available including modules from this chunk group
48
48
  * @property {Set<ChunkGroupInfo>} children set of children chunk groups, that will be revisited when availableModules shrink
49
49
  * @property {Set<ChunkGroupInfo>} availableSources set of chunk groups that are the source for minAvailableModules
@@ -70,97 +70,106 @@ const bySetSize = (a, b) => {
70
70
  return b.size + b.plus.size - a.size - a.plus.size;
71
71
  };
72
72
 
73
- /**
74
- *
75
- * @param {ModuleGraphConnection[]} connections list of connections
76
- * @param {RuntimeSpec} runtime for which runtime
77
- * @returns {ConnectionState} connection state
78
- */
79
- const getActiveStateOfConnections = (connections, runtime) => {
80
- let merged = connections[0].getActiveState(runtime);
81
- if (merged === true) return true;
82
- for (let i = 1; i < connections.length; i++) {
83
- const c = connections[i];
84
- merged = ModuleGraphConnection.addConnectionStates(
85
- merged,
86
- c.getActiveState(runtime)
87
- );
88
- if (merged === true) return true;
73
+ const extractBlockModules = (module, moduleGraph, runtime, blockModulesMap) => {
74
+ let blockCache;
75
+ let modules;
76
+
77
+ const arrays = [];
78
+
79
+ const queue = [module];
80
+ while (queue.length > 0) {
81
+ const block = queue.pop();
82
+ const arr = [];
83
+ arrays.push(arr);
84
+ blockModulesMap.set(block, arr);
85
+ for (const b of block.blocks) {
86
+ queue.push(b);
87
+ }
89
88
  }
90
- return merged;
91
- };
92
89
 
93
- /**
94
- * Extracts block to modules mapping from all modules
95
- * @param {Compilation} compilation the compilation
96
- * @returns {Map<DependenciesBlock, Map<Module, ModuleGraphConnection[]>>} the mapping block to modules
97
- */
98
- const extractBlockModulesMap = compilation => {
99
- const { moduleGraph } = compilation;
100
-
101
- /** @type {Map<DependenciesBlock, Map<Module, ModuleGraphConnection[]>>} */
102
- const blockModulesMap = new Map();
103
-
104
- const blockQueue = new Set();
105
-
106
- for (const module of compilation.modules) {
107
- /** @type {WeakMap<Dependency, ModuleGraphConnection>} */
108
- let moduleMap;
109
-
110
- for (const connection of moduleGraph.getOutgoingConnections(module)) {
111
- const d = connection.dependency;
112
- // We skip connections without dependency
113
- if (!d) continue;
114
- const m = connection.module;
115
- // We skip connections without Module pointer
116
- if (!m) continue;
117
- // We skip weak connections
118
- if (connection.weak) continue;
119
- const state = connection.getActiveState(undefined);
120
- // We skip inactive connections
121
- if (state === false) continue;
122
- // Store Dependency to Module mapping in local map
123
- // to allow to access it faster compared to
124
- // moduleGraph.getConnection()
125
- if (moduleMap === undefined) {
126
- moduleMap = new WeakMap();
127
- }
128
- moduleMap.set(connection.dependency, connection);
90
+ for (const connection of moduleGraph.getOutgoingConnections(module)) {
91
+ const d = connection.dependency;
92
+ // We skip connections without dependency
93
+ if (!d) continue;
94
+ const m = connection.module;
95
+ // We skip connections without Module pointer
96
+ if (!m) continue;
97
+ // We skip weak connections
98
+ if (connection.weak) continue;
99
+ const state = connection.getActiveState(runtime);
100
+ // We skip inactive connections
101
+ if (state === false) continue;
102
+
103
+ const block = moduleGraph.getParentBlock(d);
104
+ let index = moduleGraph.getParentBlockIndex(d);
105
+
106
+ // deprecated fallback
107
+ if (index < 0) {
108
+ index = block.dependencies.indexOf(d);
129
109
  }
130
110
 
131
- blockQueue.clear();
132
- blockQueue.add(module);
133
- for (const block of blockQueue) {
134
- let modules;
135
-
136
- if (moduleMap !== undefined && block.dependencies) {
137
- for (const dep of block.dependencies) {
138
- const connection = moduleMap.get(dep);
139
- if (connection !== undefined) {
140
- const { module } = connection;
141
- if (modules === undefined) {
142
- modules = new Map();
143
- blockModulesMap.set(block, modules);
144
- }
145
- const old = modules.get(module);
146
- if (old !== undefined) {
147
- old.push(connection);
148
- } else {
149
- modules.set(module, [connection]);
150
- }
111
+ if (blockCache !== block) {
112
+ modules = blockModulesMap.get((blockCache = block));
113
+ }
114
+
115
+ const i = index << 2;
116
+ modules[i] = m;
117
+ modules[i + 1] = state;
118
+ }
119
+
120
+ for (const modules of arrays) {
121
+ if (modules.length === 0) continue;
122
+ let indexMap;
123
+ let length = 0;
124
+ outer: for (let j = 0; j < modules.length; j += 2) {
125
+ const m = modules[j];
126
+ if (m === undefined) continue;
127
+ const state = modules[j + 1];
128
+ if (indexMap === undefined) {
129
+ let i = 0;
130
+ for (; i < length; i += 2) {
131
+ if (modules[i] === m) {
132
+ const merged = modules[i + 1];
133
+ if (merged === true) continue outer;
134
+ modules[i + 1] = ModuleGraphConnection.addConnectionStates(
135
+ merged,
136
+ state
137
+ );
151
138
  }
152
139
  }
153
- }
154
-
155
- if (block.blocks) {
156
- for (const b of block.blocks) {
157
- blockQueue.add(b);
140
+ modules[length] = m;
141
+ length++;
142
+ modules[length] = state;
143
+ length++;
144
+ if (length > 30) {
145
+ // To avoid worse case performance, we will use an index map for
146
+ // linear cost access, which allows to maintain O(n) complexity
147
+ // while keeping allocations down to a minimum
148
+ indexMap = new Map();
149
+ for (let i = 0; i < length; i += 2) {
150
+ indexMap.set(modules[i], i + 1);
151
+ }
152
+ }
153
+ } else {
154
+ const idx = indexMap.get(m);
155
+ if (idx !== undefined) {
156
+ const merged = modules[idx];
157
+ if (merged === true) continue outer;
158
+ modules[idx] = ModuleGraphConnection.addConnectionStates(
159
+ merged,
160
+ state
161
+ );
162
+ } else {
163
+ modules[length] = m;
164
+ length++;
165
+ modules[length] = state;
166
+ indexMap.set(m, length);
167
+ length++;
158
168
  }
159
169
  }
160
170
  }
171
+ modules.length = length;
161
172
  }
162
-
163
- return blockModulesMap;
164
173
  };
165
174
 
166
175
  /**
@@ -182,10 +191,55 @@ const visitModules = (
182
191
  blocksWithNestedBlocks,
183
192
  allCreatedChunkGroups
184
193
  ) => {
185
- const { moduleGraph, chunkGraph } = compilation;
194
+ const { moduleGraph, chunkGraph, moduleMemCaches } = compilation;
186
195
 
187
- logger.time("visitModules: prepare");
188
- const blockModulesMap = extractBlockModulesMap(compilation);
196
+ const blockModulesRuntimeMap = new Map();
197
+
198
+ /** @type {RuntimeSpec | false} */
199
+ let blockModulesMapRuntime = false;
200
+ let blockModulesMap;
201
+
202
+ /**
203
+ *
204
+ * @param {DependenciesBlock} block block
205
+ * @param {RuntimeSpec} runtime runtime
206
+ * @returns {(Module | ConnectionState)[]} block modules in flatten tuples
207
+ */
208
+ const getBlockModules = (block, runtime) => {
209
+ if (blockModulesMapRuntime !== runtime) {
210
+ blockModulesMap = blockModulesRuntimeMap.get(runtime);
211
+ if (blockModulesMap === undefined) {
212
+ blockModulesMap = new Map();
213
+ blockModulesRuntimeMap.set(runtime, blockModulesMap);
214
+ }
215
+ }
216
+ let blockModules = blockModulesMap.get(block);
217
+ if (blockModules !== undefined) return blockModules;
218
+ const module = /** @type {Module} */ (block.getRootBlock());
219
+ const memCache = moduleMemCaches && moduleMemCaches.get(module);
220
+ if (memCache !== undefined) {
221
+ const map = memCache.provide(
222
+ "bundleChunkGraph.blockModules",
223
+ runtime,
224
+ () => {
225
+ logger.time("visitModules: prepare");
226
+ const map = new Map();
227
+ extractBlockModules(module, moduleGraph, runtime, map);
228
+ logger.timeAggregate("visitModules: prepare");
229
+ return map;
230
+ }
231
+ );
232
+ for (const [block, blockModules] of map)
233
+ blockModulesMap.set(block, blockModules);
234
+ return map.get(block);
235
+ } else {
236
+ logger.time("visitModules: prepare");
237
+ extractBlockModules(module, moduleGraph, runtime, blockModulesMap);
238
+ blockModules = blockModulesMap.get(block);
239
+ logger.timeAggregate("visitModules: prepare");
240
+ return blockModules;
241
+ }
242
+ };
189
243
 
190
244
  let statProcessedQueueItems = 0;
191
245
  let statProcessedBlocks = 0;
@@ -308,9 +362,7 @@ const visitModules = (
308
362
  /** @type {QueueItem[]} */
309
363
  let queueDelayed = [];
310
364
 
311
- logger.timeEnd("visitModules: prepare");
312
-
313
- /** @type {[Module, ModuleGraphConnection[]][]} */
365
+ /** @type {[Module, ConnectionState][]} */
314
366
  const skipConnectionBuffer = [];
315
367
  /** @type {Module[]} */
316
368
  const skipBuffer = [];
@@ -478,21 +530,23 @@ const visitModules = (
478
530
  const processBlock = block => {
479
531
  statProcessedBlocks++;
480
532
  // get prepared block info
481
- const blockModules = blockModulesMap.get(block);
533
+ const blockModules = getBlockModules(block, chunkGroupInfo.runtime);
482
534
 
483
535
  if (blockModules !== undefined) {
484
- const { minAvailableModules, runtime } = chunkGroupInfo;
536
+ const { minAvailableModules } = chunkGroupInfo;
485
537
  // Buffer items because order need to be reversed to get indices correct
486
538
  // Traverse all referenced modules
487
- for (const entry of blockModules) {
488
- const [refModule, connections] = entry;
539
+ for (let i = 0; i < blockModules.length; i += 2) {
540
+ const refModule = /** @type {Module} */ (blockModules[i]);
489
541
  if (chunkGraph.isModuleInChunk(refModule, chunk)) {
490
542
  // skip early if already connected
491
543
  continue;
492
544
  }
493
- const activeState = getActiveStateOfConnections(connections, runtime);
545
+ const activeState = /** @type {ConnectionState} */ (
546
+ blockModules[i + 1]
547
+ );
494
548
  if (activeState !== true) {
495
- skipConnectionBuffer.push(entry);
549
+ skipConnectionBuffer.push([refModule, activeState]);
496
550
  if (activeState === false) continue;
497
551
  }
498
552
  if (
@@ -562,12 +616,15 @@ const visitModules = (
562
616
  const processEntryBlock = block => {
563
617
  statProcessedBlocks++;
564
618
  // get prepared block info
565
- const blockModules = blockModulesMap.get(block);
619
+ const blockModules = getBlockModules(block, chunkGroupInfo.runtime);
566
620
 
567
621
  if (blockModules !== undefined) {
568
622
  // Traverse all referenced modules
569
- for (const [refModule, connections] of blockModules) {
570
- const activeState = getActiveStateOfConnections(connections, undefined);
623
+ for (let i = 0; i < blockModules.length; i += 2) {
624
+ const refModule = /** @type {Module} */ (blockModules[i]);
625
+ const activeState = /** @type {ConnectionState} */ (
626
+ blockModules[i + 1]
627
+ );
571
628
  // enqueue, then add and enter to be in the correct order
572
629
  // this is relevant with circular dependencies
573
630
  queueBuffer.push({
@@ -1059,10 +1116,9 @@ const visitModules = (
1059
1116
 
1060
1117
  // 2. Reconsider skipped connections
1061
1118
  if (info.skippedModuleConnections !== undefined) {
1062
- const { minAvailableModules, runtime } = info;
1119
+ const { minAvailableModules } = info;
1063
1120
  for (const entry of info.skippedModuleConnections) {
1064
- const [module, connections] = entry;
1065
- const activeState = getActiveStateOfConnections(connections, runtime);
1121
+ const [module, activeState] = entry;
1066
1122
  if (activeState === false) continue;
1067
1123
  if (activeState === true) {
1068
1124
  info.skippedModuleConnections.delete(entry);
@@ -1114,6 +1170,7 @@ const visitModules = (
1114
1170
  while (queue.length || queueConnect.size) {
1115
1171
  logger.time("visitModules: visiting");
1116
1172
  processQueue();
1173
+ logger.timeAggregateEnd("visitModules: prepare");
1117
1174
  logger.timeEnd("visitModules: visiting");
1118
1175
 
1119
1176
  if (chunkGroupsForCombining.size > 0) {
@@ -9,8 +9,8 @@
9
9
 
10
10
  class AddManagedPathsPlugin {
11
11
  /**
12
- * @param {Iterable<string>} managedPaths list of managed paths
13
- * @param {Iterable<string>} immutablePaths list of immutable paths
12
+ * @param {Iterable<string | RegExp>} managedPaths list of managed paths
13
+ * @param {Iterable<string | RegExp>} immutablePaths list of immutable paths
14
14
  */
15
15
  constructor(managedPaths, immutablePaths) {
16
16
  this.managedPaths = new Set(managedPaths);
@@ -370,8 +370,8 @@ class Pack {
370
370
  for (const identifier of content.items) {
371
371
  mergedItems.add(identifier);
372
372
  }
373
- for (const identifer of content.used) {
374
- mergedUsedItems.add(identifer);
373
+ for (const identifier of content.used) {
374
+ mergedUsedItems.add(identifier);
375
375
  }
376
376
  addToMergedMap.push(async map => {
377
377
  // unpack existing content