webpack 5.106.2 → 5.107.1

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 (235) hide show
  1. package/README.md +2 -2
  2. package/lib/APIPlugin.js +1 -1
  3. package/lib/BannerPlugin.js +3 -4
  4. package/lib/Cache.js +3 -6
  5. package/lib/Chunk.js +21 -25
  6. package/lib/ChunkGroup.js +57 -15
  7. package/lib/CompatibilityPlugin.js +8 -7
  8. package/lib/Compilation.js +67 -37
  9. package/lib/Compiler.js +4 -13
  10. package/lib/ContextModule.js +2 -2
  11. package/lib/DefinePlugin.js +2 -2
  12. package/lib/Dependency.js +22 -1
  13. package/lib/DependencyTemplate.js +2 -1
  14. package/lib/EnvironmentPlugin.js +1 -1
  15. package/lib/EvalSourceMapDevToolPlugin.js +8 -10
  16. package/lib/ExportsInfo.js +30 -34
  17. package/lib/ExternalModule.js +91 -26
  18. package/lib/ExternalModuleFactoryPlugin.js +7 -1
  19. package/lib/FileSystemInfo.js +187 -72
  20. package/lib/Generator.js +3 -3
  21. package/lib/HotModuleReplacementPlugin.js +26 -8
  22. package/lib/IgnorePlugin.js +2 -1
  23. package/lib/Module.js +20 -19
  24. package/lib/ModuleFactory.js +1 -1
  25. package/lib/ModuleNotFoundError.js +3 -84
  26. package/lib/ModuleSourceTypeConstants.js +51 -19
  27. package/lib/ModuleTypeConstants.js +12 -3
  28. package/lib/MultiCompiler.js +2 -2
  29. package/lib/NodeStuffPlugin.js +1 -1
  30. package/lib/NormalModule.js +119 -77
  31. package/lib/NormalModuleFactory.js +47 -27
  32. package/lib/Parser.js +1 -1
  33. package/lib/ProgressPlugin.js +129 -56
  34. package/lib/RuntimeGlobals.js +5 -5
  35. package/lib/RuntimeModule.js +9 -7
  36. package/lib/RuntimePlugin.js +12 -1
  37. package/lib/SourceMapDevToolPlugin.js +250 -49
  38. package/lib/Template.js +1 -1
  39. package/lib/TemplatedPathPlugin.js +22 -4
  40. package/lib/WarnCaseSensitiveModulesPlugin.js +70 -2
  41. package/lib/WarnDeprecatedOptionPlugin.js +1 -1
  42. package/lib/WarnNoModeSetPlugin.js +16 -1
  43. package/lib/Watching.js +2 -3
  44. package/lib/WebpackError.js +3 -77
  45. package/lib/WebpackIsIncludedPlugin.js +1 -1
  46. package/lib/WebpackOptionsApply.js +13 -1
  47. package/lib/asset/AssetBytesGenerator.js +12 -8
  48. package/lib/asset/AssetGenerator.js +36 -22
  49. package/lib/asset/AssetModulesPlugin.js +6 -8
  50. package/lib/asset/AssetSourceGenerator.js +12 -8
  51. package/lib/buildChunkGraph.js +4 -6
  52. package/lib/cache/PackFileCacheStrategy.js +4 -4
  53. package/lib/cli.js +3 -1
  54. package/lib/config/defaults.js +197 -10
  55. package/lib/config/normalization.js +3 -1
  56. package/lib/css/CssGenerator.js +320 -105
  57. package/lib/css/CssInjectStyleRuntimeModule.js +44 -42
  58. package/lib/css/CssLoadingRuntimeModule.js +22 -4
  59. package/lib/{CssModule.js → css/CssModule.js} +15 -15
  60. package/lib/css/CssModulesPlugin.js +168 -88
  61. package/lib/css/CssParser.js +566 -269
  62. package/lib/css/walkCssTokens.js +148 -2
  63. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +1 -1
  64. package/lib/dependencies/CommonJsDependencyHelpers.js +63 -0
  65. package/lib/dependencies/CommonJsExportRequireDependency.js +54 -10
  66. package/lib/dependencies/CommonJsExportsParserPlugin.js +1 -1
  67. package/lib/dependencies/CommonJsFullRequireDependency.js +32 -9
  68. package/lib/dependencies/CommonJsImportsParserPlugin.js +112 -4
  69. package/lib/dependencies/CommonJsRequireDependency.js +67 -4
  70. package/lib/dependencies/ContextDependency.js +1 -1
  71. package/lib/dependencies/ContextDependencyHelpers.js +1 -1
  72. package/lib/dependencies/CreateRequireParserPlugin.js +1 -1
  73. package/lib/dependencies/CriticalDependencyWarning.js +1 -1
  74. package/lib/dependencies/CssIcssExportDependency.js +332 -67
  75. package/lib/dependencies/CssIcssImportDependency.js +49 -7
  76. package/lib/dependencies/CssIcssSymbolDependency.js +11 -3
  77. package/lib/dependencies/CssImportDependency.js +8 -0
  78. package/lib/dependencies/CssUrlDependency.js +28 -2
  79. package/lib/dependencies/HarmonyDetectionParserPlugin.js +22 -2
  80. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +8 -7
  81. package/lib/dependencies/HarmonyExportExpressionDependency.js +22 -14
  82. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +110 -3
  83. package/lib/dependencies/HarmonyImportDependency.js +10 -2
  84. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +22 -1
  85. package/lib/dependencies/HarmonyImportSpecifierDependency.js +1 -1
  86. package/lib/{HarmonyLinkingError.js → dependencies/HarmonyLinkingError.js} +5 -3
  87. package/lib/dependencies/HtmlInlineScriptDependency.js +133 -0
  88. package/lib/dependencies/HtmlInlineStyleDependency.js +101 -0
  89. package/lib/dependencies/HtmlScriptSrcDependency.js +557 -0
  90. package/lib/dependencies/HtmlSourceDependency.js +128 -0
  91. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +1 -1
  92. package/lib/dependencies/ImportParserPlugin.js +2 -2
  93. package/lib/dependencies/ImportPhase.js +1 -1
  94. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +1 -1
  95. package/lib/{RequireJsStuffPlugin.js → dependencies/RequireJsStuffPlugin.js} +7 -7
  96. package/lib/dependencies/SystemPlugin.js +1 -1
  97. package/lib/dependencies/WebAssemblyImportDependency.js +1 -1
  98. package/lib/dependencies/WorkerPlugin.js +2 -2
  99. package/lib/{DelegatedModule.js → dll/DelegatedModule.js} +31 -31
  100. package/lib/{DelegatedModuleFactoryPlugin.js → dll/DelegatedModuleFactoryPlugin.js} +4 -4
  101. package/lib/{DelegatedPlugin.js → dll/DelegatedPlugin.js} +2 -2
  102. package/lib/{DllEntryPlugin.js → dll/DllEntryPlugin.js} +4 -4
  103. package/lib/{DllModule.js → dll/DllModule.js} +24 -24
  104. package/lib/{DllModuleFactory.js → dll/DllModuleFactory.js} +4 -4
  105. package/lib/{DllPlugin.js → dll/DllPlugin.js} +6 -5
  106. package/lib/{DllReferencePlugin.js → dll/DllReferencePlugin.js} +14 -14
  107. package/lib/{LibManifestPlugin.js → dll/LibManifestPlugin.js} +9 -9
  108. package/lib/{AsyncDependencyToInitialChunkError.js → errors/AsyncDependencyToInitialChunkError.js} +2 -2
  109. package/lib/errors/BuildCycleError.js +1 -1
  110. package/lib/{ChunkRenderError.js → errors/ChunkRenderError.js} +1 -1
  111. package/lib/{CodeGenerationError.js → errors/CodeGenerationError.js} +1 -1
  112. package/lib/{CommentCompilationWarning.js → errors/CommentCompilationWarning.js} +3 -3
  113. package/lib/{ConcurrentCompilationError.js → errors/ConcurrentCompilationError.js} +4 -2
  114. package/lib/{EnvironmentNotSupportAsyncWarning.js → errors/EnvironmentNotSupportAsyncWarning.js} +4 -4
  115. package/lib/{HookWebpackError.js → errors/HookWebpackError.js} +5 -5
  116. package/lib/{IgnoreErrorModuleFactory.js → errors/IgnoreErrorModuleFactory.js} +4 -4
  117. package/lib/{InvalidDependenciesModuleWarning.js → errors/InvalidDependenciesModuleWarning.js} +3 -3
  118. package/lib/errors/JSONParseError.js +114 -0
  119. package/lib/{ModuleBuildError.js → errors/ModuleBuildError.js} +5 -5
  120. package/lib/{ModuleDependencyError.js → errors/ModuleDependencyError.js} +2 -2
  121. package/lib/{ModuleDependencyWarning.js → errors/ModuleDependencyWarning.js} +4 -4
  122. package/lib/{ModuleError.js → errors/ModuleError.js} +5 -5
  123. package/lib/{ModuleHashingError.js → errors/ModuleHashingError.js} +1 -1
  124. package/lib/errors/ModuleNotFoundError.js +91 -0
  125. package/lib/{ModuleParseError.js → errors/ModuleParseError.js} +8 -6
  126. package/lib/{ModuleRestoreError.js → errors/ModuleRestoreError.js} +1 -1
  127. package/lib/{ModuleStoreError.js → errors/ModuleStoreError.js} +1 -1
  128. package/lib/{ModuleWarning.js → errors/ModuleWarning.js} +5 -5
  129. package/lib/{NodeStuffInWebError.js → errors/NodeStuffInWebError.js} +4 -4
  130. package/lib/errors/NonErrorEmittedError.js +28 -0
  131. package/lib/{UnhandledSchemeError.js → errors/UnhandledSchemeError.js} +2 -2
  132. package/lib/{UnsupportedFeatureWarning.js → errors/UnsupportedFeatureWarning.js} +3 -3
  133. package/lib/errors/WebpackError.js +84 -0
  134. package/lib/html/HtmlGenerator.js +379 -0
  135. package/lib/html/HtmlModulesPlugin.js +429 -0
  136. package/lib/html/HtmlParser.js +1489 -0
  137. package/lib/html/walkHtmlTokens.js +3249 -0
  138. package/lib/ids/IdHelpers.js +2 -1
  139. package/lib/index.js +36 -15
  140. package/lib/javascript/JavascriptModulesPlugin.js +91 -10
  141. package/lib/javascript/JavascriptParser.js +197 -16
  142. package/lib/javascript/JavascriptParserHelpers.js +1 -1
  143. package/lib/json/JsonParser.js +7 -16
  144. package/lib/library/AbstractLibraryPlugin.js +1 -1
  145. package/lib/library/EnableLibraryPlugin.js +1 -1
  146. package/lib/{FalseIIFEUmdWarning.js → library/FalseIIFEUmdWarning.js} +1 -1
  147. package/lib/library/ModuleLibraryPlugin.js +74 -0
  148. package/lib/node/NodeEnvironmentPlugin.js +4 -2
  149. package/lib/node/nodeConsole.js +113 -64
  150. package/lib/optimize/ConcatenatedModule.js +51 -6
  151. package/lib/optimize/InnerGraph.js +1 -1
  152. package/lib/optimize/InnerGraphPlugin.js +11 -1
  153. package/lib/optimize/MinMaxSizeWarning.js +4 -4
  154. package/lib/optimize/ModuleConcatenationPlugin.js +15 -7
  155. package/lib/optimize/RealContentHashPlugin.js +89 -26
  156. package/lib/optimize/SideEffectsFlagPlugin.js +112 -5
  157. package/lib/optimize/SplitChunksPlugin.js +5 -5
  158. package/lib/performance/AssetsOverSizeLimitWarning.js +2 -2
  159. package/lib/performance/EntrypointsOverSizeLimitWarning.js +2 -2
  160. package/lib/performance/NoAsyncChunksWarning.js +5 -3
  161. package/lib/performance/SizeLimitsPlugin.js +1 -1
  162. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +4 -1
  163. package/lib/rules/UseEffectRulePlugin.js +4 -3
  164. package/lib/runtime/AutoPublicPathRuntimeModule.js +3 -3
  165. package/lib/runtime/GetChunkFilenameRuntimeModule.js +5 -5
  166. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +119 -13
  167. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +35 -0
  168. package/lib/schemes/DataUriPlugin.js +13 -1
  169. package/lib/schemes/VirtualUrlPlugin.js +1 -1
  170. package/lib/serialization/SerializerMiddleware.js +2 -2
  171. package/lib/sharing/ConsumeSharedPlugin.js +4 -10
  172. package/lib/sharing/ConsumeSharedRuntimeModule.js +8 -4
  173. package/lib/sharing/ProvideSharedModule.js +1 -1
  174. package/lib/sharing/ProvideSharedPlugin.js +5 -5
  175. package/lib/sharing/resolveMatchedConfigs.js +1 -1
  176. package/lib/stats/DefaultStatsFactoryPlugin.js +2 -2
  177. package/lib/stats/DefaultStatsPresetPlugin.js +1 -1
  178. package/lib/stats/DefaultStatsPrinterPlugin.js +1 -1
  179. package/lib/stats/StatsFactory.js +1 -1
  180. package/lib/typescript/TypeScriptPlugin.js +210 -0
  181. package/lib/url/URLParserPlugin.js +2 -2
  182. package/lib/util/AsyncQueue.js +2 -2
  183. package/lib/util/Hash.js +2 -2
  184. package/lib/util/LocConverter.js +53 -0
  185. package/lib/util/SortableSet.js +1 -1
  186. package/lib/util/cleverMerge.js +2 -2
  187. package/lib/util/comparators.js +3 -3
  188. package/lib/util/concatenate.js +3 -3
  189. package/lib/util/conventions.js +42 -1
  190. package/lib/util/createMappings.js +118 -0
  191. package/lib/{formatLocation.js → util/formatLocation.js} +2 -2
  192. package/lib/{SizeFormatHelpers.js → util/formatSize.js} +3 -1
  193. package/lib/util/fs.js +8 -8
  194. package/lib/util/hash/md4.js +1 -1
  195. package/lib/util/hash/xxhash64.js +1 -1
  196. package/lib/util/identifier.js +48 -0
  197. package/lib/util/internalSerializables.js +35 -19
  198. package/lib/util/magicComment.js +10 -7
  199. package/lib/util/parseJson.js +2 -73
  200. package/lib/util/source.js +21 -0
  201. package/lib/util/topologicalSort.js +69 -0
  202. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +3 -4
  203. package/lib/wasm-async/AsyncWebAssemblyParser.js +1 -1
  204. package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +5 -3
  205. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +1 -1
  206. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +5 -3
  207. package/lib/webpack.js +3 -1
  208. package/package.json +24 -22
  209. package/schemas/WebpackOptions.check.js +1 -1
  210. package/schemas/WebpackOptions.json +129 -12
  211. package/schemas/plugins/{DllPlugin.check.d.ts → HtmlGeneratorOptions.check.d.ts} +1 -1
  212. package/schemas/plugins/HtmlGeneratorOptions.check.js +6 -0
  213. package/schemas/plugins/HtmlGeneratorOptions.json +3 -0
  214. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  215. package/schemas/plugins/ProgressPlugin.json +22 -0
  216. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  217. package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
  218. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  219. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  220. package/schemas/plugins/container/ModuleFederationPlugin.json +1 -0
  221. package/schemas/plugins/{DllReferencePlugin.check.d.ts → css/CssAutoOrModuleParserOptions.check.d.ts} +1 -1
  222. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +6 -0
  223. package/schemas/plugins/css/CssAutoOrModuleParserOptions.json +3 -0
  224. package/schemas/plugins/dll/DllPlugin.check.d.ts +7 -0
  225. package/schemas/plugins/dll/DllReferencePlugin.check.d.ts +7 -0
  226. package/types.d.ts +1153 -233
  227. package/lib/CaseSensitiveModulesWarning.js +0 -80
  228. package/lib/GraphHelpers.js +0 -49
  229. package/lib/NoModeWarning.js +0 -23
  230. package/lib/css/CssMergeStyleSheetsRuntimeModule.js +0 -57
  231. /package/lib/{AbstractMethodError.js → errors/AbstractMethodError.js} +0 -0
  232. /package/schemas/plugins/{DllPlugin.check.js → dll/DllPlugin.check.js} +0 -0
  233. /package/schemas/plugins/{DllPlugin.json → dll/DllPlugin.json} +0 -0
  234. /package/schemas/plugins/{DllReferencePlugin.check.js → dll/DllReferencePlugin.check.js} +0 -0
  235. /package/schemas/plugins/{DllReferencePlugin.json → dll/DllReferencePlugin.json} +0 -0
