@depup/webpack 5.106.0-depup.0 → 5.109.0-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 (667) hide show
  1. package/README.md +9 -11
  2. package/changes.json +16 -24
  3. package/hot/dev-server.js +2 -0
  4. package/lib/APIPlugin.js +60 -35
  5. package/lib/AsyncDependenciesBlock.js +3 -0
  6. package/lib/AutomaticPrefetchPlugin.js +6 -1
  7. package/lib/BannerPlugin.js +13 -5
  8. package/lib/Cache.js +27 -5
  9. package/lib/CacheFacade.js +41 -0
  10. package/lib/Chunk.js +71 -25
  11. package/lib/ChunkGraph.js +141 -9
  12. package/lib/ChunkGroup.js +115 -28
  13. package/lib/ChunkTemplate.js +9 -0
  14. package/lib/CircularModulesPlugin.js +190 -0
  15. package/lib/CleanPlugin.js +23 -26
  16. package/lib/CodeGenerationResults.js +19 -0
  17. package/lib/CompatibilityPlugin.js +54 -37
  18. package/lib/Compilation.js +635 -107
  19. package/lib/Compiler.js +93 -31
  20. package/lib/ConcatenationScope.js +34 -4
  21. package/lib/ConditionalInitFragment.js +6 -0
  22. package/lib/ConstPlugin.js +15 -12
  23. package/lib/ContextExclusionPlugin.js +3 -1
  24. package/lib/ContextModule.js +345 -55
  25. package/lib/ContextModuleFactory.js +193 -51
  26. package/lib/ContextReplacementPlugin.js +8 -1
  27. package/lib/DefinePlugin.js +498 -127
  28. package/lib/DependenciesBlock.js +6 -1
  29. package/lib/Dependency.js +159 -11
  30. package/lib/DependencyTemplate.js +7 -1
  31. package/lib/DependencyTemplates.js +4 -0
  32. package/lib/DotenvPlugin.js +3 -0
  33. package/lib/DynamicEntryPlugin.js +3 -1
  34. package/lib/EntryOptionPlugin.js +42 -2
  35. package/lib/EntryPlugin.js +4 -1
  36. package/lib/Entrypoint.js +5 -1
  37. package/lib/EnvironmentPlugin.js +3 -2
  38. package/lib/ErrorHelpers.js +7 -0
  39. package/lib/EvalDevToolModulePlugin.js +3 -1
  40. package/lib/EvalSourceMapDevToolPlugin.js +11 -11
  41. package/lib/ExportsInfo.js +399 -108
  42. package/lib/ExportsInfoApiPlugin.js +4 -3
  43. package/lib/ExternalModule.js +376 -78
  44. package/lib/ExternalModuleFactoryPlugin.js +75 -3
  45. package/lib/ExternalsPlugin.js +3 -1
  46. package/lib/FileSystemInfo.js +575 -149
  47. package/lib/FlagAllModulesAsUsedPlugin.js +3 -6
  48. package/lib/FlagDependencyExportsPlugin.js +82 -9
  49. package/lib/FlagDependencyUsagePlugin.js +92 -6
  50. package/lib/FlagEntryExportAsUsedPlugin.js +4 -1
  51. package/lib/Generator.js +24 -3
  52. package/lib/HotModuleReplacementPlugin.js +110 -44
  53. package/lib/IgnorePlugin.js +5 -2
  54. package/lib/IgnoreWarningsPlugin.js +2 -1
  55. package/lib/InitFragment.js +15 -0
  56. package/lib/JavascriptMetaInfoPlugin.js +9 -6
  57. package/lib/LazyBarrel.js +389 -0
  58. package/lib/LibraryTemplatePlugin.js +2 -1
  59. package/lib/LoaderOptionsPlugin.js +3 -1
  60. package/lib/LoaderTargetPlugin.js +3 -1
  61. package/lib/MainTemplate.js +15 -0
  62. package/lib/ManifestPlugin.js +9 -2
  63. package/lib/Module.js +121 -60
  64. package/lib/ModuleFactory.js +6 -1
  65. package/lib/ModuleFilenameHelpers.js +5 -2
  66. package/lib/ModuleGraph.js +69 -2
  67. package/lib/ModuleGraphConnection.js +9 -0
  68. package/lib/ModuleInfoHeaderPlugin.js +5 -0
  69. package/lib/ModuleNotFoundError.js +3 -83
  70. package/lib/ModuleProfile.js +27 -1
  71. package/lib/ModuleSourceTypeConstants.js +52 -19
  72. package/lib/ModuleTemplate.js +10 -0
  73. package/lib/ModuleTypeConstants.js +20 -4
  74. package/lib/MultiCompiler.js +59 -4
  75. package/lib/MultiStats.js +9 -0
  76. package/lib/MultiWatching.js +6 -0
  77. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  78. package/lib/NodeStuffPlugin.js +78 -46
  79. package/lib/NormalModule.js +485 -181
  80. package/lib/NormalModuleFactory.js +148 -29
  81. package/lib/NormalModuleReplacementPlugin.js +3 -1
  82. package/lib/NullFactory.js +1 -0
  83. package/lib/OptionsApply.js +1 -0
  84. package/lib/Parser.js +3 -1
  85. package/lib/PlatformPlugin.js +2 -1
  86. package/lib/PrefetchPlugin.js +4 -1
  87. package/lib/ProgressPlugin.js +351 -161
  88. package/lib/ProvidePlugin.js +6 -3
  89. package/lib/RawModule.js +32 -16
  90. package/lib/RecordIdsPlugin.js +9 -0
  91. package/lib/RequestShortener.js +8 -0
  92. package/lib/ResolverFactory.js +5 -0
  93. package/lib/RuntimeGlobals.js +58 -5
  94. package/lib/RuntimeModule.js +22 -7
  95. package/lib/RuntimePlugin.js +104 -26
  96. package/lib/RuntimeTemplate.js +616 -37
  97. package/lib/SelfModuleFactory.js +3 -0
  98. package/lib/SourceMapDevToolModuleOptionsPlugin.js +2 -0
  99. package/lib/SourceMapDevToolPlugin.js +341 -63
  100. package/lib/Stats.js +6 -0
  101. package/lib/Template.js +29 -3
  102. package/lib/TemplatedPathPlugin.js +505 -138
  103. package/lib/UseStrictPlugin.js +3 -2
  104. package/lib/WarnCaseSensitiveModulesPlugin.js +72 -3
  105. package/lib/WarnDeprecatedOptionPlugin.js +6 -2
  106. package/lib/WarnNoModeSetPlugin.js +18 -2
  107. package/lib/WatchIgnorePlugin.js +5 -1
  108. package/lib/Watching.js +25 -3
  109. package/lib/WebpackError.js +3 -74
  110. package/lib/WebpackIsIncludedPlugin.js +4 -2
  111. package/lib/WebpackOptionsApply.js +88 -25
  112. package/lib/WebpackOptionsDefaulter.js +1 -0
  113. package/lib/asset/AssetBytesGenerator.js +28 -10
  114. package/lib/asset/AssetBytesParser.js +1 -0
  115. package/lib/asset/AssetGenerator.js +199 -60
  116. package/lib/asset/AssetModule.js +47 -0
  117. package/lib/asset/AssetModulesPlugin.js +115 -24
  118. package/lib/asset/AssetParser.js +4 -2
  119. package/lib/asset/AssetSourceGenerator.js +26 -8
  120. package/lib/asset/AssetSourceParser.js +1 -0
  121. package/lib/asset/RawDataUrlModule.js +23 -13
  122. package/lib/asset/WebManifestGenerator.js +164 -0
  123. package/lib/asset/WebManifestParser.js +130 -0
  124. package/lib/async-modules/AsyncModuleHelpers.js +1 -0
  125. package/lib/async-modules/AwaitDependenciesInitFragment.js +18 -4
  126. package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
  127. package/lib/async-modules/isGeneratorLowered.js +26 -0
  128. package/lib/buildChunkGraph.js +107 -15
  129. package/lib/bun/BunTargetPlugin.js +42 -0
  130. package/lib/cache/AddBuildDependenciesPlugin.js +3 -1
  131. package/lib/cache/AddManagedPathsPlugin.js +5 -1
  132. package/lib/cache/IdleFileCachePlugin.js +6 -1
  133. package/lib/cache/MemoryCachePlugin.js +1 -1
  134. package/lib/cache/MemoryWithGcCachePlugin.js +4 -1
  135. package/lib/cache/PackFileCacheStrategy.js +43 -7
  136. package/lib/cache/ResolverCachePlugin.js +12 -1
  137. package/lib/cache/getLazyHashedEtag.js +13 -2
  138. package/lib/cache/mergeEtags.js +4 -0
  139. package/lib/cli.js +142 -20
  140. package/lib/config/browserslistTargetHandler.js +141 -0
  141. package/lib/config/defaults.js +591 -41
  142. package/lib/config/defineConfig.js +31 -0
  143. package/lib/config/normalization.js +46 -1
  144. package/lib/config/target.js +200 -2
  145. package/lib/container/ContainerEntryDependency.js +2 -0
  146. package/lib/container/ContainerEntryModule.js +27 -14
  147. package/lib/container/ContainerEntryModuleFactory.js +1 -0
  148. package/lib/container/ContainerExposedDependency.js +6 -2
  149. package/lib/container/ContainerPlugin.js +2 -1
  150. package/lib/container/ContainerReferencePlugin.js +3 -2
  151. package/lib/container/FallbackDependency.js +9 -7
  152. package/lib/container/FallbackItemDependency.js +1 -0
  153. package/lib/container/FallbackModule.js +22 -9
  154. package/lib/container/FallbackModuleFactory.js +1 -0
  155. package/lib/container/ModuleFederationPlugin.js +12 -26
  156. package/lib/container/RemoteModule.js +33 -10
  157. package/lib/container/RemoteRuntimeModule.js +15 -12
  158. package/lib/container/RemoteToExternalDependency.js +1 -0
  159. package/lib/container/options.js +7 -0
  160. package/lib/css/CssGenerator.js +534 -272
  161. package/lib/css/CssInjectStyleRuntimeModule.js +86 -70
  162. package/lib/css/CssLoadingRuntimeModule.js +156 -77
  163. package/lib/{CssModule.js → css/CssModule.js} +72 -37
  164. package/lib/css/CssModulesPlugin.js +356 -204
  165. package/lib/css/CssParser.js +3452 -1950
  166. package/lib/css/syntax.js +4058 -0
  167. package/lib/debug/ProfilingPlugin.js +33 -2
  168. package/lib/deno/DenoTargetPlugin.js +41 -0
  169. package/lib/dependencies/AMDDefineDependency.js +29 -17
  170. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +19 -6
  171. package/lib/dependencies/AMDPlugin.js +6 -3
  172. package/lib/dependencies/AMDRequireArrayDependency.js +13 -11
  173. package/lib/dependencies/AMDRequireContextDependency.js +10 -11
  174. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -0
  175. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +28 -14
  176. package/lib/dependencies/AMDRequireDependency.js +28 -20
  177. package/lib/dependencies/AMDRequireItemDependency.js +1 -0
  178. package/lib/dependencies/AMDRuntimeModules.js +3 -0
  179. package/lib/dependencies/CachedConstDependency.js +9 -1
  180. package/lib/dependencies/CommonJsDependencyHelpers.js +104 -0
  181. package/lib/dependencies/CommonJsExportRequireDependency.js +138 -38
  182. package/lib/dependencies/CommonJsExportsDependency.js +74 -20
  183. package/lib/dependencies/CommonJsExportsParserPlugin.js +246 -15
  184. package/lib/dependencies/CommonJsFullRequireDependency.js +62 -27
  185. package/lib/dependencies/CommonJsImportsParserPlugin.js +187 -24
  186. package/lib/dependencies/CommonJsPlugin.js +7 -4
  187. package/lib/dependencies/CommonJsRequireContextDependency.js +13 -13
  188. package/lib/dependencies/CommonJsRequireDependency.js +135 -13
  189. package/lib/dependencies/CommonJsSelfReferenceDependency.js +60 -16
  190. package/lib/dependencies/ConstDependency.js +22 -12
  191. package/lib/dependencies/ContextDependency.js +13 -2
  192. package/lib/dependencies/ContextDependencyHelpers.js +7 -4
  193. package/lib/dependencies/ContextDependencyTemplateAsId.js +2 -1
  194. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +1 -0
  195. package/lib/dependencies/ContextElementDependency.js +27 -14
  196. package/lib/dependencies/CreateRequireParserPlugin.js +14 -7
  197. package/lib/dependencies/CreateScriptUrlDependency.js +9 -7
  198. package/lib/dependencies/CriticalDependencyWarning.js +3 -1
  199. package/lib/dependencies/CssIcssExportDependency.js +682 -368
  200. package/lib/dependencies/CssIcssImportDependency.js +62 -17
  201. package/lib/dependencies/CssIcssSymbolDependency.js +36 -17
  202. package/lib/dependencies/CssImportDependency.js +37 -1
  203. package/lib/dependencies/CssUrlDependency.js +87 -14
  204. package/lib/dependencies/DelegatedSourceDependency.js +1 -0
  205. package/lib/dependencies/DllEntryDependency.js +12 -13
  206. package/lib/dependencies/DynamicExports.js +5 -0
  207. package/lib/dependencies/EntryDependency.js +1 -0
  208. package/lib/dependencies/ExportBindingInitFragment.js +164 -0
  209. package/lib/dependencies/ExportsInfoDependency.js +18 -12
  210. package/lib/dependencies/ExternalModuleDependency.js +13 -5
  211. package/lib/dependencies/ExternalModuleInitFragment.js +10 -5
  212. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +19 -12
  213. package/lib/dependencies/HarmonyAcceptDependency.js +24 -26
  214. package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -0
  215. package/lib/dependencies/HarmonyCompatibilityDependency.js +33 -14
  216. package/lib/dependencies/HarmonyDetectionParserPlugin.js +108 -30
  217. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +32 -2
  218. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +70 -33
  219. package/lib/dependencies/HarmonyExportExpressionDependency.js +140 -46
  220. package/lib/dependencies/HarmonyExportHeaderDependency.js +11 -9
  221. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +253 -37
  222. package/lib/dependencies/HarmonyExportInitFragment.js +28 -20
  223. package/lib/dependencies/HarmonyExportSpecifierDependency.js +88 -18
  224. package/lib/dependencies/HarmonyExports.js +6 -1
  225. package/lib/dependencies/HarmonyImportDependency.js +59 -3
  226. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +139 -146
  227. package/lib/dependencies/HarmonyImportGuard.js +426 -0
  228. package/lib/dependencies/HarmonyImportSideEffectDependency.js +22 -1
  229. package/lib/dependencies/HarmonyImportSpecifierDependency.js +136 -17
  230. package/lib/{HarmonyLinkingError.js → dependencies/HarmonyLinkingError.js} +6 -3
  231. package/lib/dependencies/HarmonyModulesPlugin.js +11 -1
  232. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +2 -1
  233. package/lib/dependencies/HtmlEntryDependency.js +1295 -0
  234. package/lib/dependencies/HtmlInlineHtmlDependency.js +107 -0
  235. package/lib/dependencies/HtmlInlineScriptDependency.js +126 -0
  236. package/lib/dependencies/HtmlInlineStyleDependency.js +152 -0
  237. package/lib/dependencies/HtmlSourceDependency.js +172 -0
  238. package/lib/dependencies/ImportContextDependency.js +9 -9
  239. package/lib/dependencies/ImportDependency.js +92 -3
  240. package/lib/dependencies/ImportEagerDependency.js +2 -0
  241. package/lib/dependencies/ImportMetaContextDependency.js +1 -0
  242. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +35 -19
  243. package/lib/dependencies/ImportMetaContextPlugin.js +40 -8
  244. package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
  245. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
  246. package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
  247. package/lib/dependencies/ImportMetaHotAcceptDependency.js +2 -0
  248. package/lib/dependencies/ImportMetaHotDeclineDependency.js +2 -0
  249. package/lib/dependencies/ImportMetaPlugin.js +595 -209
  250. package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
  251. package/lib/dependencies/ImportParserPlugin.js +114 -27
  252. package/lib/dependencies/ImportPhase.js +17 -11
  253. package/lib/dependencies/ImportPlugin.js +2 -1
  254. package/lib/dependencies/ImportWeakDependency.js +3 -0
  255. package/lib/dependencies/JsonExportsDependency.js +15 -10
  256. package/lib/dependencies/LoaderDependency.js +2 -0
  257. package/lib/dependencies/LoaderImportDependency.js +3 -0
  258. package/lib/dependencies/LoaderPlugin.js +9 -2
  259. package/lib/dependencies/LocalModule.js +15 -12
  260. package/lib/dependencies/LocalModuleDependency.js +15 -13
  261. package/lib/dependencies/LocalModulesHelpers.js +3 -0
  262. package/lib/dependencies/ModuleDecoratorDependency.js +16 -10
  263. package/lib/dependencies/ModuleDependency.js +14 -0
  264. package/lib/dependencies/ModuleDependencyTemplateAsId.js +1 -0
  265. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +1 -0
  266. package/lib/dependencies/ModuleHotAcceptDependency.js +2 -0
  267. package/lib/dependencies/ModuleHotDeclineDependency.js +2 -0
  268. package/lib/dependencies/ModuleInitFragmentDependency.js +19 -11
  269. package/lib/dependencies/NullDependency.js +2 -0
  270. package/lib/dependencies/PrefetchDependency.js +1 -0
  271. package/lib/dependencies/ProvidedDependency.js +36 -27
  272. package/lib/dependencies/PureExpressionDependency.js +14 -10
  273. package/lib/dependencies/RequireContextDependency.js +1 -0
  274. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -1
  275. package/lib/dependencies/RequireContextPlugin.js +2 -1
  276. package/lib/dependencies/RequireEnsureDependenciesBlock.js +1 -0
  277. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +4 -6
  278. package/lib/dependencies/RequireEnsureDependency.js +16 -13
  279. package/lib/dependencies/RequireEnsureItemDependency.js +1 -0
  280. package/lib/dependencies/RequireEnsurePlugin.js +2 -1
  281. package/lib/dependencies/RequireHeaderDependency.js +7 -4
  282. package/lib/dependencies/RequireIncludeDependency.js +2 -0
  283. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +11 -12
  284. package/lib/dependencies/RequireIncludePlugin.js +2 -1
  285. package/lib/{RequireJsStuffPlugin.js → dependencies/RequireJsStuffPlugin.js} +9 -8
  286. package/lib/dependencies/RequireResolveContextDependency.js +10 -11
  287. package/lib/dependencies/RequireResolveDependency.js +2 -0
  288. package/lib/dependencies/RequireResolveHeaderDependency.js +8 -5
  289. package/lib/dependencies/RuntimeRequirementsDependency.js +11 -8
  290. package/lib/dependencies/StaticExportsDependency.js +13 -10
  291. package/lib/dependencies/SystemPlugin.js +9 -6
  292. package/lib/dependencies/SystemRuntimeModule.js +1 -0
  293. package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
  294. package/lib/dependencies/URLContextDependency.js +8 -7
  295. package/lib/dependencies/URLDependency.js +157 -33
  296. package/lib/dependencies/URLPlugin.js +2 -0
  297. package/lib/dependencies/UnsupportedDependency.js +12 -13
  298. package/lib/dependencies/WebAssemblyExportImportedDependency.js +15 -16
  299. package/lib/dependencies/WebAssemblyImportDependency.js +19 -18
  300. package/lib/dependencies/WebpackIsIncludedDependency.js +3 -0
  301. package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +364 -114
  302. package/lib/dependencies/WorkerDependency.js +111 -27
  303. package/lib/dependencies/WorkletDependency.js +278 -0
  304. package/lib/dependencies/getFunctionExpression.js +1 -0
  305. package/lib/dependencies/processExportInfo.js +14 -11
  306. package/lib/{DelegatedModule.js → dll/DelegatedModule.js} +71 -44
  307. package/lib/{DelegatedModuleFactoryPlugin.js → dll/DelegatedModuleFactoryPlugin.js} +27 -4
  308. package/lib/{DelegatedPlugin.js → dll/DelegatedPlugin.js} +5 -3
  309. package/lib/{DllEntryPlugin.js → dll/DllEntryPlugin.js} +9 -5
  310. package/lib/{DllModule.js → dll/DllModule.js} +36 -24
  311. package/lib/{DllModuleFactory.js → dll/DllModuleFactory.js} +5 -4
  312. package/lib/{DllPlugin.js → dll/DllPlugin.js} +24 -6
  313. package/lib/{DllReferencePlugin.js → dll/DllReferencePlugin.js} +26 -18
  314. package/lib/{LibManifestPlugin.js → dll/LibManifestPlugin.js} +14 -10
  315. package/lib/electron/ElectronTargetPlugin.js +24 -5
  316. package/lib/{AbstractMethodError.js → errors/AbstractMethodError.js} +10 -1
  317. package/lib/{AsyncDependencyToInitialChunkError.js → errors/AsyncDependencyToInitialChunkError.js} +8 -3
  318. package/lib/errors/BuildCycleError.js +1 -1
  319. package/lib/{ChunkRenderError.js → errors/ChunkRenderError.js} +1 -1
  320. package/lib/{CodeGenerationError.js → errors/CodeGenerationError.js} +1 -1
  321. package/lib/{CommentCompilationWarning.js → errors/CommentCompilationWarning.js} +9 -3
  322. package/lib/{ConcurrentCompilationError.js → errors/ConcurrentCompilationError.js} +5 -2
  323. package/lib/{EnvironmentNotSupportAsyncWarning.js → errors/EnvironmentNotSupportAsyncWarning.js} +5 -5
  324. package/lib/{HookWebpackError.js → errors/HookWebpackError.js} +20 -16
  325. package/lib/{IgnoreErrorModuleFactory.js → errors/IgnoreErrorModuleFactory.js} +7 -4
  326. package/lib/{InvalidDependenciesModuleWarning.js → errors/InvalidDependenciesModuleWarning.js} +6 -3
  327. package/lib/errors/JSONParseError.js +115 -0
  328. package/lib/errors/LoaderLoadingError.js +20 -0
  329. package/lib/{ModuleBuildError.js → errors/ModuleBuildError.js} +22 -16
  330. package/lib/{ModuleDependencyError.js → errors/ModuleDependencyError.js} +10 -3
  331. package/lib/{ModuleDependencyWarning.js → errors/ModuleDependencyWarning.js} +13 -5
  332. package/lib/{ModuleError.js → errors/ModuleError.js} +10 -14
  333. package/lib/{ModuleHashingError.js → errors/ModuleHashingError.js} +5 -1
  334. package/lib/errors/ModuleNotFoundError.js +94 -0
  335. package/lib/errors/ModuleParseError.js +141 -0
  336. package/lib/{ModuleRestoreError.js → errors/ModuleRestoreError.js} +4 -1
  337. package/lib/{ModuleStoreError.js → errors/ModuleStoreError.js} +5 -1
  338. package/lib/{ModuleWarning.js → errors/ModuleWarning.js} +13 -14
  339. package/lib/{NodeStuffInWebError.js → errors/NodeStuffInWebError.js} +7 -5
  340. package/lib/errors/NonErrorEmittedError.js +30 -0
  341. package/lib/{UnhandledSchemeError.js → errors/UnhandledSchemeError.js} +9 -2
  342. package/lib/{UnsupportedFeatureWarning.js → errors/UnsupportedFeatureWarning.js} +4 -3
  343. package/lib/errors/WebpackError.js +84 -0
  344. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  345. package/lib/esm/ModuleChunkFormatPlugin.js +52 -15
  346. package/lib/esm/ModuleChunkLoadingPlugin.js +11 -3
  347. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +71 -49
  348. package/lib/hmr/HotModuleReplacement.runtime.js +175 -30
  349. package/lib/hmr/HotModuleReplacementRuntimeModule.js +8 -0
  350. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +173 -26
  351. package/lib/hmr/JavascriptHotModuleReplacementHelper.js +1 -0
  352. package/lib/hmr/LazyCompilationPlugin.js +154 -7
  353. package/lib/hmr/lazyCompilationBackend.js +34 -8
  354. package/lib/html/HtmlGenerator.js +1470 -0
  355. package/lib/html/HtmlModule.js +41 -0
  356. package/lib/html/HtmlModulesPlugin.js +1111 -0
  357. package/lib/html/HtmlParser.js +1970 -0
  358. package/lib/html/favicon.svg +1 -0
  359. package/lib/html/syntax.js +9020 -0
  360. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -1
  361. package/lib/ids/DeterministicChunkIdsPlugin.js +3 -1
  362. package/lib/ids/DeterministicModuleIdsPlugin.js +3 -1
  363. package/lib/ids/HashedModuleIdsPlugin.js +2 -1
  364. package/lib/ids/IdHelpers.js +25 -2
  365. package/lib/ids/NamedChunkIdsPlugin.js +3 -1
  366. package/lib/ids/NamedModuleIdsPlugin.js +3 -1
  367. package/lib/ids/NaturalChunkIdsPlugin.js +1 -1
  368. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  369. package/lib/ids/OccurrenceChunkIdsPlugin.js +2 -1
  370. package/lib/ids/OccurrenceModuleIdsPlugin.js +4 -1
  371. package/lib/ids/SyncModuleIdsPlugin.js +3 -1
  372. package/lib/index.js +66 -15
  373. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +5 -6
  374. package/lib/javascript/BasicEvaluatedExpression.js +370 -49
  375. package/lib/javascript/ChunkFormatHelpers.js +2 -1
  376. package/lib/javascript/ChunkHelpers.js +1 -0
  377. package/lib/javascript/CommonJsChunkFormatPlugin.js +1 -1
  378. package/lib/javascript/EnableChunkLoadingPlugin.js +6 -1
  379. package/lib/javascript/JavascriptGenerator.js +213 -51
  380. package/lib/javascript/JavascriptModule.js +54 -0
  381. package/lib/javascript/JavascriptModulesPlugin.js +579 -183
  382. package/lib/javascript/JavascriptParser.js +1289 -462
  383. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  384. package/lib/javascript/StartupHelpers.js +5 -0
  385. package/lib/javascript/syntax.js +4380 -0
  386. package/lib/json/JsonData.js +5 -0
  387. package/lib/json/JsonGenerator.js +21 -0
  388. package/lib/json/JsonModule.js +40 -0
  389. package/lib/json/JsonModulesPlugin.js +8 -1
  390. package/lib/json/JsonParser.js +18 -27
  391. package/lib/library/AbstractLibraryPlugin.js +17 -2
  392. package/lib/library/AmdLibraryPlugin.js +8 -0
  393. package/lib/library/AssignLibraryPlugin.js +21 -3
  394. package/lib/library/EnableLibraryPlugin.js +8 -2
  395. package/lib/library/ExportPropertyLibraryPlugin.js +10 -0
  396. package/lib/{FalseIIFEUmdWarning.js → library/FalseIIFEUmdWarning.js} +2 -1
  397. package/lib/library/JsonpLibraryPlugin.js +8 -0
  398. package/lib/library/ModuleLibraryPlugin.js +154 -7
  399. package/lib/library/SystemLibraryPlugin.js +11 -3
  400. package/lib/library/UmdLibraryPlugin.js +16 -0
  401. package/lib/loaders/LoaderRunner.js +714 -0
  402. package/lib/loaders/loadLoader.js +100 -0
  403. package/lib/logging/Logger.js +17 -0
  404. package/lib/logging/createConsoleLogger.js +7 -0
  405. package/lib/logging/runtime.js +2 -0
  406. package/lib/logging/truncateArgs.js +2 -0
  407. package/lib/node/CommonJsChunkLoadingPlugin.js +5 -1
  408. package/lib/node/NodeEnvironmentPlugin.js +7 -3
  409. package/lib/node/NodeSourcePlugin.js +1 -1
  410. package/lib/node/NodeTargetPlugin.js +4 -63
  411. package/lib/node/NodeTemplatePlugin.js +3 -1
  412. package/lib/node/NodeWatchFileSystem.js +40 -22
  413. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +13 -9
  414. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +23 -1
  415. package/lib/node/ReadFileCompileWasmPlugin.js +18 -1
  416. package/lib/node/RequireChunkLoadingRuntimeModule.js +21 -16
  417. package/lib/node/nodeBuiltins.js +80 -0
  418. package/lib/node/nodeConsole.js +116 -64
  419. package/lib/optimize/AggressiveMergingPlugin.js +3 -1
  420. package/lib/optimize/AggressiveSplittingPlugin.js +6 -1
  421. package/lib/optimize/ConcatenatedModule.js +585 -116
  422. package/lib/optimize/ConstExportsPlugin.js +211 -0
  423. package/lib/optimize/EnsureChunkConditionsPlugin.js +2 -1
  424. package/lib/optimize/FlagIncludedChunksPlugin.js +15 -4
  425. package/lib/optimize/InlineExports.js +178 -0
  426. package/lib/optimize/InnerGraph.js +374 -262
  427. package/lib/optimize/InnerGraphPlugin.js +246 -117
  428. package/lib/optimize/LimitChunkCountPlugin.js +9 -0
  429. package/lib/optimize/MangleExportsPlugin.js +5 -1
  430. package/lib/optimize/MergeDuplicateChunksPlugin.js +2 -0
  431. package/lib/optimize/MinChunkSizePlugin.js +2 -1
  432. package/lib/optimize/MinMaxSizeWarning.js +5 -4
  433. package/lib/optimize/ModuleConcatenationPlugin.js +159 -34
  434. package/lib/optimize/RealContentHashPlugin.js +125 -50
  435. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -1
  436. package/lib/optimize/RemoveParentModulesPlugin.js +3 -1
  437. package/lib/optimize/RuntimeChunkPlugin.js +2 -1
  438. package/lib/optimize/SideEffectsFlagPlugin.js +381 -55
  439. package/lib/optimize/SplitChunksPlugin.js +54 -6
  440. package/lib/performance/AssetsOverSizeLimitWarning.js +3 -2
  441. package/lib/performance/EntrypointsOverSizeLimitWarning.js +3 -2
  442. package/lib/performance/NoAsyncChunksWarning.js +5 -3
  443. package/lib/performance/SizeLimitsPlugin.js +8 -2
  444. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +1 -0
  445. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +21 -0
  446. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +1 -0
  447. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -1
  448. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +25 -13
  449. package/lib/prefetch/ResourceHintPlugin.js +663 -0
  450. package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
  451. package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
  452. package/lib/prefetch/parseResourceHintOptions.js +103 -0
  453. package/lib/rules/BasicEffectRulePlugin.js +3 -0
  454. package/lib/rules/BasicMatcherRulePlugin.js +3 -0
  455. package/lib/rules/ObjectMatcherRulePlugin.js +3 -0
  456. package/lib/rules/RuleSetCompiler.js +132 -0
  457. package/lib/rules/UseEffectRulePlugin.js +10 -3
  458. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
  459. package/lib/runtime/AsyncModuleRuntimeModule.js +52 -33
  460. package/lib/runtime/AutoPublicPathRuntimeModule.js +22 -9
  461. package/lib/runtime/BaseUriRuntimeModule.js +1 -0
  462. package/lib/runtime/ChunkNameRuntimeModule.js +1 -0
  463. package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
  464. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +2 -1
  465. package/lib/runtime/CompatRuntimeModule.js +2 -0
  466. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
  467. package/lib/runtime/CreateScriptRuntimeModule.js +1 -0
  468. package/lib/runtime/CreateScriptUrlRuntimeModule.js +1 -0
  469. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +34 -4
  470. package/lib/runtime/EnsureChunkRuntimeModule.js +1 -0
  471. package/lib/runtime/GetChunkFilenameRuntimeModule.js +88 -8
  472. package/lib/runtime/GetFullHashRuntimeModule.js +1 -0
  473. package/lib/runtime/GetMainFilenameRuntimeModule.js +1 -0
  474. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -1
  475. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
  476. package/lib/runtime/GlobalRuntimeModule.js +1 -0
  477. package/lib/runtime/HasOwnPropertyRuntimeModule.js +2 -1
  478. package/lib/runtime/HelperRuntimeModule.js +5 -0
  479. package/lib/runtime/LoadScriptRuntimeModule.js +28 -37
  480. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +354 -37
  481. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +2 -1
  482. package/lib/runtime/NonceRuntimeModule.js +1 -0
  483. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -4
  484. package/lib/runtime/PublicPathRuntimeModule.js +1 -0
  485. package/lib/runtime/RelativeUrlRuntimeModule.js +4 -2
  486. package/lib/runtime/RuntimeIdRuntimeModule.js +1 -0
  487. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +38 -0
  488. package/lib/runtime/StartupChunkDependenciesPlugin.js +13 -1
  489. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +2 -1
  490. package/lib/runtime/StartupEntrypointRuntimeModule.js +5 -3
  491. package/lib/runtime/SystemContextRuntimeModule.js +1 -0
  492. package/lib/runtime/ToBinaryRuntimeModule.js +1 -0
  493. package/lib/runtime/WorkerRuntimeModule.js +33 -0
  494. package/lib/schemes/DataUriPlugin.js +14 -2
  495. package/lib/schemes/FileUriPlugin.js +1 -1
  496. package/lib/schemes/HttpUriPlugin.js +86 -4
  497. package/lib/schemes/VirtualUrlPlugin.js +8 -4
  498. package/lib/serialization/AggregateErrorSerializer.js +9 -6
  499. package/lib/serialization/ArraySerializer.js +6 -8
  500. package/lib/serialization/BinaryMiddleware.js +552 -463
  501. package/lib/serialization/DateObjectSerializer.js +4 -2
  502. package/lib/serialization/ErrorObjectSerializer.js +10 -6
  503. package/lib/serialization/FileMiddleware.js +50 -3
  504. package/lib/serialization/MapObjectSerializer.js +7 -9
  505. package/lib/serialization/NullPrototypeObjectSerializer.js +9 -9
  506. package/lib/serialization/ObjectMiddleware.js +73 -13
  507. package/lib/serialization/PlainObjectSerializer.js +16 -8
  508. package/lib/serialization/RegExpObjectSerializer.js +4 -2
  509. package/lib/serialization/Serializer.js +6 -0
  510. package/lib/serialization/SerializerMiddleware.js +14 -2
  511. package/lib/serialization/SetObjectSerializer.js +6 -8
  512. package/lib/serialization/SingleItemMiddleware.js +3 -0
  513. package/lib/sharing/ConsumeSharedFallbackDependency.js +1 -0
  514. package/lib/sharing/ConsumeSharedModule.js +21 -7
  515. package/lib/sharing/ConsumeSharedPlugin.js +11 -11
  516. package/lib/sharing/ConsumeSharedRuntimeModule.js +55 -45
  517. package/lib/sharing/ProvideForSharedDependency.js +1 -0
  518. package/lib/sharing/ProvideSharedDependency.js +34 -15
  519. package/lib/sharing/ProvideSharedModule.js +42 -12
  520. package/lib/sharing/ProvideSharedModuleFactory.js +1 -0
  521. package/lib/sharing/ProvideSharedPlugin.js +13 -8
  522. package/lib/sharing/SharePlugin.js +5 -1
  523. package/lib/sharing/ShareRuntimeModule.js +19 -16
  524. package/lib/sharing/resolveMatchedConfigs.js +6 -2
  525. package/lib/sharing/utils.js +9 -1
  526. package/lib/stats/DefaultStatsFactoryPlugin.js +94 -12
  527. package/lib/stats/DefaultStatsPresetPlugin.js +14 -2
  528. package/lib/stats/DefaultStatsPrinterPlugin.js +64 -18
  529. package/lib/stats/StatsFactory.js +39 -18
  530. package/lib/stats/StatsPrinter.js +16 -2
  531. package/lib/typescript/TypeScriptPlugin.js +210 -0
  532. package/lib/url/URLParserPlugin.js +111 -23
  533. package/lib/util/ArrayHelpers.js +1 -0
  534. package/lib/util/ArrayQueue.js +10 -5
  535. package/lib/util/AsyncQueue.js +154 -74
  536. package/lib/util/Hash.js +2 -2
  537. package/lib/util/IterableHelpers.js +3 -0
  538. package/lib/util/LazyBucketSortedSet.js +26 -0
  539. package/lib/util/LazySet.js +45 -4
  540. package/lib/util/LocConverter.js +64 -0
  541. package/lib/util/ParallelismFactorCalculator.js +1 -0
  542. package/lib/util/Queue.js +6 -3
  543. package/lib/util/Semaphore.js +15 -1
  544. package/lib/util/SetHelpers.js +4 -1
  545. package/lib/util/SortableSet.js +7 -1
  546. package/lib/util/SourceProcessor.js +119 -0
  547. package/lib/util/StackedCacheMap.js +20 -3
  548. package/lib/util/StackedMap.js +162 -43
  549. package/lib/util/StringXor.js +1 -1
  550. package/lib/util/TupleQueue.js +7 -3
  551. package/lib/util/TupleSet.js +14 -0
  552. package/lib/util/URLAbsoluteSpecifier.js +1 -0
  553. package/lib/util/WeakTupleMap.js +60 -1
  554. package/lib/util/binarySearchBounds.js +3 -2
  555. package/lib/util/chainedImports.js +3 -3
  556. package/lib/util/cleverMerge.js +19 -2
  557. package/lib/util/comparators.js +35 -4
  558. package/lib/util/compileBooleanMatcher.js +9 -0
  559. package/lib/util/concatenate.js +80 -24
  560. package/lib/util/conventions.js +46 -1
  561. package/lib/util/createHash.js +0 -1
  562. package/lib/util/createHooksRegistry.js +43 -0
  563. package/lib/util/createMappings.js +118 -0
  564. package/lib/util/dataURL.js +3 -2
  565. package/lib/util/deprecation.js +19 -0
  566. package/lib/util/deterministicGrouping.js +46 -17
  567. package/lib/util/extractSourceMap.js +2 -1
  568. package/lib/util/extractUrlAndGlobal.js +1 -0
  569. package/lib/util/findGraphRoots.js +7 -0
  570. package/lib/{formatLocation.js → util/formatLocation.js} +4 -2
  571. package/lib/{SizeFormatHelpers.js → util/formatSize.js} +10 -3
  572. package/lib/util/fs.js +87 -14
  573. package/lib/util/generateDebugId.js +1 -0
  574. package/lib/util/globUtils.js +710 -0
  575. package/lib/util/hash/BatchedHash.js +1 -0
  576. package/lib/util/hash/BulkUpdateHash.js +1 -0
  577. package/lib/util/hash/DebugHash.js +1 -0
  578. package/lib/util/hash/hash-digest.js +32 -15
  579. package/lib/util/hash/md4.js +1 -1
  580. package/lib/util/hash/wasm-hash.js +5 -0
  581. package/lib/util/hash/xxhash64.js +1 -1
  582. package/lib/util/identifier.js +97 -6
  583. package/lib/util/implicitTypeLoaderFallback.js +62 -0
  584. package/lib/util/internalSerializables.js +102 -60
  585. package/lib/util/magicComment.js +149 -7
  586. package/lib/util/makeSerializable.js +7 -0
  587. package/lib/util/memoize.js +2 -0
  588. package/lib/util/mimeTypes.js +176 -0
  589. package/lib/util/nonNumericOnlyHash.js +31 -1
  590. package/lib/util/numberHash.js +2 -2
  591. package/lib/util/parseJson.js +41 -0
  592. package/lib/util/processAsyncTree.js +8 -0
  593. package/lib/util/property.js +9 -2
  594. package/lib/util/publicPathPlaceholder.js +64 -0
  595. package/lib/util/registerExternalSerializer.js +24 -4
  596. package/lib/util/removeBOM.js +1 -0
  597. package/lib/util/runtime.js +32 -0
  598. package/lib/util/semver.js +15 -0
  599. package/lib/util/serialization.js +2 -0
  600. package/lib/util/smartGrouping.js +8 -0
  601. package/lib/util/source.js +23 -0
  602. package/lib/util/topologicalSort.js +69 -0
  603. package/lib/validateSchema.js +1 -0
  604. package/lib/wasm/EnableWasmLoadingPlugin.js +15 -1
  605. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +25 -18
  606. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +34 -22
  607. package/lib/wasm-async/AsyncWasmModule.js +77 -0
  608. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -0
  609. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +6 -1
  610. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +22 -126
  611. package/lib/wasm-async/AsyncWebAssemblyParser.js +3 -2
  612. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +13 -2
  613. package/lib/wasm-sync/SyncWasmModule.js +39 -0
  614. package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +7 -3
  615. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +86 -19
  616. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -3
  617. package/lib/wasm-sync/WebAssemblyGenerator.js +27 -1
  618. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +9 -3
  619. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +4 -0
  620. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +20 -1
  621. package/lib/wasm-sync/WebAssemblyParser.js +9 -3
  622. package/lib/wasm-sync/WebAssemblyUtils.js +2 -0
  623. package/lib/web/FetchCompileAsyncWasmPlugin.js +29 -1
  624. package/lib/web/FetchCompileWasmPlugin.js +27 -1
  625. package/lib/web/JsonpChunkLoadingPlugin.js +11 -1
  626. package/lib/web/JsonpChunkLoadingRuntimeModule.js +58 -64
  627. package/lib/web/JsonpTemplatePlugin.js +2 -1
  628. package/lib/webpack.js +78 -1
  629. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +10 -1
  630. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +15 -10
  631. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  632. package/module.d.ts +21 -0
  633. package/package.json +79 -77
  634. package/schemas/WebpackOptions.check.js +1 -1
  635. package/schemas/WebpackOptions.json +1117 -79
  636. package/schemas/plugins/{DllPlugin.check.d.ts → HtmlGeneratorOptions.check.d.ts} +1 -1
  637. package/schemas/plugins/HtmlGeneratorOptions.check.js +6 -0
  638. package/schemas/plugins/HtmlGeneratorOptions.json +3 -0
  639. package/schemas/plugins/{DllReferencePlugin.check.d.ts → HtmlParserOptions.check.d.ts} +1 -1
  640. package/schemas/plugins/HtmlParserOptions.check.js +6 -0
  641. package/schemas/plugins/HtmlParserOptions.json +3 -0
  642. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  643. package/schemas/plugins/ProgressPlugin.json +38 -0
  644. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  645. package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
  646. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  647. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  648. package/schemas/plugins/container/ModuleFederationPlugin.json +2 -0
  649. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.d.ts +7 -0
  650. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +6 -0
  651. package/schemas/plugins/css/CssAutoOrModuleParserOptions.json +3 -0
  652. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  653. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  654. package/schemas/plugins/dll/DllPlugin.check.d.ts +7 -0
  655. package/schemas/plugins/dll/DllReferencePlugin.check.d.ts +7 -0
  656. package/types.d.ts +8608 -1159
  657. package/lib/CaseSensitiveModulesWarning.js +0 -72
  658. package/lib/GraphHelpers.js +0 -46
  659. package/lib/ModuleParseError.js +0 -125
  660. package/lib/NoModeWarning.js +0 -23
  661. package/lib/css/CssMergeStyleSheetsRuntimeModule.js +0 -56
  662. package/lib/css/walkCssTokens.js +0 -1843
  663. package/lib/util/AppendOnlyStackedSet.js +0 -78
  664. /package/schemas/plugins/{DllPlugin.check.js → dll/DllPlugin.check.js} +0 -0
  665. /package/schemas/plugins/{DllPlugin.json → dll/DllPlugin.json} +0 -0
  666. /package/schemas/plugins/{DllReferencePlugin.check.js → dll/DllReferencePlugin.check.js} +0 -0
  667. /package/schemas/plugins/{DllReferencePlugin.json → dll/DllReferencePlugin.json} +0 -0
