webpack 5.110.3 → 5.111.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 (208) hide show
  1. package/README.md +5 -0
  2. package/lib/APIPlugin.js +23 -7
  3. package/lib/AutomaticPrefetchPlugin.js +1 -1
  4. package/lib/Cache.js +8 -3
  5. package/lib/CacheFacade.js +1 -1
  6. package/lib/CircularModulesPlugin.js +157 -55
  7. package/lib/CleanPlugin.js +2 -2
  8. package/lib/Compilation.js +320 -302
  9. package/lib/Compiler.js +209 -46
  10. package/lib/ContextModule.js +17 -81
  11. package/lib/ContextModuleFactory.js +1 -1
  12. package/lib/CopyPlugin.js +1054 -0
  13. package/lib/DefinePlugin.js +24 -8
  14. package/lib/ExternalModule.js +41 -14
  15. package/lib/FileSystemInfo.js +17 -14
  16. package/lib/FlagDependencyExportsPlugin.js +45 -21
  17. package/lib/HotModuleReplacementPlugin.js +53 -7
  18. package/lib/JavascriptMetaInfoPlugin.js +5 -3
  19. package/lib/MainTemplate.js +5 -1
  20. package/lib/Module.js +16 -7
  21. package/lib/MultiCompiler.js +1 -1
  22. package/lib/MultiWatching.js +1 -1
  23. package/lib/NormalModule.js +45 -12
  24. package/lib/NormalModuleFactory.js +1 -1
  25. package/lib/RuntimeGlobals.js +21 -7
  26. package/lib/RuntimeModule.js +28 -12
  27. package/lib/RuntimePlugin.js +30 -3
  28. package/lib/RuntimeTemplate.js +780 -475
  29. package/lib/SourceMapDevToolPlugin.js +1 -1
  30. package/lib/Watching.js +9 -0
  31. package/lib/WebpackOptionsApply.js +84 -91
  32. package/lib/asset/AssetGenerator.js +25 -8
  33. package/lib/asset/AssetModule.js +3 -0
  34. package/lib/asset/WebManifestParser.js +7 -5
  35. package/lib/cache/AddBuildDependenciesPlugin.js +33 -4
  36. package/lib/cache/IdleFileCachePlugin.js +2 -2
  37. package/lib/cache/PackFileCacheStrategy.js +14 -1
  38. package/lib/config/browserslistTargetHandler.js +19 -0
  39. package/lib/config/defaults.js +86 -50
  40. package/lib/config/normalization.js +82 -12
  41. package/lib/config/target.js +10 -0
  42. package/lib/container/ContainerReferencePlugin.js +6 -0
  43. package/lib/container/RemoteRuntimeModule.js +9 -0
  44. package/lib/container/declaredRemotes.js +39 -0
  45. package/lib/css/CssGenerator.js +8 -0
  46. package/lib/css/CssInjectStyleRuntimeModule.js +9 -0
  47. package/lib/css/CssLoadingRuntimeModule.js +94 -36
  48. package/lib/css/CssModule.js +1 -1
  49. package/lib/css/CssModulesPlugin.js +7 -6
  50. package/lib/css/CssParser.js +144 -11
  51. package/lib/css/CssServerStylesRuntimeModule.js +9 -0
  52. package/lib/css/cssMinify.js +11 -3
  53. package/lib/css/data.js +2814 -678
  54. package/lib/css/syntax.js +4082 -248
  55. package/lib/debug/ProfilingPlugin.js +4 -0
  56. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +6 -3
  57. package/lib/dependencies/AMDRuntimeModules.js +18 -0
  58. package/lib/dependencies/CommonJsExportRequireDependency.js +3 -1
  59. package/lib/dependencies/CommonJsExportsParserPlugin.js +12 -13
  60. package/lib/dependencies/CommonJsImportsParserPlugin.js +1 -0
  61. package/lib/dependencies/CommonJsPlugin.js +19 -3
  62. package/lib/dependencies/CommonJsRequireDependency.js +14 -5
  63. package/lib/dependencies/CssIcssExportDependency.js +7 -1
  64. package/lib/dependencies/HarmonyCompatibilityDependency.js +58 -4
  65. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +8 -3
  66. package/lib/dependencies/HarmonyExportExpressionDependency.js +44 -29
  67. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +71 -13
  68. package/lib/dependencies/HarmonyExportInitFragment.js +99 -19
  69. package/lib/dependencies/HarmonyExportSpecifierDependency.js +18 -30
  70. package/lib/dependencies/HarmonyImportBareSideEffectDependency.js +59 -0
  71. package/lib/dependencies/HarmonyImportDependency.js +6 -1
  72. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +8 -1
  73. package/lib/dependencies/HarmonyImportSpecifierDependency.js +24 -1
  74. package/lib/dependencies/HarmonyModulesPlugin.js +20 -0
  75. package/lib/dependencies/HtmlEntryDependency.js +50 -0
  76. package/lib/dependencies/ImportMetaMainDependency.js +104 -0
  77. package/lib/dependencies/ImportMetaPlugin.js +59 -15
  78. package/lib/dependencies/SystemRuntimeModule.js +9 -0
  79. package/lib/dependencies/WorkerDependency.js +1 -2
  80. package/lib/dependencies/WorkletDependency.js +1 -2
  81. package/lib/dll/DelegatedModule.js +18 -1
  82. package/lib/dll/DllReferencePlugin.js +11 -8
  83. package/lib/dll/LibManifestPlugin.js +1 -1
  84. package/lib/errors/AnalyzableBailoutsWarning.js +41 -0
  85. package/lib/errors/DuplicateModulesWarning.js +12 -7
  86. package/lib/errors/EmptyCopyPatternWarning.js +26 -0
  87. package/lib/errors/ExternalStarReexportError.js +44 -0
  88. package/lib/errors/MissingSourceMapsWarning.js +36 -0
  89. package/lib/errors/ModuleParseError.js +2 -1
  90. package/lib/errors/UnusedAssetsWarning.js +36 -0
  91. package/lib/errors/UnusedFederationWarning.js +35 -0
  92. package/lib/errors/UnusedModulesWarning.js +38 -0
  93. package/lib/esm/ExportWebpackRequireRuntimeModule.js +9 -0
  94. package/lib/esm/ModuleChunkFormatPlugin.js +28 -3
  95. package/lib/esm/ModuleChunkLoadingPlugin.js +30 -11
  96. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +92 -60
  97. package/lib/hmr/HotModuleReplacement.runtime.js +8 -2
  98. package/lib/hmr/HotModuleReplacementRuntimeModule.js +9 -0
  99. package/lib/html/HtmlGenerator.js +11 -5
  100. package/lib/html/HtmlModulesPlugin.js +331 -62
  101. package/lib/html/HtmlParser.js +13 -6
  102. package/lib/html/builtinEmbeddedRenderer.js +107 -0
  103. package/lib/html/data.js +121 -7
  104. package/lib/html/htmlMinify.js +84 -113
  105. package/lib/html/syntax.js +763 -426
  106. package/lib/ids/HashedModuleIdsPlugin.js +2 -1
  107. package/lib/index.js +3 -0
  108. package/lib/javascript/JavascriptModule.js +1 -0
  109. package/lib/javascript/JavascriptModulesPlugin.js +52 -24
  110. package/lib/javascript/JavascriptParser.js +1255 -728
  111. package/lib/javascript/StartupHelpers.js +27 -3
  112. package/lib/javascript/data.js +172 -0
  113. package/lib/javascript/grammar.js +5546 -0
  114. package/lib/javascript/parser.js +1494 -0
  115. package/lib/javascript/regexp.js +1762 -0
  116. package/lib/javascript/regexpData.js +51 -0
  117. package/lib/javascript/syntax.js +8696 -5225
  118. package/lib/library/ModuleLibraryPlugin.js +116 -5
  119. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +22 -0
  120. package/lib/node/RequireChunkLoadingRuntimeModule.js +22 -0
  121. package/lib/optimize/ConcatenatedModule.js +97 -20
  122. package/lib/optimize/ConstExportsPlugin.js +50 -39
  123. package/lib/optimize/InlineExports.js +20 -123
  124. package/lib/optimize/MangleExportsPlugin.js +10 -0
  125. package/lib/optimize/ModuleConcatenationPlugin.js +24 -1
  126. package/lib/optimize/RealContentHashPlugin.js +68 -9
  127. package/lib/optimize/SideEffectsFlagPlugin.js +17 -9
  128. package/lib/performance/AnalyzableBailoutsPlugin.js +115 -0
  129. package/lib/performance/CacheEffectivenessPlugin.js +4 -3
  130. package/lib/performance/DuplicateModulesPlugin.js +57 -13
  131. package/lib/performance/EvalUsagePlugin.js +5 -2
  132. package/lib/performance/MissingSourceMapsPlugin.js +115 -0
  133. package/lib/performance/PureAnnotationsPlugin.js +6 -3
  134. package/lib/performance/TopLevelThisPlugin.js +5 -4
  135. package/lib/performance/UnusedAssetsPlugin.js +109 -0
  136. package/lib/performance/UnusedFederationPlugin.js +147 -0
  137. package/lib/performance/UnusedModulesPlugin.js +141 -0
  138. package/lib/performance/UnusedReexportsPlugin.js +1 -55
  139. package/lib/performance/isOnlyReexported.js +65 -0
  140. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +25 -5
  141. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +2 -0
  142. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +9 -0
  143. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +9 -0
  144. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +9 -0
  145. package/lib/prefetch/ResourceHintPlugin.js +1 -2
  146. package/lib/prefetch/ResourceHintRuntimeModule.js +9 -0
  147. package/lib/prefetch/StartupAssetHintRuntimeModule.js +9 -0
  148. package/lib/rules/RuleSetCompiler.js +211 -4
  149. package/lib/runtime/AsyncModuleRuntimeModule.js +100 -66
  150. package/lib/runtime/AutoPublicPathRuntimeModule.js +9 -0
  151. package/lib/runtime/BaseUriRuntimeModule.js +9 -0
  152. package/lib/runtime/ChunkNameRuntimeModule.js +9 -0
  153. package/lib/runtime/EnsureChunkRuntimeModule.js +35 -16
  154. package/lib/runtime/GetChunkFilenameRuntimeModule.js +9 -0
  155. package/lib/runtime/GetFullHashRuntimeModule.js +9 -0
  156. package/lib/runtime/GetMainFilenameRuntimeModule.js +9 -0
  157. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +9 -0
  158. package/lib/runtime/GlobalRuntimeModule.js +9 -0
  159. package/lib/runtime/HasOwnPropertyRuntimeModule.js +9 -0
  160. package/lib/runtime/HelperRuntimeModule.js +10 -0
  161. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +330 -219
  162. package/lib/runtime/NonceRuntimeModule.js +9 -0
  163. package/lib/runtime/OnChunksLoadedRuntimeModule.js +67 -20
  164. package/lib/runtime/PublicPathRuntimeModule.js +9 -0
  165. package/lib/runtime/RuntimeIdRuntimeModule.js +9 -0
  166. package/lib/runtime/SpecNamespaceObjectRuntimeModule.js +90 -0
  167. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +9 -0
  168. package/lib/runtime/StartupEntrypointRuntimeModule.js +9 -0
  169. package/lib/runtime/SystemContextRuntimeModule.js +9 -0
  170. package/lib/runtime/ToBinaryRuntimeModule.js +9 -0
  171. package/lib/serialization/ObjectMiddleware.js +138 -106
  172. package/lib/sharing/ConsumeSharedPlugin.js +12 -0
  173. package/lib/sharing/ConsumeSharedRuntimeModule.js +11 -0
  174. package/lib/sharing/ShareRuntimeModule.js +9 -0
  175. package/lib/sharing/declaredShared.js +47 -0
  176. package/lib/stats/DefaultStatsFactoryPlugin.js +3 -1
  177. package/lib/stats/DefaultStatsPrinterPlugin.js +3 -0
  178. package/lib/util/SourceProcessor.js +76 -69
  179. package/lib/util/async.js +292 -0
  180. package/lib/util/buildDiagnostics.js +69 -0
  181. package/lib/util/fs.js +27 -1
  182. package/lib/util/handlerKeys.js +40 -0
  183. package/lib/util/identifier.js +20 -0
  184. package/lib/util/internalSerializables.js +4 -0
  185. package/lib/util/registerExternalSerializer.js +6 -45
  186. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +9 -0
  187. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +9 -0
  188. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +9 -0
  189. package/lib/web/JsonpChunkLoadingRuntimeModule.js +36 -0
  190. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +19 -0
  191. package/package.json +22 -16
  192. package/schemas/WebpackOptions.check.js +1 -1
  193. package/schemas/WebpackOptions.json +379 -66
  194. package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -1
  195. package/schemas/plugins/ManifestPlugin.check.js +1 -1
  196. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  197. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  198. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  199. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  200. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  201. package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -1
  202. package/schemas/plugins/dll/DllReferencePlugin.check.js +1 -1
  203. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +1 -1
  204. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  205. package/types.d.ts +1414 -314
  206. package/lib/dependencies/ExportBindingInitFragment.js +0 -191
  207. package/lib/errors/EntrypointOverlapWarning.js +0 -45
  208. package/lib/performance/EntrypointOverlapPlugin.js +0 -122
