webpack 5.77.0 → 5.79.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 (82) hide show
  1. package/bin/webpack.js +0 -0
  2. package/lib/APIPlugin.js +25 -18
  3. package/lib/CompatibilityPlugin.js +80 -62
  4. package/lib/Compiler.js +7 -4
  5. package/lib/ConstPlugin.js +22 -15
  6. package/lib/ContextModule.js +3 -2
  7. package/lib/DefinePlugin.js +62 -42
  8. package/lib/DelegatedModule.js +2 -1
  9. package/lib/DllModule.js +2 -1
  10. package/lib/ErrorHelpers.js +61 -22
  11. package/lib/ExportsInfoApiPlugin.js +16 -9
  12. package/lib/ExternalModule.js +2 -1
  13. package/lib/FlagAllModulesAsUsedPlugin.js +22 -27
  14. package/lib/FlagDependencyExportsPlugin.js +336 -348
  15. package/lib/FlagDependencyUsagePlugin.js +6 -8
  16. package/lib/FlagEntryExportAsUsedPlugin.js +22 -23
  17. package/lib/HotModuleReplacementPlugin.js +50 -45
  18. package/lib/JavascriptMetaInfoPlugin.js +16 -9
  19. package/lib/LibManifestPlugin.js +2 -1
  20. package/lib/ModuleTypeConstants.js +50 -0
  21. package/lib/NodeStuffPlugin.js +35 -31
  22. package/lib/NormalModule.js +2 -1
  23. package/lib/NormalModuleFactory.js +7 -1
  24. package/lib/NormalModuleReplacementPlugin.js +1 -1
  25. package/lib/ProvidePlugin.js +17 -10
  26. package/lib/RawModule.js +2 -1
  27. package/lib/RequireJsStuffPlugin.js +15 -15
  28. package/lib/UseStrictPlugin.js +15 -8
  29. package/lib/WebpackIsIncludedPlugin.js +16 -9
  30. package/lib/config/defaults.js +16 -8
  31. package/lib/config/normalization.js +4 -0
  32. package/lib/container/ContainerEntryModule.js +2 -1
  33. package/lib/css/CssLoadingRuntimeModule.js +1 -1
  34. package/lib/css/CssParser.js +28 -8
  35. package/lib/css/walkCssTokens.js +6 -1
  36. package/lib/debug/ProfilingPlugin.js +20 -12
  37. package/lib/dependencies/AMDPlugin.js +26 -20
  38. package/lib/dependencies/CommonJsImportsParserPlugin.js +5 -4
  39. package/lib/dependencies/CommonJsPlugin.js +29 -25
  40. package/lib/dependencies/HarmonyDetectionParserPlugin.js +3 -1
  41. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +4 -0
  42. package/lib/dependencies/HarmonyImportSpecifierDependency.js +28 -3
  43. package/lib/dependencies/HarmonyModulesPlugin.js +11 -5
  44. package/lib/dependencies/ImportMetaContextPlugin.js +11 -5
  45. package/lib/dependencies/ImportMetaPlugin.js +26 -20
  46. package/lib/dependencies/ImportPlugin.js +14 -7
  47. package/lib/dependencies/RequireContextPlugin.js +12 -6
  48. package/lib/dependencies/RequireEnsurePlugin.js +13 -7
  49. package/lib/dependencies/RequireIncludePlugin.js +11 -5
  50. package/lib/dependencies/SystemPlugin.js +21 -15
  51. package/lib/dependencies/URLPlugin.js +15 -9
  52. package/lib/dependencies/WorkerPlugin.js +14 -8
  53. package/lib/index.js +5 -0
  54. package/lib/javascript/JavascriptModulesPlugin.js +157 -164
  55. package/lib/javascript/JavascriptParser.js +88 -0
  56. package/lib/json/JsonModulesPlugin.js +13 -5
  57. package/lib/library/AmdLibraryPlugin.js +22 -6
  58. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +2 -1
  59. package/lib/node/ReadFileCompileWasmPlugin.js +2 -1
  60. package/lib/optimize/ConcatenatedModule.js +2 -1
  61. package/lib/optimize/InnerGraphPlugin.js +47 -46
  62. package/lib/optimize/SideEffectsFlagPlugin.js +43 -43
  63. package/lib/sharing/ConsumeSharedPlugin.js +4 -0
  64. package/lib/stats/DefaultStatsPrinterPlugin.js +14 -0
  65. package/lib/util/hash/md4.js +2 -2
  66. package/lib/util/hash/xxhash64.js +1 -1
  67. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +9 -6
  68. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +42 -43
  69. package/lib/web/FetchCompileAsyncWasmPlugin.js +2 -1
  70. package/lib/web/FetchCompileWasmPlugin.js +40 -40
  71. package/lib/webpack.js +1 -1
  72. package/package.json +41 -36
  73. package/schemas/WebpackOptions.check.js +1 -1
  74. package/schemas/WebpackOptions.json +18 -0
  75. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  76. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  77. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  78. package/schemas/plugins/container/ContainerPlugin.json +8 -0
  79. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  80. package/schemas/plugins/container/ModuleFederationPlugin.json +8 -0
  81. package/schemas/plugins/sharing/SharePlugin.check.js +1 -1
  82. package/types.d.ts +152 -122
