@depup/webpack 5.110.3-depup.0 → 5.111.1-depup.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 (283) hide show
  1. package/README.md +7 -8
  2. package/changes.json +7 -11
  3. package/lib/APIPlugin.js +26 -11
  4. package/lib/AutomaticPrefetchPlugin.js +1 -1
  5. package/lib/Cache.js +8 -3
  6. package/lib/CacheFacade.js +1 -1
  7. package/lib/CircularModulesPlugin.js +157 -55
  8. package/lib/CleanPlugin.js +2 -2
  9. package/lib/CompatibilityPlugin.js +3 -4
  10. package/lib/Compilation.js +336 -337
  11. package/lib/Compiler.js +213 -51
  12. package/lib/ConstPlugin.js +16 -132
  13. package/lib/CopyPlugin.js +1054 -0
  14. package/lib/DefinePlugin.js +24 -8
  15. package/lib/DependencyTemplate.js +2 -1
  16. package/lib/DotenvPlugin.js +24 -28
  17. package/lib/ErrorHelpers.js +113 -0
  18. package/lib/ExportsInfo.js +20 -16
  19. package/lib/ExternalModule.js +47 -22
  20. package/lib/FileSystemInfo.js +17 -14
  21. package/lib/FlagDependencyExportsPlugin.js +53 -34
  22. package/lib/FlagDependencyUsagePlugin.js +9 -13
  23. package/lib/Generator.js +24 -2
  24. package/lib/HotModuleReplacementPlugin.js +55 -7
  25. package/lib/IgnorePlugin.js +1 -1
  26. package/lib/JavascriptMetaInfoPlugin.js +5 -3
  27. package/lib/LoaderOptionsPlugin.js +1 -1
  28. package/lib/MainTemplate.js +5 -1
  29. package/lib/Module.js +19 -10
  30. package/lib/ModuleGraph.js +6 -9
  31. package/lib/MultiCompiler.js +7 -17
  32. package/lib/MultiWatching.js +1 -1
  33. package/lib/NormalModule.js +135 -50
  34. package/lib/NormalModuleFactory.js +1 -1
  35. package/lib/RuntimeGlobals.js +21 -7
  36. package/lib/RuntimeModule.js +28 -12
  37. package/lib/RuntimePlugin.js +30 -3
  38. package/lib/RuntimeTemplate.js +813 -518
  39. package/lib/SourceMapDevToolPlugin.js +54 -104
  40. package/lib/TemplatedPathPlugin.js +16 -59
  41. package/lib/Watching.js +9 -0
  42. package/lib/WebpackOptionsApply.js +84 -91
  43. package/lib/asset/AssetBytesGenerator.js +7 -1
  44. package/lib/asset/AssetGenerator.js +50 -24
  45. package/lib/asset/AssetModule.js +3 -0
  46. package/lib/asset/AssetSourceGenerator.js +7 -1
  47. package/lib/asset/WebManifestParser.js +7 -5
  48. package/lib/buildChunkGraph.js +11 -15
  49. package/lib/cache/AddBuildDependenciesPlugin.js +33 -4
  50. package/lib/cache/IdleFileCachePlugin.js +2 -2
  51. package/lib/cache/MemoryCachePlugin.js +4 -4
  52. package/lib/cache/MemoryWithGcCachePlugin.js +7 -8
  53. package/lib/cache/PackFileCacheStrategy.js +17 -19
  54. package/lib/cache/getLazyHashedEtag.js +3 -5
  55. package/lib/config/browserslistTargetHandler.js +17 -4
  56. package/lib/config/defaults.js +138 -128
  57. package/lib/config/getClaimedAssetTypes.js +10 -11
  58. package/lib/config/normalization.js +82 -12
  59. package/lib/config/target.js +13 -4
  60. package/lib/container/ContainerReferencePlugin.js +6 -0
  61. package/lib/container/RemoteRuntimeModule.js +9 -0
  62. package/lib/container/declaredRemotes.js +39 -0
  63. package/lib/{ContextExclusionPlugin.js → context/ContextExclusionPlugin.js} +1 -1
  64. package/lib/{ContextModule.js → context/ContextModule.js} +54 -115
  65. package/lib/{ContextModuleFactory.js → context/ContextModuleFactory.js} +19 -21
  66. package/lib/{ContextReplacementPlugin.js → context/ContextReplacementPlugin.js} +4 -4
  67. package/lib/css/CssGenerator.js +27 -11
  68. package/lib/css/CssInjectStyleRuntimeModule.js +9 -0
  69. package/lib/css/CssLoadingRuntimeModule.js +94 -36
  70. package/lib/css/CssModule.js +1 -1
  71. package/lib/css/CssModulesPlugin.js +7 -6
  72. package/lib/css/CssParser.js +162 -31
  73. package/lib/css/CssServerStylesRuntimeModule.js +9 -0
  74. package/lib/css/cssMinify.js +43 -32
  75. package/lib/css/data.js +3514 -869
  76. package/lib/css/syntax.js +6370 -1220
  77. package/lib/debug/ProfilingPlugin.js +7 -4
  78. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +6 -3
  79. package/lib/dependencies/AMDRuntimeModules.js +18 -0
  80. package/lib/dependencies/CommonJsExportRequireDependency.js +13 -12
  81. package/lib/dependencies/CommonJsExportsParserPlugin.js +12 -13
  82. package/lib/dependencies/CommonJsImportsParserPlugin.js +5 -5
  83. package/lib/dependencies/CommonJsPlugin.js +19 -3
  84. package/lib/dependencies/CommonJsRequireDependency.js +14 -5
  85. package/lib/dependencies/CommonJsSelfReferenceDependency.js +2 -4
  86. package/lib/dependencies/ContextDependency.js +1 -1
  87. package/lib/dependencies/ContextDependencyHelpers.js +3 -9
  88. package/lib/dependencies/ContextElementDependency.js +1 -1
  89. package/lib/dependencies/CssIcssExportDependency.js +13 -9
  90. package/lib/dependencies/CssIcssImportDependency.js +3 -6
  91. package/lib/dependencies/CssUrlDependency.js +3 -5
  92. package/lib/dependencies/HarmonyCompatibilityDependency.js +67 -22
  93. package/lib/dependencies/HarmonyDetectionParserPlugin.js +3 -4
  94. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +10 -7
  95. package/lib/dependencies/HarmonyExportExpressionDependency.js +47 -33
  96. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +74 -17
  97. package/lib/dependencies/HarmonyExportInitFragment.js +110 -23
  98. package/lib/dependencies/HarmonyExportSpecifierDependency.js +25 -58
  99. package/lib/dependencies/HarmonyImportBareSideEffectDependency.js +59 -0
  100. package/lib/dependencies/HarmonyImportDependency.js +6 -1
  101. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +111 -17
  102. package/lib/dependencies/HarmonyImportSideEffectDependency.js +3 -4
  103. package/lib/dependencies/HarmonyImportSpecifierDependency.js +40 -3
  104. package/lib/dependencies/HarmonyModulesPlugin.js +20 -0
  105. package/lib/dependencies/HtmlEntryDependency.js +124 -102
  106. package/lib/dependencies/HtmlInlineScriptDependency.js +3 -4
  107. package/lib/dependencies/HtmlInlineStyleDependency.js +3 -4
  108. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +1 -1
  109. package/lib/dependencies/ImportMetaGlobHelpers.js +1 -1
  110. package/lib/dependencies/ImportMetaMainDependency.js +104 -0
  111. package/lib/dependencies/ImportMetaPlugin.js +67 -25
  112. package/lib/dependencies/ImportParserPlugin.js +1 -1
  113. package/lib/dependencies/LoaderPlugin.js +26 -1
  114. package/lib/dependencies/RequireContextDependencyParserPlugin.js +1 -1
  115. package/lib/dependencies/SystemRuntimeModule.js +9 -0
  116. package/lib/dependencies/URLContextDependency.js +1 -1
  117. package/lib/dependencies/URLDependency.js +6 -5
  118. package/lib/dependencies/WorkerAndWorkletPlugin.js +15 -21
  119. package/lib/dependencies/WorkerDependency.js +7 -7
  120. package/lib/dependencies/WorkletDependency.js +7 -11
  121. package/lib/dll/DelegatedModule.js +18 -1
  122. package/lib/dll/DllReferencePlugin.js +11 -8
  123. package/lib/dll/LibManifestPlugin.js +1 -1
  124. package/lib/errors/AnalyzableBailoutsWarning.js +41 -0
  125. package/lib/errors/DuplicateModulesWarning.js +12 -7
  126. package/lib/errors/EmptyCopyPatternWarning.js +26 -0
  127. package/lib/errors/ExternalStarReexportError.js +44 -0
  128. package/lib/errors/HookWebpackError.js +3 -2
  129. package/lib/errors/MissingSourceMapsWarning.js +36 -0
  130. package/lib/errors/ModuleParseError.js +2 -1
  131. package/lib/errors/UnusedAssetsWarning.js +36 -0
  132. package/lib/errors/UnusedFederationWarning.js +35 -0
  133. package/lib/errors/UnusedModulesWarning.js +38 -0
  134. package/lib/esm/ExportWebpackRequireRuntimeModule.js +9 -0
  135. package/lib/esm/ModuleChunkFormatPlugin.js +28 -3
  136. package/lib/esm/ModuleChunkLoadingPlugin.js +30 -11
  137. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +92 -60
  138. package/lib/hmr/HotModuleReplacement.runtime.js +8 -2
  139. package/lib/hmr/HotModuleReplacementRuntimeModule.js +9 -0
  140. package/lib/hmr/LazyCompilationPlugin.js +3 -5
  141. package/lib/html/HtmlGenerator.js +72 -87
  142. package/lib/html/HtmlModulesPlugin.js +418 -200
  143. package/lib/html/HtmlParser.js +110 -147
  144. package/lib/html/builtinEmbeddedRenderer.js +107 -0
  145. package/lib/html/data.js +142 -7
  146. package/lib/html/htmlMinify.js +92 -122
  147. package/lib/html/syntax.js +1618 -1391
  148. package/lib/ids/HashedModuleIdsPlugin.js +2 -1
  149. package/lib/index.js +49 -3
  150. package/lib/javascript/ChunkFormatHelpers.js +4 -3
  151. package/lib/javascript/JavascriptGenerator.js +8 -1
  152. package/lib/javascript/JavascriptModule.js +1 -0
  153. package/lib/javascript/JavascriptModulesPlugin.js +73 -72
  154. package/lib/javascript/JavascriptParser.js +1970 -900
  155. package/lib/javascript/StartupHelpers.js +27 -3
  156. package/lib/javascript/data.js +172 -0
  157. package/lib/javascript/grammar.js +5546 -0
  158. package/lib/javascript/parser.js +1500 -0
  159. package/lib/javascript/regexp.js +1762 -0
  160. package/lib/javascript/regexpData.js +51 -0
  161. package/lib/javascript/syntax.js +9061 -5262
  162. package/lib/json/JsonGenerator.js +7 -1
  163. package/lib/library/ModuleLibraryPlugin.js +171 -132
  164. package/lib/loaders/LoaderRunner.js +137 -9
  165. package/lib/node/NodeWatchFileSystem.js +3 -9
  166. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +22 -0
  167. package/lib/node/RequireChunkLoadingRuntimeModule.js +22 -0
  168. package/lib/optimize/AggressiveMergingPlugin.js +3 -5
  169. package/lib/optimize/ConcatenatedModule.js +178 -120
  170. package/lib/optimize/ConstExportsPlugin.js +50 -39
  171. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -11
  172. package/lib/optimize/InlineExports.js +20 -123
  173. package/lib/optimize/InnerGraphPlugin.js +7 -13
  174. package/lib/optimize/LimitChunkCountPlugin.js +5 -8
  175. package/lib/optimize/MangleExportsPlugin.js +13 -4
  176. package/lib/optimize/ModuleConcatenationPlugin.js +27 -5
  177. package/lib/optimize/RealContentHashPlugin.js +68 -9
  178. package/lib/optimize/SideEffectsFlagPlugin.js +24 -28
  179. package/lib/optimize/SplitChunksPlugin.js +2 -4
  180. package/lib/performance/AnalyzableBailoutsPlugin.js +115 -0
  181. package/lib/performance/BroadContextsPlugin.js +1 -1
  182. package/lib/performance/CacheEffectivenessPlugin.js +7 -7
  183. package/lib/performance/DuplicateModulesPlugin.js +57 -13
  184. package/lib/performance/EvalUsagePlugin.js +5 -2
  185. package/lib/performance/MissingSourceMapsPlugin.js +115 -0
  186. package/lib/performance/PureAnnotationsPlugin.js +6 -3
  187. package/lib/performance/SizeLimitsPlugin.js +2 -4
  188. package/lib/performance/TopLevelThisPlugin.js +5 -4
  189. package/lib/performance/UnusedAssetsPlugin.js +109 -0
  190. package/lib/performance/UnusedFederationPlugin.js +147 -0
  191. package/lib/performance/UnusedModulesPlugin.js +141 -0
  192. package/lib/performance/UnusedReexportsPlugin.js +1 -55
  193. package/lib/performance/isOnlyReexported.js +65 -0
  194. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +25 -5
  195. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +8 -8
  196. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +9 -0
  197. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +9 -0
  198. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +9 -0
  199. package/lib/prefetch/ResourceHintPlugin.js +18 -23
  200. package/lib/prefetch/ResourceHintRuntimeModule.js +9 -0
  201. package/lib/prefetch/StartupAssetHintRuntimeModule.js +16 -10
  202. package/lib/rules/RuleSetCompiler.js +211 -4
  203. package/lib/runtime/AsyncModuleRuntimeModule.js +98 -66
  204. package/lib/runtime/AutoPublicPathRuntimeModule.js +9 -0
  205. package/lib/runtime/BaseUriRuntimeModule.js +9 -0
  206. package/lib/runtime/ChunkNameRuntimeModule.js +9 -0
  207. package/lib/runtime/EnsureChunkRuntimeModule.js +35 -16
  208. package/lib/runtime/GetChunkFilenameRuntimeModule.js +12 -4
  209. package/lib/runtime/GetFullHashRuntimeModule.js +9 -0
  210. package/lib/runtime/GetMainFilenameRuntimeModule.js +9 -0
  211. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +9 -0
  212. package/lib/runtime/GlobalRuntimeModule.js +11 -4
  213. package/lib/runtime/HasOwnPropertyRuntimeModule.js +9 -0
  214. package/lib/runtime/HelperRuntimeModule.js +10 -0
  215. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +305 -224
  216. package/lib/runtime/NonceRuntimeModule.js +9 -0
  217. package/lib/runtime/OnChunksLoadedRuntimeModule.js +67 -20
  218. package/lib/runtime/PublicPathRuntimeModule.js +9 -0
  219. package/lib/runtime/RuntimeIdRuntimeModule.js +9 -0
  220. package/lib/runtime/SpecNamespaceObjectRuntimeModule.js +90 -0
  221. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +9 -0
  222. package/lib/runtime/StartupEntrypointRuntimeModule.js +9 -0
  223. package/lib/runtime/SystemContextRuntimeModule.js +9 -0
  224. package/lib/runtime/ToBinaryRuntimeModule.js +9 -0
  225. package/lib/schemes/DataUriPlugin.js +3 -6
  226. package/lib/schemes/VirtualUrlPlugin.js +1 -1
  227. package/lib/serialization/BinaryMiddleware.js +9 -9
  228. package/lib/serialization/FileMiddleware.js +16 -16
  229. package/lib/serialization/ObjectMiddleware.js +168 -139
  230. package/lib/sharing/ConsumeSharedPlugin.js +12 -0
  231. package/lib/sharing/ConsumeSharedRuntimeModule.js +11 -0
  232. package/lib/sharing/ShareRuntimeModule.js +9 -0
  233. package/lib/sharing/declaredShared.js +47 -0
  234. package/lib/stats/DefaultStatsFactoryPlugin.js +6 -5
  235. package/lib/stats/DefaultStatsPrinterPlugin.js +3 -0
  236. package/lib/typescript/TypeScriptPlugin.js +2 -3
  237. package/lib/url/URLParserPlugin.js +6 -8
  238. package/lib/util/LocConverter.js +4 -7
  239. package/lib/util/SourceProcessor.js +91 -91
  240. package/lib/util/async.js +292 -0
  241. package/lib/util/buildDiagnostics.js +69 -0
  242. package/lib/util/chainedImports.js +3 -4
  243. package/lib/util/concatenate.js +4 -4
  244. package/lib/util/createHooksRegistry.js +1 -2
  245. package/lib/util/dataURL.js +2 -3
  246. package/lib/util/deterministicGrouping.js +8 -13
  247. package/lib/util/findGraphRoots.js +6 -13
  248. package/lib/util/fs.js +27 -1
  249. package/lib/util/globUtils.js +1 -1
  250. package/lib/util/handlerKeys.js +40 -0
  251. package/lib/util/hash/wasm-hash.js +3 -4
  252. package/lib/util/identifier.js +20 -0
  253. package/lib/util/internalSerializables.js +5 -1
  254. package/lib/util/registerExternalSerializer.js +6 -45
  255. package/lib/util/semver.js +5 -3
  256. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +9 -0
  257. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +9 -0
  258. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -1
  259. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +5 -1
  260. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +12 -4
  261. package/lib/wasm-sync/WebAssemblyGenerator.js +6 -1
  262. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -1
  263. package/lib/wasm-sync/WebAssemblyUtils.js +2 -4
  264. package/lib/web/JsonpChunkLoadingRuntimeModule.js +36 -0
  265. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +19 -0
  266. package/package.json +55 -46
  267. package/schemas/WebpackOptions.check.js +1 -1
  268. package/schemas/WebpackOptions.json +379 -66
  269. package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -1
  270. package/schemas/plugins/ManifestPlugin.check.js +1 -1
  271. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  272. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  273. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  274. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  275. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  276. package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -1
  277. package/schemas/plugins/dll/DllReferencePlugin.check.js +1 -1
  278. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +1 -1
  279. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  280. package/types.d.ts +1723 -604
  281. package/lib/dependencies/ExportBindingInitFragment.js +0 -191
  282. package/lib/errors/EntrypointOverlapWarning.js +0 -45
  283. package/lib/performance/EntrypointOverlapPlugin.js +0 -122
