webpack 5.107.2 → 5.108.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 (357) hide show
  1. package/hot/dev-server.js +2 -0
  2. package/lib/APIPlugin.js +8 -4
  3. package/lib/CacheFacade.js +7 -0
  4. package/lib/Chunk.js +4 -0
  5. package/lib/ChunkGraph.js +30 -9
  6. package/lib/CircularModulesPlugin.js +190 -0
  7. package/lib/CleanPlugin.js +2 -1
  8. package/lib/Compilation.js +396 -65
  9. package/lib/Compiler.js +25 -11
  10. package/lib/ConcatenationScope.js +10 -3
  11. package/lib/ContextExclusionPlugin.js +1 -0
  12. package/lib/ContextModule.js +92 -47
  13. package/lib/ContextReplacementPlugin.js +4 -0
  14. package/lib/DefinePlugin.js +89 -15
  15. package/lib/Dependency.js +111 -7
  16. package/lib/EntryOptionPlugin.js +39 -2
  17. package/lib/EntryPlugin.js +2 -0
  18. package/lib/ExportsInfo.js +314 -73
  19. package/lib/ExternalModule.js +82 -34
  20. package/lib/ExternalModuleFactoryPlugin.js +1 -0
  21. package/lib/ExternalsPlugin.js +1 -0
  22. package/lib/FileSystemInfo.js +173 -23
  23. package/lib/FlagAllModulesAsUsedPlugin.js +1 -5
  24. package/lib/FlagDependencyExportsPlugin.js +23 -0
  25. package/lib/FlagDependencyUsagePlugin.js +87 -5
  26. package/lib/FlagEntryExportAsUsedPlugin.js +2 -0
  27. package/lib/Generator.js +8 -0
  28. package/lib/HotModuleReplacementPlugin.js +65 -28
  29. package/lib/IgnorePlugin.js +1 -0
  30. package/lib/InitFragment.js +5 -0
  31. package/lib/JavascriptMetaInfoPlugin.js +7 -5
  32. package/lib/LazyBarrel.js +361 -0
  33. package/lib/LoaderTargetPlugin.js +1 -0
  34. package/lib/Module.js +21 -42
  35. package/lib/ModuleGraph.js +3 -2
  36. package/lib/ModuleProfile.js +27 -1
  37. package/lib/ModuleTemplate.js +2 -0
  38. package/lib/MultiCompiler.js +2 -0
  39. package/lib/MultiStats.js +1 -0
  40. package/lib/MultiWatching.js +2 -0
  41. package/lib/NodeStuffPlugin.js +22 -17
  42. package/lib/NormalModule.js +142 -80
  43. package/lib/NormalModuleReplacementPlugin.js +2 -0
  44. package/lib/PrefetchPlugin.js +2 -0
  45. package/lib/ProgressPlugin.js +8 -0
  46. package/lib/ProvidePlugin.js +1 -0
  47. package/lib/RawModule.js +20 -16
  48. package/lib/RecordIdsPlugin.js +1 -0
  49. package/lib/RuntimeGlobals.js +5 -0
  50. package/lib/RuntimePlugin.js +58 -26
  51. package/lib/RuntimeTemplate.js +278 -21
  52. package/lib/SelfModuleFactory.js +1 -0
  53. package/lib/SourceMapDevToolPlugin.js +3 -5
  54. package/lib/Stats.js +1 -0
  55. package/lib/Template.js +8 -2
  56. package/lib/TemplatedPathPlugin.js +473 -131
  57. package/lib/WarnCaseSensitiveModulesPlugin.js +1 -0
  58. package/lib/WarnDeprecatedOptionPlugin.js +4 -0
  59. package/lib/WarnNoModeSetPlugin.js +1 -0
  60. package/lib/WatchIgnorePlugin.js +1 -0
  61. package/lib/Watching.js +9 -0
  62. package/lib/WebpackOptionsApply.js +50 -5
  63. package/lib/asset/AssetBytesGenerator.js +11 -3
  64. package/lib/asset/AssetGenerator.js +47 -22
  65. package/lib/asset/AssetModule.js +47 -0
  66. package/lib/asset/AssetModulesPlugin.js +14 -14
  67. package/lib/asset/AssetParser.js +2 -2
  68. package/lib/asset/AssetSourceGenerator.js +8 -0
  69. package/lib/asset/RawDataUrlModule.js +12 -13
  70. package/lib/buildChunkGraph.js +64 -7
  71. package/lib/bun/BunTargetPlugin.js +48 -0
  72. package/lib/cache/AddBuildDependenciesPlugin.js +1 -0
  73. package/lib/cache/AddManagedPathsPlugin.js +3 -0
  74. package/lib/cache/IdleFileCachePlugin.js +4 -0
  75. package/lib/cache/MemoryWithGcCachePlugin.js +1 -0
  76. package/lib/cache/PackFileCacheStrategy.js +1 -0
  77. package/lib/cache/ResolverCachePlugin.js +2 -0
  78. package/lib/cache/mergeEtags.js +2 -0
  79. package/lib/cli.js +109 -19
  80. package/lib/config/browserslistTargetHandler.js +99 -0
  81. package/lib/config/defaults.js +147 -7
  82. package/lib/config/defineConfig.js +31 -0
  83. package/lib/config/normalization.js +5 -0
  84. package/lib/config/target.js +181 -2
  85. package/lib/container/ContainerEntryModule.js +15 -14
  86. package/lib/container/ContainerExposedDependency.js +2 -2
  87. package/lib/container/ContainerReferencePlugin.js +1 -1
  88. package/lib/container/FallbackDependency.js +5 -7
  89. package/lib/container/FallbackModule.js +10 -9
  90. package/lib/container/RemoteModule.js +20 -10
  91. package/lib/container/RemoteRuntimeModule.js +14 -12
  92. package/lib/css/CssGenerator.js +353 -327
  93. package/lib/css/CssInjectStyleRuntimeModule.js +36 -8
  94. package/lib/css/CssLoadingRuntimeModule.js +118 -47
  95. package/lib/css/CssModule.js +52 -23
  96. package/lib/css/CssModulesPlugin.js +107 -124
  97. package/lib/css/CssParser.js +2759 -2205
  98. package/lib/css/syntax.js +2859 -0
  99. package/lib/debug/ProfilingPlugin.js +2 -0
  100. package/lib/deno/DenoTargetPlugin.js +47 -0
  101. package/lib/dependencies/AMDDefineDependency.js +22 -17
  102. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +1 -0
  103. package/lib/dependencies/AMDRequireArrayDependency.js +7 -11
  104. package/lib/dependencies/AMDRequireContextDependency.js +7 -11
  105. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +1 -0
  106. package/lib/dependencies/AMDRequireDependency.js +24 -20
  107. package/lib/dependencies/CachedConstDependency.js +3 -0
  108. package/lib/dependencies/CommonJsDependencyHelpers.js +1 -0
  109. package/lib/dependencies/CommonJsExportRequireDependency.js +79 -31
  110. package/lib/dependencies/CommonJsExportsDependency.js +21 -16
  111. package/lib/dependencies/CommonJsExportsParserPlugin.js +230 -7
  112. package/lib/dependencies/CommonJsFullRequireDependency.js +27 -19
  113. package/lib/dependencies/CommonJsImportsParserPlugin.js +51 -16
  114. package/lib/dependencies/CommonJsPlugin.js +1 -1
  115. package/lib/dependencies/CommonJsRequireContextDependency.js +10 -13
  116. package/lib/dependencies/CommonJsRequireDependency.js +42 -11
  117. package/lib/dependencies/CommonJsSelfReferenceDependency.js +22 -14
  118. package/lib/dependencies/ConstDependency.js +16 -11
  119. package/lib/dependencies/ContextDependency.js +4 -0
  120. package/lib/dependencies/ContextDependencyTemplateAsId.js +1 -1
  121. package/lib/dependencies/ContextElementDependency.js +23 -14
  122. package/lib/dependencies/CreateRequireParserPlugin.js +1 -0
  123. package/lib/dependencies/CreateScriptUrlDependency.js +5 -7
  124. package/lib/dependencies/CriticalDependencyWarning.js +1 -0
  125. package/lib/dependencies/CssIcssExportDependency.js +512 -574
  126. package/lib/dependencies/CssIcssImportDependency.js +9 -9
  127. package/lib/dependencies/CssIcssSymbolDependency.js +22 -15
  128. package/lib/dependencies/CssImportDependency.js +25 -1
  129. package/lib/dependencies/CssUrlDependency.js +23 -14
  130. package/lib/dependencies/DllEntryDependency.js +9 -13
  131. package/lib/dependencies/ExportBindingInitFragment.js +164 -0
  132. package/lib/dependencies/ExportsInfoDependency.js +12 -12
  133. package/lib/dependencies/ExternalModuleDependency.js +8 -5
  134. package/lib/dependencies/ExternalModuleInitFragment.js +7 -5
  135. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +13 -10
  136. package/lib/dependencies/HarmonyAcceptDependency.js +11 -11
  137. package/lib/dependencies/HarmonyAcceptImportDependency.js +1 -0
  138. package/lib/dependencies/HarmonyDetectionParserPlugin.js +47 -22
  139. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +28 -2
  140. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +46 -22
  141. package/lib/dependencies/HarmonyExportExpressionDependency.js +107 -30
  142. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -9
  143. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +109 -31
  144. package/lib/dependencies/HarmonyExportInitFragment.js +18 -15
  145. package/lib/dependencies/HarmonyExportSpecifierDependency.js +83 -18
  146. package/lib/dependencies/HarmonyExports.js +4 -1
  147. package/lib/dependencies/HarmonyImportDependency.js +24 -0
  148. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +110 -74
  149. package/lib/dependencies/HarmonyImportGuard.js +254 -0
  150. package/lib/dependencies/HarmonyImportSideEffectDependency.js +18 -1
  151. package/lib/dependencies/HarmonyImportSpecifierDependency.js +118 -14
  152. package/lib/dependencies/HarmonyLinkingError.js +1 -0
  153. package/lib/dependencies/HarmonyModulesPlugin.js +1 -0
  154. package/lib/dependencies/{HtmlScriptSrcDependency.js → HtmlEntryDependency.js} +261 -109
  155. package/lib/dependencies/HtmlInlineHtmlDependency.js +107 -0
  156. package/lib/dependencies/HtmlInlineScriptDependency.js +17 -13
  157. package/lib/dependencies/HtmlInlineStyleDependency.js +45 -11
  158. package/lib/dependencies/ImportContextDependency.js +5 -9
  159. package/lib/dependencies/ImportDependency.js +44 -2
  160. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -0
  161. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -0
  162. package/lib/dependencies/ImportMetaPlugin.js +74 -30
  163. package/lib/dependencies/ImportParserPlugin.js +19 -0
  164. package/lib/dependencies/ImportWeakDependency.js +1 -0
  165. package/lib/dependencies/JsonExportsDependency.js +9 -9
  166. package/lib/dependencies/LoaderImportDependency.js +1 -0
  167. package/lib/dependencies/LocalModule.js +11 -12
  168. package/lib/dependencies/LocalModuleDependency.js +11 -13
  169. package/lib/dependencies/ModuleDecoratorDependency.js +9 -9
  170. package/lib/dependencies/ModuleDependency.js +7 -0
  171. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -0
  172. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -0
  173. package/lib/dependencies/ModuleInitFragmentDependency.js +15 -11
  174. package/lib/dependencies/ProvidedDependency.js +31 -27
  175. package/lib/dependencies/PureExpressionDependency.js +7 -9
  176. package/lib/dependencies/RequireEnsureDependency.js +12 -13
  177. package/lib/dependencies/RequireHeaderDependency.js +3 -4
  178. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +3 -0
  179. package/lib/dependencies/RequireResolveContextDependency.js +7 -11
  180. package/lib/dependencies/RequireResolveDependency.js +1 -0
  181. package/lib/dependencies/RequireResolveHeaderDependency.js +3 -5
  182. package/lib/dependencies/RuntimeRequirementsDependency.js +6 -7
  183. package/lib/dependencies/StaticExportsDependency.js +10 -10
  184. package/lib/dependencies/SystemPlugin.js +2 -0
  185. package/lib/dependencies/URLContextDependency.js +5 -7
  186. package/lib/dependencies/URLDependency.js +14 -16
  187. package/lib/dependencies/UnsupportedDependency.js +8 -13
  188. package/lib/dependencies/WebAssemblyExportImportedDependency.js +11 -16
  189. package/lib/dependencies/WebAssemblyImportDependency.js +14 -16
  190. package/lib/dependencies/WebpackIsIncludedDependency.js +1 -0
  191. package/lib/dependencies/WorkerDependency.js +19 -8
  192. package/lib/dependencies/WorkerPlugin.js +22 -6
  193. package/lib/dependencies/processExportInfo.js +13 -11
  194. package/lib/dll/DelegatedModule.js +29 -15
  195. package/lib/dll/DelegatedModuleFactoryPlugin.js +1 -0
  196. package/lib/dll/DelegatedPlugin.js +1 -0
  197. package/lib/dll/DllEntryPlugin.js +3 -0
  198. package/lib/dll/DllModule.js +3 -2
  199. package/lib/dll/DllPlugin.js +16 -0
  200. package/lib/dll/DllReferencePlugin.js +3 -0
  201. package/lib/dll/LibManifestPlugin.js +1 -0
  202. package/lib/electron/ElectronTargetPlugin.js +22 -4
  203. package/lib/errors/ConcurrentCompilationError.js +1 -0
  204. package/lib/errors/HookWebpackError.js +11 -13
  205. package/lib/errors/IgnoreErrorModuleFactory.js +1 -0
  206. package/lib/errors/InvalidDependenciesModuleWarning.js +2 -0
  207. package/lib/errors/JSONParseError.js +9 -8
  208. package/lib/errors/ModuleBuildError.js +16 -13
  209. package/lib/errors/ModuleDependencyError.js +8 -1
  210. package/lib/errors/ModuleDependencyWarning.js +8 -1
  211. package/lib/errors/ModuleError.js +5 -11
  212. package/lib/errors/ModuleHashingError.js +4 -0
  213. package/lib/errors/ModuleNotFoundError.js +3 -0
  214. package/lib/errors/ModuleParseError.js +5 -11
  215. package/lib/errors/ModuleRestoreError.js +2 -0
  216. package/lib/errors/ModuleStoreError.js +3 -0
  217. package/lib/errors/ModuleWarning.js +7 -11
  218. package/lib/errors/NodeStuffInWebError.js +1 -0
  219. package/lib/errors/NonErrorEmittedError.js +2 -0
  220. package/lib/errors/UnhandledSchemeError.js +1 -0
  221. package/lib/esm/ModuleChunkLoadingPlugin.js +0 -1
  222. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +28 -23
  223. package/lib/hmr/HotModuleReplacement.runtime.js +175 -30
  224. package/lib/hmr/HotModuleReplacementRuntimeModule.js +7 -0
  225. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +173 -26
  226. package/lib/hmr/LazyCompilationPlugin.js +30 -6
  227. package/lib/html/HtmlGenerator.js +217 -23
  228. package/lib/html/HtmlModule.js +40 -0
  229. package/lib/html/HtmlModulesPlugin.js +219 -55
  230. package/lib/html/HtmlParser.js +1108 -1099
  231. package/lib/html/{walkHtmlTokens.js → syntax.js} +4701 -212
  232. package/lib/ids/IdHelpers.js +4 -2
  233. package/lib/index.js +19 -0
  234. package/lib/javascript/BasicEvaluatedExpression.js +1 -0
  235. package/lib/javascript/EnableChunkLoadingPlugin.js +1 -0
  236. package/lib/javascript/JavascriptGenerator.js +6 -2
  237. package/lib/javascript/JavascriptModule.js +54 -0
  238. package/lib/javascript/JavascriptModulesPlugin.js +257 -102
  239. package/lib/javascript/JavascriptParser.js +285 -158
  240. package/lib/json/JsonModule.js +40 -0
  241. package/lib/json/JsonModulesPlugin.js +7 -0
  242. package/lib/json/JsonParser.js +4 -2
  243. package/lib/library/AssignLibraryPlugin.js +5 -3
  244. package/lib/library/ExportPropertyLibraryPlugin.js +1 -0
  245. package/lib/library/FalseIIFEUmdWarning.js +1 -0
  246. package/lib/library/ModuleLibraryPlugin.js +24 -5
  247. package/lib/library/SystemLibraryPlugin.js +3 -3
  248. package/lib/node/NodeTargetPlugin.js +1 -0
  249. package/lib/node/NodeWatchFileSystem.js +1 -0
  250. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +10 -9
  251. package/lib/node/RequireChunkLoadingRuntimeModule.js +18 -16
  252. package/lib/optimize/ConcatenatedModule.js +395 -77
  253. package/lib/optimize/ConstExportsPlugin.js +211 -0
  254. package/lib/optimize/InlineExports.js +178 -0
  255. package/lib/optimize/InnerGraph.js +372 -275
  256. package/lib/optimize/InnerGraphPlugin.js +196 -99
  257. package/lib/optimize/ModuleConcatenationPlugin.js +56 -25
  258. package/lib/optimize/RealContentHashPlugin.js +14 -1
  259. package/lib/optimize/SideEffectsFlagPlugin.js +234 -64
  260. package/lib/runtime/AsyncModuleRuntimeModule.js +32 -30
  261. package/lib/runtime/AutoPublicPathRuntimeModule.js +11 -5
  262. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +1 -1
  263. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +6 -4
  264. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +33 -4
  265. package/lib/runtime/GetChunkFilenameRuntimeModule.js +82 -3
  266. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +1 -1
  267. package/lib/runtime/HasOwnPropertyRuntimeModule.js +1 -1
  268. package/lib/runtime/LoadScriptRuntimeModule.js +18 -13
  269. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +39 -26
  270. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +1 -1
  271. package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -4
  272. package/lib/runtime/RelativeUrlRuntimeModule.js +3 -2
  273. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +1 -1
  274. package/lib/runtime/StartupEntrypointRuntimeModule.js +4 -3
  275. package/lib/runtime/WorkerRuntimeModule.js +33 -0
  276. package/lib/schemes/HttpUriPlugin.js +3 -2
  277. package/lib/serialization/AggregateErrorSerializer.js +7 -6
  278. package/lib/serialization/ArraySerializer.js +4 -8
  279. package/lib/serialization/BinaryMiddleware.js +538 -468
  280. package/lib/serialization/DateObjectSerializer.js +2 -2
  281. package/lib/serialization/ErrorObjectSerializer.js +7 -6
  282. package/lib/serialization/MapObjectSerializer.js +5 -9
  283. package/lib/serialization/NullPrototypeObjectSerializer.js +7 -9
  284. package/lib/serialization/ObjectMiddleware.js +50 -13
  285. package/lib/serialization/PlainObjectSerializer.js +9 -8
  286. package/lib/serialization/RegExpObjectSerializer.js +2 -2
  287. package/lib/serialization/Serializer.js +1 -0
  288. package/lib/serialization/SetObjectSerializer.js +4 -8
  289. package/lib/sharing/ConsumeSharedModule.js +6 -7
  290. package/lib/sharing/ConsumeSharedPlugin.js +1 -0
  291. package/lib/sharing/ConsumeSharedRuntimeModule.js +46 -41
  292. package/lib/sharing/ProvideSharedDependency.js +30 -15
  293. package/lib/sharing/ProvideSharedModule.js +30 -11
  294. package/lib/sharing/ProvideSharedPlugin.js +4 -2
  295. package/lib/sharing/SharePlugin.js +3 -0
  296. package/lib/sharing/ShareRuntimeModule.js +18 -16
  297. package/lib/sharing/resolveMatchedConfigs.js +2 -1
  298. package/lib/sharing/utils.js +1 -1
  299. package/lib/stats/DefaultStatsFactoryPlugin.js +4 -6
  300. package/lib/stats/DefaultStatsPrinterPlugin.js +14 -14
  301. package/lib/stats/StatsFactory.js +11 -9
  302. package/lib/stats/StatsPrinter.js +9 -2
  303. package/lib/url/URLParserPlugin.js +5 -2
  304. package/lib/util/AsyncQueue.js +10 -0
  305. package/lib/util/LazyBucketSortedSet.js +5 -0
  306. package/lib/util/LazySet.js +6 -4
  307. package/lib/util/LocConverter.js +11 -1
  308. package/lib/util/Semaphore.js +1 -0
  309. package/lib/util/SourceProcessor.js +106 -0
  310. package/lib/util/TupleSet.js +1 -0
  311. package/lib/util/WeakTupleMap.js +27 -1
  312. package/lib/util/chainedImports.js +3 -3
  313. package/lib/util/comparators.js +2 -2
  314. package/lib/util/concatenate.js +31 -7
  315. package/lib/util/createHash.js +0 -1
  316. package/lib/util/deterministicGrouping.js +19 -12
  317. package/lib/util/extractSourceMap.js +1 -1
  318. package/lib/util/findGraphRoots.js +2 -0
  319. package/lib/util/fs.js +10 -5
  320. package/lib/util/hash/DebugHash.js +1 -0
  321. package/lib/util/hash/hash-digest.js +24 -15
  322. package/lib/util/identifier.js +7 -0
  323. package/lib/util/internalSerializables.js +11 -2
  324. package/lib/util/magicComment.js +42 -0
  325. package/lib/util/makeSerializable.js +1 -0
  326. package/lib/util/nonNumericOnlyHash.js +30 -1
  327. package/lib/util/property.js +7 -1
  328. package/lib/util/publicPathPlaceholder.js +64 -0
  329. package/lib/util/registerExternalSerializer.js +4 -4
  330. package/lib/wasm-async/AsyncWasmModule.js +77 -0
  331. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +1 -1
  332. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +1 -96
  333. package/lib/wasm-async/AsyncWebAssemblyParser.js +1 -1
  334. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +1 -1
  335. package/lib/wasm-sync/SyncWasmModule.js +39 -0
  336. package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +1 -0
  337. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +6 -3
  338. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +2 -1
  339. package/lib/wasm-sync/WebAssemblyGenerator.js +1 -0
  340. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +2 -0
  341. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +10 -0
  342. package/lib/wasm-sync/WebAssemblyParser.js +7 -3
  343. package/lib/web/JsonpChunkLoadingRuntimeModule.js +45 -39
  344. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +11 -10
  345. package/package.json +35 -27
  346. package/schemas/WebpackOptions.check.js +1 -1
  347. package/schemas/WebpackOptions.json +212 -3
  348. package/schemas/plugins/HtmlGeneratorOptions.check.js +1 -1
  349. package/schemas/plugins/HtmlParserOptions.check.d.ts +7 -0
  350. package/schemas/plugins/HtmlParserOptions.check.js +6 -0
  351. package/schemas/plugins/HtmlParserOptions.json +3 -0
  352. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  353. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  354. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  355. package/types.d.ts +1456 -290
  356. package/lib/css/walkCssTokens.js +0 -2020
  357. package/lib/util/AppendOnlyStackedSet.js +0 -93