@@ -16,6 +16,9 @@ const Queue = require("./util/Queue");
16
16
  /** @typedef {import("./ExportsInfo")} ExportsInfo */
17
17
  /** @typedef {import("./Module")} Module */
18
18
 
19
+ const PLUGIN_NAME = "FlagDependencyExportsPlugin";
20
+ const PLUGIN_LOGGER_NAME = `webpack.${PLUGIN_NAME}`;
21
+
19
22
  class FlagDependencyExportsPlugin {
20
23
  /**
21
24
  * Apply the plugin
@@ -23,394 +26,379 @@ class FlagDependencyExportsPlugin {
23
26
  * @returns {void}
24
27
  */
25
28
  apply(compiler) {
26
- compiler.hooks.compilation.tap(
27
- "FlagDependencyExportsPlugin",
28
- compilation => {
29
- const moduleGraph = compilation.moduleGraph;
30
- const cache = compilation.getCache("FlagDependencyExportsPlugin");
31
- compilation.hooks.finishModules.tapAsync(
32
- "FlagDependencyExportsPlugin",
33
- (modules, callback) => {
34
- const logger = compilation.getLogger(
35
- "webpack.FlagDependencyExportsPlugin"
36
- );
37
- let statRestoredFromMemCache = 0;
38
- let statRestoredFromCache = 0;
39
- let statNoExports = 0;
40
- let statFlaggedUncached = 0;
41
- let statNotCached = 0;
42
- let statQueueItemsProcessed = 0;
43
-
44
- const { moduleMemCaches } = compilation;
45
-
46
- /** @type {Queue<Module>} */
47
- const queue = new Queue();
48
-
49
- // Step 1: Try to restore cached provided export info from cache
50
- logger.time("restore cached provided exports");
51
- asyncLib.each(
52
- modules,
53
- (module, callback) => {
54
- const exportsInfo = moduleGraph.getExportsInfo(module);
55
- if (!module.buildMeta || !module.buildMeta.exportsType) {
56
- if (exportsInfo.otherExportsInfo.provided !== null) {
57
- // It's a module without declared exports
58
- statNoExports++;
59
- exportsInfo.setHasProvideInfo();
60
- exportsInfo.setUnknownExportsProvided();
61
- return callback();
62
- }
63
- }
64
- if (typeof module.buildInfo.hash !== "string") {
65
- statFlaggedUncached++;
66
- // Enqueue uncacheable module for determining the exports
67
- queue.enqueue(module);
29
+ compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
30
+ const moduleGraph = compilation.moduleGraph;
31
+ const cache = compilation.getCache(PLUGIN_NAME);
32
+ compilation.hooks.finishModules.tapAsync(
33
+ PLUGIN_NAME,
34
+ (modules, callback) => {
35
+ const logger = compilation.getLogger(PLUGIN_LOGGER_NAME);
36
+ let statRestoredFromMemCache = 0;
37
+ let statRestoredFromCache = 0;
38
+ let statNoExports = 0;
39
+ let statFlaggedUncached = 0;
40
+ let statNotCached = 0;
41
+ let statQueueItemsProcessed = 0;
42
+
43
+ const { moduleMemCaches } = compilation;
44
+
45
+ /** @type {Queue<Module>} */
46
+ const queue = new Queue();
47
+
48
+ // Step 1: Try to restore cached provided export info from cache
49
+ logger.time("restore cached provided exports");
50
+ asyncLib.each(
51
+ modules,
52
+ (module, callback) => {
53
+ const exportsInfo = moduleGraph.getExportsInfo(module);
54
+ // If the module doesn't have an exportsType, it's a module
55
+ // without declared exports.
56
+ if (!module.buildMeta || !module.buildMeta.exportsType) {
57
+ if (exportsInfo.otherExportsInfo.provided !== null) {
58
+ // It's a module without declared exports
59
+ statNoExports++;
68
60
  exportsInfo.setHasProvideInfo();
61
+ exportsInfo.setUnknownExportsProvided();
69
62
  return callback();
70
63
  }
71
- const memCache = moduleMemCaches && moduleMemCaches.get(module);
72
- const memCacheValue = memCache && memCache.get(this);
73
- if (memCacheValue !== undefined) {
74
- statRestoredFromMemCache++;
75
- exportsInfo.restoreProvided(memCacheValue);
76
- return callback();
77
- }
78
- cache.get(
79
- module.identifier(),
80
- module.buildInfo.hash,
81
- (err, result) => {
82
- if (err) return callback(err);
83
-
84
- if (result !== undefined) {
85
- statRestoredFromCache++;
86
- exportsInfo.restoreProvided(result);
87
- } else {
88
- statNotCached++;
89
- // Without cached info enqueue module for determining the exports
90
- queue.enqueue(module);
91
- exportsInfo.setHasProvideInfo();
92
- }
93
- callback();
64
+ }
65
+ // If the module has no hash, it's uncacheable
66
+ if (typeof module.buildInfo.hash !== "string") {
67
+ statFlaggedUncached++;
68
+ // Enqueue uncacheable module for determining the exports
69
+ queue.enqueue(module);
70
+ exportsInfo.setHasProvideInfo();
71
+ return callback();
72
+ }
73
+ const memCache = moduleMemCaches && moduleMemCaches.get(module);
74
+ const memCacheValue = memCache && memCache.get(this);
75
+ if (memCacheValue !== undefined) {
76
+ statRestoredFromMemCache++;
77
+ exportsInfo.restoreProvided(memCacheValue);
78
+ return callback();
79
+ }
80
+ cache.get(
81
+ module.identifier(),
82
+ module.buildInfo.hash,
83
+ (err, result) => {
84
+ if (err) return callback(err);
85
+
86
+ if (result !== undefined) {
87
+ statRestoredFromCache++;
88
+ exportsInfo.restoreProvided(result);
89
+ } else {
90
+ statNotCached++;
91
+ // Without cached info enqueue module for determining the exports
92
+ queue.enqueue(module);
93
+ exportsInfo.setHasProvideInfo();
94
94
  }
95
- );
96
- },
97
- err => {
98
- logger.timeEnd("restore cached provided exports");
99
- if (err) return callback(err);
95
+ callback();
96
+ }
97
+ );
98
+ },
99
+ err => {
100
+ logger.timeEnd("restore cached provided exports");
101
+ if (err) return callback(err);
100
102
 
101
- /** @type {Set<Module>} */
102
- const modulesToStore = new Set();
103
+ /** @type {Set<Module>} */
104
+ const modulesToStore = new Set();
103
105
 
104
- /** @type {Map<Module, Set<Module>>} */
105
- const dependencies = new Map();
106
+ /** @type {Map<Module, Set<Module>>} */
107
+ const dependencies = new Map();
106
108
 
107
- /** @type {Module} */
108
- let module;
109
+ /** @type {Module} */
110
+ let module;
109
111
 
110
- /** @type {ExportsInfo} */
111
- let exportsInfo;
112
+ /** @type {ExportsInfo} */
113
+ let exportsInfo;
112
114
 
113
- /** @type {Map<Dependency, ExportsSpec>} */
114
- const exportsSpecsFromDependencies = new Map();
115
+ /** @type {Map<Dependency, ExportsSpec>} */
116
+ const exportsSpecsFromDependencies = new Map();
115
117
 
116
- let cacheable = true;
117
- let changed = false;
118
+ let cacheable = true;
119
+ let changed = false;
118
120
 
119
- /**
120
- * @param {DependenciesBlock} depBlock the dependencies block
121
- * @returns {void}
122
- */
123
- const processDependenciesBlock = depBlock => {
124
- for (const dep of depBlock.dependencies) {
125
- processDependency(dep);
121
+ /**
122
+ * @param {DependenciesBlock} depBlock the dependencies block
123
+ * @returns {void}
124
+ */
125
+ const processDependenciesBlock = depBlock => {
126
+ for (const dep of depBlock.dependencies) {
127
+ processDependency(dep);
128
+ }
129
+ for (const block of depBlock.blocks) {
130
+ processDependenciesBlock(block);
131
+ }
132
+ };
133
+
134
+ /**
135
+ * @param {Dependency} dep the dependency
136
+ * @returns {void}
137
+ */
138
+ const processDependency = dep => {
139
+ const exportDesc = dep.getExports(moduleGraph);
140
+ if (!exportDesc) return;
141
+ exportsSpecsFromDependencies.set(dep, exportDesc);
142
+ };
143
+
144
+ /**
145
+ * @param {Dependency} dep dependency
146
+ * @param {ExportsSpec} exportDesc info
147
+ * @returns {void}
148
+ */
149
+ const processExportsSpec = (dep, exportDesc) => {
150
+ const exports = exportDesc.exports;
151
+ const globalCanMangle = exportDesc.canMangle;
152
+ const globalFrom = exportDesc.from;
153
+ const globalPriority = exportDesc.priority;
154
+ const globalTerminalBinding =
155
+ exportDesc.terminalBinding || false;
156
+ const exportDeps = exportDesc.dependencies;
157
+ if (exportDesc.hideExports) {
158
+ for (const name of exportDesc.hideExports) {
159
+ const exportInfo = exportsInfo.getExportInfo(name);
160
+ exportInfo.unsetTarget(dep);
126
161
  }
127
- for (const block of depBlock.blocks) {
128
- processDependenciesBlock(block);
162
+ }
163
+ if (exports === true) {
164
+ // unknown exports
165
+ if (
166
+ exportsInfo.setUnknownExportsProvided(
167
+ globalCanMangle,
168
+ exportDesc.excludeExports,
169
+ globalFrom && dep,
170
+ globalFrom,
171
+ globalPriority
172
+ )
173
+ ) {
174
+ changed = true;
129
175
  }
130
- };
131
-
132
- /**
133
- * @param {Dependency} dep the dependency
134
- * @returns {void}
135
- */
136
- const processDependency = dep => {
137
- const exportDesc = dep.getExports(moduleGraph);
138
- if (!exportDesc) return;
139
- exportsSpecsFromDependencies.set(dep, exportDesc);
140
- };
141
-
142
- /**
143
- * @param {Dependency} dep dependency
144
- * @param {ExportsSpec} exportDesc info
145
- * @returns {void}
146
- */
147
- const processExportsSpec = (dep, exportDesc) => {
148
- const exports = exportDesc.exports;
149
- const globalCanMangle = exportDesc.canMangle;
150
- const globalFrom = exportDesc.from;
151
- const globalPriority = exportDesc.priority;
152
- const globalTerminalBinding =
153
- exportDesc.terminalBinding || false;
154
- const exportDeps = exportDesc.dependencies;
155
- if (exportDesc.hideExports) {
156
- for (const name of exportDesc.hideExports) {
176
+ } else if (Array.isArray(exports)) {
177
+ /**
178
+ * merge in new exports
179
+ * @param {ExportsInfo} exportsInfo own exports info
180
+ * @param {(ExportSpec | string)[]} exports list of exports
181
+ */
182
+ const mergeExports = (exportsInfo, exports) => {
183
+ for (const exportNameOrSpec of exports) {
184
+ let name;
185
+ let canMangle = globalCanMangle;
186
+ let terminalBinding = globalTerminalBinding;
187
+ let exports = undefined;
188
+ let from = globalFrom;
189
+ let fromExport = undefined;
190
+ let priority = globalPriority;
191
+ let hidden = false;
192
+ if (typeof exportNameOrSpec === "string") {
193
+ name = exportNameOrSpec;
194
+ } else {
195
+ name = exportNameOrSpec.name;
196
+ if (exportNameOrSpec.canMangle !== undefined)
197
+ canMangle = exportNameOrSpec.canMangle;
198
+ if (exportNameOrSpec.export !== undefined)
199
+ fromExport = exportNameOrSpec.export;
200
+ if (exportNameOrSpec.exports !== undefined)
201
+ exports = exportNameOrSpec.exports;
202
+ if (exportNameOrSpec.from !== undefined)
203
+ from = exportNameOrSpec.from;
204
+ if (exportNameOrSpec.priority !== undefined)
205
+ priority = exportNameOrSpec.priority;
206
+ if (exportNameOrSpec.terminalBinding !== undefined)
207
+ terminalBinding = exportNameOrSpec.terminalBinding;
208
+ if (exportNameOrSpec.hidden !== undefined)
209
+ hidden = exportNameOrSpec.hidden;
210
+ }
157
211
  const exportInfo = exportsInfo.getExportInfo(name);
158
- exportInfo.unsetTarget(dep);
159
- }
160
- }
161
- if (exports === true) {
162
- // unknown exports
163
- if (
164
- exportsInfo.setUnknownExportsProvided(
165
- globalCanMangle,
166
- exportDesc.excludeExports,
167
- globalFrom && dep,
168
- globalFrom,
169
- globalPriority
170
- )
171
- ) {
172
- changed = true;
173
- }
174
- } else if (Array.isArray(exports)) {
175
- /**
176
- * merge in new exports
177
- * @param {ExportsInfo} exportsInfo own exports info
178
- * @param {(ExportSpec | string)[]} exports list of exports
179
- */
180
- const mergeExports = (exportsInfo, exports) => {
181
- for (const exportNameOrSpec of exports) {
182
- let name;
183
- let canMangle = globalCanMangle;
184
- let terminalBinding = globalTerminalBinding;
185
- let exports = undefined;
186
- let from = globalFrom;
187
- let fromExport = undefined;
188
- let priority = globalPriority;
189
- let hidden = false;
190
- if (typeof exportNameOrSpec === "string") {
191
- name = exportNameOrSpec;
192
- } else {
193
- name = exportNameOrSpec.name;
194
- if (exportNameOrSpec.canMangle !== undefined)
195
- canMangle = exportNameOrSpec.canMangle;
196
- if (exportNameOrSpec.export !== undefined)
197
- fromExport = exportNameOrSpec.export;
198
- if (exportNameOrSpec.exports !== undefined)
199
- exports = exportNameOrSpec.exports;
200
- if (exportNameOrSpec.from !== undefined)
201
- from = exportNameOrSpec.from;
202
- if (exportNameOrSpec.priority !== undefined)
203
- priority = exportNameOrSpec.priority;
204
- if (exportNameOrSpec.terminalBinding !== undefined)
205
- terminalBinding = exportNameOrSpec.terminalBinding;
206
- if (exportNameOrSpec.hidden !== undefined)
207
- hidden = exportNameOrSpec.hidden;
208
- }
209
- const exportInfo = exportsInfo.getExportInfo(name);
210
212
 
211
- if (
212
- exportInfo.provided === false ||
213
- exportInfo.provided === null
214
- ) {
215
- exportInfo.provided = true;
216
- changed = true;
217
- }
213
+ if (
214
+ exportInfo.provided === false ||
215
+ exportInfo.provided === null
216
+ ) {
217
+ exportInfo.provided = true;
218
+ changed = true;
219
+ }
218
220
 
219
- if (
220
- exportInfo.canMangleProvide !== false &&
221
- canMangle === false
222
- ) {
223
- exportInfo.canMangleProvide = false;
224
- changed = true;
225
- }
221
+ if (
222
+ exportInfo.canMangleProvide !== false &&
223
+ canMangle === false
224
+ ) {
225
+ exportInfo.canMangleProvide = false;
226
+ changed = true;
227
+ }
226
228
 
227
- if (terminalBinding && !exportInfo.terminalBinding) {
228
- exportInfo.terminalBinding = true;
229
- changed = true;
230
- }
229
+ if (terminalBinding && !exportInfo.terminalBinding) {
230
+ exportInfo.terminalBinding = true;
231
+ changed = true;
232
+ }
231
233
 
232
- if (exports) {
233
- const nestedExportsInfo =
234
- exportInfo.createNestedExportsInfo();
235
- mergeExports(nestedExportsInfo, exports);
236
- }
234
+ if (exports) {
235
+ const nestedExportsInfo =
236
+ exportInfo.createNestedExportsInfo();
237
+ mergeExports(nestedExportsInfo, exports);
238
+ }
237
239
 
238
- if (
239
- from &&
240
- (hidden
241
- ? exportInfo.unsetTarget(dep)
242
- : exportInfo.setTarget(
243
- dep,
244
- from,
245
- fromExport === undefined ? [name] : fromExport,
246
- priority
247
- ))
248
- ) {
249
- changed = true;
250
- }
240
+ if (
241
+ from &&
242
+ (hidden
243
+ ? exportInfo.unsetTarget(dep)
244
+ : exportInfo.setTarget(
245
+ dep,
246
+ from,
247
+ fromExport === undefined ? [name] : fromExport,
248
+ priority
249
+ ))
250
+ ) {
251
+ changed = true;
252
+ }
251
253
 
252
- // Recalculate target exportsInfo
253
- const target = exportInfo.getTarget(moduleGraph);
254
- let targetExportsInfo = undefined;
255
- if (target) {
256
- const targetModuleExportsInfo =
257
- moduleGraph.getExportsInfo(target.module);
258
- targetExportsInfo =
259
- targetModuleExportsInfo.getNestedExportsInfo(
260
- target.export
261
- );
262
- // add dependency for this module
263
- const set = dependencies.get(target.module);
264
- if (set === undefined) {
265
- dependencies.set(target.module, new Set([module]));
266
- } else {
267
- set.add(module);
268
- }
254
+ // Recalculate target exportsInfo
255
+ const target = exportInfo.getTarget(moduleGraph);
256
+ let targetExportsInfo = undefined;
257
+ if (target) {
258
+ const targetModuleExportsInfo =
259
+ moduleGraph.getExportsInfo(target.module);
260
+ targetExportsInfo =
261
+ targetModuleExportsInfo.getNestedExportsInfo(
262
+ target.export
263
+ );
264
+ // add dependency for this module
265
+ const set = dependencies.get(target.module);
266
+ if (set === undefined) {
267
+ dependencies.set(target.module, new Set([module]));
268
+ } else {
269
+ set.add(module);
269
270
  }
271
+ }
270
272
 
271
- if (exportInfo.exportsInfoOwned) {
272
- if (
273
- exportInfo.exportsInfo.setRedirectNamedTo(
274
- targetExportsInfo
275
- )
276
- ) {
277
- changed = true;
278
- }
279
- } else if (
280
- exportInfo.exportsInfo !== targetExportsInfo
273
+ if (exportInfo.exportsInfoOwned) {
274
+ if (
275
+ exportInfo.exportsInfo.setRedirectNamedTo(
276
+ targetExportsInfo
277
+ )
281
278
  ) {
282
- exportInfo.exportsInfo = targetExportsInfo;
283
279
  changed = true;
284
280
  }
285
- }
286
- };
287
- mergeExports(exportsInfo, exports);
288
- }
289
- // store dependencies
290
- if (exportDeps) {
291
- cacheable = false;
292
- for (const exportDependency of exportDeps) {
293
- // add dependency for this module
294
- const set = dependencies.get(exportDependency);
295
- if (set === undefined) {
296
- dependencies.set(exportDependency, new Set([module]));
297
- } else {
298
- set.add(module);
281
+ } else if (exportInfo.exportsInfo !== targetExportsInfo) {
282
+ exportInfo.exportsInfo = targetExportsInfo;
283
+ changed = true;
299
284
  }
300
285
  }
286
+ };
287
+ mergeExports(exportsInfo, exports);
288
+ }
289
+ // store dependencies
290
+ if (exportDeps) {
291
+ cacheable = false;
292
+ for (const exportDependency of exportDeps) {
293
+ // add dependency for this module
294
+ const set = dependencies.get(exportDependency);
295
+ if (set === undefined) {
296
+ dependencies.set(exportDependency, new Set([module]));
297
+ } else {
298
+ set.add(module);
299
+ }
301
300
  }
302
- };
301
+ }
302
+ };
303
303
 
304
- const notifyDependencies = () => {
305
- const deps = dependencies.get(module);
306
- if (deps !== undefined) {
307
- for (const dep of deps) {
308
- queue.enqueue(dep);
309
- }
304
+ const notifyDependencies = () => {
305
+ const deps = dependencies.get(module);
306
+ if (deps !== undefined) {
307
+ for (const dep of deps) {
308
+ queue.enqueue(dep);
310
309
  }
311
- };
310
+ }
311
+ };
312
312
 
313
- logger.time("figure out provided exports");
314
- while (queue.length > 0) {
315
- module = queue.dequeue();
313
+ logger.time("figure out provided exports");
314
+ while (queue.length > 0) {
315
+ module = queue.dequeue();
316
316
 
317
- statQueueItemsProcessed++;
317
+ statQueueItemsProcessed++;
318
318
 
319
- exportsInfo = moduleGraph.getExportsInfo(module);
319
+ exportsInfo = moduleGraph.getExportsInfo(module);
320
320
 
321
- cacheable = true;
322
- changed = false;
321
+ cacheable = true;
322
+ changed = false;
323
323
 
324
- exportsSpecsFromDependencies.clear();
325
- moduleGraph.freeze();
326
- processDependenciesBlock(module);
327
- moduleGraph.unfreeze();
328
- for (const [
329
- dep,
330
- exportsSpec
331
- ] of exportsSpecsFromDependencies) {
332
- processExportsSpec(dep, exportsSpec);
333
- }
324
+ exportsSpecsFromDependencies.clear();
325
+ moduleGraph.freeze();
326
+ processDependenciesBlock(module);
327
+ moduleGraph.unfreeze();
328
+ for (const [dep, exportsSpec] of exportsSpecsFromDependencies) {
329
+ processExportsSpec(dep, exportsSpec);
330
+ }
334
331
 
335
- if (cacheable) {
336
- modulesToStore.add(module);
337
- }
332
+ if (cacheable) {
333
+ modulesToStore.add(module);
334
+ }
338
335
 
339
- if (changed) {
340
- notifyDependencies();
341
- }
336
+ if (changed) {
337
+ notifyDependencies();
342
338
  }
343
- logger.timeEnd("figure out provided exports");
344
-
345
- logger.log(
346
- `${Math.round(
347
- (100 * (statFlaggedUncached + statNotCached)) /
348
- (statRestoredFromMemCache +
349
- statRestoredFromCache +
350
- statNotCached +
351
- statFlaggedUncached +
352
- statNoExports)
353
- )}% of exports of modules have been determined (${statNoExports} no declared exports, ${statNotCached} not cached, ${statFlaggedUncached} flagged uncacheable, ${statRestoredFromCache} from cache, ${statRestoredFromMemCache} from mem cache, ${
354
- statQueueItemsProcessed -
355
- statNotCached -
356
- statFlaggedUncached
357
- } additional calculations due to dependencies)`
358
- );
359
-
360
- logger.time("store provided exports into cache");
361
- asyncLib.each(
362
- modulesToStore,
363
- (module, callback) => {
364
- if (typeof module.buildInfo.hash !== "string") {
365
- // not cacheable
366
- return callback();
367
- }
368
- const cachedData = moduleGraph
369
- .getExportsInfo(module)
370
- .getRestoreProvidedData();
371
- const memCache =
372
- moduleMemCaches && moduleMemCaches.get(module);
373
- if (memCache) {
374
- memCache.set(this, cachedData);
375
- }
376
- cache.store(
377
- module.identifier(),
378
- module.buildInfo.hash,
379
- cachedData,
380
- callback
381
- );
382
- },
383
- err => {
384
- logger.timeEnd("store provided exports into cache");
385
- callback(err);
386
- }
387
- );
388
339
  }
389
- );
390
- }
391
- );
392
-
393
- /** @type {WeakMap<Module, any>} */
394
- const providedExportsCache = new WeakMap();
395
- compilation.hooks.rebuildModule.tap(
396
- "FlagDependencyExportsPlugin",
397
- module => {
398
- providedExportsCache.set(
399
- module,
400
- moduleGraph.getExportsInfo(module).getRestoreProvidedData()
401
- );
402
- }
403
- );
404
- compilation.hooks.finishRebuildingModule.tap(
405
- "FlagDependencyExportsPlugin",
406
- module => {
407
- moduleGraph
408
- .getExportsInfo(module)
409
- .restoreProvided(providedExportsCache.get(module));
410
- }
340
+ logger.timeEnd("figure out provided exports");
341
+
342
+ logger.log(
343
+ `${Math.round(
344
+ (100 * (statFlaggedUncached + statNotCached)) /
345
+ (statRestoredFromMemCache +
346
+ statRestoredFromCache +
347
+ statNotCached +
348
+ statFlaggedUncached +
349
+ statNoExports)
350
+ )}% of exports of modules have been determined (${statNoExports} no declared exports, ${statNotCached} not cached, ${statFlaggedUncached} flagged uncacheable, ${statRestoredFromCache} from cache, ${statRestoredFromMemCache} from mem cache, ${
351
+ statQueueItemsProcessed - statNotCached - statFlaggedUncached
352
+ } additional calculations due to dependencies)`
353
+ );
354
+
355
+ logger.time("store provided exports into cache");
356
+ asyncLib.each(
357
+ modulesToStore,
358
+ (module, callback) => {
359
+ if (typeof module.buildInfo.hash !== "string") {
360
+ // not cacheable
361
+ return callback();
362
+ }
363
+ const cachedData = moduleGraph
364
+ .getExportsInfo(module)
365
+ .getRestoreProvidedData();
366
+ const memCache =
367
+ moduleMemCaches && moduleMemCaches.get(module);
368
+ if (memCache) {
369
+ memCache.set(this, cachedData);
370
+ }
371
+ cache.store(
372
+ module.identifier(),
373
+ module.buildInfo.hash,
374
+ cachedData,
375
+ callback
376
+ );
377
+ },
378
+ err => {
379
+ logger.timeEnd("store provided exports into cache");
380
+ callback(err);
381
+ }
382
+ );
383
+ }
384
+ );
385
+ }
386
+ );
387
+
388
+ /** @type {WeakMap<Module, any>} */
389
+ const providedExportsCache = new WeakMap();
390
+ compilation.hooks.rebuildModule.tap(PLUGIN_NAME, module => {
391
+ providedExportsCache.set(
392
+ module,
393
+ moduleGraph.getExportsInfo(module).getRestoreProvidedData()
411
394
  );
412
- }
413
- );
395
+ });
396
+ compilation.hooks.finishRebuildingModule.tap(PLUGIN_NAME, module => {
397
+ moduleGraph
398
+ .getExportsInfo(module)
399
+ .restoreProvided(providedExportsCache.get(module));
400
+ });
401
+ });
414
402
  }
415
403
  }
416
404