@@ -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
 
@@ -92,11 +93,9 @@ const IMPORT_META_FIELDS = new Set([
92
93
  "webpackHot"
93
94
  ]);
94
95
 
95
- // Single source of truth for `import.meta` accesses that only exist in ES modules
96
- // and therefore mark a module as ESM (consumed by HarmonyDetectionParserPlugin).
97
- // `dirname`/`filename` are resolved by NodeStuffPlugin, the rest here. The webpack
98
- // pragmas `import.meta.webpackHot`/`webpackContext` are intentionally excluded:
99
- // they are usable in CommonJS modules and must not force ESM.
96
+ // The `import.meta` accesses that exist only in ES modules, and so mark one.
97
+ // `dirname` and `filename` are resolved by NodeStuffPlugin. The webpack pragmas
98
+ // are excluded: they work in CommonJS too and must not force ESM.
100
99
  const IMPORT_META_NAMES = [
101
100
  IMPORT_META,
102
101
  IMPORT_META_URL,
@@ -108,11 +107,11 @@ const IMPORT_META_NAMES = [
108
107
  IMPORT_META_RESOLVE
109
108
  ];
110
109
 
111
- // Ordering contract for import.meta parser hooks across plugins: ESM detection
112
- // (HarmonyDetectionParserPlugin, non-bailing) must observe every access before
113
- // any bailing replacement; the merged replacements here must run before
114
- // DefinePlugin object defines (default stage 0) and its nested destructuring
115
- // handler (stage 100).
110
+ // WHY: the ordering contract for the `import.meta` parser hooks across plugins.
111
+ // ESM detection (HarmonyDetectionParserPlugin, non-bailing) must observe every
112
+ // access before any bailing replacement, and the merged replacements here must
113
+ // run before DefinePlugin's object defines (default stage 0) and its nested
114
+ // destructuring handler (stage 100).
116
115
  const IMPORT_META_STAGE_ESM_DETECTION = -1000;
117
116
  const IMPORT_META_STAGE_REPLACEMENT = -100;
118
117
 
@@ -154,17 +153,44 @@ const isImportMetaFieldEnabled = (importMeta, field) => {
154
153
  };
155
154
 
156
155
  /**
157
- * Renders the `import.meta.main` comparison and bails out of scope hoisting.
156
+ * Renders the `import.meta.main` comparison, which reads the module argument a
157
+ * scope-hoisted module does not have. A caller that can answer the expression
158
+ * statically for an inner module rules out only the concatenation root.
158
159
  * @param {Parser} parser the parser
160
+ * @param {boolean} staticWhenInner whether an inner concatenated module answers it without the comparison
159
161
  * @returns {string} the comparison expression
160
162
  */
161
- const renderImportMetaMain = (parser) => {
163
+ const renderImportMetaMain = (parser, staticWhenInner) => {
162
164
  const currentModule = parser.state.module;
163
- /** @type {JavascriptModuleBuildInfo} */
164
- (currentModule.buildInfo).moduleConcatenationBailout = IMPORT_META_MAIN;
165
+ const buildInfo =
166
+ /** @type {JavascriptModuleBuildInfo} */
167
+ (currentModule.buildInfo);
168
+ if (staticWhenInner) {
169
+ buildInfo.moduleConcatenationRootBailout = IMPORT_META_MAIN;
170
+ } else {
171
+ buildInfo.moduleConcatenationBailout = IMPORT_META_MAIN;
172
+ }
165
173
  return `${RuntimeGlobals.moduleCache}[${RuntimeGlobals.entryModuleId}] === ${currentModule.moduleArgument}`;
166
174
  };
167
175
 
176
+ const IMPORT_META_VAR = "__webpack_import_meta__";
177
+
178
+ /**
179
+ * The name of the module's synthesized `import.meta` binding, stepped aside when
180
+ * the source already spells it. Re-bundling webpack output is the case that
181
+ * matters: the earlier binding would shadow this one and make it initialize
182
+ * itself.
183
+ * @param {Parser} parser the parser
184
+ * @returns {string} a name no declaration in this module takes
185
+ */
186
+ const importMetaVarName = (parser) => {
187
+ const { source } = parser.state;
188
+ if (!source || !source.includes(IMPORT_META_VAR)) return IMPORT_META_VAR;
189
+ let index = 2;
190
+ while (source.includes(`__webpack_import_meta_${index}__`)) index++;
191
+ return `__webpack_import_meta_${index}__`;
192
+ };
193
+
168
194
  /**
169
195
  * Checks whether the callee is the `import.meta.resolve` member.
170
196
  * @param {Expression | Super} callee call callee
@@ -261,6 +287,10 @@ class ImportMetaPlugin {
261
287
  BuildTimeConstDependency,
262
288
  new BuildTimeConstDependency.Template()
263
289
  );
290
+ compilation.dependencyTemplates.set(
291
+ ImportMetaMainDependency,
292
+ new ImportMetaMainDependency.Template()
293
+ );
264
294
 
265
295
  /**
266
296
  * Returns file url.
@@ -442,7 +472,7 @@ class ImportMetaPlugin {
442
472
  const referencedPropertiesInDestructuring =
443
473
  parser.destructuringAssignmentPropertiesFor(metaProperty);
444
474
  if (!referencedPropertiesInDestructuring) {
445
- const varName = "__webpack_import_meta__";
475
+ const varName = importMetaVarName(parser);
446
476
  const knownProps = [];
447
477
  if (isImportMetaFieldEnabled(importMeta, "url")) {
448
478
  knownProps.push(`url: ${importMetaUrl()}`);
@@ -451,7 +481,9 @@ class ImportMetaPlugin {
451
481
  knownProps.push(`webpack: ${importMetaWebpackVersion()}`);
452
482
  }
453
483
  if (isImportMetaFieldEnabled(importMeta, "main")) {
454
- knownProps.push(`main: ${renderImportMetaMain(parser)}`);
484
+ knownProps.push(
485
+ `main: ${renderImportMetaMain(parser, false)}`
486
+ );
455
487
  }
456
488
  if (isImportMetaFieldEnabled(importMeta, "env")) {
457
489
  addDefinitionValueDependencies();
@@ -471,8 +503,10 @@ class ImportMetaPlugin {
471
503
  const plainInitCode = `var ${varName} = {${knownProps.join(
472
504
  ", "
473
505
  )}};\n`;
506
+ // Each module owns its `import.meta`: it copies the bundle's one
507
+ // and inherits from it, so later host writes stay visible.
474
508
  const initCode = preserveUnknown(importMeta)
475
- ? `var ${varName} = Object.assign(import.meta, {${knownProps.join(
509
+ ? `var ${varName} = Object.assign(Object.create(import.meta), import.meta, {${knownProps.join(
476
510
  ", "
477
511
  )}});\n`
478
512
  : plainInitCode;
@@ -556,7 +590,7 @@ class ImportMetaPlugin {
556
590
  break;
557
591
  case "main":
558
592
  if (fieldEnabled) {
559
- append(`main: ${renderImportMetaMain(parser)},`);
593
+ append(`main: ${renderImportMetaMain(parser, false)},`);
560
594
  runtimeRequirements.push(
561
595
  RuntimeGlobals.moduleCache,
562
596
  RuntimeGlobals.entryModuleId,
@@ -740,13 +774,21 @@ class ImportMetaPlugin {
740
774
  if (isImportMetaFieldEnabled(importMeta, "main")) {
741
775
  parser.hooks.expression
742
776
  .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
- );
777
+ .tap(PLUGIN_NAME, (expr) => {
778
+ const dep = new ImportMetaMainDependency(
779
+ renderImportMetaMain(parser, true),
780
+ "false",
781
+ /** @type {Range} */ (expr.range),
782
+ [
783
+ RuntimeGlobals.moduleCache,
784
+ RuntimeGlobals.entryModuleId,
785
+ RuntimeGlobals.module
786
+ ]
787
+ );
788
+ dep.loc = parser.getLocation(expr);
789
+ parser.state.module.addPresentationalDependency(dep);
790
+ return true;
791
+ });
750
792
  parser.hooks.typeof