@@ -30,13 +30,15 @@ class CssIcssSymbolDependency extends NullDependency {
30
30
  * @param {Range} range range
31
31
  * @param {string=} value value when it was defined in this module
32
32
  * @param {string=} importName import name when it was imported from other module
33
+ * @param {string=} request request of the `@value` import that was active when this reference was parsed — used to disambiguate when the same local name is imported from multiple modules
33
34
  */
34
- constructor(localName, range, value, importName) {
35
+ constructor(localName, range, value, importName, request) {
35
36
  super();
36
37
  this.localName = localName;
37
38
  this.range = range;
38
39
  this.value = value;
39
40
  this.importName = importName;
41
+ this.request = request;
40
42
  /** @type {undefined | string} */
41
43
  this._hashUpdate = undefined;
42
44
  }
@@ -53,7 +55,10 @@ class CssIcssSymbolDependency extends NullDependency {
53
55
  */
54
56
  updateHash(hash, context) {
55
57
  if (this._hashUpdate === undefined) {
56
- this._hashUpdate = `${this.range}${this.localName}${this.value || this.importName}`;
58
+ // Concatenate with explicit field separators so adjacent fields
59
+ // can't alias each other (e.g. range `[1,11]` + localName `"foo"`
60
+ // vs range `[1,1]` + localName `"1foo"`).
61
+ this._hashUpdate = `range|${JSON.stringify(this.range)}|localName|${this.localName}|value|${this.value || ""}|importName|${this.importName || ""}|request|${this.request || ""}`;
57
62
  }
58
63
  hash.update(this._hashUpdate);
59
64
  }
@@ -68,6 +73,7 @@ class CssIcssSymbolDependency extends NullDependency {
68
73
  write(this.range);
69
74
  write(this.value);
70
75
  write(this.importName);
76
+ write(this.request);
71
77
  super.serialize(context);
72
78
  }
73
79
 
@@ -81,6 +87,7 @@ class CssIcssSymbolDependency extends NullDependency {
81
87
  this.range = read();
82
88
  this.value = read();
83
89
  this.importName = read();
90
+ this.request = read();
84
91
  super.deserialize(context);
85
92
  }
86
93
  }
@@ -103,7 +110,8 @@ CssIcssSymbolDependency.Template = class CssIcssSymbolDependencyTemplate extends
103
110
  ? CssIcssExportDependency.Template.resolve(
104
111
  dep.localName,
105
112
  dep.importName,
106
- templateContext
113
+ templateContext,
114
+ dep.request
107
115
  )
108
116
  : dep.value;
109
117
 
@@ -43,6 +43,14 @@ class CssImportDependency extends ModuleDependency {
43
43
  return `css-import${this.mode ? `-${this.mode}-module` : ""}`;
44
44
  }
45
45
 
46
+ /**
47
+ * Returns true if this dependency can be concatenated
48
+ * @returns {boolean} true if this dependency can be concatenated
49
+ */
50
+ canConcatenate() {
51
+ return true;
52
+ }
53
+
46
54
  /**
47
55
  * Returns an identifier to merge equal requests.
48
56
  * @returns {string | null} an identifier to merge equal requests
@@ -5,6 +5,7 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ const { ASSET_URL_TYPE } = require("../ModuleSourceTypeConstants");
8
9
  const RawDataUrlModule = require("../asset/RawDataUrlModule");
9
10
  const makeSerializable = require("../util/makeSerializable");
10
11
  const memoize = require("../util/memoize");
@@ -12,14 +13,17 @@ const ModuleDependency = require("./ModuleDependency");
12
13
 
13
14
  /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
14
15
  /** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */
16
+ /** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
15
17
  /** @typedef {import("../Dependency")} Dependency */
16
18
  /** @typedef {import("../DependencyTemplate").CssDependencyTemplateContext} DependencyTemplateContext */
17
19
  /** @typedef {import("../Module")} Module */
20
+ /** @typedef {import("../Module").BuildInfo} BuildInfo */
18
21
  /** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
19
22
  /** @typedef {import("../Module").CodeGenerationResultData} CodeGenerationResultData */
20
23
  /** @typedef {import("../javascript/JavascriptParser").Range} Range */
21
24
  /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
22
25
  /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
26
+ /** @typedef {import("../util/Hash")} Hash */
23
27
  /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
24
28
 
25
29
  const getIgnoredRawDataUrlModule = memoize(
@@ -56,6 +60,27 @@ class CssUrlDependency extends ModuleDependency {
56
60
  return getIgnoredRawDataUrlModule();
57
61
  }
58
62
 
63
+ /**
64
+ * Updates the hash with the data contributed by this instance.
65
+ * @param {Hash} hash hash to be updated
66
+ * @param {UpdateHashContext} context context
67
+ * @returns {void}
68
+ */
69
+ updateHash(hash, context) {
70
+ // The dependency template substitutes the referenced asset's hashed
71
+ // filename into the rendered CSS at code-generation time. Folding the
72
+ // asset module's content hash into the dependency hash ensures the
73
+ // CSS module's hash invalidates — and the CSS chunk's contenthash
74
+ // updates — whenever the referenced asset's content changes.
75
+ const { chunkGraph } = context;
76
+ const module = chunkGraph.moduleGraph.getModule(this);
77
+ if (!module) return;
78
+ const buildInfo = /** @type {BuildInfo | undefined} */ (module.buildInfo);
79
+ if (buildInfo && buildInfo.hash) {
80
+ hash.update(/** @type {string} */ (buildInfo.hash));
81
+ }
82
+ }
83
+
59
84
  /**
60
85
  * Serializes this instance into the provided serializer context.
61
86
  * @param {ObjectSerializerContext} context context
@@ -184,13 +209,14 @@ CssUrlDependency.Template = class CssUrlDependencyTemplate extends (
184
209
  const data = codeGen.data;
185
210
  if (!data) return "data:,";
186
211
  const url = data.get("url");
187
- if (!url || !url["css-url"]) return "data:,";
188
- return url["css-url"];
212
+ if (!url || !url[ASSET_URL_TYPE]) return "data:,";
213
+ return url[ASSET_URL_TYPE];
189
214
  }
190
215
  };
191
216
 
192
217
  makeSerializable(CssUrlDependency, "webpack/lib/dependencies/CssUrlDependency");
193
218
 
194
219
  CssUrlDependency.PUBLIC_PATH_AUTO = "__WEBPACK_CSS_PUBLIC_PATH_AUTO__";
220
+ CssUrlDependency.PUBLIC_PATH_FULL_HASH = "__WEBPACK_CSS_PUBLIC_PATH_FULL_HASH_";
195
221
 
196
222
  module.exports = CssUrlDependency;
@@ -5,8 +5,8 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const EnvironmentNotSupportAsyncWarning = require("../EnvironmentNotSupportAsyncWarning");
9
8
  const { JAVASCRIPT_MODULE_TYPE_ESM } = require("../ModuleTypeConstants");
9
+ const EnvironmentNotSupportAsyncWarning = require("../errors/EnvironmentNotSupportAsyncWarning");
10
10
  const DynamicExports = require("./DynamicExports");
11
11
  const HarmonyCompatibilityDependency = require("./HarmonyCompatibilityDependency");
12
12
  const HarmonyExports = require("./HarmonyExports");
@@ -92,6 +92,19 @@ module.exports = class HarmonyDetectionParserPlugin {
92
92
  }
93
93
  };
94
94
 
95
+ /**
96
+ * Walks call arguments so import bindings used inside callbacks are
97
+ * still tracked, then skips default AMD/CommonJS handling.
98
+ * @param {import("estree").CallExpression} expr call expression
99
+ * @returns {boolean | undefined} true if in harmony
100
+ */
101
+ const walkArgumentsAndSkipInHarmony = (expr) => {
102
+ if (HarmonyExports.isEnabled(parser.state)) {
103
+ if (expr.arguments) parser.walkExpressions(expr.arguments);
104
+ return true;
105
+ }
106
+ };
107
+
95
108
  const nonHarmonyIdentifiers = ["define", "exports"];
96
109
  for (const identifier of nonHarmonyIdentifiers) {
97
110
  parser.hooks.evaluateTypeof
@@ -100,7 +113,14 @@ module.exports = class HarmonyDetectionParserPlugin {
100
113
  parser.hooks.typeof.for(identifier).tap(PLUGIN_NAME, skipInHarmony);
101
114
  parser.hooks.evaluate.for(identifier).tap(PLUGIN_NAME, nullInHarmony);
102
115
  parser.hooks.expression.for(identifier).tap(PLUGIN_NAME, skipInHarmony);
103
- parser.hooks.call.for(identifier).tap(PLUGIN_NAME, skipInHarmony);
116
+ parser.hooks.call
117
+ .for(identifier)
118
+ .tap(
119
+ PLUGIN_NAME,
120
+ identifier === "define"
121
+ ? walkArgumentsAndSkipInHarmony
122
+ : skipInHarmony
123
+ );
104
124
  }
105
125
  }
106
126
  };
@@ -6,7 +6,7 @@
6
6
  "use strict";
7
7
 
8
8
  const CompatibilityPlugin = require("../CompatibilityPlugin");
9
- const WebpackError = require("../WebpackError");
9
+ const WebpackError = require("../errors/WebpackError");
10
10
  const { getImportAttributes } = require("../javascript/JavascriptParser");
11
11
  const InnerGraph = require("../optimize/InnerGraph");
12
12
  const ConstDependency = require("./ConstDependency");
@@ -144,12 +144,13 @@ module.exports = class HarmonyExportDependencyParserPlugin {
144
144
  : undefined
145
145
  );
146
146
  dep.isAnonymousDefault =
147
- node.type === "ArrowFunctionExpression" ||
148
- ((node.type === "FunctionDeclaration" ||
149
- node.type === "FunctionExpression" ||
150
- node.type === "ClassDeclaration" ||
151
- node.type === "ClassExpression") &&
152
- !node.id);
147
+ this.options.anonymousDefaultExportName !== false &&
148
+ (node.type === "ArrowFunctionExpression" ||
149
+ ((node.type === "FunctionDeclaration" ||
150
+ node.type === "FunctionExpression" ||
151
+ node.type === "ClassDeclaration" ||
152
+ node.type === "ClassExpression") &&
153
+ !node.id));
153
154
  dep.loc = Object.create(
154
155
  /** @type {DependencyLocation} */ (statement.loc)
155
156
  );
@@ -143,18 +143,17 @@ HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTempla
143
143
  );
144
144
  }