@@ -0,0 +1,104 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const makeSerializable = require("../util/makeSerializable");
9
+ const ConstDependency = require("./ConstDependency");
10
+ const NullDependency = require("./NullDependency");
11
+
12
+ /** @import { ReplaceSource } from "webpack-sources" */
13
+ /** @import Dependency, { UpdateHashContext } from "../Dependency" */
14
+ /** @import { DependencyTemplateContext } from "../DependencyTemplate" */
15
+ /** @import { Range } from "../javascript/JavascriptParser" */
16
+ /**
17
+ * @import {
18
+ * ObjectDeserializerContext,
19
+ * ObjectSerializerContext
20
+ * } from "../serialization/ObjectMiddleware"
21
+ */
22
+ /** @import Hash from "../util/Hash" */
23
+
24
+ /**
25
+ * `import.meta.main` asks whether the module is the entry, which needs the
26
+ * module argument scope hoisting removes. An inner concatenated module is
27
+ * never an entry module, so it answers with a separate constant expression.
28
+ */
29
+ class ImportMetaMainDependency extends ConstDependency {
30
+ /**
31
+ * Creates an instance of ImportMetaMainDependency.
32
+ * @param {string} expression the expression a module outside a concatenation evaluates
33
+ * @param {string} concatenatedExpression the expression an inner concatenated module evaluates
34
+ * @param {Range} range the source range
35
+ * @param {(string[] | null)=} runtimeRequirements runtime requirements of `expression`
36
+ */
37
+ constructor(expression, concatenatedExpression, range, runtimeRequirements) {
38
+ super(expression, range, runtimeRequirements);
39
+ /** @type {string} */
40
+ this.concatenatedExpression = concatenatedExpression;
41
+ }
42
+
43
+ /**
44
+ * Updates the hash with the data contributed by this instance.
45
+ * @param {Hash} hash hash to be updated
46
+ * @param {UpdateHashContext} context context
47
+ * @returns {void}
48
+ */
49
+ updateHash(hash, context) {
50
+ super.updateHash(hash, context);
51
+ hash.update(this.concatenatedExpression);
52
+ }
53
+
54
+ /**
55
+ * Serializes this instance into the provided serializer context.
56
+ * @param {ObjectSerializerContext} context context
57
+ */
58
+ serialize(context) {
59
+ context.write(this.concatenatedExpression);
60
+ super.serialize(context);
61
+ }
62
+
63
+ /**
64
+ * Restores this instance from the provided deserializer context.
65
+ * @param {ObjectDeserializerContext} context context
66
+ */
67
+ deserialize(context) {
68
+ this.concatenatedExpression = context.read();
69
+ super.deserialize(context.rest);
70
+ }
71
+ }
72
+
73
+ makeSerializable(
74
+ ImportMetaMainDependency,
75
+ "webpack/lib/dependencies/ImportMetaMainDependency"
76
+ );
77
+
78
+ ImportMetaMainDependency.Template = class ImportMetaMainDependencyTemplate extends (
79
+ NullDependency.Template
80
+ ) {
81
+ /**
82
+ * Applies the plugin by registering its hooks on the compiler.
83
+ * @param {Dependency} dependency the dependency for which the template should be applied
84
+ * @param {ReplaceSource} source the current replace source which can be modified
85
+ * @param {DependencyTemplateContext} templateContext the context object
86
+ * @returns {void}
87
+ */
88
+ apply(dependency, source, templateContext) {
89
+ const dep = /** @type {ImportMetaMainDependency} */ (dependency);
90
+ const concatenated = templateContext.concatenationScope !== undefined;
91
+ if (!concatenated && dep.runtimeRequirements) {
92
+ for (const req of dep.runtimeRequirements) {
93
+ templateContext.runtimeRequirements.add(req);
94
+ }
95
+ }
96
+ const expression = concatenated
97
+ ? dep.concatenatedExpression
98
+ : dep.expression;
99
+ const range = /** @type {Range} */ (dep.range);
100
+ source.replace(range[0], range[1] - 1, expression);
101
+ }
102
+ };
103
+
104
+ module.exports = ImportMetaMainDependency;
@@ -27,6 +27,7 @@ const createHooksRegistry = require("../util/createHooksRegistry");
27
27
  const { propertyAccess } = require("../util/property");