751
793
  .for(IMPORT_META_MAIN)
752
794
  .tap(
@@ -45,7 +45,7 @@ const getCommentCompilationWarning = memoize(() =>
45
45
  * } from "../../declarations/WebpackOptions"
46
46
  */
47
47
  /** @import { RawChunkGroupOptions } from "../ChunkGroup" */
48
- /** @import { ContextMode } from "../ContextModule" */
48
+ /** @import { ContextMode } from "../context/ContextModule" */
49
49
  /** @import { RawReferencedExports } from "../Dependency" */
50
50
  /** @import { BuildMeta } from "../Module" */
51
51
  /**
@@ -21,7 +21,7 @@ const LoaderImportDependency = require("./LoaderImportDependency");
21
21
  * } from "../Compilation"
22
22
  */
23
23
  /** @import Compiler from "../Compiler" */
24
- /** @import { BuildInfo } from "../Module" */
24
+ /** @import Module, { BuildInfo } from "../Module" */
25
25
 
26
26
  /**
27
27
  * Defines the import module callback callback.
@@ -39,6 +39,31 @@ const LoaderImportDependency = require("./LoaderImportDependency");
39
39
  * @property {string=} baseUri target base uri
40
40
  */
41
41
 
42
+ /**
43
+ * @callback LoadModuleCallback
44
+ * @param {Error | null} err error object
45
+ * @param {(string | Buffer)=} source source of the loaded module
46
+ * @param {(object | null)=} sourceMap source map of the loaded module
47
+ * @param {Module=} module the loaded module
48
+ * @returns {void}
49
+ */
50
+
51
+ /**
52
+ * `importModule` takes a callback or, given none, answers with a promise, and
53
+ * TypeScript reads an intersection of call signatures as an overload set
54
+ * @typedef {{ (request: string, options: ImportModuleOptions | undefined, callback: ImportModuleCallback): void } & { (request: string, options?: ImportModuleOptions): Promise<ExecuteModuleExports> }} ImportModuleMethod
55
+ */
56
+
57
+ /**
58
+ * These properties are added by the LoaderPlugin
59
+ * @typedef {object} LoaderPluginLoaderContext
60
+ * @property {(request: string, callback: LoadModuleCallback) => void} loadModule Resolves the given request to a module, applies all configured loaders and calls
61
+ * back with the generated source, the sourceMap and the module instance (usually an
62
+ * instance of NormalModule). Use this function if you need to know the source code
63
+ * of another module to generate the result.
64
+ * @property {ImportModuleMethod} importModule
65
+ */
66
+
42
67
  const PLUGIN_NAME = "LoaderPlugin";
43
68
 
44
69
  class LoaderPlugin {
@@ -7,7 +7,7 @@
7
7
 
8
8
  const RequireContextDependency = require("./RequireContextDependency");
9
9
 
10
- /** @import { ContextMode } from "../ContextModule" */
10
+ /** @import { ContextMode } from "../context/ContextModule" */
11
11
  /** @import JavascriptParser, { Range } from "../javascript/JavascriptParser" */
12
12
 
13
13
  const PLUGIN_NAME = "RequireContextDependencyParserPlugin";
@@ -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
@@ -9,7 +9,7 @@ const makeSerializable = require("../util/makeSerializable");
9
9
  const ContextDependency = require("./ContextDependency");
10
10
  const ContextDependencyTemplateAsRequireCall = require("./ContextDependencyTemplateAsRequireCall");
11
11
 
12
- /** @import { ContextOptions } from "../ContextModule" */
12
+ /** @import { ContextOptions } from "../context/ContextModule" */
13
13
  /** @import { Range } from "../javascript/JavascriptParser" */
14
14
  /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext<[Range]>} ObjectDeserializerContext */
15
15
  /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext<[Range]>} ObjectSerializerContext */
