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
@@ -22,6 +22,7 @@ const { chunkHasCss } = require("./css/CssModulesPlugin");
22
22
  const ConstDependency = require("./dependencies/ConstDependency");
23
23
  const ImportMetaHotAcceptDependency = require("./dependencies/ImportMetaHotAcceptDependency");
24
24
  const ImportMetaHotDeclineDependency = require("./dependencies/ImportMetaHotDeclineDependency");
25
+ const { isImportMetaFieldEnabled } = require("./dependencies/ImportMetaPlugin");
25
26
  const ModuleHotAcceptDependency = require("./dependencies/ModuleHotAcceptDependency");
26
27
  const ModuleHotDeclineDependency = require("./dependencies/ModuleHotDeclineDependency");
27
28
  const WebpackError = require("./errors/WebpackError");
@@ -141,7 +142,7 @@ class HotModuleReplacementPlugin {
141
142
  /** @type {Range} */ (expr.callee.range),
142
143
  runtimeRequirements
143
144
  );
144
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
145
+ dep.loc = parser.getLocation(expr);
145
146
  module.addPresentationalDependency(dep);
146
147
  /** @type {BuildInfo} */
147
148
  (module.buildInfo).moduleConcatenationBailout =
@@ -168,10 +169,7 @@ class HotModuleReplacementPlugin {
168
169
  /** @type {Range} */ (param.range)
169
170
  );
170
171
  dep.optional = true;
171
- dep.setLocWithIndex(
172
- /** @type {DependencyLocation} */ (expr.loc),
173
- idx
174
- );
172
+ dep.setLocWithIndex(parser.getLocation(expr), idx);
175
173
  module.addDependency(dep);
176
174
  requests.push(request);
177
175
  }
@@ -204,7 +202,7 @@ class HotModuleReplacementPlugin {
204
202
  /** @type {Range} */ (expr.callee.range),
205
203
  runtimeRequirements
206
204
  );
207
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
205
+ dep.loc = parser.getLocation(expr);
208
206
  module.addPresentationalDependency(dep);
209
207
  /** @type {BuildInfo} */
210
208
  (module.buildInfo).moduleConcatenationBailout = "Hot Module Replacement";
@@ -225,10 +223,7 @@ class HotModuleReplacementPlugin {
225
223
  /** @type {Range} */ (param.range)
226
224
  );
227
225
  dep.optional = true;
228
- dep.setLocWithIndex(
229
- /** @type {DependencyLocation} */ (expr.loc),
230
- idx
231
- );
226
+ dep.setLocWithIndex(parser.getLocation(expr), idx);
232
227
  module.addDependency(dep);
233
228
  }
234
229
  }
@@ -247,7 +242,7 @@ class HotModuleReplacementPlugin {
247
242
  /** @type {Range} */ (expr.range),
248
243
  runtimeRequirements
249
244
  );
250
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
245
+ dep.loc = parser.getLocation(expr);
251
246
  module.addPresentationalDependency(dep);
252
247
  /** @type {BuildInfo} */
253
248
  (module.buildInfo).moduleConcatenationBailout = "Hot Module Replacement";
@@ -960,9 +955,13 @@ To fix this, make sure to include [runtime] in the output.hotUpdateMainFilename
960
955
 
961
956
  normalModuleFactory.hooks.parser
962
957
  .for(JAVASCRIPT_MODULE_TYPE_AUTO)
963
- .tap(PLUGIN_NAME, (parser) => {
958
+ .tap(PLUGIN_NAME, (parser, parserOptions) => {
964
959
  applyModuleHot(parser);
965
- applyImportMetaHot(parser);
960
+ if (
961
+ isImportMetaFieldEnabled(parserOptions.importMeta, "webpackHot")
962
+ ) {
963
+ applyImportMetaHot(parser);
964
+ }
966
965
  });
967
966
  normalModuleFactory.hooks.parser
968
967
  .for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
@@ -971,8 +970,12 @@ To fix this, make sure to include [runtime] in the output.hotUpdateMainFilename
971
970
  });