@@ -14,8 +14,8 @@ const ModuleDependency = require("./ModuleDependency");
14
14
  /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
15
15
  /** @typedef {import("../Entrypoint")} Entrypoint */
16
16
  /** @typedef {import("../javascript/JavascriptParser").Range} Range */
17
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
18
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
17
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext<[number, Range, string, string]>} ObjectDeserializerContext */
18
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext<[number, Range, string, string]>} ObjectSerializerContext */
19
19
 
20
20
  /**
21
21
  * Represents an inline `<script>...</script>` block in an HTML module. The
@@ -34,9 +34,11 @@ class HtmlInlineScriptDependency extends ModuleDependency {
34
34
  */
35
35
  constructor(request, insertPos, contentRange, entryName, category) {
36
36
  super(request);
37
+ /** @type {number} */
37
38
  this.insertPos = insertPos;
38
39
  this.contentRange = contentRange;
39
40
  this.range = contentRange;
41
+ /** @type {string} */
40
42
  this.entryName = entryName;
41
43
  /** @type {string} */
42
44
  this._category = category || "commonjs";
@@ -55,11 +57,11 @@ class HtmlInlineScriptDependency extends ModuleDependency {
55
57
  * @param {ObjectSerializerContext} context context
56
58
  */
57
59
  serialize(context) {
58
- const { write } = context;
59
- write(this.insertPos);
60
- write(this.contentRange);
61
- write(this.entryName);
62
- write(this._category);
60
+ context
61
+ .write(this.insertPos)
62
+ .write(this.contentRange)
63
+ .write(this.entryName)
64
+ .write(this._category);
63
65
  super.serialize(context);
64
66
  }
65
67
 
@@ -68,13 +70,15 @@ class HtmlInlineScriptDependency extends ModuleDependency {
68
70
  * @param {ObjectDeserializerContext} context context
69
71
  */
70
72
  deserialize(context) {
71
- const { read } = context;
72
- this.insertPos = read();
73
- this.contentRange = read();
73
+ this.insertPos = context.read();
74
+ const c1 = context.rest;
75
+ this.contentRange = c1.read();
74
76
  this.range = this.contentRange;
75
- this.entryName = read();
76
- this._category = read();
77
- super.deserialize(context);
77
+ const c2 = c1.rest;
78
+ this.entryName = c2.read();
79
+ const c3 = c2.rest;
80
+ this._category = c3.read();
81
+ super.deserialize(c3.rest);
78
82
  }
79
83
  }
80
84
 
@@ -16,28 +16,48 @@ const ModuleDependency = require("./ModuleDependency");
16
16
  /** @typedef {import("../Module")} Module */
17
17
  /** @typedef {import("../Module").BuildInfo} BuildInfo */
18
18
  /** @typedef {import("../javascript/JavascriptParser").Range} Range */
19
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
20
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
19
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext<boolean[]>} ObjectDeserializerContext */
20
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext<boolean[]>} ObjectSerializerContext */
21
21
  /** @typedef {import("../util/Hash")} Hash */
