webpack 5.108.3 → 5.109.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 (191) hide show
  1. package/lib/APIPlugin.js +48 -29
  2. package/lib/CacheFacade.js +8 -0
  3. package/lib/ChunkGroup.js +1 -0
  4. package/lib/CompatibilityPlugin.js +31 -29
  5. package/lib/Compilation.js +50 -8
  6. package/lib/ConstPlugin.js +11 -11
  7. package/lib/ContextModule.js +239 -6
  8. package/lib/ContextModuleFactory.js +139 -14
  9. package/lib/DefinePlugin.js +396 -101
  10. package/lib/Entrypoint.js +1 -1
  11. package/lib/ExportsInfoApiPlugin.js +2 -2
  12. package/lib/ExternalModule.js +107 -5
  13. package/lib/ExternalModuleFactoryPlugin.js +20 -1
  14. package/lib/FileSystemInfo.js +130 -74
  15. package/lib/FlagDependencyExportsPlugin.js +55 -8
  16. package/lib/HotModuleReplacementPlugin.js +18 -15
  17. package/lib/LazyBarrel.js +30 -3
  18. package/lib/Module.js +3 -0
  19. package/lib/ModuleFilenameHelpers.js +2 -2
  20. package/lib/ModuleTypeConstants.js +8 -1
  21. package/lib/MultiCompiler.js +13 -2
  22. package/lib/MultiWatching.js +1 -0
  23. package/lib/NodeStuffPlugin.js +51 -33
  24. package/lib/NormalModule.js +169 -405
  25. package/lib/NormalModuleFactory.js +76 -2
  26. package/lib/ProgressPlugin.js +211 -119
  27. package/lib/ProvidePlugin.js +2 -2
  28. package/lib/RuntimeGlobals.js +47 -0
  29. package/lib/RuntimePlugin.js +33 -0
  30. package/lib/RuntimeTemplate.js +304 -16
  31. package/lib/UseStrictPlugin.js +1 -1
  32. package/lib/WebpackIsIncludedPlugin.js +1 -1
  33. package/lib/WebpackOptionsApply.js +24 -19
  34. package/lib/asset/AssetGenerator.js +110 -28
  35. package/lib/asset/AssetModulesPlugin.js +92 -2
  36. package/lib/asset/WebManifestGenerator.js +164 -0
  37. package/lib/asset/WebManifestParser.js +130 -0
  38. package/lib/async-modules/AwaitDependenciesInitFragment.js +14 -4
  39. package/lib/async-modules/isGeneratorLowered.js +26 -0
  40. package/lib/cache/PackFileCacheStrategy.js +9 -3
  41. package/lib/config/browserslistTargetHandler.js +40 -0
  42. package/lib/config/defaults.js +222 -32
  43. package/lib/config/normalization.js +26 -0
  44. package/lib/config/target.js +9 -1
  45. package/lib/css/CssGenerator.js +73 -73
  46. package/lib/css/CssLoadingRuntimeModule.js +5 -1
  47. package/lib/css/CssModulesPlugin.js +92 -53
  48. package/lib/css/CssParser.js +843 -302
  49. package/lib/css/syntax.js +1219 -483
  50. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +6 -6
  51. package/lib/dependencies/AMDPlugin.js +2 -2
  52. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +13 -13
  53. package/lib/dependencies/CommonJsDependencyHelpers.js +39 -0
  54. package/lib/dependencies/CommonJsExportsDependency.js +47 -2
  55. package/lib/dependencies/CommonJsExportsParserPlugin.js +10 -10
  56. package/lib/dependencies/CommonJsImportsParserPlugin.js +18 -18
  57. package/lib/dependencies/CommonJsPlugin.js +2 -2
  58. package/lib/dependencies/CommonJsRequireDependency.js +26 -1
  59. package/lib/dependencies/CommonJsSelfReferenceDependency.js +32 -1
  60. package/lib/dependencies/ContextDependencyHelpers.js +3 -3
  61. package/lib/dependencies/CreateRequireParserPlugin.js +6 -6
  62. package/lib/dependencies/CssIcssExportDependency.js +190 -87
  63. package/lib/dependencies/CssUrlDependency.js +35 -4
  64. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +2 -2
  65. package/lib/dependencies/HarmonyCompatibilityDependency.js +32 -14
  66. package/lib/dependencies/HarmonyDetectionParserPlugin.js +43 -13
  67. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +7 -19
  68. package/lib/dependencies/HarmonyImportDependency.js +12 -1
  69. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +34 -107
  70. package/lib/dependencies/HarmonyImportGuard.js +192 -20
  71. package/lib/dependencies/HarmonyModulesPlugin.js +6 -0
  72. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -1
  73. package/lib/dependencies/HtmlEntryDependency.js +797 -172
  74. package/lib/dependencies/HtmlSourceDependency.js +26 -0
  75. package/lib/dependencies/ImportDependency.js +43 -1
  76. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +31 -18
  77. package/lib/dependencies/ImportMetaContextPlugin.js +38 -7
  78. package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
  79. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
  80. package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
  81. package/lib/dependencies/ImportMetaPlugin.js +532 -180
  82. package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
  83. package/lib/dependencies/ImportParserPlugin.js +87 -26
  84. package/lib/dependencies/ImportPhase.js +10 -8
  85. package/lib/dependencies/LoaderPlugin.js +5 -1
  86. package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
  87. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +3 -6
  88. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +4 -11
  89. package/lib/dependencies/SystemPlugin.js +2 -4
  90. package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
  91. package/lib/dependencies/URLDependency.js +141 -21
  92. package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +324 -112
  93. package/lib/dependencies/WorkerDependency.js +86 -18
  94. package/lib/dependencies/WorkletDependency.js +278 -0
  95. package/lib/dll/DelegatedModuleFactoryPlugin.js +19 -0
  96. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +1 -1
  97. package/lib/errors/LoaderLoadingError.js +20 -0
  98. package/lib/errors/ModuleParseError.js +39 -22
  99. package/lib/errors/NodeStuffInWebError.js +1 -1
  100. package/lib/esm/ModuleChunkFormatPlugin.js +47 -14
  101. package/lib/esm/ModuleChunkLoadingPlugin.js +8 -1
  102. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +29 -1
  103. package/lib/hmr/lazyCompilationBackend.js +32 -8
  104. package/lib/html/HtmlGenerator.js +940 -91
  105. package/lib/html/HtmlModule.js +3 -2
  106. package/lib/html/HtmlModulesPlugin.js +625 -170
  107. package/lib/html/HtmlParser.js +812 -340
  108. package/lib/html/favicon.svg +1 -0
  109. package/lib/html/syntax.js +2116 -834
  110. package/lib/ids/IdHelpers.js +1 -1
  111. package/lib/index.js +6 -0
  112. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +4 -5
  113. package/lib/javascript/BasicEvaluatedExpression.js +366 -48
  114. package/lib/javascript/JavascriptGenerator.js +197 -49
  115. package/lib/javascript/JavascriptModulesPlugin.js +178 -24
  116. package/lib/javascript/JavascriptParser.js +711 -355
  117. package/lib/javascript/JavascriptParserHelpers.js +3 -6
  118. package/lib/javascript/syntax.js +4380 -0
  119. package/lib/library/ModuleLibraryPlugin.js +38 -1
  120. package/lib/loaders/LoaderRunner.js +714 -0
  121. package/lib/loaders/loadLoader.js +100 -0
  122. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +19 -0
  123. package/lib/node/ReadFileCompileWasmPlugin.js +14 -0
  124. package/lib/optimize/ConcatenatedModule.js +120 -16
  125. package/lib/optimize/FlagIncludedChunksPlugin.js +13 -3
  126. package/lib/optimize/InnerGraphPlugin.js +50 -30
  127. package/lib/optimize/ModuleConcatenationPlugin.js +69 -3
  128. package/lib/optimize/SideEffectsFlagPlugin.js +86 -43
  129. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +15 -0
  130. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +24 -13
  131. package/lib/prefetch/ResourceHintPlugin.js +663 -0
  132. package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
  133. package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
  134. package/lib/prefetch/parseResourceHintOptions.js +103 -0
  135. package/lib/rules/RuleSetCompiler.js +114 -0
  136. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
  137. package/lib/runtime/AsyncModuleRuntimeModule.js +24 -8
  138. package/lib/runtime/AutoPublicPathRuntimeModule.js +7 -1
  139. package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
  140. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
  141. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +204 -8
  142. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +4 -1
  143. package/lib/schemes/HttpUriPlugin.js +40 -1
  144. package/lib/schemes/VirtualUrlPlugin.js +1 -2
  145. package/lib/serialization/FileMiddleware.js +29 -3
  146. package/lib/stats/DefaultStatsFactoryPlugin.js +32 -3
  147. package/lib/stats/DefaultStatsPresetPlugin.js +2 -0
  148. package/lib/stats/DefaultStatsPrinterPlugin.js +12 -2
  149. package/lib/stats/StatsFactory.js +15 -8
  150. package/lib/url/URLParserPlugin.js +98 -19
  151. package/lib/util/AsyncQueue.js +122 -72
  152. package/lib/util/LocConverter.js +9 -8
  153. package/lib/util/SetHelpers.js +1 -1
  154. package/lib/util/SourceProcessor.js +41 -28
  155. package/lib/util/StackedMap.js +122 -48
  156. package/lib/util/binarySearchBounds.js +2 -2
  157. package/lib/util/concatenate.js +40 -14
  158. package/lib/util/createHooksRegistry.js +13 -5
  159. package/lib/util/dataURL.js +2 -2
  160. package/lib/util/deterministicGrouping.js +7 -5
  161. package/lib/util/formatSize.js +6 -2
  162. package/lib/util/globUtils.js +710 -0
  163. package/lib/util/identifier.js +23 -6
  164. package/lib/util/implicitTypeLoaderFallback.js +62 -0
  165. package/lib/util/internalSerializables.js +88 -71
  166. package/lib/util/magicComment.js +121 -25
  167. package/lib/util/numberHash.js +2 -2
  168. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +24 -18
  169. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +33 -22
  170. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +79 -16
  171. package/lib/web/FetchCompileAsyncWasmPlugin.js +19 -0
  172. package/lib/web/FetchCompileWasmPlugin.js +14 -0
  173. package/lib/web/JsonpChunkLoadingRuntimeModule.js +2 -0
  174. package/lib/webpack.js +65 -0
  175. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +3 -0
  176. package/module.d.ts +21 -0
  177. package/package.json +14 -13
  178. package/schemas/WebpackOptions.check.js +1 -1
  179. package/schemas/WebpackOptions.json +759 -36
  180. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  181. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  182. package/schemas/plugins/ProgressPlugin.json +17 -1
  183. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  184. package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
  185. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  186. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  187. package/schemas/plugins/container/ModuleFederationPlugin.json +1 -0
  188. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  189. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  190. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  191. package/types.d.ts +1300 -325