28
28
  const BuildTimeConstDependency = require("./BuildTimeConstDependency");
29
29
  const ConstDependency = require("./ConstDependency");
30
+ const ImportMetaMainDependency = require("./ImportMetaMainDependency");
30
31
  const ImportMetaResolveDependency = require("./ImportMetaResolveDependency");
31
32
  const ModuleInitFragmentDependency = require("./ModuleInitFragmentDependency");
32
33
 
@@ -154,17 +155,44 @@ const isImportMetaFieldEnabled = (importMeta, field) => {
154
155
  };
155
156
 
156
157
  /**
157
- * Renders the `import.meta.main` comparison and bails out of scope hoisting.
158
+ * Renders the `import.meta.main` comparison, which reads the module argument a
159
+ * scope-hoisted module does not have. A caller that can answer the expression
160
+ * statically for an inner module rules out only the concatenation root.
158
161
  * @param {Parser} parser the parser
162
+ * @param {boolean} staticWhenInner whether an inner concatenated module answers it without the comparison
159
163
  * @returns {string} the comparison expression
160
164
  */
161
- const renderImportMetaMain = (parser) => {
165
+ const renderImportMetaMain = (parser, staticWhenInner) => {
162
166
  const currentModule = parser.state.module;
163
- /** @type {JavascriptModuleBuildInfo} */
164
- (currentModule.buildInfo).moduleConcatenationBailout = IMPORT_META_MAIN;
167
+ const buildInfo =
168
+ /** @type {JavascriptModuleBuildInfo} */
169
+ (currentModule.buildInfo);
170
+ if (staticWhenInner) {
171
+ buildInfo.moduleConcatenationRootBailout = IMPORT_META_MAIN;
172
+ } else {
173
+ buildInfo.moduleConcatenationBailout = IMPORT_META_MAIN;
174
+ }
165
175
  return `${RuntimeGlobals.moduleCache}[${RuntimeGlobals.entryModuleId}] === ${currentModule.moduleArgument}`;
166
176
  };
167
177
 
178
+ const IMPORT_META_VAR = "__webpack_import_meta__";
179
+
180
+ /**
181
+ * The name of the module's synthesized `import.meta` binding, stepped aside when
182
+ * the source already spells it. Re-bundling webpack output is the case that
183
+ * matters: the earlier binding would shadow this one and make it initialize
184
+ * itself.
185
+ * @param {Parser} parser the parser
186
+ * @returns {string} a name no declaration in this module takes
187
+ */
188
+ const importMetaVarName = (parser) => {
189
+ const { source } = parser.state;
190
+ if (!source || !source.includes(IMPORT_META_VAR)) return IMPORT_META_VAR;
191
+ let index = 2;
192
+ while (source.includes(`__webpack_import_meta_${index}__`)) index++;
193
+ return `__webpack_import_meta_${index}__`;
194
+ };
195
+
168
196
  /**
169
197
  * Checks whether the callee is the `import.meta.resolve` member.
170
198
  * @param {Expression | Super} callee call callee
@@ -261,6 +289,10 @@ class ImportMetaPlugin {
261
289
  BuildTimeConstDependency,
262
290
  new BuildTimeConstDependency.Template()
263
291
  );
292
+ compilation.dependencyTemplates.set(
293
+ ImportMetaMainDependency,
294
+ new ImportMetaMainDependency.Template()
295
+ );
264
296
 
265
297
  /**
266
298
  * Returns file url.
@@ -442,7 +474,7 @@ class ImportMetaPlugin {
442
474
  const referencedPropertiesInDestructuring =
443
475
  parser.destructuringAssignmentPropertiesFor(metaProperty);
444
476
  if (!referencedPropertiesInDestructuring) {
445
- const varName = "__webpack_import_meta__";
477
+ const varName = importMetaVarName(parser);
446
478
  const knownProps = [];
447
479
  if (isImportMetaFieldEnabled(importMeta, "url")) {
448
480
  knownProps.push(`url: ${importMetaUrl()}`);
@@ -451,7 +483,9 @@ class ImportMetaPlugin {
451
483
  knownProps.push(`webpack: ${importMetaWebpackVersion()}`);
452
484
  }
453
485
  if (isImportMetaFieldEnabled(importMeta, "main")) {
454
- knownProps.push(`main: ${renderImportMetaMain(parser)}`);
486
+ knownProps.push(
487
+ `main: ${renderImportMetaMain(parser, false)}`
488
+ );
455
489
  }
456
490
  if (isImportMetaFieldEnabled(importMeta, "env")) {
457
491
  addDefinitionValueDependencies();
@@ -471,8 +505,10 @@ class ImportMetaPlugin {
471
505
  const plainInitCode = `var ${varName} = {${knownProps.join(
472
506
  ", "
473
507
  )}};\n`;
508
+ // Each module owns its `import.meta`: it copies the bundle's one
509
+ // and inherits from it, so later host writes stay visible.
474
510
  const initCode = preserveUnknown(importMeta)
475
- ? `var ${varName} = Object.assign(import.meta, {${knownProps.join(
511
+ ? `var ${varName} = Object.assign(Object.create(import.meta), import.meta, {${knownProps.join(
476
512
  ", "
477
513
  )}});\n`
478
514
  : plainInitCode;
@@ -556,7 +592,7 @@ class ImportMetaPlugin {
556
592
  break;
557
593
  case "main":
558
594
  if (fieldEnabled) {
559
- append(`main: ${renderImportMetaMain(parser)},`);
595
+ append(`main: ${renderImportMetaMain(parser, false)},`);
560
596
  runtimeRequirements.push(
561
597
  RuntimeGlobals.moduleCache,
562
598
  RuntimeGlobals.entryModuleId,
@@ -740,13 +776,21 @@ class ImportMetaPlugin {
740
776
  if (isImportMetaFieldEnabled(importMeta, "main")) {
741
777
  parser.hooks.expression
742
778
  .for(IMPORT_META_MAIN)
743
- .tap(PLUGIN_NAME, (expr) =>
744
- toConstantDependency(parser, renderImportMetaMain(parser), [
745
- RuntimeGlobals.moduleCache,
746
- RuntimeGlobals.entryModuleId,
747
- RuntimeGlobals.module
748
- ])(expr)
749
- );
779
+ .tap(PLUGIN_NAME, (expr) => {
780
+ const dep = new ImportMetaMainDependency(
781
+ renderImportMetaMain(parser, true),
782
+ "false",
783
+ /** @type {Range} */ (expr.range),
784
+ [
785
+ RuntimeGlobals.moduleCache,
786
+ RuntimeGlobals.entryModuleId,
787
+ RuntimeGlobals.module
788
+ ]
789
+ );
790
+ dep.loc = parser.getLocation(expr);
791
+ parser.state.module.addPresentationalDependency(dep);
792
+ return true;
793
+ });
750
794
  parser.hooks.typeof