22
22
  /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
23
23
 
24
+ const TRAILING_WHITESPACE_REGEXP = /\s+$/;
25
+ // One pass over the source: each char is replaced once and replacements aren't
26
+ // re-scanned, so this matches the `&`-first sequential escape chain exactly
27
+ // while avoiding two extra full-string scans + intermediate strings.
28
+ const ATTR_ESCAPE_REGEXP = /[&"']/g;
29
+ /** @type {Record<string, string>} */
30
+ const ATTR_ESCAPES = { "&": "&amp;", '"': "&quot;", "'": "&#39;" };
24
31
  /**
25
- * Represents an inline `<style>...</style>` block in an HTML module. The
26
- * tag's content is fed into webpack's CSS pipeline as a virtual CSS module
27
- * with `exportType: "text"` so `url()` and `\@import` references are
28
- * resolved relative to the HTML file. At render time the original content
29
- * range is replaced with the processed CSS text read from the CSS module's
30
- * code generation data.
32
+ * @param {string} c matched character
33
+ * @returns {string} the HTML-attribute-escaped entity
34
+ */
35
+ const escapeAttrChar = (c) => ATTR_ESCAPES[c];
36
+
37
+ /**
38
+ * Represents inline CSS in an HTML module — either a `<style>...</style>`
39
+ * block (a stylesheet) or an element's `style="..."` attribute (a CSS
40
+ * block's contents). The content is fed into webpack's CSS pipeline as a
41
+ * virtual CSS module with `exportType: "text"` so `url()` and `\@import`
42
+ * references are resolved relative to the HTML file. At render time the
43
+ * original content range is replaced with the processed CSS text read from
44
+ * the CSS module's code generation data.
31
45
  */
32
46
  class HtmlInlineStyleDependency extends ModuleDependency {
33
47
  /**
34
48
  * Creates an instance of HtmlInlineStyleDependency.
35
49
  * @param {string} request virtual request resolving to the inline CSS (data URI)
36
- * @param {Range} range range of the inline CSS content (between `<style>` and `</style>`)
50
+ * @param {Range} range range of the inline CSS content (between `<style>` and `</style>`, or the `style` attribute value)
51
+ * @param {boolean=} attribute true when the source is a `style="..."` attribute (a block's contents) rather than a `<style>` block (stylesheet)
52
+ * @param {boolean=} inAttribute true when the range is an attribute value (decoded on parse, so the processed CSS must be re-escaped on write-back); defaults to `attribute` — differs only for attribute values parsed as full stylesheets
37
53
  */
38
- constructor(request, range) {
54
+ constructor(request, range, attribute = false, inAttribute = attribute) {
39
55
  super(request);
40
56
  this.range = range;
57
+ /** @type {boolean} */
58
+ this.attribute = attribute;
59
+ /** @type {boolean} */
60
+ this.inAttribute = inAttribute;
41
61
  }
42
62
 
43
63
  get type() {
@@ -45,7 +65,7 @@ class HtmlInlineStyleDependency extends ModuleDependency {
45
65
  }
46
66
 
47
67
  get category() {
48
- return "html-style";
68
+ return this.attribute ? "html-style-attribute" : "html-style";
49
69
  }
50
70
 
51
71
  /**
@@ -68,6 +88,8 @@ class HtmlInlineStyleDependency extends ModuleDependency {
68
88
  */
69
89
  serialize(context) {
70
90
  super.serialize(context);
91
+ context.write(this.attribute);
92
+ context.write(this.inAttribute);
71
93
  }
72
94
 
73
95
  /**
@@ -76,6 +98,8 @@ class HtmlInlineStyleDependency extends ModuleDependency {
76
98
  */
77
99
  deserialize(context) {
78
100
  super.deserialize(context);
101
+ this.attribute = context.read();
102
+ this.inAttribute = context.read();
79
103
  }
80
104
  }
81
105
 
@@ -106,6 +130,16 @@ HtmlInlineStyleDependency.Template = class HtmlInlineStyleDependencyTemplate ext
106
130
  }
107
131
  }
108
132
 
133
+ // An attribute value was entity-decoded before parsing, so re-escape
134
+ // the processed CSS to keep the surrounding markup valid in any
135
+ // quoting context, and drop the trailing newline the CSS generator
136
+ // appends so the rewritten attribute stays on one line.
137
+ if (dep.inAttribute) {
138
+ cssText = cssText
139
+ .replace(TRAILING_WHITESPACE_REGEXP, "")
140
+ .replace(ATTR_ESCAPE_REGEXP, escapeAttrChar);
141
+ }
142
+
109
143
  source.replace(dep.range[0], dep.range[1] - 1, cssText);
110
144
  }