@@ -145,11 +145,11 @@ class AMDDefineDependencyParserPlugin {
145
145
  } else if ((localModule = getLocalModule(parser.state, request))) {
146
146
  localModule.flagUsed();
147
147
  dep = new LocalModuleDependency(localModule, undefined, false);
148
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
148
+ dep.loc = parser.getLocation(expr);
149
149
  parser.state.module.addPresentationalDependency(dep);
150
150
  } else {
151
151
  dep = this.newRequireItemDependency(request);
152
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
152
+ dep.loc = parser.getLocation(expr);
153
153
  dep.optional = Boolean(parser.scope.inTry);
154
154
  parser.state.current.addDependency(dep);
155
155
  }
@@ -159,7 +159,7 @@ class AMDDefineDependencyParserPlugin {
159
159
  deps,
160
160
  /** @type {Range} */ (param.range)
161
161
  );
162
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
162
+ dep.loc = parser.getLocation(expr);
163
163
  dep.optional = Boolean(parser.scope.inTry);
164
164
  parser.state.module.addPresentationalDependency(dep);
165
165
  return true;
@@ -227,7 +227,7 @@ class AMDDefineDependencyParserPlugin {
227
227
  parser.state.current.addDependency(dep);
228
228
  return true;
229
229
  }
230
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
230
+ dep.loc = parser.getLocation(expr);
231
231
  parser.state.module.addPresentationalDependency(dep);