751
795
  .for(IMPORT_META_MAIN)
752
796
  .tap(
@@ -24,6 +24,15 @@ class SystemRuntimeModule extends RuntimeModule {
24
24
  return false;
25
25
  }
26
26
 
27
+ /**
28
+ * The `[handlerMap, key]` pairs this module installs onto a chunk handler map
29
+ * such as `__webpack_require__.f`, or `null` where it cannot name them.
30
+ * @returns {[string, string][] | null} installed chunk handlers (do not mutate)
31
+ */
32
+ getInstalledChunkHandlers() {
33
+ return RuntimeModule.NO_CHUNK_HANDLERS;
34
+ }
35
+
27
36
  /**
28
37
  * Generates runtime code for this runtime module.
29
38
  * @returns {string | null} runtime code
@@ -140,8 +140,7 @@ WorkerDependency.Template = class WorkerDependencyTemplate extends (
140
140
  dep.options.publicPath,
141
141
  chunk,
142
142
  templateContext.module,
143
- chunkGraph,
144
- runtimeRequirements
143
+ chunkGraph
145
144
  );
146
145
 
147
146
  if (analyzableSpecifier !== null) {
@@ -144,8 +144,7 @@ WorkletDependency.Template = class WorkletDependencyTemplate extends (
144
144
  dep.options.publicPath,
145
145
  entryChunk,
146
146
  module,
147
- chunkGraph,
148
- runtimeRequirements
147
+ chunkGraph
149
148
  );
150
149
  if (analyzableSpecifier !== null) {
151
150
  source.replace(
@@ -242,6 +242,7 @@ class DelegatedModule extends Module {
242
242
  updateHash(hash, context) {
243
243
  hash.update(this.delegationType);
244
244
  hash.update(JSON.stringify(this.request));
245
+ hash.update(JSON.stringify(this.delegateData));
245
246
  super.updateHash(hash, context);
246
247
  }
247
248
 
@@ -299,7 +300,23 @@ class DelegatedModule extends Module {
299
300
  this.delegationType = m.delegationType;
300
301
  this.userRequest = m.userRequest;
301
302
  this.originalRequest = m.originalRequest;
302
- this.delegateData = m.delegateData;
303
+ const next = m.delegateData;
304
+ // cleanupForCache clears delegateData; compare surviving build products instead.
305
+ if (this.buildMeta) {
306
+ const nextMeta = { ...next.buildMeta };
307
+ const exportsDependency = this.dependencies[1];
308
+ const builtExports =
309
+ exportsDependency instanceof StaticExportsDependency
310
+ ? exportsDependency.exports
311
+ : undefined;
312
+ if (
313
+ JSON.stringify(this.buildMeta) !== JSON.stringify(nextMeta) ||
314
+ JSON.stringify(builtExports) !== JSON.stringify(next.exports || true)
315
+ ) {
316
+ this.buildMeta = undefined;
317
+ }
318
+ }
319
+ this.delegateData = next;
303
320
  }
304
321
 
305
322
  /**
@@ -8,7 +8,7 @@
8
8
  const ExternalModuleFactoryPlugin = require("../ExternalModuleFactoryPlugin");
9
9
  const DelegatedSourceDependency = require("../dependencies/DelegatedSourceDependency");
10
10
  const WebpackError = require("../errors/WebpackError");
11
- const { makePathsRelative } = require("../util/identifier");
11
+ const { fileUrlToPath, makePathsRelative } = require("../util/identifier");
12
12
  const parseJson = require("../util/parseJson");
13
13
  const DelegatedModuleFactoryPlugin = require("./DelegatedModuleFactoryPlugin");
14
14
 
@@ -72,12 +72,13 @@ class DllReferencePlugin {
72
72
  if ("manifest" in this.options) {
73
73
  const manifest = this.options.manifest;
74
74
  if (typeof manifest === "string") {
75
+ const manifestPath = fileUrlToPath(manifest);
75
76
  /** @type {InputFileSystem} */
76
- (compiler.inputFileSystem).readFile(manifest, (err, result) => {
77
+ (compiler.inputFileSystem).readFile(manifestPath, (err, result) => {
77
78
  if (err) return callback(err);
78
79
  /** @type {CompilationDataItem} */
79
80
  const data = {
80
- path: manifest,
81
+ path: manifestPath,
81
82
  data: undefined,
82
83
  error: undefined
83
84
  };
@@ -93,13 +94,13 @@ class DllReferencePlugin {
93
94
  } catch (parseErr) {
94
95
  // Store the error in the params so that it can
95
96
  // be added as a compilation error later on.
96
- const manifestPath = makePathsRelative(
97
+ const relativePath = makePathsRelative(
97
98
  compiler.context,
98
- manifest,
99
+ manifestPath,
99
100
  compiler.root
100
101
  );
101
102
  data.error = new DllManifestError(
102
- manifestPath,
103
+ relativePath,
103
104
  /** @type {Error} */ (parseErr).message
104
105
  );
105
106
  }
@@ -153,7 +154,9 @@ class DllReferencePlugin {
153
154
  source,
154
155
  type: this.options.type,
155
156
  scope: this.options.scope,
156
- context: this.options.context || compiler.context,
157
+ context: this.options.context
158
+ ? fileUrlToPath(this.options.context)
159
+ : compiler.context,
157
160
  content:
158
161
  /** @type {DllReferencePluginOptionsContent} */
159
162
  (resolvedContent),
@@ -176,7 +179,7 @@ class DllReferencePlugin {
176
179
  /** @type {DllManifestError} */ (data.error)
177
180
  );
178
181
  }
179
- compilation.fileDependencies.add(manifest);
182
+ compilation.fileDependencies.add(fileUrlToPath(manifest));
180
183
  }
181
184
  }
182
185
  });
@@ -5,9 +5,9 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const asyncLib = require("neo-async");
9
8
  const EntryDependency = require("../dependencies/EntryDependency");
10
9
  const { someInIterable } = require("../util/IterableHelpers");
10
+ const asyncLib = require("../util/async");
11
11
  const { compareModulesById } = require("../util/comparators");
12
12
  const { dirname, mkdirp } = require("../util/fs");
13
13
 
@@ -0,0 +1,41 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const WebpackError = require("./WebpackError");
9
+
10
+ /**
11
+ * @typedef {object} BailoutDetails
12
+ * @property {string} reason what keeps the runtime form, as the code generation recorded it
13
+ * @property {string[]} modules the modules it was recorded on, as many as are printed
14
+ * @property {number} count how many modules it was recorded on in all
15
+ */
16
+
17
+ class AnalyzableBailoutsWarning extends WebpackError {
18
+ /**
19
+ * Creates an instance of AnalyzableBailoutsWarning.
20
+ * @param {BailoutDetails[]} bailouts the reasons found, the most frequent first
21
+ * @param {number} references how many module and reason pairs there are
22
+ */
23
+ constructor(bailouts, references) {
24
+ const list = bailouts
25
+ .map((it) => {
26
+ const more = it.count - it.modules.length;
27
+ const names = `${it.modules.join(", ")}${more > 0 ? `, and ${more} more` : ""}`;
28
+ return `\n ${it.reason}\n ${names}`;
29
+ })
30
+ .join("");
31
+
32
+ super(
33
+ `analyzable ESM output: ${references} ${references === 1 ? "reference keeps" : "references keep"} the runtime form:${list}\nA bundler reading this output cannot follow such a reference without running webpack's runtime. Each reason names the setting that keeps it; changing that setting lets the reference be written as a literal import() or new URL().\nFor more info visit https://webpack.js.org/configuration/output/#outputmodule`
34
+ );
35
+
36
+ /** @type {string} */
37
+ this.name = "AnalyzableBailoutsWarning";
38
+ }
39
+ }
40
+
41
+ module.exports = AnalyzableBailoutsWarning;
@@ -12,6 +12,7 @@ const WebpackError = require("./WebpackError");
12
12
  * @typedef {object} DuplicateModuleDetails
13
13
  * @property {string} name
14
14
  * @property {number} chunks how many chunks carry a copy
15
+ * @property {string[]} entrypoints the entrypoints those chunks belong to, when more than one
15
16
  * @property {number} wasted bytes the extra copies cost
16
17
  */
17
18
 
@@ -23,18 +24,22 @@ class DuplicateModulesWarning extends WebpackError {
23
24
  */
24
25
  constructor(modules, wasted) {
25
26
  const list = modules
26
- .map(
27
- (module) =>
28
- `\n ${module.name} (in ${module.chunks} chunks, ${formatSize(
29
- module.wasted
30
- )} extra)`
31
- )
27
+ .map((module) => {
28
+ // Which entrypoints pay for it is the actionable part, so it leads
29
+ // where the copies are spread across more than one.
30
+ const where =
31
+ module.entrypoints.length > 1
32
+ ? `in ${module.entrypoints.join(", ")}, ${module.chunks} chunks`
33
+ : `in ${module.chunks} chunks`;
34
+
35
+ return `\n ${module.name} (${where}, ${formatSize(module.wasted)} extra)`;
36
+ })
32
37
  .join("");
33
38
 
34
39
  super(
35
40
  `duplicate modules: copies of the same module across chunks add ${formatSize(
36
41
  wasted
37
- )}:${list}\nA module reached from several chunks is emitted into each of them unless a shared chunk holds it. 'optimization.splitChunks' can pull it into one.\nFor more info visit https://webpack.js.org/plugins/split-chunks-plugin/`
42
+ )}:${list}\nA module reached from several chunks is emitted into each of them unless a shared chunk holds it. 'optimization.splitChunks' can pull it into one, with 'chunks: "all"' where the copies are in different entrypoints.\nFor more info visit https://webpack.js.org/plugins/split-chunks-plugin/`
38
43
  );
39
44
 
40
45
  /** @type {string} */
@@ -0,0 +1,26 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const WebpackError = require("./WebpackError");
9
+
10
+ class EmptyCopyPatternWarning extends WebpackError {
11
+ /**
12
+ * Creates an instance of EmptyCopyPatternWarning.
13
+ * @param {string} from the `from` of the pattern as written in the configuration
14
+ * @param {string} glob the glob `from` was resolved to
15
+ */
16
+ constructor(from, glob) {
17
+ super(
18
+ `The '${from}' pattern of 'output.copy' copied no file.\nIt resolved to '${glob}', which matches nothing on disk — usually a typo, a path relative to the wrong directory, or a directory a previous build step was supposed to create.\nSilence it with 'ignoreWarnings' when the pattern is optional.`
19
+ );
20
+
21
+ /** @type {string} */
22
+ this.name = "EmptyCopyPatternWarning";
23
+ }
24
+ }
25
+
26
+ module.exports = EmptyCopyPatternWarning;
@@ -0,0 +1,44 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const WebpackError = require("./WebpackError");
9
+
10
+ /** @import ExternalModule from "../ExternalModule" */
11
+ /** @import Module from "../Module" */
12
+
13
+ /**
14
+ * Error raised when a `module` library reexports everything from an external
15
+ * whose request names a property path instead of a module.
16
+ */
17
+ class ExternalStarReexportError extends WebpackError {
18
+ /**
19
+ * Captures the external and the library entry reexporting from it.
20
+ * @param {ExternalModule} externalModule the reexported external
21
+ * @param {Module} module the library entry module
22
+ */
23
+ constructor(externalModule, module) {
24
+ const request = /** @type {string[]} */ (
25
+ externalModule.getResolvedRequest()
26
+ );
27
+ super(
28
+ `Can't 'export * from ${JSON.stringify(
29
+ externalModule.userRequest
30
+ )}': the external is configured as ${JSON.stringify(
31
+ request
32
+ )}, which is a property of ${JSON.stringify(
33
+ request[0]
34
+ )} and has no module specifier to reexport. Reexport the names explicitly or configure the external without a property path.`
35
+ );
36
+
37
+ /** @type {string} */
38
+ this.name = "ExternalStarReexportError";
39
+ /** @type {Module} */
40
+ this.module = module;
41
+ }
42
+ }
43
+
44
+ module.exports = ExternalStarReexportError;
@@ -0,0 +1,36 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const WebpackError = require("./WebpackError");
9
+
10
+ /**
11
+ * @typedef {object} MissingSourceMapDetails
12
+ * @property {string} name the module, by request
13
+ * @property {string[]} loaders the loaders that ran on it
14
+ */
15
+
16
+ class MissingSourceMapsWarning extends WebpackError {
17
+ /**
18
+ * Creates an instance of MissingSourceMapsWarning.
19
+ * @param {MissingSourceMapDetails[]} modules the modules whose map was lost
20
+ * @param {number} total how many such modules there are
21
+ */
22
+ constructor(modules, total) {
23
+ const list = modules
24
+ .map((it) => `\n ${it.name} (${it.loaders.join(", ")})`)
25
+ .join("");
26
+
27
+ super(
28
+ `missing source maps: ${total} ${total === 1 ? "module was" : "modules were"} transformed by a loader that returned no source map:${list}\nA loader that rewrites code without returning a map leaves webpack mapping positions to the loader's output as though it were the file on disk, so every line the map names below that point is likely to be wrong. Have the loader pass its map to 'this.callback(null, code, map)', or take the loader out of the chain for this build.\nFor more info visit https://webpack.js.org/api/loaders/#thiscallback`
29
+ );
30
+
31
+ /** @type {string} */
32
+ this.name = "MissingSourceMapsWarning";
33
+ }
34
+ }
35
+
36
+ module.exports = MissingSourceMapsWarning;
@@ -101,7 +101,8 @@ class ModuleParseError extends WebpackError {
101
101
  }
102
102
  }
103
103
 
104
- loc = { start: err.loc };
104
+ // a plain copy: a parser's own position class must not reach the cache
105
+ loc = { start: { line: lineNumber, column: err.loc.column } };
105
106
  } else if (err && err.stack) {
106
107
  message += `\n${err.stack}`;
107
108
  }