145
145
 
146
+ const used = concatenationScope
147
+ ? undefined
148
+ : moduleGraph.getExportsInfo(module).getUsedName("default", runtime);
149
+
146
150
  if (concatenationScope) {
147
151
  concatenationScope.registerExport("default", name);
148
- } else {
149
- const used = moduleGraph
150
- .getExportsInfo(module)
151
- .getUsedName("default", runtime);
152
- if (used) {
153
- /** @type {ExportMap} */
154
- const map = new Map();
155
- map.set(used, `/* export default binding */ ${name}`);
156
- initFragments.push(new HarmonyExportInitFragment(exportsName, map));
157
- }
152
+ } else if (used) {
153
+ /** @type {ExportMap} */
154
+ const map = new Map();
155
+ map.set(used, `/* export default binding */ ${name}`);
156
+ initFragments.push(new HarmonyExportInitFragment(exportsName, map));
158
157
  }
159
158
 
160
159
  source.replace(
@@ -163,12 +162,17 @@ HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTempla
163
162
  `/* harmony default export */ ${dep.prefix}`
164
163
  );
165
164
 
166
- if (typeof declarationId !== "string" && dep.isAnonymousDefault) {
165
+ if (
166
+ typeof declarationId !== "string" &&
167
+ dep.isAnonymousDefault &&
168
+ (concatenationScope || used)
169
+ ) {
167
170
  // Fix .name for anonymous default export function declarations
168
171
  // see test/test262-cases/test/language/module-code/instn-named-bndng-dflt-fun-anon.js cspell:disable-line
172
+ runtimeRequirements.add(RuntimeGlobals.setAnonymousDefaultName);
169
173
  initFragments.push(
170
174
  new InitFragment(
171
- `Object.defineProperty(${name}, "name", { value: "default", configurable: true });\n`,
175
+ `${RuntimeGlobals.setAnonymousDefaultName}(${name});\n`,
172
176
  InitFragment.STAGE_HARMONY_EXPORTS,
173
177
  2
174
178
  )
@@ -178,6 +182,7 @@ HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTempla
178
182
  /** @type {string} */
179
183
  let content;
180
184
  let name = ConcatenationScope.DEFAULT_EXPORT;
185
+ let defaultIsUsed = Boolean(concatenationScope);
181
186
  if (runtimeTemplate.supportsConst()) {
182
187
  content = `/* harmony default export */ const ${name} = `;
183
188
  if (concatenationScope) {
@@ -187,6 +192,7 @@ HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTempla
187
192
  .getExportsInfo(module)
188
193
  .getUsedName("default", runtime);
189
194
  if (used) {
195
+ defaultIsUsed = true;
190
196
  runtimeRequirements.add(RuntimeGlobals.exports);
191
197
  /** @type {ExportMap} */
192
198
  const map = new Map();
@@ -204,6 +210,7 @@ HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTempla
204
210
  .getExportsInfo(module)
205
211
  .getUsedName("default", runtime);
206
212
  if (used) {
213
+ defaultIsUsed = true;
207
214
  runtimeRequirements.add(RuntimeGlobals.exports);
208
215
  // This is a little bit incorrect as TDZ is not correct, but we can't use const.
209
216
  // No local `__WEBPACK_DEFAULT_EXPORT__` binding is created in this path,
@@ -224,13 +231,14 @@ HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTempla
224
231
  dep.range[0] - 1,
225
232
  `${content}(${dep.prefix}`
226
233
  );
227
- if (dep.isAnonymousDefault) {
234
+ if (dep.isAnonymousDefault && defaultIsUsed) {
228
235
  // Fix .name for anonymous default export expressions
229
236
  // see test/test262-cases/test/language/module-code/eval-export-dflt-cls-anon.js cspell:disable-line
237
+ runtimeRequirements.add(RuntimeGlobals.setAnonymousDefaultName);
230
238
  source.replace(
231
239
  dep.range[1],
232
240
  dep.rangeStatement[1] - 0.5,
233
- `);\n(Object.getOwnPropertyDescriptor(${name}, "name") || {}).writable || Object.defineProperty(${name}, "name", { value: "default", configurable: true });`
241
+ `);\n${RuntimeGlobals.setAnonymousDefaultName}(${name});`
234
242
  );
235
243
  } else {
236
244
  source.replace(dep.range[1], dep.rangeStatement[1] - 0.5, ");");
@@ -8,7 +8,6 @@
8
8
  const ConditionalInitFragment = require("../ConditionalInitFragment");
9
9
  const Dependency = require("../Dependency");
10
10
  const { UsageState } = require("../ExportsInfo");
11
- const HarmonyLinkingError = require("../HarmonyLinkingError");
12
11
  const InitFragment = require("../InitFragment");
13
12
  const RuntimeGlobals = require("../RuntimeGlobals");
14
13
  const Template = require("../Template");
@@ -26,6 +25,7 @@ const {
26
25
  } = require("../util/runtime");
27
26
  const HarmonyExportInitFragment = require("./HarmonyExportInitFragment");
28
27
  const HarmonyImportDependency = require("./HarmonyImportDependency");
28
+ const HarmonyLinkingError = require("./HarmonyLinkingError");
29
29
  const { ImportPhaseUtils } = require("./ImportPhase");
30
30
  const processExportInfo = require("./processExportInfo");
31
31
 
@@ -50,7 +50,7 @@ const processExportInfo = require("./processExportInfo");
50
50
  /** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
51
51
  /** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
52
52
  /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
53
- /** @typedef {import("../WebpackError")} WebpackError */
53
+ /** @typedef {import("../errors/WebpackError")} WebpackError */
54
54
  /** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
55
55
  /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
56
56
  /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
@@ -128,6 +128,79 @@ class ExportMode {
128
128
 
129
129
  /** @typedef {number[]} DependencyIndices */
130
130
 
131
+ const RETURNS_TRUE = () => true;
132
+
133
+ /**
134
+ * Detect a per-name cycle when collecting `export *` contributions from
135
+ * `exportInfo`'s module into `parentModule`. The TC39 `ResolveExport`
136
+ * algorithm tracks a `resolveSet` of `(module, exportName)` pairs and
137
+ * returns null when an entry is revisited — letting the `StarExportEntries`
138
+ * loop fall through to a non-cyclic source. Webpack's static export graph
139
+ * does not run that resolution algorithm, so we approximate it: if the
140
+ * imported module's same-named export ultimately re-exports from
141
+ * `parentModule` under the same name, the star contribution is cyclic and
142
+ * must be skipped. The non-cyclic alternative (a sibling `export *` that
143
+ * provides a real binding) then wins.
144
+ *
145
+ * We walk the target chain one hop at a time using `findTarget` with a
146
+ * "match anything" filter so we can guard against namespace targets
147
+ * (`export * as ns from`, where `target.export` is undefined) and against
148
+ * unrelated cycles in the graph that would otherwise loop forever inside
149
+ * `_findTarget`.
150
+ * @param {ModuleGraph} moduleGraph the module graph
151
+ * @param {ExportInfo} exportInfo export info on the imported module
152
+ * @param {Module} parentModule the module that contains the star reexport
153
+ * @returns {boolean} true when this export reexports back to the parent module under the same name
154
+ */
155
+ const isStarReexportBackToParent = (moduleGraph, exportInfo, parentModule) => {
156
+ // Fast path: probe the first hop directly. The overwhelmingly common case
157
+ // in real builds is a terminal local binding (no `_target`) — `findTarget`
158
+ // returns `undefined` and we exit without allocating a `visited` set.
159
+ const firstTarget = exportInfo.findTarget(moduleGraph, RETURNS_TRUE);
160
+ if (!firstTarget || typeof firstTarget !== "object") return false;
161
+ const name = exportInfo.name;
162
+ if (
163
+ firstTarget.module === parentModule &&
164
+ Array.isArray(firstTarget.export) &&
165
+ firstTarget.export.length === 1 &&
166
+ firstTarget.export[0] === name
167
+ ) {
168
+ return true;
169
+ }
170
+ if (!Array.isArray(firstTarget.export) || firstTarget.export.length === 0) {
171
+ return false;
172
+ }
173
+ // Multi-hop chain — allocate visited tracking now. The set protects against
174
+ // unrelated cycles in the graph that would otherwise spin inside
175
+ // `_findTarget` (its `alreadyVisited` is only seeded for the entry node).
176
+ let current = moduleGraph
177
+ .getExportsInfo(firstTarget.module)
178
+ .getReadOnlyExportInfo(firstTarget.export[0]);
179
+ /** @type {Set<ExportInfo>} */
180
+ const visited = new Set([exportInfo, current]);
181
+ for (;;) {
182
+ const target = current.findTarget(moduleGraph, RETURNS_TRUE);
183
+ if (!target || typeof target !== "object") return false;
184
+ if (
185
+ target.module === parentModule &&
186
+ Array.isArray(target.export) &&
187
+ target.export.length === 1 &&
188
+ target.export[0] === name
189
+ ) {
190
+ return true;
191
+ }
192
+ if (!Array.isArray(target.export) || target.export.length === 0) {
193
+ return false;
194
+ }
195
+ const next = moduleGraph
196
+ .getExportsInfo(target.module)
197
+ .getReadOnlyExportInfo(target.export[0]);
198
+ if (visited.has(next)) return false;
199
+ visited.add(next);
200
+ current = next;
201
+ }
202
+ };
203
+
131
204
  /**
132
205
  * Determine export assignments.
133
206
  * @param {ModuleGraph} moduleGraph module graph
@@ -149,6 +222,11 @@ const determineExportAssignments = (
149
222
  dependencies = [...dependencies, additionalDependency];
150
223
  }
151
224
 
225
+ const referenceDep = dependencies[0] || additionalDependency;
226
+ const parentModule = referenceDep
227
+ ? moduleGraph.getParentModule(referenceDep)
228
+ : null;
229
+
152
230
  for (const dep of dependencies) {
153
231
  const i = dependencyIndices.length;
154
232
  dependencyIndices[i] = names.size;
@@ -159,7 +237,11 @@ const determineExportAssignments = (
159
237
  if (
160
238
  exportInfo.provided === true &&
161
239
  exportInfo.name !== "default" &&
162
- !names.has(exportInfo.name)
240
+ !names.has(exportInfo.name) &&
241
+ !(
242
+ parentModule &&
243
+ isStarReexportBackToParent(moduleGraph, exportInfo, parentModule)
244
+ )
163
245
  ) {
164
246
  names.add(exportInfo.name);
165
247
  dependencyIndices[i] = names.size;
@@ -535,6 +617,10 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
535
617
  /** @type {Hidden | undefined} */
536
618
  const hidden = hiddenExports !== undefined ? new Set() : undefined;
537
619
 
620
+ const parentModule = /** @type {Module} */ (
621
+ moduleGraph.getParentModule(this)
622
+ );
623
+
538
624
  if (noExtraImports) {
539
625
  for (const exportInfo of exportsInfo.orderedExports) {
540
626
  const name = exportInfo.name;
@@ -544,10 +630,22 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
544
630
  importedExportsInfo.getReadOnlyExportInfo(name);
545
631
  if (importedExportInfo.provided === false) continue;
546
632
  if (hiddenExports !== undefined && hiddenExports.has(name)) {
633
+ // Earlier star deps already provided this name non-cyclically
634
+ // (`determineExportAssignments` filters cyclic candidates), so
635
+ // the cycle check below would be wasted work.
547
636
  /** @type {Hidden} */
548
637
  (hidden).add(name);
549
638
  continue;
550
639
  }
640
+ if (
641
+ isStarReexportBackToParent(
642
+ moduleGraph,
643
+ importedExportInfo,
644
+ parentModule
645
+ )
646
+ ) {
647
+ continue;
648
+ }
551
649
  exports.add(name);
552
650
  if (importedExportInfo.provided === true) continue;
553
651
  checked.add(name);
@@ -564,6 +662,15 @@ class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
564
662
  (hidden).add(name);
565
663
  continue;
566
664
  }
665
+ if (
666
+ isStarReexportBackToParent(
667
+ moduleGraph,
668
+ importedExportInfo,
669
+ parentModule
670
+ )
671
+ ) {
672
+ continue;
673
+ }
567
674
  exports.add(name);
568
675
  if (importedExportInfo.provided === true) continue;
569
676
  checked.add(name);
@@ -7,11 +7,11 @@
7
7
 
8
8
  const ConditionalInitFragment = require("../ConditionalInitFragment");
9
9
  const Dependency = require("../Dependency");
10
- const HarmonyLinkingError = require("../HarmonyLinkingError");
11
10
  const InitFragment = require("../InitFragment");
12
11
  const Template = require("../Template");
13
12
  const AwaitDependenciesInitFragment = require("../async-modules/AwaitDependenciesInitFragment");
14
13
  const { filterRuntime, mergeRuntime } = require("../util/runtime");
14
+ const HarmonyLinkingError = require("./HarmonyLinkingError");
15
15
  const { ImportPhase, ImportPhaseUtils } = require("./ImportPhase");
16
16
  const ModuleDependency = require("./ModuleDependency");
17
17
 
@@ -23,7 +23,7 @@ const ModuleDependency = require("./ModuleDependency");
23
23
  /** @typedef {import("../Module")} Module */
24
24
  /** @typedef {import("../Module").BuildMeta} BuildMeta */
25
25
  /** @typedef {import("../ModuleGraph")} ModuleGraph */
26
- /** @typedef {import("../WebpackError")} WebpackError */
26
+ /** @typedef {import("../errors/WebpackError")} WebpackError */
27
27
  /** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
28
28
  /** @typedef {import("./ImportPhase").ImportPhaseType} ImportPhaseType */
29
29
  /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
@@ -112,6 +112,14 @@ class HarmonyImportDependency extends ModuleDependency {
112
112
  return "esm";
113
113
  }
114
114
 
115
+ /**
116
+ * Returns true if this dependency can be concatenated
117
+ * @returns {boolean} true if this dependency can be concatenated
118
+ */
119
+ canConcatenate() {
120
+ return true;
121
+ }
122
+
115
123
  /**
116
124
  * Returns an identifier to merge equal requests.
117
125
  * @returns {string | null} an identifier to merge equal requests
@@ -6,7 +6,7 @@
6
6
  "use strict";
7
7
 
8
8
  const HotModuleReplacementPlugin = require("../HotModuleReplacementPlugin");
9
- const WebpackError = require("../WebpackError");
9
+ const WebpackError = require("../errors/WebpackError");
10
10
  const {
11
11
  VariableInfo,
12
12
  getImportAttributes
@@ -413,6 +413,27 @@ module.exports = class HarmonyImportDependencyParserPlugin {
413
413
  return true;
414
414
  }
415
415
  );
416
+ // Per the TC39 import-defer spec, [[Set]] on a Module Namespace
417
+ // Exotic Object returns false without triggering evaluation. The
418
+ // default expressionMemberChain path produces `<importVar>.a.foo`
419
+ // whose `.a` getter eagerly requires (and thus evaluates) the
420
+ // deferred module. For top-level `ns.foo = value`, walk only the
421
+ // bare `ns` identifier so it gets replaced with the deferred
422
+ // namespace proxy (whose set trap returns false), and leave the
423
+ // `.foo = value` part as plain code.
424
+ parser.hooks.assignMemberChain
425
+ .for(harmonySpecifierTag)
426
+ .tap(PLUGIN_NAME, (expression, members) => {
427
+ const settings = /** @type {HarmonySettings} */ (parser.currentTagData);
428
+ if (!ImportPhaseUtils.isDefer(settings.phase)) return;
429
+ if (expression.operator !== "=") return;
430
+ if (members.length !== 1) return;
431
+ const left = /** @type {MemberExpression} */ (expression.left);
432
+ if (left.object.type !== "Identifier") return;
433
+ parser.walkExpression(expression.right);
434
+ parser.walkExpression(left.object);
435
+ return true;
436
+ });
416
437
  const { hotAcceptCallback, hotAcceptWithoutCallback } =
417
438
  HotModuleReplacementPlugin.getParserHooks(parser);
418
439
  hotAcceptCallback.tap(PLUGIN_NAME, (expr, requests) => {
@@ -27,7 +27,7 @@ const { ImportPhaseUtils } = require("./ImportPhase");
27
27
  /** @typedef {import("../Module").BuildMeta} BuildMeta */
28
28
  /** @typedef {import("../ModuleGraph")} ModuleGraph */
29
29
  /** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
30
- /** @typedef {import("../WebpackError")} WebpackError */
30
+ /** @typedef {import("../errors/WebpackError")} WebpackError */
31
31
  /** @typedef {import("../javascript/JavascriptParser").DestructuringAssignmentProperties} DestructuringAssignmentProperties */
32
32
  /** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
33
33
  /** @typedef {import("../javascript/JavascriptParser").Range} Range */
@@ -4,9 +4,9 @@
4
4
 
5
5
  "use strict";
6
6
 
7
- const WebpackError = require("./WebpackError");
7
+ const WebpackError = require("../errors/WebpackError");
8
8
 
9
- module.exports = class HarmonyLinkingError extends WebpackError {
9
+ class HarmonyLinkingError extends WebpackError {
10
10
  /** @param {string} message Error message */
11
11
  constructor(message) {
12
12
  super(message);
@@ -14,4 +14,6 @@ module.exports = class HarmonyLinkingError extends WebpackError {
14
14
  this.name = "HarmonyLinkingError";
15
15
  this.hideStack = true;
16
16
  }
17
- };
17
+ }
18
+
19
+ module.exports = HarmonyLinkingError;