232
232
  return true;
233
233
  }
@@ -253,7 +253,7 @@ class AMDDefineDependencyParserPlugin {
253
253
  parser
254
254
  );
255
255
  if (!dep) return;
256
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
256
+ dep.loc = parser.getLocation(expr);
257
257
  dep.optional = Boolean(parser.scope.inTry);
258
258
  parser.state.current.addDependency(dep);
259
259
  return true;
@@ -465,7 +465,7 @@ class AMDDefineDependencyParserPlugin {
465
465
  obj ? /** @type {Range} */ (obj.range) : null,
466
466
  namedModule || null
467
467
  );
468
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
468
+ dep.loc = parser.getLocation(expr);
469
469
  if (namedModule) {
470
470
  dep.localModule = addLocalModule(parser.state, namedModule);
471
471
  }
@@ -197,7 +197,7 @@ class AMDPlugin {
197
197
  /** @type {Range} */ (expr.range),
198
198
  [RuntimeGlobals.amdDefine]
199
199
  );
200
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
200
+ dep.loc = parser.getLocation(expr);
201
201
  parser.state.module.addPresentationalDependency(dep);
202
202
  return true;
203
203
  });
@@ -217,7 +217,7 @@ class AMDPlugin {
217
217
  /** @type {Range} */ (expr.range),
218
218
  [RuntimeGlobals.amdDefine]
219
219
  );
220
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
220
+ dep.loc = parser.getLocation(expr);
221
221
  parser.state.module.addPresentationalDependency(dep);
222
222
  return false;
223
223
  });
@@ -122,11 +122,11 @@ class AMDRequireDependenciesBlockParserPlugin {
122
122
  } else if ((localModule = getLocalModule(parser.state, request))) {
123
123
  localModule.flagUsed();
124
124
  dep = new LocalModuleDependency(localModule, undefined, false);
125
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
125
+ dep.loc = parser.getLocation(expr);
126
126
  parser.state.module.addPresentationalDependency(dep);
127
127
  } else {
128
128
  dep = this.newRequireItemDependency(request);
129
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
129
+ dep.loc = parser.getLocation(expr);
130
130
  dep.optional = Boolean(parser.scope.inTry);
131
131
  parser.state.current.addDependency(dep);
132
132
  }
@@ -137,7 +137,7 @@ class AMDRequireDependenciesBlockParserPlugin {
137
137
  /** @type {Range} */
138
138
  (param.range)
139
139
  );
140
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
140
+ dep.loc = parser.getLocation(expr);
141
141
  dep.optional = Boolean(parser.scope.inTry);
142
142
  parser.state.module.addPresentationalDependency(dep);
143
143
  return true;
@@ -203,12 +203,12 @@ class AMDRequireDependenciesBlockParserPlugin {
203
203
  (param.string),
204
204
  param.range
205
205
  );