@@ -7,7 +7,7 @@
7
7
 
8
8
  const { pathToFileURL } = require("url");
9
9
  const { SyncBailHook } = require("tapable");
10
- const Compilation = require("../Compilation");
10
+ /** @typedef {import("../Compilation")} Compilation */
11
11
  const DefinePlugin = require("../DefinePlugin");
12
12
  const {
13
13
  JAVASCRIPT_MODULE_TYPE_AUTO,
@@ -22,15 +22,31 @@ const {
22
22
  evaluateToString,
23
23
  toConstantDependency
24
24
  } = require("../javascript/JavascriptParserHelpers");
25
+ const { getInnerGraphUtils } = require("../optimize/InnerGraph");
26
+ const createHooksRegistry = require("../util/createHooksRegistry");
25
27
  const { propertyAccess } = require("../util/property");
26
28
  const ConstDependency = require("./ConstDependency");
29
+ const ImportMetaResolveDependency = require("./ImportMetaResolveDependency");
27
30
  const ModuleInitFragmentDependency = require("./ModuleInitFragmentDependency");
28
31
 
32
+ // Loaded at module scope, not inside the parser handler: the async resolver
33
+ // cache tail can run that handler after a test tears down the module registry.
34
+ const WEBPACK_VERSION = Number.parseInt(
35
+ require("../../package.json").version,
36
+ 10
37
+ );
38
+
29
39
  /** @typedef {import("estree").MemberExpression} MemberExpression */
30
40
  /** @typedef {import("estree").Identifier} Identifier */
41
+ /** @typedef {import("estree").CallExpression} CallExpression */
42
+ /** @typedef {import("estree").Expression} Expression */
43
+ /** @typedef {import("estree").Super} Super */
31
44
  /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
32
45
  /** @typedef {import("../Compiler")} Compiler */
46
+ /** @typedef {import("../DefinePlugin").MergedDefinitionNode} MergedDefinitionNode */
33
47
  /** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
48
+ /** @typedef {import("../Module").ValueCacheVersion} ValueCacheVersion */
49
+ /** @typedef {import("../NormalModule").NormalModuleBuildInfo} NormalModuleBuildInfo */
34
50
  /** @typedef {import("../NormalModule")} NormalModule */
35
51
  /** @typedef {import("../javascript/JavascriptParser")} Parser */
36
52
  /** @typedef {import("../javascript/JavascriptParser").Range} Range */
@@ -40,69 +56,160 @@ const ModuleInitFragmentDependency = require("./ModuleInitFragmentDependency");
40
56
 
41
57
  const PLUGIN_NAME = "ImportMetaPlugin";
42
58
 
43
- /** @type {WeakMap<Compilation, { stringify: string, env: Record<string, string> }>} */
44
- const compilationMetaEnvMap = new WeakMap();
59
+ const IMPORT_META = "import.meta";
60
+ const IMPORT_META_URL = "import.meta.url";
61
+ const IMPORT_META_WEBPACK = "import.meta.webpack";
62
+ const IMPORT_META_MAIN = "import.meta.main";
63
+ const IMPORT_META_ENV = "import.meta.env";
64
+ const IMPORT_META_DIRNAME = "import.meta.dirname";
65
+ const IMPORT_META_FILENAME = "import.meta.filename";
66
+ const IMPORT_META_RESOLVE = "import.meta.resolve";
67
+
68
+ const IMPORT_META_FIELDS = new Set([
69
+ "url",
70
+ "webpack",
71
+ "main",
72
+ "env",
73
+ "dirname",
74
+ "filename",
75
+ "resolve",
76
+ "webpackContext",
77
+ "webpackHot"
78
+ ]);
79
+
80
+ // Single source of truth for `import.meta` accesses that only exist in ES modules
81
+ // and therefore mark a module as ESM (consumed by HarmonyDetectionParserPlugin).
82
+ // `dirname`/`filename` are resolved by NodeStuffPlugin, the rest here. The webpack
83
+ // pragmas `import.meta.webpackHot`/`webpackContext` are intentionally excluded:
84
+ // they are usable in CommonJS modules and must not force ESM.
85
+ const IMPORT_META_NAMES = [
86
+ IMPORT_META,
87
+ IMPORT_META_URL,
88
+ IMPORT_META_WEBPACK,
89
+ IMPORT_META_MAIN,
90
+ IMPORT_META_ENV,
91
+ IMPORT_META_DIRNAME,
92
+ IMPORT_META_FILENAME,
93
+ IMPORT_META_RESOLVE
94
+ ];
95
+
96
+ // Ordering contract for import.meta parser hooks across plugins: ESM detection
97
+ // (HarmonyDetectionParserPlugin, non-bailing) must observe every access before
98
+ // any bailing replacement; the merged replacements here must run before
99
+ // DefinePlugin object defines (default stage 0) and its nested destructuring
100
+ // handler (stage 100).
101
+ const IMPORT_META_STAGE_ESM_DETECTION = -1000;
102
+ const IMPORT_META_STAGE_REPLACEMENT = -100;
103
+
104
+ /**
105
+ * import.meta definitions collected from DefinePlugin's merged view.
106
+ * @typedef {object} ImportMetaDefinitions
107
+ * @property {MergedDefinitionNode | undefined} envNode `import.meta.env` node (a map unless custom-defined)
108
+ * @property {Map<string, MergedDefinitionNode>} customProps custom (non-field) property nodes
109
+ */
110
+
111
+ /** @type {WeakMap<Compilation, ImportMetaDefinitions>} */
112
+ const compilationMetaDefinitionsMap = new WeakMap();
113
+
114
+ /**
115
+ * Returns true if unknown import.meta properties should be preserved.
116
+ * @param {JavascriptParserOptions["importMeta"]} importMeta parser option
117
+ * @returns {boolean} true when unknown properties should be preserved
118
+ */
119
+ const preserveUnknown = (importMeta) =>
120
+ importMeta === "preserve-unknown" ||
121
+ (Boolean(importMeta) && typeof importMeta === "object");
122
+
123
+ /**
124
+ * Checks whether webpack should handle an import.meta field.
125
+ * @param {JavascriptParserOptions["importMeta"]} importMeta parser option
126
+ * @param {string} field field name
127
+ * @returns {boolean} true when the field should be handled
128
+ */
129
+ const isImportMetaFieldEnabled = (importMeta, field) => {
130
+ if (importMeta === false) {
131
+ return false;
132
+ }
133
+ return !(
134
+ Boolean(importMeta) &&
135
+ typeof importMeta === "object" &&
136
+ /** @type {Record<string, boolean | undefined>} */ (importMeta)[field] ===
137
+ false
138
+ );
139
+ };
140
+
141
+ /**
142
+ * Checks whether the callee is the `import.meta.resolve` member.
143
+ * @param {Expression | Super} callee call callee
144
+ * @returns {boolean} true when the callee is `import.meta.resolve`
145
+ */
146
+ const isImportMetaResolveCallee = (callee) =>
147
+ callee.type === "MemberExpression" &&
148
+ callee.object.type === "MetaProperty" &&
149
+ callee.object.meta.name === "import" &&
150
+ callee.object.property.name === "meta" &&
151
+ (callee.computed
152
+ ? callee.property.type === "Literal" && callee.property.value === "resolve"
153
+ : callee.property.type === "Identifier" &&
154
+ callee.property.name === "resolve");
155
+
156
+ /**
157
+ * Only a single statically known specifier maps to an asset.
158
+ * @param {CallExpression} call the call expression
159
+ * @param {Parser} parser the parser
160
+ * @returns {string | undefined} the resolved static specifier, if any
161
+ */
162
+ const getImportMetaResolveRequest = (call, parser) => {
163
+ if (call.arguments.length !== 1) return undefined;
164
+ const [arg] = call.arguments;
165
+ if (arg.type === "SpreadElement") return undefined;
166
+ return parser.evaluateExpression(arg).asString();
167
+ };
45
168
 
46
169
  /**
47
- * Collect import.meta.env definitions from DefinePlugin and build JSON string
170
+ * Collects import.meta definitions from DefinePlugin's merged view
171
+ * (object form and dotted keys of every instance).
48
172
  * @param {Compilation} compilation the compilation
49
- * @returns {{ stringify: string, env: Record<string, string> }} env object as JSON string
173
+ * @returns {ImportMetaDefinitions} collected definitions
50
174
  */
51
- const collectImportMetaEnvDefinitions = (compilation) => {
52
- const cached = compilationMetaEnvMap.get(compilation);
175
+ const collectImportMetaDefinitions = (compilation) => {
176
+ const cached = compilationMetaDefinitionsMap.get(compilation);
53
177
  if (cached) {
54
178
  return cached;
55
179
  }
56
180
 
57
- const definePluginHooks = DefinePlugin.getCompilationHooks(compilation);
58
- const definitions = definePluginHooks.definitions.call({});
59
- /** @type {Record<string, string>} */
60
- const env = {};
61
- /** @type {string[]} */
62
- const pairs = [];
63
- for (const key of Object.keys(definitions)) {
64
- if (key.startsWith("import.meta.env.")) {
65
- const envKey = key.slice("import.meta.env.".length);
66
- const value = definitions[key];
67
- pairs.push(`${JSON.stringify(envKey)}:${value}`);
68
- env[envKey] = /** @type {string} */ (value);
181
+ const metaNode = DefinePlugin.getMergedDefinitionNode(
182
+ compilation,
183
+ IMPORT_META
184
+ );
185
+ /** @type {MergedDefinitionNode | undefined} */
186
+ let envNode;
187
+ /** @type {Map<string, MergedDefinitionNode>} */
188
+ const customProps = new Map();
189
+ if (metaNode instanceof Map) {
190
+ for (const [prop, node] of metaNode) {
191
+ if (prop === "env") {
192
+ envNode = node;
193
+ } else if (!IMPORT_META_FIELDS.has(prop)) {
194
+ // fields (url, webpack, …) are handled by their own logic
195
+ customProps.set(prop, node);
196
+ }
69
197
  }
70
198
  }
71
- const result = { stringify: `{${pairs.join(",")}}`, env };
72
- compilationMetaEnvMap.set(compilation, result);
199
+ const result = { envNode, customProps };
200
+ compilationMetaDefinitionsMap.set(compilation, result);
73
201
  return result;
74
202
  };
75
203
 
76
204
  /**
205
+ * Defines the import meta plugin hooks type used by this module.
77
206
  * @typedef {object} ImportMetaPluginHooks
78
207
  * @property {SyncBailHook<[DestructuringAssignmentProperty], string | void>} propertyInDestructuring
79
208
  */
80
209
 
81
- /** @type {WeakMap<Compilation, ImportMetaPluginHooks>} */
82
- const compilationHooksMap = new WeakMap();
83
-
84
210
  class ImportMetaPlugin {
85
211
  /**
86
- * @param {Compilation} compilation the compilation
87
- * @returns {ImportMetaPluginHooks} the attached hooks
88
- */
89
- static getCompilationHooks(compilation) {
90
- if (!(compilation instanceof Compilation)) {
91
- throw new TypeError(
92
- "The 'compilation' argument must be an instance of Compilation"
93
- );
94
- }
95
- let hooks = compilationHooksMap.get(compilation);
96
- if (hooks === undefined) {
97
- hooks = {
98
- propertyInDestructuring: new SyncBailHook(["property"])
99
- };
100
- compilationHooksMap.set(compilation, hooks);
101
- }
102
- return hooks;
103
- }
104
-
105
- /**
212
+ * Applies the plugin by registering its hooks on the compiler.
106
213
  * @param {Compiler} compiler compiler
107
214
  */
108
215
  apply(compiler) {
@@ -115,59 +222,158 @@ class ImportMetaPlugin {
115
222
  ModuleInitFragmentDependency,
116
223
  new ModuleInitFragmentDependency.Template()
117
224
  );
225
+ compilation.dependencyFactories.set(
226
+ ImportMetaResolveDependency,
227
+ normalModuleFactory
228
+ );
229
+ compilation.dependencyTemplates.set(
230
+ ImportMetaResolveDependency,
231
+ new ImportMetaResolveDependency.Template()
232
+ );
118
233
 
119
234
  /**
235
+ * Returns file url.
120
236
  * @param {NormalModule} module module
121
237
  * @returns {string} file url
122
238
  */
123
239
  const getUrl = (module) => pathToFileURL(module.resource).toString();
124
240
  /**
241
+ * Processes the provided parser.
125
242
  * @param {Parser} parser parser parser
126
243
  * @param {JavascriptParserOptions} parserOptions parserOptions
127
244
  * @returns {void}
128
245
  */
129
- const parserHandler = (parser, { importMeta }) => {
246
+ const parserHandler = (parser, { importMeta, url }) => {
130
247
  if (importMeta === false) {
131
248
  const { importMetaName } = compilation.outputOptions;
132
249
  if (importMetaName === "import.meta") return;
133
250
 
134
251
  parser.hooks.expression
135
- .for("import.meta")
252
+ .for(IMPORT_META)
136
253
  .tap(PLUGIN_NAME, (metaProperty) => {
137
254
  const dep = new ConstDependency(
138
255
  /** @type {string} */ (importMetaName),
139
256
  /** @type {Range} */ (metaProperty.range)
140
257
  );
141
- dep.loc = /** @type {DependencyLocation} */ (metaProperty.loc);
258
+ dep.loc = parser.getLocation(metaProperty);
142
259
  parser.state.module.addPresentationalDependency(dep);
143
260
  return true;
144
261
  });
145
262
  return;
146
263
  }
147
264
 
265
+ const { envNode, customProps: allCustomProps } =
266
+ collectImportMetaDefinitions(compilation);
267
+ // a non-object definition: DefinePlugin replaces the whole object
268
+ const envIsCustom =
269
+ envNode !== undefined && !(envNode instanceof Map);
270
+ // per-field parser options may disable custom properties too
271
+ /** @type {Map<string, MergedDefinitionNode>} */
272
+ const customProps = new Map();
273
+ for (const [prop, node] of allCustomProps) {
274
+ if (isImportMetaFieldEnabled(importMeta, prop)) {
275
+ customProps.set(prop, node);
276
+ }
277
+ }
278
+
279
+ /** @type {Map<string, ValueCacheVersion>} */
280
+ const definitionValueDependencies = new Map();
281
+ /**
282
+ * @param {string} name value cache key
283
+ */
284
+ const addDefinitionValueDependency = (name) => {
285
+ const version = compilation.valueCacheVersions.get(name);
286
+ // an undefined version would force a rebuild on every build
287
+ if (version !== undefined) {
288
+ definitionValueDependencies.set(name, version);
289
+ }
290
+ };
291
+ addDefinitionValueDependency(DefinePlugin.VALUE_DEP_MAIN);
292
+ if (isImportMetaFieldEnabled(importMeta, "env")) {
293
+ addDefinitionValueDependency(
294
+ DefinePlugin.VALUE_DEP_PREFIX + IMPORT_META_ENV
295
+ );
296
+ if (envNode instanceof Map) {
297
+ for (const envKey of envNode.keys()) {
298
+ addDefinitionValueDependency(
299
+ `${DefinePlugin.VALUE_DEP_PREFIX + IMPORT_META_ENV}.${envKey}`
300
+ );
301
+ }
302
+ }
303
+ }
304
+ for (const prop of customProps.keys()) {
305
+ addDefinitionValueDependency(
306
+ `${DefinePlugin.VALUE_DEP_PREFIX + IMPORT_META}.${prop}`
307
+ );
308
+ }
309
+ /**
310
+ * Records value dependencies for every inlined definition so
311
+ * cached modules rebuild when a definition value changes.
312
+ * @returns {void}
313
+ */
314
+ const addDefinitionValueDependencies = () => {
315
+ if (definitionValueDependencies.size === 0) return;
316
+ const buildInfo = /** @type {NormalModuleBuildInfo} */ (
317
+ parser.state.module.buildInfo
318
+ );
319
+ const valueDependencies =
320
+ buildInfo.valueDependencies ||
321
+ (buildInfo.valueDependencies = new Map());
322
+ for (const [name, version] of definitionValueDependencies) {
323
+ valueDependencies.set(name, version);
324
+ }
325
+ };
326
+ /**
327
+ * Renders a merged definition node at a use site.
328
+ * @param {MergedDefinitionNode | undefined} node node
329
+ * @param {string} key definition key
330
+ * @param {Set<string>=} objKeys used keys
331
+ * @returns {string} code
332
+ */
333
+ const renderDefinition = (node, key, objKeys) =>
334
+ node === undefined
335
+ ? "{}"
336
+ : DefinePlugin.stringifyMergedDefinition(
337
+ compilation,
338
+ parser,
339
+ node,
340
+ key,
341
+ objKeys
342
+ );
343
+
148
344
  // import.meta direct
149
- const webpackVersion = Number.parseInt(
150
- require("../../package.json").version,
151
- 10
152
- );
153
345
  const importMetaUrl = () =>
154
346
  JSON.stringify(getUrl(parser.state.module));
155
- const importMetaWebpackVersion = () => JSON.stringify(webpackVersion);
347
+ const importMetaWebpackVersion = () =>
348
+ JSON.stringify(WEBPACK_VERSION);
156
349
  /**
350
+ * Import meta unknown property.
157
351
  * @param {Members} members members
158
352
  * @returns {string} error message
159
353
  */
160
354
  const importMetaUnknownProperty = (members) => {
161
- if (importMeta === "preserve-unknown") {
355
+ if (
356
+ preserveUnknown(importMeta) ||
357
+ (IMPORT_META_FIELDS.has(members[0]) &&
358
+ !isImportMetaFieldEnabled(importMeta, members[0]))
359
+ ) {
162
360
  return `import.meta${propertyAccess(members, 0)}`;
163
361
  }
164
362
  return `${Template.toNormalComment(
165
363
  `unsupported import.meta.${members.join(".")}`
166
364
  )} undefined${propertyAccess(members, 1)}`;
167
365
  };
366
+ /**
367
+ * @param {string} field field name
368
+ * @returns {string} generated property
369
+ */
370
+ const importMetaRuntimeProperty = (field) =>
371
+ `[${JSON.stringify(field)}]: ${importMetaUnknownProperty([
372
+ field
373
+ ])},`;
168
374
 
169
375
  parser.hooks.typeof
170
- .for("import.meta")
376
+ .for(IMPORT_META)
171
377
  .tap(
172
378
  PLUGIN_NAME,
173
379
  toConstantDependency(parser, JSON.stringify("object"))
@@ -178,8 +384,17 @@ class ImportMetaPlugin {
178
384
  if (expr.type === "MetaProperty") return true;
179
385
  }
180
386
  );
387
+ // `import.meta` is always replaced by the synthesized object, so it
388
+ // must never become a variable alias: the alias declaration would keep
389
+ // the raw MetaProperty. Staged before DefinePlugin's canRename taps.
390
+ parser.hooks.canRename
391
+ .for(IMPORT_META)
392
+ .tap(
393
+ { name: PLUGIN_NAME, stage: IMPORT_META_STAGE_REPLACEMENT },
394
+ () => false
395
+ );
181
396
  parser.hooks.expression
182
- .for("import.meta")
397
+ .for(IMPORT_META)
183
398
  .tap(PLUGIN_NAME, (metaProperty) => {
184
399
  /** @type {RawRuntimeRequirements} */
185
400
  const runtimeRequirements = [];
@@ -189,43 +404,75 @@ class ImportMetaPlugin {
189
404
  parser.destructuringAssignmentPropertiesFor(metaProperty);
190
405
  if (!referencedPropertiesInDestructuring) {
191
406
  const varName = "__webpack_import_meta__";
192
- const { stringify: envStringify } =
193
- collectImportMetaEnvDefinitions(compilation);
194
- const knownProps =
195
- `{url: ${importMetaUrl()}, ` +
196
- `webpack: ${importMetaWebpackVersion()}, ` +
197
- `main: ${RuntimeGlobals.moduleCache}[${RuntimeGlobals.entryModuleId}] === ${moduleArgument}, ` +
198
- `env: ${envStringify}}`;
199
- const initCode =
200
- importMeta === "preserve-unknown"
201
- ? `var ${varName} = Object.assign(import.meta, ${knownProps});\n`
202
- : `var ${varName} = ${knownProps};\n`;
407
+ const knownProps = [];
408
+ if (isImportMetaFieldEnabled(importMeta, "url")) {
409
+ knownProps.push(`url: ${importMetaUrl()}`);
410
+ }
411
+ if (isImportMetaFieldEnabled(importMeta, "webpack")) {
412
+ knownProps.push(`webpack: ${importMetaWebpackVersion()}`);
413
+ }
414
+ if (isImportMetaFieldEnabled(importMeta, "main")) {
415
+ knownProps.push(
416
+ `main: ${RuntimeGlobals.moduleCache}[${RuntimeGlobals.entryModuleId}] === ${moduleArgument}`
417
+ );
418
+ }
419
+ if (isImportMetaFieldEnabled(importMeta, "env")) {
420
+ addDefinitionValueDependencies();
421
+ knownProps.push(
422
+ `env: ${renderDefinition(envNode, IMPORT_META_ENV)}`
423
+ );
424
+ }
425
+ for (const [prop, node] of customProps) {
426
+ addDefinitionValueDependencies();
427
+ knownProps.push(
428
+ `${DefinePlugin.toPropertyKey(prop)}: ${renderDefinition(
429
+ node,
430
+ `${IMPORT_META}.${prop}`
431
+ )}`
432
+ );
433
+ }
434
+ const initCode = preserveUnknown(importMeta)
435
+ ? `var ${varName} = Object.assign(import.meta, {${knownProps.join(
436
+ ", "
437
+ )}});\n`
438
+ : `var ${varName} = {${knownProps.join(", ")}};\n`;
439
+ /** @type {RawRuntimeRequirements} */
440
+ const initRuntimeRequirements = [
441
+ RuntimeGlobals.moduleCache,
442
+ RuntimeGlobals.entryModuleId,
443
+ RuntimeGlobals.module
444
+ ];
445
+ const initCodeRequirements =
446
+ DefinePlugin.getRuntimeRequirements(initCode);
447
+ if (initCodeRequirements) {
448
+ initRuntimeRequirements.push(...initCodeRequirements);
449
+ }
203
450
  const initDep = new ModuleInitFragmentDependency(
204
451
  initCode,
205
- [
206
- RuntimeGlobals.moduleCache,
207
- RuntimeGlobals.entryModuleId,
208
- RuntimeGlobals.module
209
- ],
452
+ initRuntimeRequirements,
210
453
  varName
211
454
  );
212
- initDep.loc = /** @type {DependencyLocation} */ (
213
- metaProperty.loc
214
- );
455
+ initDep.loc = parser.getLocation(metaProperty);
215
456
  parser.state.module.addPresentationalDependency(initDep);
216
457
  const dep = new ConstDependency(
217
458
  varName,
218
459
  /** @type {Range} */ (metaProperty.range),
219
460
  runtimeRequirements
220
461
  );
221
- dep.loc = /** @type {DependencyLocation} */ (metaProperty.loc);
462
+ dep.loc = parser.getLocation(metaProperty);
222
463
  parser.state.module.addPresentationalDependency(dep);
223
464
  return true;
224
465
  }
225
466
 
226
467
  let str = "";
227
468
  for (const prop of referencedPropertiesInDestructuring) {
228
- const value = hooks.propertyInDestructuring.call(prop);
469
+ const fieldEnabled = isImportMetaFieldEnabled(
470
+ importMeta,
471
+ prop.id
472
+ );
473
+ const value = fieldEnabled
474
+ ? hooks.propertyInDestructuring.call(prop)
475
+ : undefined;
229
476
 
230
477
  if (value) {
231
478
  str += value;
@@ -234,175 +481,283 @@ class ImportMetaPlugin {
234
481
 
235
482
  switch (prop.id) {
236
483
  case "url":
237
- str += `url: ${importMetaUrl()},`;
484
+ str += fieldEnabled
485
+ ? `url: ${importMetaUrl()},`
486
+ : importMetaRuntimeProperty(prop.id);
238
487
  break;
239
488
  case "webpack":
240
- str += `webpack: ${importMetaWebpackVersion()},`;
489
+ str += fieldEnabled
490
+ ? `webpack: ${importMetaWebpackVersion()},`
491
+ : importMetaRuntimeProperty(prop.id);
241
492
  break;
242
493
  case "main":
243
- str += `main: ${RuntimeGlobals.moduleCache}[${RuntimeGlobals.entryModuleId}] === ${moduleArgument},`;
244
- runtimeRequirements.push(
245
- RuntimeGlobals.moduleCache,
246
- RuntimeGlobals.entryModuleId,
247
- RuntimeGlobals.module
248
- );
494
+ if (fieldEnabled) {
495
+ str += `main: ${RuntimeGlobals.moduleCache}[${RuntimeGlobals.entryModuleId}] === ${moduleArgument},`;
496
+ runtimeRequirements.push(
497
+ RuntimeGlobals.moduleCache,
498
+ RuntimeGlobals.entryModuleId,
499
+ RuntimeGlobals.module
500
+ );
501
+ } else {
502
+ str += importMetaRuntimeProperty(prop.id);
503
+ }
249
504
  break;
250
505
  case "env":
251
- str += `env: ${collectImportMetaEnvDefinitions(compilation).stringify},`;
506
+ if (fieldEnabled) {
507
+ addDefinitionValueDependencies();
508
+ str += `env: ${renderDefinition(envNode, IMPORT_META_ENV)},`;
509
+ } else {
510
+ str += importMetaRuntimeProperty(prop.id);
511
+ }
252
512
  break;
253
- default:
254
- str += `[${JSON.stringify(
255
- prop.id
256
- )}]: ${importMetaUnknownProperty([prop.id])},`;
513
+ default: {
514
+ const node = customProps.get(prop.id);
515
+ if (node !== undefined) {
516
+ addDefinitionValueDependencies();
517
+ str += `${DefinePlugin.toPropertyKey(prop.id)}: ${renderDefinition(
518
+ node,
519
+ `${IMPORT_META}.${prop.id}`
520
+ )},`;
521
+ } else {
522
+ str += importMetaRuntimeProperty(prop.id);
523
+ }
257
524
  break;
525
+ }
258
526
  }
259
527
  }
528
+ const strCode = `({${str}})`;
529
+ const codeRequirements =
530
+ DefinePlugin.getRuntimeRequirements(strCode);
531
+ if (codeRequirements) {
532
+ runtimeRequirements.push(...codeRequirements);
533
+ }
260
534
  const dep = new ConstDependency(
261
- `({${str}})`,
535
+ strCode,
262
536
  /** @type {Range} */ (metaProperty.range),
263
537
  runtimeRequirements
264
538
  );
265
- dep.loc = /** @type {DependencyLocation} */ (metaProperty.loc);
539
+ dep.loc = parser.getLocation(metaProperty);
266
540
  parser.state.module.addPresentationalDependency(dep);
267
541
  return true;
268
542
  });
269
543
  parser.hooks.evaluateTypeof
270
- .for("import.meta")
544
+ .for(IMPORT_META)
271
545
  .tap(PLUGIN_NAME, evaluateToString("object"));
272
- parser.hooks.evaluateIdentifier.for("import.meta").tap(
546
+ parser.hooks.evaluateIdentifier.for(IMPORT_META).tap(
273
547
  PLUGIN_NAME,
274
- evaluateToIdentifier("import.meta", "import.meta", () => [], true)
548
+ evaluateToIdentifier(IMPORT_META, IMPORT_META, () => [], true)
275
549
  );
276
550
 
551
+ // custom import.meta properties defined only via nested dotted keys,
552
+ // e.g. reading `import.meta.build` with `"import.meta.build.time"` defined
553
+ if (customProps.size > 0) {
554
+ parser.hooks.expressionMemberChain
555
+ .for(IMPORT_META)
556
+ .tap(PLUGIN_NAME, (expr, members) => {
557
+ const node = customProps.get(members[0]);
558
+ if (node === undefined) return;
559
+ addDefinitionValueDependencies();
560
+ const strCode = `(${renderDefinition(
561
+ node,
562
+ `${IMPORT_META}.${members[0]}`
563
+ )})${propertyAccess(members, 1)}`;
564
+ return toConstantDependency(
565
+ parser,
566
+ strCode,
567
+ DefinePlugin.getRuntimeRequirements(strCode)
568
+ )(expr);
569
+ });
570
+ }
571
+
572
+ // import.meta.resolve — resolve a static specifier to the emitted
573
+ // asset URL string (the string form of `new URL(x, import.meta.url)`).
574
+ if (isImportMetaFieldEnabled(importMeta, "resolve")) {
575
+ const relative = url === "relative";
576
+ parser.hooks.call
577
+ .for(IMPORT_META_RESOLVE)
578
+ .tap(PLUGIN_NAME, (expr) => {
579
+ const call = /** @type {CallExpression} */ (expr);
580
+ // Non-static forms are left untouched for runtime evaluation.
581
+ const request = getImportMetaResolveRequest(call, parser);
582
+ if (request === undefined) return;
583
+ const range = /** @type {Range} */ (call.range);
584
+ const dep = new ImportMetaResolveDependency(
585
+ request,
586
+ range,
587
+ range,
588
+ relative
589
+ );
590
+ dep.loc = parser.getLocation(call);
591
+ parser.state.current.addDependency(dep);
592
+ getInnerGraphUtils(parser.state.compilation).onUsage(
593
+ parser.state,
594
+ (e) => (dep.usedByExports = e)
595
+ );
596
+ return true;
597
+ });
598
+ // Computing a URL string is side-effect free, so an unused result
599
+ // can be tree-shaken (matching `new URL(..., import.meta.url)`).
600
+ parser.hooks.isPure
601
+ .for("CallExpression")
602
+ .tap(PLUGIN_NAME, (expr) => {
603
+ const call = /** @type {CallExpression} */ (expr);
604
+ if (!isImportMetaResolveCallee(call.callee)) return;
605
+ if (getImportMetaResolveRequest(call, parser) !== undefined) {
606
+ return true;
607
+ }
608
+ });
609
+ }
610
+
277
611
  // import.meta.url
278
- parser.hooks.typeof
279
- .for("import.meta.url")
280
- .tap(
281
- PLUGIN_NAME,
282
- toConstantDependency(parser, JSON.stringify("string"))
283
- );
284
- parser.hooks.expression
285
- .for("import.meta.url")
286
- .tap(PLUGIN_NAME, (expr) => {
287
- const dep = new ConstDependency(
288
- importMetaUrl(),
289
- /** @type {Range} */ (expr.range)
612
+ if (isImportMetaFieldEnabled(importMeta, "url")) {
613
+ parser.hooks.typeof
614
+ .for(IMPORT_META_URL)
615
+ .tap(
616
+ PLUGIN_NAME,
617
+ toConstantDependency(parser, JSON.stringify("string"))
290
618
  );
291
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
292
- parser.state.module.addPresentationalDependency(dep);
293
- return true;
294
- });
295
- parser.hooks.evaluateTypeof
296
- .for("import.meta.url")
297
- .tap(PLUGIN_NAME, evaluateToString("string"));
298
- parser.hooks.evaluateIdentifier
299
- .for("import.meta.url")
300
- .tap(PLUGIN_NAME, (expr) =>
301
- new BasicEvaluatedExpression()
302
- .setString(getUrl(parser.state.module))
303
- .setRange(/** @type {Range} */ (expr.range))
304
- );
619
+ parser.hooks.expression
620
+ .for(IMPORT_META_URL)
621
+ .tap(PLUGIN_NAME, (expr) => {
622
+ const dep = new ConstDependency(
623
+ importMetaUrl(),
624
+ /** @type {Range} */ (expr.range)
625
+ );
626
+ dep.loc = parser.getLocation(expr);
627
+ parser.state.module.addPresentationalDependency(dep);
628
+ return true;
629
+ });
630
+ parser.hooks.evaluateTypeof
631
+ .for(IMPORT_META_URL)
632
+ .tap(PLUGIN_NAME, evaluateToString("string"));
633
+ parser.hooks.evaluateIdentifier
634
+ .for(IMPORT_META_URL)
635
+ .tap(PLUGIN_NAME, (expr) =>
636
+ new BasicEvaluatedExpression()
637
+ .setString(getUrl(parser.state.module))
638
+ .setRange(/** @type {Range} */ (expr.range))
639
+ );
640
+ }
305
641
 
306
642
  // import.meta.webpack
307
- parser.hooks.expression
308
- .for("import.meta.webpack")
309
- .tap(
310
- PLUGIN_NAME,
311
- toConstantDependency(parser, importMetaWebpackVersion())
312
- );
313
- parser.hooks.typeof
314
- .for("import.meta.webpack")
315
- .tap(
316
- PLUGIN_NAME,
317
- toConstantDependency(parser, JSON.stringify("number"))
318
- );
319
- parser.hooks.evaluateTypeof
320
- .for("import.meta.webpack")
321
- .tap(PLUGIN_NAME, evaluateToString("number"));
322
- parser.hooks.evaluateIdentifier
323
- .for("import.meta.webpack")
324
- .tap(PLUGIN_NAME, evaluateToNumber(webpackVersion));
643
+ if (isImportMetaFieldEnabled(importMeta, "webpack")) {
644
+ parser.hooks.expression
645
+ .for(IMPORT_META_WEBPACK)
646
+ .tap(
647
+ PLUGIN_NAME,
648
+ toConstantDependency(parser, importMetaWebpackVersion())
649
+ );
650
+ parser.hooks.typeof
651
+ .for(IMPORT_META_WEBPACK)
652
+ .tap(
653
+ PLUGIN_NAME,
654
+ toConstantDependency(parser, JSON.stringify("number"))
655
+ );
656
+ parser.hooks.evaluateTypeof
657
+ .for(IMPORT_META_WEBPACK)
658
+ .tap(PLUGIN_NAME, evaluateToString("number"));
659
+ parser.hooks.evaluateIdentifier
660
+ .for(IMPORT_META_WEBPACK)
661
+ .tap(PLUGIN_NAME, evaluateToNumber(WEBPACK_VERSION));
662
+ }
325
663
 
326
- parser.hooks.expression
327
- .for("import.meta.main")
328
- .tap(
329
- PLUGIN_NAME,
330
- toConstantDependency(
331
- parser,
332
- `${RuntimeGlobals.moduleCache}[${RuntimeGlobals.entryModuleId}] === ${RuntimeGlobals.module}`,
333
- [
334
- RuntimeGlobals.moduleCache,
335
- RuntimeGlobals.entryModuleId,
336
- RuntimeGlobals.module
337
- ]
338
- )
339
- );
340
- parser.hooks.typeof
341
- .for("import.meta.main")
342
- .tap(
343
- PLUGIN_NAME,
344
- toConstantDependency(parser, JSON.stringify("boolean"))
345
- );
346
- parser.hooks.evaluateTypeof
347
- .for("import.meta.main")
348
- .tap(PLUGIN_NAME, evaluateToString("boolean"));
664
+ if (isImportMetaFieldEnabled(importMeta, "main")) {
665
+ parser.hooks.expression
666
+ .for(IMPORT_META_MAIN)
667
+ .tap(
668
+ PLUGIN_NAME,
669
+ toConstantDependency(
670
+ parser,
671
+ `${RuntimeGlobals.moduleCache}[${RuntimeGlobals.entryModuleId}] === ${RuntimeGlobals.module}`,
672
+ [
673
+ RuntimeGlobals.moduleCache,
674
+ RuntimeGlobals.entryModuleId,
675
+ RuntimeGlobals.module
676
+ ]
677
+ )
678
+ );
679
+ parser.hooks.typeof
680
+ .for(IMPORT_META_MAIN)
681
+ .tap(
682
+ PLUGIN_NAME,
683
+ toConstantDependency(parser, JSON.stringify("boolean"))
684
+ );
685
+ parser.hooks.evaluateTypeof
686
+ .for(IMPORT_META_MAIN)
687
+ .tap(PLUGIN_NAME, evaluateToString("boolean"));
688
+ }
349
689
 
350
690
  // import.meta.env
351
- parser.hooks.typeof
352
- .for("import.meta.env")
353
- .tap(
354
- PLUGIN_NAME,
355
- toConstantDependency(parser, JSON.stringify("object"))
356
- );
357
- parser.hooks.expressionMemberChain
358
- .for("import.meta")
359
- .tap(PLUGIN_NAME, (expr, members) => {
360
- if (members[0] === "env" && members[1]) {
361
- const name = members[1];
362
- const { env } = collectImportMetaEnvDefinitions(compilation);
363
- if (!Object.prototype.hasOwnProperty.call(env, name)) {
364
- const dep = new ConstDependency(
365
- "undefined",
366
- /** @type {Range} */ (expr.range)
367
- );
368
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
369
- parser.state.module.addPresentationalDependency(dep);
370
- return true;
691
+ if (isImportMetaFieldEnabled(importMeta, "env")) {
692
+ parser.hooks.typeof
693
+ .for(IMPORT_META_ENV)
694
+ .tap(
695
+ PLUGIN_NAME,
696
+ toConstantDependency(parser, JSON.stringify("object"))
697
+ );
698
+ parser.hooks.expressionMemberChain
699
+ .for(IMPORT_META)
700
+ .tap(PLUGIN_NAME, (expr, members) => {
701
+ if (members[0] === "env" && members[1]) {
702
+ // members of a custom definition resolve on it at runtime
703
+ if (envIsCustom) return;
704
+ if (!(envNode instanceof Map) || !envNode.has(members[1])) {
705
+ return toConstantDependency(parser, "undefined")(expr);
706
+ }
371
707
  }
708
+ });
709
+ parser.hooks.expression.for(IMPORT_META_ENV).tap(
710
+ // before DefinePlugin object defines: merge every definition source
711
+ { name: PLUGIN_NAME, stage: IMPORT_META_STAGE_REPLACEMENT },
712
+ (expr) => {
713
+ // a custom definition replaces the whole object via DefinePlugin
714
+ if (envIsCustom) return;
715
+ addDefinitionValueDependencies();
716
+ const destructured =
717
+ parser.destructuringAssignmentPropertiesFor(expr);
718
+ const objKeys =
719
+ destructured &&
720
+ new Set([...destructured].map((prop) => prop.id));
721
+ const code = renderDefinition(
722
+ envNode,
723
+ IMPORT_META_ENV,
724
+ objKeys
725
+ );
726
+ const strCode = parser.isAsiPosition(
727
+ /** @type {Range} */ (expr.range)[0]
728
+ )
729
+ ? `;(${code})`
730
+ : `(${code})`;
731
+ return toConstantDependency(
732
+ parser,
733
+ strCode,
734
+ DefinePlugin.getRuntimeRequirements(strCode)
735
+ )(expr);
372
736
  }
373
- });
374
- parser.hooks.expression
375
- .for("import.meta.env")
376
- .tap(PLUGIN_NAME, (expr) => {
377
- const { stringify } =
378
- collectImportMetaEnvDefinitions(compilation);
379
-
380
- const dep = new ConstDependency(
381
- stringify,
382
- /** @type {Range} */ (expr.range)
383
- );
384
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
385
- parser.state.module.addPresentationalDependency(dep);
386
- return true;
387
- });
388
- parser.hooks.evaluateTypeof
389
- .for("import.meta.env")
390
- .tap(PLUGIN_NAME, evaluateToString("object"));
391
- parser.hooks.evaluateIdentifier
392
- .for("import.meta.env")
393
- .tap(PLUGIN_NAME, (expr) =>
394
- new BasicEvaluatedExpression()
395
- .setTruthy()
396
- .setSideEffects(false)
397
- .setRange(/** @type {Range} */ (expr.range))
398
737
  );
738
+ parser.hooks.evaluateTypeof
739
+ .for(IMPORT_META_ENV)
740
+ .tap(PLUGIN_NAME, evaluateToString("object"));
741
+ parser.hooks.evaluateIdentifier
742
+ .for(IMPORT_META_ENV)
743
+ .tap(PLUGIN_NAME, (expr) =>
744
+ new BasicEvaluatedExpression()
745
+ .setTruthy()
746
+ .setSideEffects(false)
747
+ .setRange(/** @type {Range} */ (expr.range))
748
+ );
749
+ }
399
750
 
400
751
  // Unknown properties
401
752
  parser.hooks.unhandledExpressionMemberChain
402
- .for("import.meta")
753
+ .for(IMPORT_META)
403
754
  .tap(PLUGIN_NAME, (expr, members) => {
404
755
  // unknown import.meta properties should be determined at runtime
405
- if (importMeta === "preserve-unknown") {
756
+ if (
757
+ preserveUnknown(importMeta) ||
758
+ (IMPORT_META_FIELDS.has(members[0]) &&
759
+ !isImportMetaFieldEnabled(importMeta, members[0]))
760
+ ) {
406
761
  return true;
407
762
  }
408
763
 
@@ -420,7 +775,7 @@ class ImportMetaPlugin {
420
775
  importMetaUnknownProperty(members),
421
776
  /** @type {Range} */ (expr.range)
422
777
  );
423
- dep.loc = /** @type {DependencyLocation} */ (expr.loc);
778
+ dep.loc = parser.getLocation(expr);
424
779
  parser.state.module.addPresentationalDependency(dep);
425
780
  return true;
426
781
  });
@@ -436,6 +791,24 @@ class ImportMetaPlugin {
436
791
  expr.property.type ===
437
792
  (expr.computed ? "Literal" : "Identifier")
438
793
  ) {
794
+ const prop = expr.computed
795
+ ? /** @type {import("estree").Literal} */ (expr.property)
796
+ .value
797
+ : /** @type {Identifier} */ (expr.property).name;
798
+ if (
799
+ !isImportMetaFieldEnabled(importMeta, String(prop)) ||
800
+ (preserveUnknown(importMeta) &&
801
+ !IMPORT_META_FIELDS.has(String(prop)))
802
+ ) {
803
+ return;
804
+ }
805
+ if (IMPORT_META_FIELDS.has(String(prop))) {
806
+ return;
807
+ }
808
+ // custom-defined properties evaluate via DefinePlugin/runtime
809
+ if (customProps.has(String(prop))) {
810
+ return;
811
+ }
439
812
  return new BasicEvaluatedExpression()
440
813
  .setUndefined()
441
814
  .setRange(/** @type {Range} */ (expr.range));
@@ -454,4 +827,17 @@ class ImportMetaPlugin {
454
827
  }
455
828
  }
456
829
 
830
+ ImportMetaPlugin.getCompilationHooks = createHooksRegistry(
831
+ () =>
832
+ /** @type {ImportMetaPluginHooks} */ ({
833
+ propertyInDestructuring: new SyncBailHook(["property"])
834
+ })
835
+ );
836
+
457
837
  module.exports = ImportMetaPlugin;
838
+ module.exports.IMPORT_META_DIRNAME = IMPORT_META_DIRNAME;
839
+ module.exports.IMPORT_META_FILENAME = IMPORT_META_FILENAME;
840
+ module.exports.IMPORT_META_NAMES = IMPORT_META_NAMES;
841
+ module.exports.IMPORT_META_STAGE_ESM_DETECTION =
842
+ IMPORT_META_STAGE_ESM_DETECTION;
843
+ module.exports.isImportMetaFieldEnabled = isImportMetaFieldEnabled;