972
971
  normalModuleFactory.hooks.parser
973
972
  .for(JAVASCRIPT_MODULE_TYPE_ESM)
974
- .tap(PLUGIN_NAME, (parser) => {
975
- applyImportMetaHot(parser);
973
+ .tap(PLUGIN_NAME, (parser, parserOptions) => {
974
+ if (
975
+ isImportMetaFieldEnabled(parserOptions.importMeta, "webpackHot")
976
+ ) {
977
+ applyImportMetaHot(parser);
978
+ }
976
979
  });
977
980
  normalModuleFactory.hooks.module.tap(PLUGIN_NAME, (module) => {
978
981
  if (module instanceof NormalModule) module.hot = true;
package/lib/LazyBarrel.js CHANGED
@@ -68,7 +68,7 @@ class LazyBarrelInfo {
68
68
  this._requestToDepGroup = new Map();
69
69
  /** @type {Set<string> | undefined} locally provided export names */
70
70
  this._terminalIds = undefined;
71
- /** @type {Set<string> | undefined} request keys of star re-exports */
71
+ /** @type {Set<string> | undefined} requests of star re-exports */
72
72
  this._fallbackRequests = undefined;
73
73
  }
74
74
 
@@ -125,6 +125,14 @@ class LazyBarrelInfo {
125
125
  return this._requestToDepGroup.size === 0;
126
126
  }
127
127
 
128
+ /**
129
+ * Returns the requests of the still-lazy groups.
130
+ * @returns {Iterable<string>} still-lazy requests
131
+ */
132
+ getLazyRequests() {
133
+ return this._requestToDepGroup.keys();
134
+ }
135
+
128
136
  /**
129
137
  * Drops the export-name lookups once no group stays deferred; they only serve
130
138
  * to find still-deferred groups, so keeping them per module wastes memory.
@@ -202,13 +210,32 @@ class LazyBarrelController {
202
210
  }
203
211
 
204
212
  /**
205
- * Releases all per-module deferral state. Lazy barrel only acts while the
206
- * module graph is built, so the bookkeeping is dead weight once make is done.
213
+ * Releases all per-module deferral state. The last consumer is
214
+ * `FlagDependencyExportsPlugin`'s cache key during `finishModules`, so the
215
+ * bookkeeping is dead weight once sealing starts.
207
216
  */
208
217
  clear() {
209
218
  this._modules = new WeakMap();
210
219
  }
211
220
 
221
+ /**
222
+ * requests of the re-export targets `module` still keeps lazy.
223
+ * `FlagDependencyExportsPlugin` folds them into its provided-exports cache
224
+ * key, so a barrel whose built targets differ from a cached run does not
225
+ * reuse that run's stale exports.
226
+ * @param {Module} module the module
227
+ * @returns {Iterable<string> | undefined} still-lazy requests, if any
228
+ */
229
+ getLazyRequests(module) {
230
+ const factoryMeta = module.factoryMeta;
231
+ if (factoryMeta === undefined || !factoryMeta.sideEffectFree) return;
232
+ const state = this._modules.get(module);
233
+ if (state === undefined) return;
234
+ const info = state.lazyBarrelInfo;
235
+ if (info === undefined || info.isEmpty()) return;
236
+ return info.getLazyRequests();
237
+ }
238
+
212
239
  /**
213
240
  * Classifies the re-export dependencies of a side-effect-free module (lazy barrel)
214
241
  * into deferrable groups and marks the deferred ones.
package/lib/Module.js CHANGED
@@ -106,6 +106,7 @@ const makeSerializable = require("./util/makeSerializable");
106
106
  * @typedef {object} ConcatenationBailoutReasonContext
107
107
  * @property {ModuleGraph} moduleGraph the module graph
108
108
  * @property {ChunkGraph} chunkGraph the chunk graph
109
+ * @property {boolean=} concatenateCommonJsModules whether eligible CommonJS modules may be concatenated
109
110
  */
110
111
 
111
112
  /** @typedef {Set<string>} RuntimeRequirements */
@@ -179,6 +180,7 @@ const makeSerializable = require("./util/makeSerializable");
179
180
  * Module type specific properties live in the `Known*BuildInfo` typedef of the dedicated module class.
180
181
  * @typedef {object} KnownBuildInfo
181
182
  * @property {boolean=} cacheable
183
+ * @property {string[]=} notCacheableReasons reasons why the module is not cacheable (e.g. paths of loaders that marked it)
182
184
  * @property {boolean=} strict
183
185
  * @property {string=} moduleArgument
184
186
  * @property {string=} exportsArgument
@@ -186,6 +188,7 @@ const makeSerializable = require("./util/makeSerializable");
186
188
  * @property {Map<string, AssetInfo | undefined>=} assetsInfo
187
189
  * @property {Set<string>=} topLevelDeclarations top level declaration names
188
190
  * @property {boolean=} isCircular true when the module is part of a circular dependency chain
191
+ * @property {boolean=} usesTopLevelAwaitForOf module uses top-level `for await…of`, which can't be lowered to a generator
189
192
  */
190
193
 
191
194
  /** @typedef {string | Set<string>} ValueCacheVersion */
@@ -327,9 +327,9 @@ ModuleFilenameHelpers.replaceDuplicates = (array, fn, comparator) => {
327
327
  * ```js
328
328
  * ModuleFilenameHelpers.matchPart("foo.js", "foo"); // true
329
329
  * ModuleFilenameHelpers.matchPart("foo.js", "foo.js"); // true
330
- * ModuleFilenameHelpers.matchPart("foo.js", "foo."); // false
330
+ * ModuleFilenameHelpers.matchPart("foo.js", "foo."); // true
331
331
  * ModuleFilenameHelpers.matchPart("foo.js", "foo*"); // false
332
- * ModuleFilenameHelpers.matchPart("foo.js", "foo.*"); // true
332
+ * ModuleFilenameHelpers.matchPart("foo.js", "foo.*"); // false
333
333
  * ModuleFilenameHelpers.matchPart("foo.js", /^foo/); // true
334
334
  * ModuleFilenameHelpers.matchPart("foo.js", [/^foo/, "bar"]); // true
335
335
  * ModuleFilenameHelpers.matchPart("foo.js", [/^foo/, "bar"]); // true
@@ -108,6 +108,12 @@ const ASSET_MODULE_TYPE_BYTES = "asset/bytes";
108
108
  */
109
109
  const ASSET_MODULE_TYPE_RAW_DATA_URL = "asset/raw-data-url";
110
110
 
111
+ /**
112
+ * @type {Readonly<"asset/webmanifest">}
113
+ * This is the module type used for a Web App Manifest whose icon URLs are bundled as assets.
114
+ */
115
+ const ASSET_MODULE_TYPE_WEBMANIFEST = "asset/webmanifest";
116
+
111
117
  /**
112
118
  * @type {Readonly<"runtime">}
113
119
  * This is the module type used for the webpack runtime abstractions.
@@ -149,7 +155,7 @@ const WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY = "lazy-compilation-proxy";
149
155
  /** @typedef {"webassembly/async" | "webassembly/sync"} WebAssemblyModuleTypes */
150
156
  /** @typedef {"css" | "css/global" | "css/module" | "css/auto"} CssModuleTypes */
151
157
  /** @typedef {"html"} HTMLModuleType */
152
- /** @typedef {"asset" | "asset/inline" | "asset/resource" | "asset/source" | "asset/raw-data-url"} AssetModuleTypes */
158
+ /** @typedef {"asset" | "asset/inline" | "asset/resource" | "asset/source" | "asset/raw-data-url" | "asset/webmanifest"} AssetModuleTypes */
153
159
  /** @typedef {"runtime" | "fallback-module" | "remote-module" | "provide-module" | "consume-shared-module" | "lazy-compilation-proxy"} WebpackModuleTypes */
154
160
  /** @typedef {string} UnknownModuleTypes */
155
161
  /** @typedef {JavaScriptModuleTypes | JSONModuleType | WebAssemblyModuleTypes | CssModuleTypes | HTMLModuleType | AssetModuleTypes | WebpackModuleTypes | UnknownModuleTypes} ModuleTypes */
@@ -160,6 +166,7 @@ module.exports.ASSET_MODULE_TYPE_INLINE = ASSET_MODULE_TYPE_INLINE;
160
166
  module.exports.ASSET_MODULE_TYPE_RAW_DATA_URL = ASSET_MODULE_TYPE_RAW_DATA_URL;
161
167
  module.exports.ASSET_MODULE_TYPE_RESOURCE = ASSET_MODULE_TYPE_RESOURCE;
162
168
  module.exports.ASSET_MODULE_TYPE_SOURCE = ASSET_MODULE_TYPE_SOURCE;
169
+ module.exports.ASSET_MODULE_TYPE_WEBMANIFEST = ASSET_MODULE_TYPE_WEBMANIFEST;
163
170
  /** @type {CssModuleTypes[]} */
164
171
  module.exports.CSS_MODULES = [
165
172
  CSS_MODULE_TYPE,
@@ -102,6 +102,8 @@ module.exports = class MultiCompiler {
102
102
  this.dependencies = new WeakMap();
103
103
  /** @type {boolean} */
104
104
  this.running = false;
105
+ /** @type {MultiWatching | undefined} */
106
+ this.watching = undefined;
105
107
 
106
108
  /** @type {(Stats | null)[]} */
107
109
  const compilerStats = this.compilers.map(() => null);
@@ -662,10 +664,12 @@ module.exports = class MultiCompiler {
662
664
  },
663
665
  handler
664
666
  );
665
- return new MultiWatching(watchings, this);
667
+ this.watching = new MultiWatching(watchings, this);
668
+ return this.watching;
666
669
  }
667
670
 
668
- return new MultiWatching([], this);
671
+ this.watching = new MultiWatching([], this);
672
+ return this.watching;
669
673
  }
670
674
 
671
675
  /**
@@ -709,6 +713,13 @@ module.exports = class MultiCompiler {
709
713
  * @returns {void}
710
714
  */
711
715
  close(callback) {
716
+ if (this.watching) {
717
+ // When there is still an active watching, close this first
718
+ this.watching.close((_err) => {
719
+ this.close(callback);
720
+ });
721
+ return;
722
+ }
712
723
  asyncLib.each(
713
724
  this.compilers,
714
725
  (compiler, callback) => {
@@ -69,6 +69,7 @@ class MultiWatching {
69
69
  watching.close(finishedCallback);
70
70
  },
71
71
  (err) => {
72
+ if (this.compiler.watching === this) this.compiler.watching = undefined;
72
73
  this.compiler.hooks.watchClose.call();
73
74
  if (typeof callback === "function") {
74
75
  this.compiler.running = false;
@@ -34,7 +34,8 @@ const { parseResource } = require("./util/identifier");
34
34
  const PLUGIN_NAME = "NodeStuffPlugin";
35
35
  const URL_MODULE_CONSTANT_FUNCTION_NAME = "__webpack_fileURLToPath__";
36
36
 
37
- const { IMPORT_META_DIRNAME, IMPORT_META_FILENAME } = ImportMetaPlugin;
37
+ const { IMPORT_META_DIRNAME, IMPORT_META_FILENAME, isImportMetaFieldEnabled } =
38
+ ImportMetaPlugin;
38
39
 
39
40
  class NodeStuffPlugin {
40
41
  /**
@@ -97,7 +98,7 @@ class NodeStuffPlugin {
97
98
 
98
99
  parser.hooks.expression.for("global").tap(PLUGIN_NAME, (expr) => {
99
100
  const dep = getGlobalDep(expr);
100
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
101
+ dep.loc = parser.getLocation(expr);
101
102
  parser.state.module.addPresentationalDependency(dep);
102
103
 
103
104
  if (withWarning) {
@@ -113,7 +114,7 @@ class NodeStuffPlugin {
113
114
 
114
115
  parser.hooks.rename.for("global").tap(PLUGIN_NAME, (expr) => {
115
116
  const dep = getGlobalDep(expr);
116
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
117
+ dep.loc = parser.getLocation(expr);
117
118
  parser.state.module.addPresentationalDependency(dep);
118
119
  return false;
119
120
  });
@@ -138,7 +139,7 @@ class NodeStuffPlugin {
138
139
  /** @type {Range} */
139
140
  (expr.range)
140
141
  );
141
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
142
+ dep.loc = parser.getLocation(expr);
142
143
  parser.state.module.addPresentationalDependency(dep);
143
144
  return true;
144
145
  });
@@ -180,7 +181,7 @@ class NodeStuffPlugin {
180
181
  (expr.range),
181
182
  `__webpack_${property}__`
182
183
  );
183
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
184
+ dep.loc = parser.getLocation(expr);
184
185
  parser.state.module.addPresentationalDependency(dep);
185
186
 
186
187
  if (warning) {
@@ -201,7 +202,7 @@ class NodeStuffPlugin {
201
202
  if (warning) {
202
203
  parser.state.module.addWarning(
203
204
  new NodeStuffInWebError(
204
- usingProperty.loc,
205
+ parser.getLocation(usingProperty),
205
206
  expressionName,
206
207
  warning
207
208
  )
@@ -278,7 +279,7 @@ class NodeStuffPlugin {
278
279
  CachedConstDependency.PLACE_CHUNK
279
280
  );
280
281
 
281
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
282
+ dep.loc = parser.getLocation(expr);
282
283
  parser.state.module.addPresentationalDependency(dep);
283
284
  return;
284
285
  }
@@ -297,7 +298,7 @@ class NodeStuffPlugin {
297
298
  `__webpack_${property}__`,
298
299
  ExternalModuleDependency.PLACE_CHUNK
299
300
  );
300
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
301
+ dep.loc = parser.getLocation(expr);
301
302
  parser.state.module.addPresentationalDependency(dep);
302
303
 
303
304
  return true;
@@ -324,9 +325,7 @@ class NodeStuffPlugin {
324
325
  `__webpack_${property}__`,
325
326
  CachedConstDependency.PLACE_CHUNK
326
327
  );
327
- dep.loc = /** @type {DependencyLocation} */ (
328
- usingProperty.loc
329
- );
328
+ dep.loc = parser.getLocation(usingProperty);
330
329
  parser.state.module.addPresentationalDependency(dep);
331
330
  return `${property}: __webpack_${property}__,`;
332
331
  }
@@ -346,7 +345,7 @@ class NodeStuffPlugin {
346
345
  ExternalModuleDependency.PLACE_CHUNK
347
346
  );
348
347
 
349
- dep.loc = /** @type {DependencyLocation} */ (usingProperty.loc);
348
+ dep.loc = parser.getLocation(usingProperty);
350
349
  parser.state.module.addPresentationalDependency(dep);
351
350
 
352
351
  return `${property}: __webpack_${property}__,`;
@@ -359,23 +358,24 @@ class NodeStuffPlugin {
359
358
  * Dirname and filename handler.
360
359
  * @param {JavascriptParser} parser the parser
361
360
  * @param {NodeOptions} nodeOptions options
362
- * @param {{ dirname: "__dirname" | "import.meta.dirname", filename: "__filename" | "import.meta.filename" }} identifiers options
361
+ * @param {{ dirname: "__dirname" | "import.meta.dirname", filename: "__filename" | "import.meta.filename", dirnameEnabled?: boolean, filenameEnabled?: boolean }} identifiers options
363
362
  * @returns {void}
364
363
  */
365
364
  const dirnameAndFilenameHandler = (
366
365
  parser,
367
366
  nodeOptions,
368
- { dirname, filename }
367
+ { dirname, filename, dirnameEnabled = true, filenameEnabled = true }
369
368
  ) => {
370
- // Keep `import.meta.filename` in code
369
+ // Keep `import.meta.filename` in code.
371
370
  if (
371
+ filenameEnabled &&
372
372
  nodeOptions.__filename === false &&
373
373
  filename === IMPORT_META_FILENAME
374
374
  ) {
375
375
  setModuleConstant(parser, filename, () => filename, "filename");
376
376
  }
377
377
 
378
- if (nodeOptions.__filename) {
378
+ if (filenameEnabled && nodeOptions.__filename) {
379
379
  switch (nodeOptions.__filename) {
380
380
  case "mock":
381
381
  setConstant(parser, filename, "/index.js", "filename");
@@ -446,15 +446,16 @@ class NodeStuffPlugin {
446
446
  });
447
447
  }
448
448
 
449
- // Keep `import.meta.dirname` in code
449
+ // Keep `import.meta.dirname` in code.
450
450
  if (
451
+ dirnameEnabled &&
451
452
  nodeOptions.__dirname === false &&
452
453
  dirname === IMPORT_META_DIRNAME
453
454
  ) {
454
455
  setModuleConstant(parser, dirname, () => dirname, "dirname");
455
456
  }
456
457
 
457
- if (nodeOptions.__dirname) {
458
+ if (dirnameEnabled && nodeOptions.__dirname) {
458
459
  switch (nodeOptions.__dirname) {
459
460
  case "mock":
460
461
  setConstant(parser, dirname, "/", "dirname");
@@ -537,19 +538,24 @@ class NodeStuffPlugin {
537
538
  */
538
539
  const handler = (parser, parserOptions, a, b) => {
539
540
  if (b && parserOptions.node === false) {
540
- // Keep `import.meta.dirname` and `import.meta.filename` in code
541
- setModuleConstant(
542
- parser,
543
- IMPORT_META_DIRNAME,
544
- () => IMPORT_META_DIRNAME,
545
- "dirname"
546
- );
547
- setModuleConstant(
548
- parser,
549
- IMPORT_META_FILENAME,
550
- () => IMPORT_META_FILENAME,
551
- "filename"
552
- );
541
+ if (isImportMetaFieldEnabled(parserOptions.importMeta, "dirname")) {
542
+ setModuleConstant(
543
+ parser,
544
+ IMPORT_META_DIRNAME,
545
+ () => IMPORT_META_DIRNAME,
546
+ "dirname"
547
+ );
548
+ }
549
+ if (
550
+ isImportMetaFieldEnabled(parserOptions.importMeta, "filename")
551
+ ) {
552
+ setModuleConstant(
553
+ parser,
554
+ IMPORT_META_FILENAME,
555
+ () => IMPORT_META_FILENAME,
556
+ "filename"
557
+ );
558
+ }
553
559
  return;
554
560
  }
555
561
 
@@ -570,10 +576,22 @@ class NodeStuffPlugin {
570
576
  });
571
577
  }
572
578
 
573
- if (b && parserOptions.importMeta !== false) {
579
+ if (
580
+ b &&
581
+ (isImportMetaFieldEnabled(parserOptions.importMeta, "dirname") ||
582
+ isImportMetaFieldEnabled(parserOptions.importMeta, "filename"))
583
+ ) {
574
584
  dirnameAndFilenameHandler(parser, localOptions, {
575
585
  dirname: IMPORT_META_DIRNAME,
576
- filename: IMPORT_META_FILENAME
586
+ filename: IMPORT_META_FILENAME,
587
+ dirnameEnabled: isImportMetaFieldEnabled(
588
+ parserOptions.importMeta,
589
+ "dirname"
590
+ ),
591
+ filenameEnabled: isImportMetaFieldEnabled(
592
+ parserOptions.importMeta,
593
+ "filename"
594
+ )
577
595
  });
578
596
  }
579
597
  };