@@ -263,11 +263,12 @@ URLDependency.Template = class URLDependencyTemplate extends (
263
263
  return;
264
264
  }
265
265
 
266
- // For ESM module output, emit the analyzable `new URL("./asset", import.meta.url)`
267
- // form (literal specifier, no runtime helpers) so other bundlers and webpack itself
268
- // can statically follow the asset. `url: "relative"` keeps the runtime form.
269
- // A prefetch/preload hint doesn't force it: the `<link>` is emitted separately at
270
- // chunk startup (`StartupAssetHintRuntimeModule`), independent of the call site.
266
+ // WHY: ESM module output emits the analyzable
267
+ // `new URL("./asset", import.meta.url)` form — a literal specifier, no runtime
268
+ // helpers — so other bundlers and webpack itself can statically follow the
269
+ // asset, while `url: "relative"` keeps the runtime form. A prefetch or preload
270
+ // hint does not force it: the `<link>` is emitted separately at chunk startup
271
+ // (`StartupAssetHintRuntimeModule`), independent of the call site.
271
272
  if (
272
273
  !dep.relative &&
273
274
  runtimeTemplate.supportsAnalyzable(
@@ -86,10 +86,9 @@ const WORKER_DEFAULT_SYNTAX = [
86
86
  "Worker from worker_threads"
87
87
  ];
88
88
 
89
- // Worklets are always module scripts loaded through `addModule` and — unlike Web
90
- // Workers — cannot load additional chunks at runtime (no `importScripts`, no
91
- // dynamic `import()`). The WorkletDependency wraps the call so every chunk is
92
- // pre-added via `addModule` from the calling scope (see WorkletDependency).
89
+ // A worklet is always a module script loaded through `addModule`, and unlike a
90
+ // Web Worker cannot load further chunks at runtime, so WorkletDependency wraps
91
+ // the call and pre-adds every chunk from the calling scope.
93
92
  const WORKLET_DEFAULT_SYNTAX = [
94
93
  "*context.audioWorklet.addModule()",
95
94
  "*audioWorklet.addModule()",
@@ -406,10 +405,9 @@ class WorkerAndWorkletPlugin {
406
405
  )
407
406
  );
408
407
  } else {
409
- // `webpackEntryOptions` is user input from a magic
410
- // comment, so copy only safe own keys to avoid
411
- // prototype pollution via `__proto__`/`constructor`/
412
- // `prototype`.
408
+ // `webpackEntryOptions` is user input from a magic comment, so
409
+ // only safe own keys are copied, against prototype pollution
410
+ // through `__proto__` or `constructor`.
413
411
  const userEntryOptions = importOptions.webpackEntryOptions;
414
412
  for (const key of Object.keys(userEntryOptions)) {
415
413
  if (
@@ -502,11 +500,9 @@ class WorkerAndWorkletPlugin {
502
500
 
503
501
  /** @type {ResourceHint | undefined} */
504
502
  let resourceHint;
505
- // Resource-hint comments belong to the asset expression — read
506
- // them from the inner `new URL(...)` range only, never from
507
- // elsewhere inside `new Worker(...)`. When `arg1` is bare
508
- // `import.meta.url` there is no `new URL` and no place for
509
- // the comments to go, so resource hints are skipped.
503
+ // Resource-hint comments belong to the asset expression, so they are
504
+ // read from the inner `new URL(...)` range alone. A bare
505
+ // `import.meta.url` has none, so its hints are skipped.
510
506
  if (arg1.type === "NewExpression") {
511
507
  const { options: urlImportOptions } = parser.parseCommentOptions(
512
508
  /** @type {Range} */ (arg1.range)
@@ -652,10 +648,9 @@ class WorkerAndWorkletPlugin {
652
648
  name: entryOptions.name,
653
649
  circular: false,
654
650
  entryOptions: {
655
- // A module worklet links its split chunks via native `import`
656
- // (resolved by `addModule`), so it keeps the module chunk
657
- // loading. A script worklet can't load chunks at runtime, so its
658
- // chunks use import-scripts and are pre-added from the calling scope.
651
+ // A module worklet links its split chunks through native `import`
652
+ // and keeps module chunk loading. A script worklet loads none at
653
+ // runtime, so its chunks are pre-added from the calling scope.
659
654
  chunkLoading: this._module
660
655
  ? this._chunkLoading
661
656
  : "import-scripts",
@@ -800,10 +795,9 @@ class WorkerAndWorkletPlugin {
800
795
  );
801
796
  }
802
797
 
803
- // Worklet parsing is opt-in: unset falls back to the `futureDefaults`
804
- // default, `false` disables it. It is not defaulted in
805
- // `config/defaults.js` because that would splice into the `"..."`
806
- // merge sentinel of a user-provided list.
798
+ // Worklet parsing is opt-in: unset falls back to `futureDefaults` and
799
+ // `false` disables it. Not defaulted in `config/defaults.js`, which
800
+ // would splice into a user list's `"..."` sentinel.
807
801
  const workletOption =
808
802
  parserOptions.worklet === undefined
809
803
  ? this._workletDefault
@@ -131,17 +131,17 @@ WorkerDependency.Template = class WorkerDependencyTemplate extends (
131
131
  );
132
132
  const chunk = entrypoint.getEntrypointChunk();
133
133
 
134
- // For ESM module output emit the analyzable `new URL("./worker.<name>.js",
135
- // import.meta.url)` form (literal specifier, no runtime helpers) so other bundlers
136
- // and webpack itself can statically follow the worker. A resource hint doesn't
137
- // block it: the `<link>` is emitted at chunk startup instead of wrapping the href,
138
- // which would turn the specifier into a non-analyzable expression.
134
+ // WHY: ESM module output emits the analyzable
135
+ // `new URL("./worker.<name>.js", import.meta.url)` form — a literal specifier,
136
+ // no runtime helpers — so other bundlers and webpack itself can statically
137
+ // follow the worker. A resource hint does not block it: the `<link>` is
138
+ // emitted at chunk startup instead of wrapping the href, which would turn the
139
+ // specifier into a non-analyzable expression.
139
140
  const analyzableSpecifier = runtimeTemplate.getAnalyzableWorkerUrl(
140
141
  dep.options.publicPath,
141
142
  chunk,
142
143
  templateContext.module,
143
- chunkGraph,
144
- runtimeRequirements
144
+ chunkGraph
145
145
  );
146
146
 
147
147
  if (analyzableSpecifier !== null) {
@@ -136,16 +136,14 @@ WorkletDependency.Template = class WorkletDependencyTemplate extends (
136
136
  const runtimeChunkId =
137
137
  runtimeChunk && runtimeChunk.id !== null ? runtimeChunk.id : null;
138
138
 
139
- // For ESM module output emit the analyzable `new URL("./worklet.<name>.js",
140
- // import.meta.url)` form (literal specifier, no runtime helpers) so other bundlers
141
- // and webpack itself can statically follow the worklet. The worklet chunk links its
142
- // splits via native `import`, so only the entry chunk is referenced.
139
+ // ESM output emits the analyzable `new URL("./worklet.<name>.js",
140
+ // import.meta.url)`, which another bundler can follow statically. Only the
141
+ // entry chunk is named, its splits being linked by native `import`.
143
142
  const analyzableSpecifier = runtimeTemplate.getAnalyzableWorkerUrl(
144
143
  dep.options.publicPath,
145
144
  entryChunk,
146
145
  module,
147
- chunkGraph,
148
- runtimeRequirements
146
+ chunkGraph
149
147
  );
150
148
  if (analyzableSpecifier !== null) {
151
149
  source.replace(
@@ -197,11 +195,9 @@ WorkletDependency.Template = class WorkletDependencyTemplate extends (
197
195
  return;
198
196
  }
199
197
 
200
- // A worklet can't load chunks at runtime, so every reachable chunk (initial
201
- // splits and async `import()` targets alike) is pre-added via `addModule`
202
- // from the calling scope. The runtime chunk is added last so it installs the
203
- // chunks pushed before it and runs entry startup with every module present
204
- // (see ImportScriptsChunkLoadingRuntimeModule).
198
+ // A worklet loads no chunks at runtime, so every reachable one is pre-added
199
+ // from the calling scope. The runtime chunk goes last, installing what came
200
+ // before it and running startup with every module present.
205
201
  /** @type {(string | number)[]} */
206
202
  const restChunkIds = [];
207
203
  for (const chunk of referencedChunks) {
@@ -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;