@@ -0,0 +1,36 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const WebpackError = require("./WebpackError");
9
+
10
+ /**
11
+ * @typedef {object} UnusedAssetDetails
12
+ * @property {string} name the module, by request
13
+ * @property {number} size the bytes its file adds to the output
14
+ */
15
+
16
+ class UnusedAssetsWarning extends WebpackError {
17
+ /**
18
+ * Creates an instance of UnusedAssetsWarning.
19
+ * @param {UnusedAssetDetails[]} assets the assets nothing reads
20
+ * @param {number} total the bytes they add between them
21
+ */
22
+ constructor(assets, total) {
23
+ const list = assets
24
+ .map((it) => `\n ${it.name} (${it.size} bytes)`)
25
+ .join("");
26
+
27
+ super(
28
+ `unused assets: ${total} bytes are emitted for ${assets.length === 1 ? "an import whose binding" : "imports whose bindings"} nothing reads:${list}\nThe import brings the file into the output but its value is never used, so the bytes ship for nothing. Drop the import, or write it as 'import "./file"' with no binding where the file is wanted on disk regardless — 'experiments.futureDefaults' already leaves those alone and drops these.\nFor more info visit https://webpack.js.org/guides/asset-modules/`
29
+ );
30
+
31
+ /** @type {string} */
32
+ this.name = "UnusedAssetsWarning";
33
+ }
34
+ }
35
+
36
+ module.exports = UnusedAssetsWarning;
@@ -0,0 +1,35 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Alexander Akait @alexander-akait
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const WebpackError = require("./WebpackError");
9
+
10
+ /**
11
+ * @typedef {object} UnusedFederationDetails
12
+ * @property {string} name the share key or remote name, as declared
13
+ * @property {"shared" | "remote"} kind which list declared it
14
+ */
15
+
16
+ class UnusedFederationWarning extends WebpackError {
17
+ /**
18
+ * Creates an instance of UnusedFederationWarning.
19
+ * @param {UnusedFederationDetails[]} entries the entries nothing used
20
+ */
21
+ constructor(entries) {
22
+ const list = entries
23
+ .map((entry) => `\n ${entry.name} (${entry.kind})`)
24
+ .join("");
25
+
26
+ super(
27
+ `unused federation config: ${entries.length} ${entries.length === 1 ? "entry was" : "entries were"} declared but never used:${list}\nA 'shared' key nothing imports is not shared at all — each side keeps its own copy, which for a package holding state breaks at runtime rather than only costing bytes. A 'remotes' name nothing imports is dead configuration, or names a remote the code spells differently.\nFor more info visit https://webpack.js.org/concepts/module-federation/`
28
+ );
29
+
30
+ /** @type {string} */
31
+ this.name = "UnusedFederationWarning";
32
+ }
33
+ }
34
+
35
+ module.exports = UnusedFederationWarning;