206
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
206
+ dep.loc = parser.getLocation(expr);
207
207
  dep.optional = Boolean(parser.scope.inTry);
208
208
  parser.state.current.addDependency(dep);
209
209
  return true;
210
210
  }
211
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
211
+ dep.loc = parser.getLocation(expr);
212
212
  parser.state.module.addPresentationalDependency(dep);
213
213
  return true;
214
214
  }
@@ -235,7 +235,7 @@ class AMDRequireDependenciesBlockParserPlugin {
235
235
  parser
236
236
  );
237
237
  if (!dep) return;
238
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
238
+ dep.loc = parser.getLocation(expr);
239
239
  dep.optional = Boolean(parser.scope.inTry);
240
240
  parser.state.current.addDependency(dep);
241
241
  return true;
@@ -296,7 +296,7 @@ class AMDRequireDependenciesBlockParserPlugin {
296
296
  /** @type {Expression} */ (expr.arguments[0])
297
297
  );
298
298
  depBlock = this.newRequireDependenciesBlock(
299
- /** @type {DependencyLocation} */ (expr.loc),
299
+ parser.getLocation(expr),
300
300
  this.processArrayForRequestString(param)
301
301
  );
302
302
  dep = this.newRequireDependency(
@@ -309,7 +309,7 @@ class AMDRequireDependenciesBlockParserPlugin {
309
309
  ? /** @type {Range} */ (expr.arguments[2].range)
310
310
  : null
311
311
  );
312
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
312
+ dep.loc = parser.getLocation(expr);
313
313
  depBlock.addDependency(dep);
314
314
 
315
315
  parser.state.current = /** @type {EXPECTED_ANY} */ (depBlock);
@@ -351,13 +351,13 @@ class AMDRequireDependenciesBlockParserPlugin {
351
351
  );
352
352
  old.addPresentationalDependency(dep);
353
353
  if (parser.state.module) {
354
+ const loc = /** @type {SourceLocation} */ (
355
+ parser.getLocation(expr)
356
+ );
354
357
  parser.state.module.addError(
355
358
  new UnsupportedFeatureWarning(
356
- `Cannot statically analyse 'require(…, …)' in line ${
357
- /** @type {SourceLocation} */ (expr.loc).start.line
358
- }`,
359
- /** @type {DependencyLocation} */
360
- (expr.loc)
359
+ `Cannot statically analyse 'require(…, …)' in line ${loc.start.line}`,
360
+ loc
361
361
  )
362
362
  );
363
363
  }
@@ -5,9 +5,13 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ const InitFragment = require("../InitFragment");
8
9
  const RuntimeGlobals = require("../RuntimeGlobals");
10
+ const Template = require("../Template");
9
11
  const { propertyAccess } = require("../util/property");
10
12
 
13
+ /** @typedef {import("../ConcatenationScope")} ConcatenationScope */
14
+ /** @typedef {import("../Generator").GenerateContext} GenerateContext */
11
15
  /** @typedef {import("../Module")} Module */
12
16
  /** @typedef {import("../Module").RuntimeRequirements} RuntimeRequirements */
13
17
  /** @typedef {import("../ModuleGraph")} ModuleGraph */
@@ -70,6 +74,41 @@ const getRequireEsmModuleExportsAccess = (
70
74
  };
71
75
 
72
76
  module.exports.ESM_MODULE_EXPORTS_NAME = ESM_MODULE_EXPORTS_NAME;
77
+
78
+ /**
79
+ * Rewrites an `exports.<names>` reference of a concatenated CommonJS module to
80
+ * a hoisted module-scope variable and registers that variable as the export's
81
+ * symbol, so other concatenated modules bind to it directly.
82
+ * @param {ConcatenationScope} concatenationScope the concatenation scope
83
+ * @param {InitFragment<GenerateContext>[]} initFragments init fragments (receives the `var` declaration)
84
+ * @param {string[]} names full member chain of the reference (at least one entry)
85
+ * @returns {string} replacement expression for the whole reference
86
+ */
87
+ module.exports.getConcatenatedExportAccess = (
88
+ concatenationScope,
89
+ initFragments,
90
+ names
91
+ ) => {
92
+ const name = names[0];
93
+ const identifier = Template.toIdentifier(name);
94
+ // A sanitized name could collide with another export ("a-b" vs "a_b"),
95
+ // so non-identifier names get a hex suffix of the raw name.
96
+ const symbol = `__WEBPACK_CJS_EXPORT_${
97
+ identifier === name
98
+ ? name
99
+ : `${identifier}_${Buffer.from(name, "utf8").toString("hex")}`
100
+ }__`;
101
+ initFragments.push(
102
+ new InitFragment(
103
+ `var ${symbol};\n`,
104
+ InitFragment.STAGE_CONSTANTS,
105
+ 0,
106
+ `cjs concatenated export ${name}`
107
+ )
108
+ );
109
+ concatenationScope.registerExport(name, symbol);
110
+ return `${symbol}${propertyAccess(names, 1)}`;
111
+ };
73
112
  module.exports.getRequireEsmModuleExportsAccess =
74
113
  getRequireEsmModuleExportsAccess;
75
114
 
@@ -8,7 +8,10 @@
8
8
  const InitFragment = require("../InitFragment");
9
9
  const makeSerializable = require("../util/makeSerializable");
10
10
  const { propertyAccess } = require("../util/property");
11
- const { handleDependencyBase } = require("./CommonJsDependencyHelpers");
11
+ const {
12
+ getConcatenatedExportAccess,
13
+ handleDependencyBase
14
+ } = require("./CommonJsDependencyHelpers");
12
15
  const NullDependency = require("./NullDependency");
13
16
 
14
17
  /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
@@ -114,7 +117,14 @@ CommonJsExportsDependency.Template = class CommonJsExportsDependencyTemplate ext
114
117
  apply(
115
118
  dependency,
116
119
  source,
117
- { module, moduleGraph, initFragments, runtimeRequirements, runtime }
120
+ {
121
+ module,
122
+ moduleGraph,
123
+ initFragments,
124
+ runtimeRequirements,
125
+ runtime,
126
+ concatenationScope
127
+ }
118
128
  ) {
119
129
  const dep = /** @type {CommonJsExportsDependency} */ (dependency);
120
130
  // CJS exports are never inlined
@@ -122,6 +132,41 @@ CommonJsExportsDependency.Template = class CommonJsExportsDependencyTemplate ext
122
132
  moduleGraph.getExportsInfo(module).getUsedName(dep.names, runtime)
123
133
  );
124
134
 
135
+ if (concatenationScope) {
136
+ // eligibility is enforced by JavascriptGenerator.getConcatenationBailoutReason
137
+ if (dep.base !== "exports" && dep.base !== "module.exports") {
138
+ throw new Error(
139
+ `Unsupported base ${dep.base} in concatenated CommonJS module`
140
+ );
141
+ }
142
+ if (!used) {
143
+ initFragments.push(
144
+ new InitFragment(
145
+ "var __webpack_unused_export__;\n",
146
+ InitFragment.STAGE_CONSTANTS,
147
+ 0,
148
+ "__webpack_unused_export__"
149
+ )
150
+ );
151
+ source.replace(
152
+ dep.range[0],
153
+ dep.range[1] - 1,
154
+ "__webpack_unused_export__"
155
+ );
156
+ return;
157
+ }
158
+ source.replace(
159
+ dep.range[0],
160
+ dep.range[1] - 1,
161
+ getConcatenatedExportAccess(
162
+ concatenationScope,
163
+ initFragments,
164
+ dep.names
165
+ )
166
+ );
167
+ return;
168
+ }
169
+
125
170
  const [type, base] = handleDependencyBase(
126
171
  dep.base,
127
172
  module,
@@ -353,7 +353,7 @@ class CommonJsExportsParserPlugin {
353
353
  keptAllExportsForState = parser.state;
354
354
  bailoutHint(
355
355
  `this in exported function may access any export, so all exports are kept, at ${formatLocation(
356
- /** @type {DependencyLocation} */ (thisExpr.loc)
356
+ parser.getLocation(thisExpr)
357
357
  )}`
358
358
  );
359
359
  const dep = new CommonJsSelfReferenceDependency(
@@ -362,7 +362,7 @@ class CommonJsExportsParserPlugin {
362
362
  [],
363
363
  false
364
364
  );
365
- dep.loc = /** @type {DependencyLocation} */ (thisExpr.loc);
365
+ dep.loc = parser.getLocation(thisExpr);
366
366
  parser.state.module.addDependency(dep);
367
367
  };
368
368
 
@@ -404,7 +404,7 @@ class CommonJsExportsParserPlugin {
404
404
  requireCall.ids,
405
405
  !parser.isStatementLevelExpression(expr)
406
406
  );
407
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
407
+ dep.loc = parser.getLocation(expr);
408
408
  dep.optional = Boolean(parser.scope.inTry);
409
409
  parser.state.module.addDependency(dep);
410
410
  /** @type {JavascriptModuleBuildMeta} */ (
@@ -429,7 +429,7 @@ class CommonJsExportsParserPlugin {
429
429
  base,
430
430
  remainingMembers
431
431
  );
432
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
432
+ dep.loc = parser.getLocation(expr);
433
433
  parser.state.module.addDependency(dep);
434
434
  /** @type {JavascriptModuleBuildMeta} */ (
435
435
  parser.state.module.buildMeta
@@ -495,7 +495,7 @@ class CommonJsExportsParserPlugin {
495
495
  false
496
496
  );
497
497
  dep.getter = reexport.getter;
498
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
498
+ dep.loc = parser.getLocation(expr);
499
499
  dep.optional = Boolean(parser.scope.inTry);
500
500
  parser.state.module.addDependency(dep);
501
501
  /** @type {JavascriptModuleBuildMeta} */ (
@@ -517,7 +517,7 @@ class CommonJsExportsParserPlugin {
517
517
  `Object.defineProperty(${exportsArg.identifier})`,
518
518
  [property]
519
519
  );
520
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
520
+ dep.loc = parser.getLocation(expr);
521
521
  parser.state.module.addDependency(dep);
522
522
  /** @type {JavascriptModuleBuildMeta} */ (
523
523
  parser.state.module.buildMeta
@@ -554,7 +554,7 @@ class CommonJsExportsParserPlugin {
554
554
  if (members.length === 0) {
555
555
  bailout(
556
556
  `${base} is used directly at ${formatLocation(
557
- /** @type {DependencyLocation} */ (expr.loc)
557
+ parser.getLocation(expr)
558
558
  )}`
559
559
  );
560
560
  }
@@ -563,7 +563,7 @@ class CommonJsExportsParserPlugin {
563
563
  `${base}${propertyAccess(
564
564
  members
565
565
  )}(...) prevents optimization as ${base} is passed as call context at ${formatLocation(
566
- /** @type {DependencyLocation} */ (expr.loc)
566
+ parser.getLocation(expr)
567
567
  )}`
568
568
  );
569
569
  }
@@ -573,7 +573,7 @@ class CommonJsExportsParserPlugin {
573
573
  members,
574
574
  Boolean(call)
575
575
  );
576
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
576
+ dep.loc = parser.getLocation(expr);
577
577
  parser.state.module.addDependency(dep);
578
578
  /** @type {JavascriptModuleBuildMeta} */ (
579
579
  parser.state.module.buildMeta
@@ -646,7 +646,7 @@ class CommonJsExportsParserPlugin {
646
646
  : RuntimeGlobals.nodeModuleDecorator,
647
647
  !isHarmony
648
648
  );
649
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
649
+ dep.loc = parser.getLocation(expr);
650
650
  parser.state.module.addDependency(dep);
651
651
  return true;
652
652
  });
@@ -146,7 +146,7 @@ const createRequireAsExpressionHandler =
146
146
  dep.critical =
147
147
  options.unknownContextCritical &&
148
148
  "require function is used in a way in which dependencies cannot be statically extracted";
149
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
149
+ dep.loc = parser.getLocation(expr);
150
150
  dep.optional = Boolean(parser.scope.inTry);
151
151
  parser.state.current.addDependency(dep);
152
152
  return true;
@@ -194,7 +194,7 @@ const createRequireCallHandler = (
194
194
  /** @type {Range} */ (expr.range)
195
195
  );
196
196
  if (binding) binding.dep = dep;
197
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
197
+ dep.loc = parser.getLocation(expr);
198
198
  dep.optional = Boolean(parser.scope.inTry);
199
199
  parser.state.current.addDependency(dep);
200
200
  getHarmonyImportGuard().attachDependencyGuards(parser, dep);
@@ -227,7 +227,7 @@ const createRequireCallHandler = (
227
227
  getContext()
228
228
  );
229
229
  if (!dep) return;
230
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
230
+ dep.loc = parser.getLocation(expr);
231
231
  dep.optional = Boolean(parser.scope.inTry);
232
232
  parser.state.current.addDependency(dep);
233
233
  return true;
@@ -244,7 +244,7 @@ const createRequireCallHandler = (
244
244
  parser.state.module.addWarning(
245
245
  new CommentCompilationWarning(
246
246
  `Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
247
- /** @type {DependencyLocation} */ (comment.loc)
247
+ parser.getLocation(comment)
248
248
  )
249
249
  );
250
250
  }
@@ -254,7 +254,7 @@ const createRequireCallHandler = (
254
254
  parser.state.module.addWarning(
255
255
  new UnsupportedFeatureWarning(
256
256
  `\`webpackIgnore\` expected a boolean, but received: ${requireOptions.webpackIgnore}.`,
257
- /** @type {DependencyLocation} */ (expr.loc)
257
+ parser.getLocation(expr)
258
258
  )
259
259
  );
260
260
  } else if (requireOptions.webpackIgnore) {
@@ -282,7 +282,7 @@ const createRequireCallHandler = (
282
282
  const dep = new RequireHeaderDependency(
283
283
  /** @type {Range} */ (expr.callee.range)
284
284
  );
285
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
285
+ dep.loc = parser.getLocation(expr);
286
286
  parser.state.module.addPresentationalDependency(dep);
287
287
  return true;
288
288
  }
@@ -300,7 +300,7 @@ const createRequireCallHandler = (
300
300
  /** @type {Range} */ (expr.range),
301
301
  callNew
302
302
  );
303
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
303
+ dep.loc = parser.getLocation(expr);
304
304
  parser.state.module.addPresentationalDependency(dep);
305
305
  } else {
306
306
  const result = processRequireItem(expr, param);
@@ -310,7 +310,7 @@ const createRequireCallHandler = (
310
310
  const dep = new RequireHeaderDependency(
311
311
  /** @type {Range} */ (expr.callee.range)
312
312
  );
313
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
313
+ dep.loc = parser.getLocation(expr);
314
314
  parser.state.module.addPresentationalDependency(dep);
315
315
  }
316
316
  }
@@ -340,7 +340,7 @@ const createProcessResolveHandler = (parser, options, getContext) => {
340
340
  /** @type {Range} */ (param.range),
341
341
  getContext()
342
342
  );
343
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
343
+ dep.loc = parser.getLocation(expr);
344
344
  dep.optional = Boolean(parser.scope.inTry);
345
345
  dep.weak = weak;
346
346
  parser.state.current.addDependency(dep);
@@ -369,7 +369,7 @@ const createProcessResolveHandler = (parser, options, getContext) => {
369
369
  getContext()
370
370
  );
371
371
  if (!dep) return;
372
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
372
+ dep.loc = parser.getLocation(expr);
373
373
  dep.optional = Boolean(parser.scope.inTry);
374
374
  parser.state.current.addDependency(dep);
375
375
  return true;
@@ -386,7 +386,7 @@ const createProcessResolveHandler = (parser, options, getContext) => {
386
386
  parser.state.module.addWarning(
387
387
  new CommentCompilationWarning(
388
388
  `Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
389
- /** @type {DependencyLocation} */ (comment.loc)
389
+ parser.getLocation(comment)
390
390
  )
391
391
  );
392
392
  }
@@ -396,7 +396,7 @@ const createProcessResolveHandler = (parser, options, getContext) => {
396
396
  parser.state.module.addWarning(
397
397
  new UnsupportedFeatureWarning(
398
398
  `\`webpackIgnore\` expected a boolean, but received: ${requireOptions.webpackIgnore}.`,
399
- /** @type {DependencyLocation} */ (expr.loc)
399
+ parser.getLocation(expr)
400
400
  )
401
401
  );
402
402
  } else if (requireOptions.webpackIgnore) {
@@ -420,7 +420,7 @@ const createProcessResolveHandler = (parser, options, getContext) => {
420
420
  const dep = new RequireResolveHeaderDependency(
421
421
  /** @type {Range} */ (expr.callee.range)
422
422
  );
423
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
423
+ dep.loc = parser.getLocation(expr);
424
424
  parser.state.module.addPresentationalDependency(dep);
425
425
  return true;
426
426
  }
@@ -431,7 +431,7 @@ const createProcessResolveHandler = (parser, options, getContext) => {
431
431
  const dep = new RequireResolveHeaderDependency(
432
432
  /** @type {Range} */ (expr.callee.range)
433
433
  );
434
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
434
+ dep.loc = parser.getLocation(expr);
435
435
  parser.state.module.addPresentationalDependency(dep);
436
436
  return true;
437
437
  };
@@ -502,7 +502,7 @@ class CommonJsImportsParserPlugin {
502
502
  parser.hooks.assign.for("require").tap(PLUGIN_NAME, (expr) => {
503
503
  // to not leak to global "require", we need to define a local require here.
504
504
  const dep = new ConstDependency("var require;", 0);
505
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
505
+ dep.loc = parser.getLocation(expr);
506
506
  parser.state.module.addPresentationalDependency(dep);
507
507
  return true;
508
508
  });
@@ -549,7 +549,7 @@ class CommonJsImportsParserPlugin {
549
549
  "undefined",
550
550
  /** @type {Range} */ (expr.range)
551
551
  );
552
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
552
+ dep.loc = parser.getLocation(expr);
553
553
  parser.state.module.addPresentationalDependency(dep);
554
554
  return false;
555
555
  };
@@ -640,7 +640,7 @@ class CommonJsImportsParserPlugin {
640
640
  /** @type {Range} */ (expr.range)[0]
641
641
  );
642
642
  dep.optional = Boolean(parser.scope.inTry);
643
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
643
+ dep.loc = parser.getLocation(expr);
644
644
  parser.state.current.addDependency(dep);
645
645
  return true;
646
646
  }
@@ -678,7 +678,7 @@ class CommonJsImportsParserPlugin {
678
678
  /** @type {Range} */ (expr.range)[0]
679
679
  );
680
680
  dep.optional = Boolean(parser.scope.inTry);
681
- dep.loc = /** @type {DependencyLocation} */ (expr.callee.loc);
681
+ dep.loc = parser.getLocation(expr.callee);
682
682
  parser.state.current.addDependency(dep);
683
683
  parser.walkExpressions(expr.arguments);
684
684
  return true;
@@ -220,7 +220,7 @@ class CommonJsPlugin {
220
220
  const dep = new RuntimeRequirementsDependency([
221
221
  RuntimeGlobals.moduleLoaded
222
222
  ]);
223
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
223
+ dep.loc = parser.getLocation(expr);
224
224
  parser.state.module.addPresentationalDependency(dep);
225
225
  return true;
226
226
  });
@@ -234,7 +234,7 @@ class CommonJsPlugin {
234
234
  const dep = new RuntimeRequirementsDependency([
235
235
  RuntimeGlobals.moduleId
236
236
  ]);
237
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
237
+ dep.loc = parser.getLocation(expr);
238
238
  parser.state.module.addPresentationalDependency(dep);
239
239
  return true;
240
240
  });
@@ -30,6 +30,28 @@ const ModuleDependency = require("./ModuleDependency");
30
30
 
31
31
  const getHarmonyImportGuard = memoize(() => require("./HarmonyImportGuard"));
32
32
 
33
+ /**
34
+ * Trims a member-access path at the first segment that is definitively not a
35
+ * provided export of the module. Such a segment is a runtime property (e.g. an
36
+ * array/object prototype method like `arr.includes`), so only the value up to
37
+ * that point is observed; referencing the whole value keeps its data intact
38
+ * instead of tree-shaking it away. Real named exports (`utils.foo`) are kept.
39
+ * @param {import("../ExportsInfo")} exportsInfo module exports info
40
+ * @param {string[]} name member-access path
41
+ * @returns {string[]} the provided prefix of the path
42
+ */
43
+ const trimToProvidedPrefix = (exportsInfo, name) => {
44
+ let current = exportsInfo;
45
+ for (let i = 0; i < name.length; i++) {
46
+ const exportInfo = current.getReadOnlyExportInfo(name[i]);
47
+ if (exportInfo.provided === false) return name.slice(0, i);
48
+ const nested = exportInfo.exportsInfo;
49
+ if (!nested) return name;
50
+ current = nested;
51
+ }
52
+ return name;
53
+ };
54
+
33
55
  class CommonJsRequireDependency extends ModuleDependency {
34
56
  /**
35
57
  * Creates an instance of CommonJsRequireDependency.
@@ -94,8 +116,11 @@ class CommonJsRequireDependency extends ModuleDependency {
94
116
  return [{ name: [ESM_MODULE_EXPORTS_NAME], canInline: false }];
95
117
  }
96
118
  if (!this.referencedExports) return Dependency.EXPORTS_OBJECT_REFERENCED;
119
+ const exportsInfo = importedModule
120
+ ? moduleGraph.getExportsInfo(importedModule)
121
+ : undefined;
97
122
  return this.referencedExports.map((name) => ({
98
- name,
123
+ name: exportsInfo ? trimToProvidedPrefix(exportsInfo, name) : name,
99
124
  canMangle: false,
100
125
  canInline: false
101
126
  }));
@@ -9,6 +9,7 @@ const RuntimeGlobals = require("../RuntimeGlobals");
9
9
  const { equals } = require("../util/ArrayHelpers");
10
10
  const makeSerializable = require("../util/makeSerializable");
11
11
  const { propertyAccess } = require("../util/property");
12
+ const { getConcatenatedExportAccess } = require("./CommonJsDependencyHelpers");
12
13
  const NullDependency = require("./NullDependency");
13
14
 
14
15
  /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
@@ -115,7 +116,14 @@ CommonJsSelfReferenceDependency.Template = class CommonJsSelfReferenceDependency
115
116
  apply(
116
117
  dependency,
117
118
  source,
118
- { module, moduleGraph, runtime, runtimeRequirements }
119
+ {
120
+ module,
121
+ moduleGraph,
122
+ runtime,
123
+ runtimeRequirements,
124
+ initFragments,
125
+ concatenationScope
126
+ }
119
127
  ) {
120
128
  const dep = /** @type {CommonJsSelfReferenceDependency} */ (dependency);
121
129
  // CJS exports are never inlined
@@ -131,6 +139,29 @@ CommonJsSelfReferenceDependency.Template = class CommonJsSelfReferenceDependency
131
139
  );
132
140
  }
133
141
 
142
+ if (concatenationScope) {
143
+ // eligibility (non-empty names, exports/module.exports base) is enforced
144
+ // by JavascriptGenerator.getConcatenationBailoutReason
145
+ if (
146
+ dep.names.length === 0 ||
147
+ (dep.base !== "exports" && dep.base !== "module.exports")
148
+ ) {
149
+ throw new Error(
150
+ `Unsupported self-reference ${dep.base} in concatenated CommonJS module`
151
+ );
152
+ }
153
+ source.replace(
154
+ dep.range[0],
155
+ dep.range[1] - 1,
156
+ getConcatenatedExportAccess(
157
+ concatenationScope,
158
+ initFragments,
159
+ dep.names
160
+ )
161
+ );
162
+ return;
163
+ }
164
+
134
165
  /** @type {string} */
135
166
  let base;
136
167
  switch (dep.base) {
@@ -126,7 +126,7 @@ module.exports.create = (
126
126
  valueRange,
127
127
  ...depArgs
128
128
  );
129
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
129
+ dep.loc = parser.getLocation(expr);
130
130
 
131
131
  /** @type {Replaces} */
132
132
  const replaces = [];
@@ -224,7 +224,7 @@ module.exports.create = (
224
224
  valueRange,
225
225
  ...depArgs
226
226
  );
227
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
227
+ dep.loc = parser.getLocation(expr);
228
228
  /** @type {Replaces} */
229
229
  const replaces = [];
230
230
  if (prefixRange) {
@@ -269,7 +269,7 @@ module.exports.create = (
269
269
  /** @type {Range} */ (param.range),
270
270
  ...depArgs
271
271
  );
272
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
272
+ dep.loc = parser.getLocation(expr);
273
273
  dep.critical =
274
274
  options.exprContextCritical &&
275
275
  "the request of a dependency is an expression";