111
145
  };
@@ -10,8 +10,8 @@ const ContextDependency = require("./ContextDependency");
10
10
  const ContextDependencyTemplateAsRequireCall = require("./ContextDependencyTemplateAsRequireCall");
11
11
 
12
12
  /** @typedef {import("../javascript/JavascriptParser").Range} Range */
13
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
14
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
13
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext<[Range]>} ObjectDeserializerContext */
14
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext<[Range]>} ObjectSerializerContext */
15
15
  /** @typedef {import("./ContextDependency").ContextDependencyOptions} ContextDependencyOptions */
16
16
 
17
17
  class ImportContextDependency extends ContextDependency {
@@ -55,9 +55,7 @@ class ImportContextDependency extends ContextDependency {
55
55
  * @param {ObjectSerializerContext} context context
56
56
  */
57
57
  serialize(context) {
58
- const { write } = context;
59
-
60
- write(this.valueRange);
58
+ context.write(this.valueRange);
61
59
 
62
60
  super.serialize(context);
63
61
  }
@@ -67,11 +65,9 @@ class ImportContextDependency extends ContextDependency {
67
65
  * @param {ObjectDeserializerContext} context context
68
66
  */
69
67
  deserialize(context) {
70
- const { read } = context;
71
-
72
- this.valueRange = read();
68
+ this.valueRange = context.read();
73
69
 
74
- super.deserialize(context);
70
+ super.deserialize(context.rest);
75
71
  }
76
72
  }
77
73
 
@@ -7,11 +7,13 @@
7
7
 
8
8
  const Dependency = require("../Dependency");
9
9
  const makeSerializable = require("../util/makeSerializable");
10
+ const memoize = require("../util/memoize");
10
11
  const { ImportPhaseUtils } = require("./ImportPhase");
11
12
  const ModuleDependency = require("./ModuleDependency");
12
13
 
13
14
  /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
14
15
  /** @typedef {import("../AsyncDependenciesBlock")} AsyncDependenciesBlock */
16
+ /** @typedef {import("../Dependency").GetConditionFn} GetConditionFn */
15
17
  /** @typedef {import("../Dependency").RawReferencedExports} RawReferencedExports */
16
18
  /** @typedef {import("../Dependency").ReferencedExports} ReferencedExports */
17
19
  /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
@@ -23,8 +25,11 @@ const ModuleDependency = require("./ModuleDependency");
23
25
  /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
24
26
  /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
25
27
  /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
28
+ /** @typedef {import("./HarmonyImportGuard").DependencyGuard} DependencyGuard */
26
29
  /** @typedef {import("./ImportPhase").ImportPhaseType} ImportPhaseType */
27
30
 
31
+ const getHarmonyImportGuard = memoize(() => require("./HarmonyImportGuard"));
32
+
28
33
  class ImportDependency extends ModuleDependency {
29
34
  /**
30
35
  * Creates an instance of ImportDependency.
@@ -37,9 +42,14 @@ class ImportDependency extends ModuleDependency {
37
42
  constructor(request, range, referencedExports, phase, attributes) {
38
43
  super(request);
39
44
  this.range = range;
45
+ /** @type {RawReferencedExports | null} */
40
46
  this.referencedExports = referencedExports;
47
+ /** @type {ImportPhaseType} */
41
48
  this.phase = phase;
49
+ /** @type {ImportAttributes | undefined} */
42
50
  this.attributes = attributes;
51
+ /** @type {DependencyGuard[] | undefined} */
52
+ this.branchGuards = undefined;
43
53
  }
44
54
 
45
55
  get type() {
@@ -50,6 +60,18 @@ class ImportDependency extends ModuleDependency {
50
60
  return "esm";
51
61
  }
52
62
 
63
+ /**
64
+ * Returns function to determine if the connection is active.
65
+ * @param {ModuleGraph} moduleGraph module graph
66
+ * @returns {null | false | GetConditionFn} function to determine if the connection is active
67
+ */
68
+ getCondition(moduleGraph) {
69
+ const guards = this.branchGuards;
70
+ if (guards === undefined) return null;
71
+ return (connection, runtime) =>
72
+ !getHarmonyImportGuard().isDeadByGuards(guards, moduleGraph, runtime);
73
+ }
74
+
53
75
  /**
54
76
  * Returns an identifier to merge equal requests.
55
77
  * @returns {string | null} an identifier to merge equal requests
@@ -98,7 +120,8 @@ class ImportDependency extends ModuleDependency {
98
120
  }
99
121
  refs.push({
100
122
  name: referencedExport,
101
- canMangle: false
123
+ canMangle: false,
124
+ canInline: false
102
125
  });
103
126
  }
104
127
  return refs;
@@ -113,6 +136,7 @@ class ImportDependency extends ModuleDependency {
113
136
  context.write(this.referencedExports);
114
137
  context.write(this.phase);
115
138
  context.write(this.attributes);
139
+ context.write(this.branchGuards);
116
140
  super.serialize(context);
117
141
  }
118
142
 
@@ -125,6 +149,7 @@ class ImportDependency extends ModuleDependency {
125
149
  this.referencedExports = context.read();
126
150
  this.phase = context.read();
127
151
  this.attributes = context.read();
152
+ this.branchGuards = context.read();
128
153
  super.deserialize(context);
129
154
  }
130
155
  }
@@ -144,9 +169,26 @@ ImportDependency.Template = class ImportDependencyTemplate extends (
144
169
  apply(
145
170
  dependency,
146
171
  source,
147
- { runtimeTemplate, module, moduleGraph, chunkGraph, runtimeRequirements }
172
+ {
173
+ runtimeTemplate,
174
+ module,
175
+ moduleGraph,
176
+ chunkGraph,
177
+ runtimeRequirements,
178
+ runtime
179
+ }
148
180
  ) {
149
181
  const dep = /** @type {ImportDependency} */ (dependency);
182
+ const connection = moduleGraph.getConnection(dep);
183
+ // Dead branch: module is excluded and has no id; code is never executed.
184
+ if (connection && !connection.isTargetActive(runtime)) {
185
+ source.replace(
186
+ dep.range[0],
187
+ dep.range[1] - 1,
188
+ "Promise.resolve(/* dead branch */)"
189
+ );
190
+ return;
191
+ }
150
192
  const block = /** @type {AsyncDependenciesBlock} */ (
151
193
  moduleGraph.getParentBlock(dep)
152
194
  );
@@ -20,6 +20,7 @@ class ImportMetaHotAcceptDependency extends ModuleDependency {
20
20
  constructor(request, range) {
21
21
  super(request);
22
22
  this.range = range;
23
+ /** @type {boolean} */
23
24
  this.weak = true;
24
25
  }
25
26
 
@@ -21,6 +21,7 @@ class ImportMetaHotDeclineDependency extends ModuleDependency {
21
21
  super(request);
22
22
 
23
23
  this.range = range;
24
+ /** @type {boolean} */
24
25
  this.weak = true;
25
26
  }
26
27
 
@@ -26,6 +26,13 @@ const { propertyAccess } = require("../util/property");
26
26
  const ConstDependency = require("./ConstDependency");
27
27
  const ModuleInitFragmentDependency = require("./ModuleInitFragmentDependency");
28
28
 
29
+ // Loaded at module scope, not inside the parser handler: the async resolver
30
+ // cache tail can run that handler after a test tears down the module registry.
31
+ const WEBPACK_VERSION = Number.parseInt(
32
+ require("../../package.json").version,
33
+ 10
34
+ );
35
+
29
36
  /** @typedef {import("estree").MemberExpression} MemberExpression */
30
37
  /** @typedef {import("estree").Identifier} Identifier */
31
38
  /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
@@ -40,6 +47,29 @@ const ModuleInitFragmentDependency = require("./ModuleInitFragmentDependency");
40
47
 
41
48
  const PLUGIN_NAME = "ImportMetaPlugin";
42
49
 
50
+ const IMPORT_META = "import.meta";
51
+ const IMPORT_META_URL = "import.meta.url";
52
+ const IMPORT_META_WEBPACK = "import.meta.webpack";
53
+ const IMPORT_META_MAIN = "import.meta.main";
54
+ const IMPORT_META_ENV = "import.meta.env";
55
+ const IMPORT_META_DIRNAME = "import.meta.dirname";
56
+ const IMPORT_META_FILENAME = "import.meta.filename";
57
+
58
+ // Single source of truth for `import.meta` accesses that only exist in ES modules
59
+ // and therefore mark a module as ESM (consumed by HarmonyDetectionParserPlugin).
60
+ // `dirname`/`filename` are resolved by NodeStuffPlugin, the rest here. The webpack
61
+ // pragmas `import.meta.webpackHot`/`webpackContext` are intentionally excluded:
62
+ // they are usable in CommonJS modules and must not force ESM.
63
+ const IMPORT_META_NAMES = [
64
+ IMPORT_META,
65
+ IMPORT_META_URL,
66
+ IMPORT_META_WEBPACK,
67
+ IMPORT_META_MAIN,
68
+ IMPORT_META_ENV,
69
+ IMPORT_META_DIRNAME,
70
+ IMPORT_META_FILENAME
71
+ ];
72
+
43
73
  /** @type {WeakMap<Compilation, { stringify: string, env: Record<string, string> }>} */
44
74
  const compilationMetaEnvMap = new WeakMap();
45
75
 
@@ -137,7 +167,7 @@ class ImportMetaPlugin {
137
167
  if (importMetaName === "import.meta") return;
138
168
 
139
169
  parser.hooks.expression
140
- .for("import.meta")
170
+ .for(IMPORT_META)
141
171
  .tap(PLUGIN_NAME, (metaProperty) => {
142
172
  const dep = new ConstDependency(
143
173
  /** @type {string} */ (importMetaName),
@@ -151,13 +181,10 @@ class ImportMetaPlugin {
151
181
  }
152
182
 
153
183
  // import.meta direct
154
- const webpackVersion = Number.parseInt(
155
- require("../../package.json").version,
156
- 10
157
- );
158
184
  const importMetaUrl = () =>
159
185
  JSON.stringify(getUrl(parser.state.module));
160
- const importMetaWebpackVersion = () => JSON.stringify(webpackVersion);
186
+ const importMetaWebpackVersion = () =>
187
+ JSON.stringify(WEBPACK_VERSION);
161
188
  /**
162
189
  * Import meta unknown property.
163
190
  * @param {Members} members members
@@ -173,7 +200,7 @@ class ImportMetaPlugin {
173
200
  };
174
201
 
175
202
  parser.hooks.typeof
176
- .for("import.meta")
203
+ .for(IMPORT_META)
177
204
  .tap(
178
205
  PLUGIN_NAME,
179
206
  toConstantDependency(parser, JSON.stringify("object"))
@@ -185,7 +212,7 @@ class ImportMetaPlugin {
185
212
  }
186
213
  );
187
214
  parser.hooks.expression
188
- .for("import.meta")
215
+ .for(IMPORT_META)
189
216
  .tap(PLUGIN_NAME, (metaProperty) => {
190
217
  /** @type {RawRuntimeRequirements} */
191
218
  const runtimeRequirements = [];
@@ -254,7 +281,9 @@ class ImportMetaPlugin {
254
281
  );
255
282
  break;
256
283
  case "env":
257
- str += `env: ${collectImportMetaEnvDefinitions(compilation).stringify},`;
284
+ str += `env: ${
285
+ collectImportMetaEnvDefinitions(compilation).stringify
286
+ },`;
258
287
  break;
259
288
  default:
260
289
  str += `[${JSON.stringify(
@@ -273,22 +302,22 @@ class ImportMetaPlugin {
273
302
  return true;
274
303
  });
275
304
  parser.hooks.evaluateTypeof
276
- .for("import.meta")
305
+ .for(IMPORT_META)
277
306
  .tap(PLUGIN_NAME, evaluateToString("object"));
278
- parser.hooks.evaluateIdentifier.for("import.meta").tap(
307
+ parser.hooks.evaluateIdentifier.for(IMPORT_META).tap(
279
308
  PLUGIN_NAME,
280
- evaluateToIdentifier("import.meta", "import.meta", () => [], true)
309
+ evaluateToIdentifier(IMPORT_META, IMPORT_META, () => [], true)
281
310
  );
282
311
 
283
312
  // import.meta.url
284
313
  parser.hooks.typeof
285
- .for("import.meta.url")
314
+ .for(IMPORT_META_URL)
286
315
  .tap(
287
316
  PLUGIN_NAME,
288
317
  toConstantDependency(parser, JSON.stringify("string"))
289
318
  );
290
319
  parser.hooks.expression
291
- .for("import.meta.url")
320
+ .for(IMPORT_META_URL)
292
321
  .tap(PLUGIN_NAME, (expr) => {
293
322
  const dep = new ConstDependency(
294
323
  importMetaUrl(),
@@ -299,10 +328,10 @@ class ImportMetaPlugin {
299
328
  return true;
300
329
  });
301
330
  parser.hooks.evaluateTypeof
302
- .for("import.meta.url")
331
+ .for(IMPORT_META_URL)
303
332
  .tap(PLUGIN_NAME, evaluateToString("string"));
304
333
  parser.hooks.evaluateIdentifier
305
- .for("import.meta.url")
334
+ .for(IMPORT_META_URL)
306
335
  .tap(PLUGIN_NAME, (expr) =>
307
336
  new BasicEvaluatedExpression()
308
337
  .setString(getUrl(parser.state.module))
@@ -311,26 +340,26 @@ class ImportMetaPlugin {
311
340
 
312
341
  // import.meta.webpack
313
342
  parser.hooks.expression
314
- .for("import.meta.webpack")
343
+ .for(IMPORT_META_WEBPACK)
315
344
  .tap(
316
345
  PLUGIN_NAME,
317
346
  toConstantDependency(parser, importMetaWebpackVersion())
318
347
  );
319
348
  parser.hooks.typeof
320
- .for("import.meta.webpack")
349
+ .for(IMPORT_META_WEBPACK)
321
350
  .tap(
322
351
  PLUGIN_NAME,
323
352
  toConstantDependency(parser, JSON.stringify("number"))
324
353
  );
325
354
  parser.hooks.evaluateTypeof
326
- .for("import.meta.webpack")
355
+ .for(IMPORT_META_WEBPACK)
327
356
  .tap(PLUGIN_NAME, evaluateToString("number"));
328
357
  parser.hooks.evaluateIdentifier
329
- .for("import.meta.webpack")
330
- .tap(PLUGIN_NAME, evaluateToNumber(webpackVersion));
358
+ .for(IMPORT_META_WEBPACK)
359
+ .tap(PLUGIN_NAME, evaluateToNumber(WEBPACK_VERSION));
331
360
 
332
361
  parser.hooks.expression
333
- .for("import.meta.main")
362
+ .for(IMPORT_META_MAIN)
334
363
  .tap(
335
364
  PLUGIN_NAME,
336
365
  toConstantDependency(
@@ -344,24 +373,24 @@ class ImportMetaPlugin {
344
373
  )
345
374
  );
346
375
  parser.hooks.typeof
347
- .for("import.meta.main")
376
+ .for(IMPORT_META_MAIN)
348
377
  .tap(
349
378
  PLUGIN_NAME,
350
379
  toConstantDependency(parser, JSON.stringify("boolean"))
351
380
  );
352
381
  parser.hooks.evaluateTypeof
353
- .for("import.meta.main")
382
+ .for(IMPORT_META_MAIN)
354
383
  .tap(PLUGIN_NAME, evaluateToString("boolean"));
355
384
 
356
385
  // import.meta.env
357
386
  parser.hooks.typeof
358
- .for("import.meta.env")
387
+ .for(IMPORT_META_ENV)
359
388
  .tap(
360
389
  PLUGIN_NAME,
361
390
  toConstantDependency(parser, JSON.stringify("object"))
362
391
  );
363
392
  parser.hooks.expressionMemberChain
364
- .for("import.meta")
393
+ .for(IMPORT_META)
365
394
  .tap(PLUGIN_NAME, (expr, members) => {
366
395
  if (members[0] === "env" && members[1]) {
367
396
  const name = members[1];
@@ -378,7 +407,7 @@ class ImportMetaPlugin {
378
407
  }
379
408
  });
380
409
  parser.hooks.expression
381
- .for("import.meta.env")
410
+ .for(IMPORT_META_ENV)
382
411
  .tap(PLUGIN_NAME, (expr) => {
383
412
  const { stringify } =
384
413
  collectImportMetaEnvDefinitions(compilation);
@@ -392,10 +421,10 @@ class ImportMetaPlugin {
392
421
  return true;
393
422
  });
394
423
  parser.hooks.evaluateTypeof
395
- .for("import.meta.env")
424
+ .for(IMPORT_META_ENV)
396
425
  .tap(PLUGIN_NAME, evaluateToString("object"));
397
426
  parser.hooks.evaluateIdentifier
398
- .for("import.meta.env")
427
+ .for(IMPORT_META_ENV)
399
428
  .tap(PLUGIN_NAME, (expr) =>
400
429
  new BasicEvaluatedExpression()
401
430
  .setTruthy()
@@ -405,7 +434,7 @@ class ImportMetaPlugin {
405
434
 
406
435
  // Unknown properties
407
436
  parser.hooks.unhandledExpressionMemberChain
408
- .for("import.meta")
437
+ .for(IMPORT_META)
409
438
  .tap(PLUGIN_NAME, (expr, members) => {
410
439
  // unknown import.meta properties should be determined at runtime
411
440
  if (importMeta === "preserve-unknown") {
@@ -442,6 +471,18 @@ class ImportMetaPlugin {
442
471
  expr.property.type ===
443
472
  (expr.computed ? "Literal" : "Identifier")
444
473
  ) {
474
+ const prop = expr.computed
475
+ ? /** @type {import("estree").Literal} */ (expr.property)
476
+ .value
477
+ : /** @type {Identifier} */ (expr.property).name;
478
+ // dirname/filename are resolved by NodeStuffPlugin; main is a runtime value
479
+ if (
480
+ prop === "dirname" ||
481
+ prop === "filename" ||
482
+ prop === "main"
483
+ ) {
484
+ return;
485
+ }
445
486
  return new BasicEvaluatedExpression()
446
487
  .setUndefined()
447
488
  .setRange(/** @type {Range} */ (expr.range));
@@ -461,3 +502,6 @@ class ImportMetaPlugin {
461
502
  }
462
503
 
463
504
  module.exports = ImportMetaPlugin;
505
+ module.exports.IMPORT_META_DIRNAME = IMPORT_META_DIRNAME;
506
+ module.exports.IMPORT_META_FILENAME = IMPORT_META_FILENAME;
507
+ module.exports.IMPORT_META_NAMES = IMPORT_META_NAMES;
@@ -12,6 +12,7 @@ const {
12
12
  VariableInfo,
13
13
  getImportAttributes
14
14
  } = require("../javascript/JavascriptParser");
15
+ const memoize = require("../util/memoize");
15
16
  const traverseDestructuringAssignmentProperties = require("../util/traverseDestructuringAssignmentProperties");
16
17
  const ContextDependencyHelpers = require("./ContextDependencyHelpers");
17
18
  const { getNonOptionalPart } = require("./HarmonyImportDependency");
@@ -42,6 +43,8 @@ const ImportWeakDependency = require("./ImportWeakDependency");
42
43
  /** @typedef {{ references: RawReferencedExports, expression: ImportExpression }} ImportSettings */
43
44
  /** @typedef {WeakMap<ImportExpression, RawReferencedExports>} State */
44
45
 
46
+ const getHarmonyImportGuard = memoize(() => require("./HarmonyImportGuard"));
47
+
45
48
  /** @type {WeakMap<JavascriptParserState, State>} */
46
49
  const parserStateMap = new WeakMap();
47
50
  const dynamicImportTag = Symbol("import()");
@@ -177,6 +180,7 @@ class ImportParserPlugin {
177
180
  * @param {JavascriptParserOptions} options options
178
181
  */
179
182
  constructor(options) {
183
+ /** @type {JavascriptParserOptions} */
180
184
  this.options = options;
181
185
  }
182
186
 
@@ -452,6 +456,20 @@ class ImportParserPlugin {
452
456
  exports = exportsFromEnumerable(importOptions.webpackExports);
453
457
  }
454
458
  }
459
+ // `worker` is an internal entry option set only for workers
460
+ if (
461
+ importOptions.webpackEntryOptions !== undefined &&
462
+ typeof importOptions.webpackEntryOptions === "object" &&
463
+ importOptions.webpackEntryOptions !== null &&
464
+ importOptions.webpackEntryOptions.worker !== undefined
465
+ ) {
466
+ parser.state.module.addWarning(
467
+ new UnsupportedFeatureWarning(
468
+ "`worker` entry option is not supported in `import()`, it only applies to workers (e.g. `new Worker(new URL(...))`).",
469
+ /** @type {DependencyLocation} */ (expr.loc)
470
+ )
471
+ );
472
+ }
455
473
  }
456
474
 
457
475
  if (
@@ -550,6 +568,7 @@ class ImportParserPlugin {
550
568
  dep.optional = Boolean(parser.scope.inTry);
551
569
  depBlock.addDependency(dep);
552
570
  parser.state.current.addBlock(depBlock);
571
+ getHarmonyImportGuard().attachDependencyGuards(parser, dep);
553
572
  }
554
573
  } else {
555
574
  if (mode === "weak") {
@@ -29,6 +29,7 @@ class ImportWeakDependency extends ImportDependency {
29
29
  */
30
30
  constructor(request, range, referencedExports, phase, attributes) {
31
31
  super(request, range, referencedExports, phase, attributes);
32
+ /** @type {boolean} */
32
33
  this.weak = true;
33
34
  }
34
35