webpack 5.111.0 → 5.112.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 (781) hide show
  1. package/README.md +1 -1
  2. package/lib/Chunk.js +3 -966
  3. package/lib/Compilation.js +237 -138
  4. package/lib/Compiler.js +23 -24
  5. package/lib/Dependency.js +3 -551
  6. package/lib/DependencyTemplate.js +3 -69
  7. package/lib/EntryPlugin.js +3 -68
  8. package/lib/Entrypoint.js +3 -121
  9. package/lib/ExternalsPlugin.js +3 -92
  10. package/lib/FileSystemInfo.js +3 -4629
  11. package/lib/InitFragment.js +3 -204
  12. package/lib/LibraryTemplatePlugin.js +3 -46
  13. package/lib/ModuleFilenameHelpers.js +3 -400
  14. package/lib/ModuleNotFoundError.js +2 -2
  15. package/lib/MultiCompiler.js +43 -24
  16. package/lib/NormalModule.js +3 -2190
  17. package/lib/NullFactory.js +3 -22
  18. package/lib/ProgressPlugin.js +3 -908
  19. package/lib/RawModule.js +3 -197
  20. package/lib/RequestShortener.js +3 -37
  21. package/lib/SingleEntryPlugin.js +1 -1
  22. package/lib/WebpackError.js +2 -2
  23. package/lib/asset/AssetBytesGenerator.js +15 -9
  24. package/lib/asset/AssetBytesParser.js +3 -3
  25. package/lib/asset/AssetGenerator.js +61 -38
  26. package/lib/asset/AssetModule.js +2 -2
  27. package/lib/asset/AssetModulesPlugin.js +6 -9
  28. package/lib/asset/AssetParser.js +3 -3
  29. package/lib/asset/AssetSourceGenerator.js +15 -9
  30. package/lib/asset/AssetSourceParser.js +3 -3
  31. package/lib/asset/RawDataUrlModule.js +17 -10
  32. package/lib/asset/WebManifestGenerator.js +7 -7
  33. package/lib/asset/WebManifestParser.js +5 -5
  34. package/lib/async-modules/AsyncModuleHelpers.js +6 -5
  35. package/lib/async-modules/AwaitDependenciesInitFragment.js +4 -4
  36. package/lib/async-modules/InferAsyncModulesPlugin.js +4 -3
  37. package/lib/async-modules/isGeneratorLowered.js +3 -3
  38. package/lib/bun/BunTargetPlugin.js +1 -1
  39. package/lib/cache/AddBuildDependenciesPlugin.js +2 -19
  40. package/lib/{Cache.js → cache/Cache.js} +1 -1
  41. package/lib/{CacheFacade.js → cache/CacheFacade.js} +5 -5
  42. package/lib/cache/IdleFileCachePlugin.js +2 -2
  43. package/lib/cache/MemoryCachePlugin.js +6 -6
  44. package/lib/cache/MemoryWithGcCachePlugin.js +9 -10
  45. package/lib/cache/PackFileCacheStrategy.js +11 -28
  46. package/lib/cache/ResolverCachePlugin.js +8 -4
  47. package/lib/cache/getLazyHashedEtag.js +3 -5
  48. package/lib/cache/mergeEtags.js +1 -1
  49. package/lib/{OptionsApply.js → config/OptionsApply.js} +3 -3
  50. package/lib/{PlatformPlugin.js → config/PlatformPlugin.js} +2 -2
  51. package/lib/{WebpackOptionsApply.js → config/WebpackOptionsApply.js} +217 -200
  52. package/lib/{WebpackOptionsDefaulter.js → config/WebpackOptionsDefaulter.js} +3 -3
  53. package/lib/config/browserslistTargetHandler.js +3 -9
  54. package/lib/{cli.js → config/cli.js} +5 -158
  55. package/lib/config/defaults.js +192 -122
  56. package/lib/config/getClaimedAssetTypes.js +28 -21
  57. package/lib/config/normalization.js +18 -7
  58. package/lib/config/target.js +13 -4
  59. package/lib/container/ContainerEntryDependency.js +1 -1
  60. package/lib/container/ContainerEntryModule.js +13 -11
  61. package/lib/container/ContainerEntryModuleFactory.js +2 -2
  62. package/lib/container/ContainerExposedDependency.js +1 -1
  63. package/lib/container/ContainerPlugin.js +178 -5
  64. package/lib/container/ContainerReferencePlugin.js +75 -14
  65. package/lib/container/FallbackDependency.js +1 -1
  66. package/lib/container/FallbackItemDependency.js +1 -1
  67. package/lib/container/FallbackModule.js +12 -10
  68. package/lib/container/FallbackModuleFactory.js +2 -2
  69. package/lib/container/HoistContainerReferencesPlugin.js +10 -11
  70. package/lib/container/ModuleFederationPlugin.js +306 -7
  71. package/lib/container/RemoteModule.js +14 -10
  72. package/lib/container/RemoteRuntimeModule.js +5 -5
  73. package/lib/container/RemoteToExternalDependency.js +1 -1
  74. package/lib/container/moduleFederationHooks.js +1 -1
  75. package/lib/{ContextExclusionPlugin.js → context/ContextExclusionPlugin.js} +1 -1
  76. package/lib/{ContextModule.js → context/ContextModule.js} +50 -36
  77. package/lib/{ContextModuleFactory.js → context/ContextModuleFactory.js} +25 -24
  78. package/lib/{ContextReplacementPlugin.js → context/ContextReplacementPlugin.js} +4 -4
  79. package/lib/css/CssGenerator.js +57 -42
  80. package/lib/css/CssInjectStyleRuntimeModule.js +36 -30
  81. package/lib/css/CssLoadingRuntimeModule.js +77 -44
  82. package/lib/css/CssModule.js +27 -29
  83. package/lib/css/CssModulesPlugin.js +128 -44
  84. package/lib/css/CssParser.js +700 -311
  85. package/lib/css/CssServerStylesRuntimeModule.js +3 -3
  86. package/lib/css/cssMinify.js +130 -54
  87. package/lib/css/data.js +7017 -4648
  88. package/lib/css/syntax-parser.js +19873 -0
  89. package/lib/css/syntax-printer.js +6037 -0
  90. package/lib/css/syntax.js +37 -17370
  91. package/lib/debug/ProfilingPlugin.js +55 -23
  92. package/lib/{DefinePlugin.js → define/DefinePlugin.js} +407 -41
  93. package/lib/{DotenvPlugin.js → define/DotenvPlugin.js} +25 -29
  94. package/lib/{EnvironmentPlugin.js → define/EnvironmentPlugin.js} +2 -2
  95. package/lib/deno/DenoTargetPlugin.js +1 -1
  96. package/lib/dependencies/ConstDependency.js +3 -120
  97. package/lib/dependencies/ContextElementDependency.js +5 -172
  98. package/lib/dependencies/NullDependency.js +3 -37
  99. package/lib/dependencies/{AMDDefineDependency.js → amd/AMDDefineDependency.js} +12 -11
  100. package/lib/dependencies/{AMDDefineDependencyParserPlugin.js → amd/AMDDefineDependencyParserPlugin.js} +10 -10
  101. package/lib/dependencies/{AMDPlugin.js → amd/AMDPlugin.js} +11 -11
  102. package/lib/dependencies/{AMDRequireArrayDependency.js → amd/AMDRequireArrayDependency.js} +15 -13
  103. package/lib/dependencies/{AMDRequireContextDependency.js → amd/AMDRequireContextDependency.js} +11 -10
  104. package/lib/dependencies/{AMDRequireDependenciesBlock.js → amd/AMDRequireDependenciesBlock.js} +7 -6
  105. package/lib/dependencies/{AMDRequireDependenciesBlockParserPlugin.js → amd/AMDRequireDependenciesBlockParserPlugin.js} +10 -10
  106. package/lib/dependencies/{AMDRequireDependency.js → amd/AMDRequireDependency.js} +13 -12
  107. package/lib/dependencies/{AMDRequireItemDependency.js → amd/AMDRequireItemDependency.js} +8 -7
  108. package/lib/dependencies/{AMDRuntimeModules.js → amd/AMDRuntimeModules.js} +3 -3
  109. package/lib/dependencies/{LocalModule.js → amd/LocalModule.js} +8 -4
  110. package/lib/dependencies/{LocalModuleDependency.js → amd/LocalModuleDependency.js} +17 -10
  111. package/lib/dependencies/{LocalModulesHelpers.js → amd/LocalModulesHelpers.js} +1 -1
  112. package/lib/dependencies/{RequireJsStuffPlugin.js → amd/RequireJsStuffPlugin.js} +9 -9
  113. package/lib/dependencies/{UnsupportedDependency.js → amd/UnsupportedDependency.js} +11 -10
  114. package/lib/dependencies/{CommonJsDependencyHelpers.js → commonjs/CommonJsDependencyHelpers.js} +8 -9
  115. package/lib/dependencies/{CommonJsExportRequireDependency.js → commonjs/CommonJsExportRequireDependency.js} +176 -44
  116. package/lib/dependencies/{CommonJsExportsDependency.js → commonjs/CommonJsExportsDependency.js} +15 -14
  117. package/lib/dependencies/{CommonJsExportsParserPlugin.js → commonjs/CommonJsExportsParserPlugin.js} +138 -61
  118. package/lib/dependencies/{CommonJsFullRequireDependency.js → commonjs/CommonJsFullRequireDependency.js} +32 -24
  119. package/lib/dependencies/{CommonJsImportsParserPlugin.js → commonjs/CommonJsImportsParserPlugin.js} +39 -35
  120. package/lib/dependencies/{CommonJsObjectExportDependency.js → commonjs/CommonJsObjectExportDependency.js} +13 -12
  121. package/lib/dependencies/{CommonJsPlugin.js → commonjs/CommonJsPlugin.js} +47 -35
  122. package/lib/dependencies/{CommonJsRequireContextDependency.js → commonjs/CommonJsRequireContextDependency.js} +15 -14
  123. package/lib/dependencies/{CommonJsRequireDependency.js → commonjs/CommonJsRequireDependency.js} +33 -25
  124. package/lib/dependencies/{CommonJsSelfReferenceDependency.js → commonjs/CommonJsSelfReferenceDependency.js} +19 -20
  125. package/lib/dependencies/{ModuleDecoratorDependency.js → commonjs/ModuleDecoratorDependency.js} +16 -15
  126. package/lib/dependencies/{RequireEnsureDependenciesBlock.js → commonjs/RequireEnsureDependenciesBlock.js} +8 -7
  127. package/lib/dependencies/{RequireEnsureDependenciesBlockParserPlugin.js → commonjs/RequireEnsureDependenciesBlockParserPlugin.js} +5 -5
  128. package/lib/dependencies/{RequireEnsureDependency.js → commonjs/RequireEnsureDependency.js} +13 -12
  129. package/lib/dependencies/{RequireEnsureItemDependency.js → commonjs/RequireEnsureItemDependency.js} +7 -6
  130. package/lib/dependencies/{RequireEnsurePlugin.js → commonjs/RequireEnsurePlugin.js} +8 -8
  131. package/lib/dependencies/{RequireHeaderDependency.js → commonjs/RequireHeaderDependency.js} +14 -13
  132. package/lib/dependencies/{RequireIncludeDependency.js → commonjs/RequireIncludeDependency.js} +13 -12
  133. package/lib/dependencies/{RequireIncludeDependencyParserPlugin.js → commonjs/RequireIncludeDependencyParserPlugin.js} +3 -27
  134. package/lib/dependencies/{RequireIncludePlugin.js → commonjs/RequireIncludePlugin.js} +4 -4
  135. package/lib/dependencies/{RequireResolveContextDependency.js → commonjs/RequireResolveContextDependency.js} +11 -10
  136. package/lib/dependencies/{RequireResolveDependency.js → commonjs/RequireResolveDependency.js} +12 -11
  137. package/lib/dependencies/{RequireResolveHeaderDependency.js → commonjs/RequireResolveHeaderDependency.js} +13 -12
  138. package/lib/dependencies/commonjs/TopLevelThisParserPlugin.js +59 -0
  139. package/lib/dependencies/{ContextDependency.js → context/ContextDependency.js} +15 -14
  140. package/lib/dependencies/{ContextDependencyHelpers.js → context/ContextDependencyHelpers.js} +34 -18
  141. package/lib/dependencies/{ContextDependencyTemplateAsId.js → context/ContextDependencyTemplateAsId.js} +3 -3
  142. package/lib/dependencies/{ContextDependencyTemplateAsRequireCall.js → context/ContextDependencyTemplateAsRequireCall.js} +3 -3
  143. package/lib/dependencies/context/ContextElementDependency.js +198 -0
  144. package/lib/dependencies/{ImportMetaContextDependency.js → context/ImportMetaContextDependency.js} +7 -6
  145. package/lib/dependencies/{ImportMetaContextDependencyParserPlugin.js → context/ImportMetaContextDependencyParserPlugin.js} +9 -9
  146. package/lib/dependencies/{ImportMetaContextPlugin.js → context/ImportMetaContextPlugin.js} +5 -5
  147. package/lib/dependencies/{ImportMetaGlobDependency.js → context/ImportMetaGlobDependency.js} +7 -6
  148. package/lib/dependencies/{ImportMetaGlobDependencyParserPlugin.js → context/ImportMetaGlobDependencyParserPlugin.js} +4 -4
  149. package/lib/dependencies/{ImportMetaGlobHelpers.js → context/ImportMetaGlobHelpers.js} +9 -9
  150. package/lib/dependencies/{RequireContextDependency.js → context/RequireContextDependency.js} +7 -6
  151. package/lib/dependencies/{RequireContextDependencyParserPlugin.js → context/RequireContextDependencyParserPlugin.js} +2 -2
  152. package/lib/dependencies/{RequireContextPlugin.js → context/RequireContextPlugin.js} +5 -5
  153. package/lib/dependencies/{CachedConstDependency.js → core/CachedConstDependency.js} +12 -11
  154. package/lib/dependencies/core/ConstDependency.js +131 -0
  155. package/lib/dependencies/{ImportPhase.js → core/ImportPhase.js} +5 -4
  156. package/lib/dependencies/{ModuleDependency.js → core/ModuleDependency.js} +10 -7
  157. package/lib/dependencies/{ModuleDependencyTemplateAsId.js → core/ModuleDependencyTemplateAsId.js} +3 -3
  158. package/lib/dependencies/{ModuleDependencyTemplateAsRequireId.js → core/ModuleDependencyTemplateAsRequireId.js} +2 -2
  159. package/lib/dependencies/{ModuleInitFragmentDependency.js → core/ModuleInitFragmentDependency.js} +10 -9
  160. package/lib/dependencies/core/NullDependency.js +44 -0
  161. package/lib/dependencies/{RuntimeRequirementsDependency.js → core/RuntimeRequirementsDependency.js} +10 -9
  162. package/lib/dependencies/{StaticExportsDependency.js → core/StaticExportsDependency.js} +15 -8
  163. package/lib/dependencies/{CssIcssExportDependency.js → css/CssIcssExportDependency.js} +375 -100
  164. package/lib/dependencies/{CssIcssImportDependency.js → css/CssIcssImportDependency.js} +26 -22
  165. package/lib/dependencies/{CssIcssSymbolDependency.js → css/CssIcssSymbolDependency.js} +13 -12
  166. package/lib/dependencies/{CssImportDependency.js → css/CssImportDependency.js} +15 -11
  167. package/lib/dependencies/{CssUrlDependency.js → css/CssUrlDependency.js} +26 -21
  168. package/lib/dependencies/{CreateRequireParserPlugin.js → esm/CreateRequireParserPlugin.js} +9 -9
  169. package/lib/dependencies/{HarmonyAcceptDependency.js → esm/ESMAcceptDependency.js} +41 -38
  170. package/lib/dependencies/esm/ESMAcceptImportDependency.js +39 -0
  171. package/lib/dependencies/{HarmonyCompatibilityDependency.js → esm/ESMCompatibilityDependency.js} +40 -41
  172. package/lib/dependencies/{HarmonyDetectionParserPlugin.js → esm/ESMDetectionParserPlugin.js} +22 -21
  173. package/lib/dependencies/{HarmonyEvaluatedImportSpecifierDependency.js → esm/ESMEvaluatedImportSpecifierDependency.js} +33 -30
  174. package/lib/dependencies/{HarmonyExportDependencyParserPlugin.js → esm/ESMExportDependencyParserPlugin.js} +62 -93
  175. package/lib/dependencies/{HarmonyExportExpressionDependency.js → esm/ESMExportExpressionDependency.js} +83 -49
  176. package/lib/dependencies/{HarmonyExportHeaderDependency.js → esm/ESMExportHeaderDependency.js} +17 -15
  177. package/lib/dependencies/esm/ESMExportImportedSideEffectDependency.js +37 -0
  178. package/lib/dependencies/{HarmonyExportImportedSpecifierDependency.js → esm/ESMExportImportedSpecifierDependency.js} +136 -122
  179. package/lib/dependencies/{HarmonyExportInitFragment.js → esm/ESMExportInitFragment.js} +68 -43
  180. package/lib/dependencies/{HarmonyExportSpecifierDependency.js → esm/ESMExportSpecifierDependency.js} +68 -65
  181. package/lib/dependencies/{HarmonyExports.js → esm/ESMExports.js} +4 -4
  182. package/lib/dependencies/{HarmonyImportBareSideEffectDependency.js → esm/ESMImportBareSideEffectDependency.js} +21 -13
  183. package/lib/dependencies/{HarmonyImportDependency.js → esm/ESMImportDependency.js} +74 -71
  184. package/lib/dependencies/{HarmonyImportDependencyParserPlugin.js → esm/ESMImportDependencyParserPlugin.js} +199 -97
  185. package/lib/dependencies/{HarmonyImportGuard.js → esm/ESMImportGuard.js} +26 -29
  186. package/lib/dependencies/{HarmonyImportSideEffectDependency.js → esm/ESMImportSideEffectDependency.js} +86 -43
  187. package/lib/dependencies/{HarmonyImportSpecifierDependency.js → esm/ESMImportSpecifierDependency.js} +110 -61
  188. package/lib/dependencies/esm/ESMModulesPlugin.js +207 -0
  189. package/lib/dependencies/{HarmonyTopLevelThisParserPlugin.js → esm/ESMTopLevelThisParserPlugin.js} +7 -7
  190. package/lib/dependencies/{TopLevelAwaitDependency.js → esm/TopLevelAwaitDependency.js} +12 -11
  191. package/lib/dependencies/{DynamicExports.js → helpers/DynamicExports.js} +2 -2
  192. package/lib/{util → dependencies/helpers}/chainedImports.js +8 -9
  193. package/lib/dependencies/{processExportInfo.js → helpers/processExportInfo.js} +4 -4
  194. package/lib/{util → dependencies/helpers}/traverseDestructuringAssignmentProperties.js +1 -1
  195. package/lib/dependencies/{ImportMetaHotAcceptDependency.js → hmr/ImportMetaHotAcceptDependency.js} +8 -7
  196. package/lib/dependencies/{ImportMetaHotDeclineDependency.js → hmr/ImportMetaHotDeclineDependency.js} +8 -7
  197. package/lib/dependencies/{ModuleHotAcceptDependency.js → hmr/ModuleHotAcceptDependency.js} +8 -7
  198. package/lib/dependencies/{ModuleHotDeclineDependency.js → hmr/ModuleHotDeclineDependency.js} +8 -7
  199. package/lib/dependencies/{HtmlEntryDependency.js → html/HtmlEntryDependency.js} +125 -243
  200. package/lib/dependencies/{HtmlInlineHtmlDependency.js → html/HtmlInlineHtmlDependency.js} +13 -12
  201. package/lib/dependencies/{HtmlInlineScriptDependency.js → html/HtmlInlineScriptDependency.js} +72 -23
  202. package/lib/dependencies/{HtmlInlineStyleDependency.js → html/HtmlInlineStyleDependency.js} +53 -19
  203. package/lib/dependencies/{HtmlSourceDependency.js → html/HtmlSourceDependency.js} +23 -16
  204. package/lib/dependencies/{ImportContextDependency.js → import/ImportContextDependency.js} +24 -10
  205. package/lib/dependencies/{ImportDependency.js → import/ImportDependency.js} +26 -18
  206. package/lib/dependencies/{ImportEagerDependency.js → import/ImportEagerDependency.js} +18 -10
  207. package/lib/dependencies/{ImportParserPlugin.js → import/ImportParserPlugin.js} +20 -20
  208. package/lib/dependencies/{ImportPlugin.js → import/ImportPlugin.js} +4 -4
  209. package/lib/dependencies/{ImportWeakDependency.js → import/ImportWeakDependency.js} +18 -10
  210. package/lib/dependencies/{importOptionsCheck.js → import/importOptionsCheck.js} +2 -2
  211. package/lib/dependencies/{BuildTimeConstDependency.js → import-meta/BuildTimeConstDependency.js} +12 -11
  212. package/lib/dependencies/{ImportMetaMainDependency.js → import-meta/ImportMetaMainDependency.js} +12 -11
  213. package/lib/dependencies/{ImportMetaPlugin.js → import-meta/ImportMetaPlugin.js} +126 -107
  214. package/lib/dependencies/{SystemPlugin.js → system/SystemPlugin.js} +11 -38
  215. package/lib/dependencies/{SystemRuntimeModule.js → system/SystemRuntimeModule.js} +3 -3
  216. package/lib/dependencies/{ImportMetaResolveDependency.js → url/ImportMetaResolveDependency.js} +9 -8
  217. package/lib/dependencies/{URLContextDependency.js → url/URLContextDependency.js} +11 -10
  218. package/lib/dependencies/{URLDependency.js → url/URLDependency.js} +34 -25
  219. package/lib/{url → dependencies/url}/URLParserPlugin.js +22 -26
  220. package/lib/dependencies/{URLPlugin.js → url/URLPlugin.js} +6 -7
  221. package/lib/dependencies/{WebAssemblyExportImportedDependency.js → wasm/WebAssemblyExportImportedDependency.js} +18 -11
  222. package/lib/dependencies/{WebAssemblyImportDependency.js → wasm/WebAssemblyImportDependency.js} +19 -12
  223. package/lib/dependencies/{CreateScriptUrlDependency.js → worker/CreateScriptUrlDependency.js} +12 -11
  224. package/lib/dependencies/{WorkerAndWorkletPlugin.js → worker/WorkerAndWorkletPlugin.js} +46 -54
  225. package/lib/dependencies/{WorkerDependency.js → worker/WorkerDependency.js} +28 -20
  226. package/lib/dependencies/{WorkletDependency.js → worker/WorkletDependency.js} +25 -27
  227. package/lib/{EvalDevToolModulePlugin.js → devtool/EvalDevToolModulePlugin.js} +20 -6
  228. package/lib/{EvalSourceMapDevToolPlugin.js → devtool/EvalSourceMapDevToolPlugin.js} +32 -24
  229. package/lib/devtool/ModuleFilenameHelpers.js +413 -0
  230. package/lib/{SourceMapDevToolModuleOptionsPlugin.js → devtool/SourceMapDevToolModuleOptionsPlugin.js} +10 -3
  231. package/lib/{SourceMapDevToolPlugin.js → devtool/SourceMapDevToolPlugin.js} +207 -129
  232. package/lib/{util → devtool}/generateDebugId.js +1 -1
  233. package/lib/{IgnoreWarningsPlugin.js → diagnostics/IgnoreWarningsPlugin.js} +2 -2
  234. package/lib/{NoEmitOnErrorsPlugin.js → diagnostics/NoEmitOnErrorsPlugin.js} +1 -1
  235. package/lib/diagnostics/WarnCaseSensitiveModulesPlugin.js +64 -0
  236. package/lib/{WarnDeprecatedOptionPlugin.js → diagnostics/WarnDeprecatedOptionPlugin.js} +2 -22
  237. package/lib/diagnostics/WarnNoModeSetPlugin.js +27 -0
  238. package/lib/dll/DelegatedModule.js +20 -18
  239. package/lib/dll/DelegatedModuleFactoryPlugin.js +2 -2
  240. package/lib/dll/DelegatedPlugin.js +1 -1
  241. package/lib/{dependencies → dll}/DelegatedSourceDependency.js +5 -4
  242. package/lib/{dependencies → dll}/DllEntryDependency.js +6 -5
  243. package/lib/dll/DllEntryPlugin.js +3 -3
  244. package/lib/dll/DllModule.js +11 -9
  245. package/lib/dll/DllModuleFactory.js +3 -3
  246. package/lib/dll/DllPlugin.js +18 -6
  247. package/lib/dll/DllReferencePlugin.js +102 -26
  248. package/lib/dll/LibManifestPlugin.js +9 -7
  249. package/lib/electron/ElectronTargetPlugin.js +2 -2
  250. package/lib/{DynamicEntryPlugin.js → entry/DynamicEntryPlugin.js} +3 -3
  251. package/lib/{dependencies → entry}/EntryDependency.js +11 -2
  252. package/lib/{EntryOptionPlugin.js → entry/EntryOptionPlugin.js} +6 -6
  253. package/lib/entry/EntryPlugin.js +75 -0
  254. package/lib/{performance → errors}/AssetsOverSizeLimitWarning.js +2 -2
  255. package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
  256. package/lib/errors/BuildCycleError.js +1 -1
  257. package/lib/{WarnCaseSensitiveModulesPlugin.js → errors/CaseSensitiveModulesWarning.js} +4 -56
  258. package/lib/errors/ChunkRenderError.js +1 -1
  259. package/lib/errors/CodeGenerationError.js +1 -1
  260. package/lib/errors/CommentCompilationWarning.js +1 -1
  261. package/lib/errors/ConflictingEntryExportsWarning.js +38 -0
  262. package/lib/{dependencies → errors}/CriticalDependencyWarning.js +4 -3
  263. package/lib/errors/DeprecatedOptionWarning.js +30 -0
  264. package/lib/errors/DllManifestError.js +26 -0
  265. package/lib/{performance → errors}/DuplicatePackagesWarning.js +6 -6
  266. package/lib/{dependencies/HarmonyLinkingError.js → errors/ESMLinkingError.js} +4 -4
  267. package/lib/{performance → errors}/EntrypointsOverSizeLimitWarning.js +2 -2
  268. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  269. package/lib/errors/ErrorHelpers.js +222 -0
  270. package/lib/errors/ExternalStarReexportError.js +2 -2
  271. package/lib/{library → errors}/FalseIIFEUmdWarning.js +1 -1
  272. package/lib/errors/HookWebpackError.js +6 -5
  273. package/lib/errors/IgnoreErrorModuleFactory.js +3 -3
  274. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  275. package/lib/{optimize → errors}/MinMaxSizeWarning.js +1 -1
  276. package/lib/errors/ModuleBuildError.js +1 -1
  277. package/lib/errors/ModuleDependencyError.js +2 -2
  278. package/lib/errors/ModuleDependencyWarning.js +2 -2
  279. package/lib/errors/ModuleError.js +1 -1
  280. package/lib/errors/ModuleHashingError.js +1 -1
  281. package/lib/errors/ModuleNotFoundError.js +3 -3
  282. package/lib/errors/ModuleParseError.js +1 -1
  283. package/lib/errors/ModuleRestoreError.js +1 -1
  284. package/lib/errors/ModuleStoreError.js +1 -1
  285. package/lib/errors/ModuleWarning.js +1 -1
  286. package/lib/{performance → errors}/NoAsyncChunksWarning.js +1 -1
  287. package/lib/{WarnNoModeSetPlugin.js → errors/NoModeWarning.js} +2 -19
  288. package/lib/errors/NodeStuffInWebError.js +7 -2
  289. package/lib/errors/PathVariableError.js +31 -0
  290. package/lib/errors/RequireIncludeDeprecationWarning.js +40 -0
  291. package/lib/{performance → errors}/RuntimeInLargeChunkWarning.js +1 -1
  292. package/lib/errors/RuntimeModuleGenerationError.js +51 -0
  293. package/lib/errors/SSRManifestAutoPublicPathWarning.js +24 -0
  294. package/lib/errors/SystemImportDeprecationWarning.js +43 -0
  295. package/lib/errors/UnmergeableEntryExportsError.js +34 -0
  296. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  297. package/lib/{wasm-sync → errors}/UnsupportedWebAssemblyFeatureError.js +1 -1
  298. package/lib/{wasm-sync → errors}/WebAssemblyInInitialChunkError.js +7 -5
  299. package/lib/errors/WebpackError.js +12 -3
  300. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -2
  301. package/lib/esm/ModuleChunkFormatPlugin.js +19 -19
  302. package/lib/esm/ModuleChunkLoadingPlugin.js +3 -3
  303. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +8 -8
  304. package/lib/{ExternalModule.js → externals/ExternalModule.js} +85 -63
  305. package/lib/{ExternalModuleFactoryPlugin.js → externals/ExternalModuleFactoryPlugin.js} +41 -39
  306. package/lib/externals/ExternalsPlugin.js +99 -0
  307. package/lib/fs/FileSystemInfo.js +4642 -0
  308. package/lib/{util → fs}/fs.js +22 -9
  309. package/lib/{AsyncDependenciesBlock.js → graph/AsyncDependenciesBlock.js} +27 -4
  310. package/lib/graph/Chunk.js +985 -0
  311. package/lib/{ChunkGraph.js → graph/ChunkGraph.js} +187 -80
  312. package/lib/{ChunkGroup.js → graph/ChunkGroup.js} +11 -3
  313. package/lib/{DependenciesBlock.js → graph/DependenciesBlock.js} +16 -4
  314. package/lib/graph/Dependency.js +628 -0
  315. package/lib/graph/Entrypoint.js +136 -0
  316. package/lib/{ExportsInfo.js → graph/ExportsInfo.js} +151 -99
  317. package/lib/{HotUpdateChunk.js → graph/HotUpdateChunk.js} +8 -0
  318. package/lib/{ModuleGraph.js → graph/ModuleGraph.js} +36 -39
  319. package/lib/{ModuleGraphConnection.js → graph/ModuleGraphConnection.js} +2 -2
  320. package/lib/{buildChunkGraph.js → graph/buildChunkGraph.js} +163 -72
  321. package/lib/{util → graph}/findGraphRoots.js +20 -21
  322. package/lib/graph/isDependencyKind.js +23 -0
  323. package/lib/hmr/HotModuleReplacement.runtime.js +2 -2
  324. package/lib/{HotModuleReplacementPlugin.js → hmr/HotModuleReplacementPlugin.js} +49 -47
  325. package/lib/hmr/HotModuleReplacementRuntimeModule.js +3 -3
  326. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +10 -8
  327. package/lib/hmr/JavascriptHotModuleReplacementHelper.js +2 -2
  328. package/lib/hmr/LazyCompilationPlugin.js +34 -26
  329. package/lib/html/HtmlGenerator.js +168 -125
  330. package/lib/html/HtmlModule.js +6 -2
  331. package/lib/html/HtmlModulesPlugin.js +260 -215
  332. package/lib/html/HtmlParser.js +598 -292
  333. package/lib/html/builtinEmbeddedRenderer.js +60 -13
  334. package/lib/html/data.js +23 -1
  335. package/lib/html/htmlMinify.js +120 -51
  336. package/lib/html/syntax-parser.js +15796 -0
  337. package/lib/html/syntax-printer.js +1034 -0
  338. package/lib/html/syntax.js +37 -14062
  339. package/lib/html/xmlMinify.js +67 -0
  340. package/lib/ids/ChunkModuleIdRangePlugin.js +2 -2
  341. package/lib/ids/DeterministicModuleIdsPlugin.js +1 -1
  342. package/lib/ids/HashedModuleIdsPlugin.js +31 -4
  343. package/lib/ids/IdHelpers.js +4 -4
  344. package/lib/ids/NaturalChunkIdsPlugin.js +1 -1
  345. package/lib/ids/OccurrenceChunkIdsPlugin.js +6 -5
  346. package/lib/ids/OccurrenceModuleIdsPlugin.js +6 -5
  347. package/lib/{RecordIdsPlugin.js → ids/RecordIdsPlugin.js} +5 -5
  348. package/lib/ids/SyncModuleIdsPlugin.js +3 -3
  349. package/lib/{util → ids}/numberHash.js +1 -1
  350. package/lib/index.js +348 -99
  351. package/lib/{APIPlugin.js → javascript/APIPlugin.js} +29 -30
  352. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +4 -5
  353. package/lib/javascript/BasicEvaluatedExpression.js +4 -4
  354. package/lib/javascript/ChunkHelpers.js +64 -4
  355. package/lib/javascript/CommonJsChunkFormatPlugin.js +4 -7
  356. package/lib/{CompatibilityPlugin.js → javascript/CompatibilityPlugin.js} +10 -11
  357. package/lib/{ConstPlugin.js → javascript/ConstPlugin.js} +90 -139
  358. package/lib/{ExportsInfoApiPlugin.js → javascript/ExportsInfoApiPlugin.js} +5 -5
  359. package/lib/{dependencies → javascript}/ExportsInfoDependency.js +10 -9
  360. package/lib/javascript/JavascriptGenerator.js +25 -18
  361. package/lib/{JavascriptMetaInfoPlugin.js → javascript/JavascriptMetaInfoPlugin.js} +7 -7
  362. package/lib/javascript/JavascriptModule.js +4 -3
  363. package/lib/javascript/JavascriptModulesPlugin.js +458 -256
  364. package/lib/javascript/JavascriptParser.js +916 -287
  365. package/lib/javascript/JavascriptParserHelpers.js +1 -1
  366. package/lib/javascript/MergedEntryExports.js +196 -0
  367. package/lib/javascript/ScopeAnalyzer.js +3840 -5
  368. package/lib/javascript/StartupHelpers.js +6 -6
  369. package/lib/{UseStrictPlugin.js → javascript/UseStrictPlugin.js} +12 -15
  370. package/lib/{dependencies → javascript}/WebpackIsIncludedDependency.js +10 -9
  371. package/lib/{WebpackIsIncludedPlugin.js → javascript/WebpackIsIncludedPlugin.js} +8 -8
  372. package/lib/javascript/data.js +533 -122
  373. package/lib/javascript/jsMinify.js +272 -0
  374. package/lib/javascript/regexp.js +67 -32
  375. package/lib/javascript/syntax-parser.js +18561 -0
  376. package/lib/javascript/syntax-printer-data.js +933 -0
  377. package/lib/javascript/syntax-printer.js +47106 -0
  378. package/lib/javascript/syntax.js +20 -10946
  379. package/lib/json/JsonData.js +1 -1
  380. package/lib/{dependencies → json}/JsonExportsDependency.js +8 -7
  381. package/lib/json/JsonGenerator.js +17 -11
  382. package/lib/json/JsonModule.js +2 -2
  383. package/lib/json/JsonModulesPlugin.js +1 -1
  384. package/lib/json/JsonParser.js +5 -5
  385. package/lib/json/jsonMinify.js +69 -0
  386. package/lib/library/AbstractLibraryPlugin.js +28 -15
  387. package/lib/library/AmdLibraryPlugin.js +4 -4
  388. package/lib/library/AssignLibraryPlugin.js +27 -11
  389. package/lib/library/EnableLibraryPlugin.js +1 -1
  390. package/lib/library/ExportPropertyLibraryPlugin.js +4 -4
  391. package/lib/library/JsonpLibraryPlugin.js +1 -1
  392. package/lib/library/LibraryTemplatePlugin.js +53 -0
  393. package/lib/library/ModuleLibraryPlugin.js +207 -285
  394. package/lib/library/SystemLibraryPlugin.js +6 -8
  395. package/lib/library/UmdLibraryPlugin.js +3 -4
  396. package/lib/{dependencies → loaders}/LoaderDependency.js +3 -3
  397. package/lib/{dependencies → loaders}/LoaderImportDependency.js +9 -3
  398. package/lib/{LoaderOptionsPlugin.js → loaders/LoaderOptionsPlugin.js} +30 -12
  399. package/lib/{dependencies → loaders}/LoaderPlugin.js +27 -2
  400. package/lib/loaders/LoaderRunner.js +160 -22
  401. package/lib/{LoaderTargetPlugin.js → loaders/LoaderTargetPlugin.js} +2 -2
  402. package/lib/logging/Logger.js +7 -9
  403. package/lib/logging/ProgressPlugin.js +957 -0
  404. package/lib/{CodeGenerationResults.js → module/CodeGenerationResults.js} +7 -7
  405. package/lib/{Generator.js → module/Generator.js} +38 -14
  406. package/lib/{Module.js → module/Module.js} +122 -54
  407. package/lib/{ModuleFactory.js → module/ModuleFactory.js} +3 -3
  408. package/lib/module/NormalModule.js +2348 -0
  409. package/lib/{NormalModuleFactory.js → module/NormalModuleFactory.js} +53 -54
  410. package/lib/module/NullFactory.js +29 -0
  411. package/lib/{Parser.js → module/Parser.js} +3 -3
  412. package/lib/module/RawModule.js +208 -0
  413. package/lib/{SelfModuleFactory.js → module/SelfModuleFactory.js} +1 -1
  414. package/lib/{util → module}/extractSourceMap.js +2 -2
  415. package/lib/{util → module}/findCaseMismatch.js +2 -2
  416. package/lib/node/CommonJsChunkLoadingPlugin.js +3 -3
  417. package/lib/{dependencies → node}/ExternalModuleDependency.js +8 -7
  418. package/lib/{dependencies → node}/ExternalModuleInitFragment.js +6 -5
  419. package/lib/{dependencies → node}/ExternalModuleInitFragmentDependency.js +14 -9
  420. package/lib/node/NodeEnvironmentPlugin.js +11 -1
  421. package/lib/{NodeStuffPlugin.js → node/NodeStuffPlugin.js} +17 -17
  422. package/lib/node/NodeTargetPlugin.js +1 -1
  423. package/lib/node/NodeWatchFileSystem.js +61 -15
  424. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +7 -7
  425. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +9 -7
  426. package/lib/node/ReadFileCompileWasmPlugin.js +7 -5
  427. package/lib/node/RequireChunkLoadingRuntimeModule.js +7 -7
  428. package/lib/node/nodeConsole.js +2 -4
  429. package/lib/optimize/AggressiveMergingPlugin.js +5 -7
  430. package/lib/optimize/AggressiveSplittingPlugin.js +12 -8
  431. package/lib/{CircularModulesPlugin.js → optimize/CircularModulesPlugin.js} +13 -13
  432. package/lib/optimize/ConcatenatedModule.js +305 -309
  433. package/lib/{ConcatenationScope.js → optimize/ConcatenationScope.js} +39 -6
  434. package/lib/optimize/ConstExportsPlugin.js +7 -7
  435. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  436. package/lib/{FlagAllModulesAsUsedPlugin.js → optimize/FlagAllModulesAsUsedPlugin.js} +3 -3
  437. package/lib/{FlagDependencyExportsPlugin.js → optimize/FlagDependencyExportsPlugin.js} +25 -30
  438. package/lib/{FlagDependencyUsagePlugin.js → optimize/FlagDependencyUsagePlugin.js} +26 -30
  439. package/lib/{FlagEntryExportAsUsedPlugin.js → optimize/FlagEntryExportAsUsedPlugin.js} +2 -2
  440. package/lib/optimize/FlagIncludedChunksPlugin.js +5 -13
  441. package/lib/optimize/InlineExports.js +11 -3
  442. package/lib/optimize/InnerGraph.js +5 -13
  443. package/lib/optimize/InnerGraphPlugin.js +17 -23
  444. package/lib/optimize/LazyBarrels.js +584 -0
  445. package/lib/{util → optimize}/LazyBucketSortedSet.js +2 -2
  446. package/lib/optimize/LimitChunkCountPlugin.js +21 -15
  447. package/lib/optimize/MangleExportsPlugin.js +8 -9
  448. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -6
  449. package/lib/optimize/MinChunkSizePlugin.js +9 -6
  450. package/lib/optimize/ModuleConcatenationPlugin.js +23 -16
  451. package/lib/{dependencies → optimize}/PureExpressionDependency.js +11 -10
  452. package/lib/optimize/RealContentHashPlugin.js +16 -7
  453. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  454. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  455. package/lib/optimize/SideEffectsFlagPlugin.js +25 -37
  456. package/lib/optimize/SplitChunksPlugin.js +715 -159
  457. package/lib/{util → optimize}/TupleQueue.js +9 -9
  458. package/lib/optimize/chunkSetIntersections.js +437 -0
  459. package/lib/{util → optimize}/deterministicGrouping.js +25 -30
  460. package/lib/{BannerPlugin.js → output/BannerPlugin.js} +82 -14
  461. package/lib/{CleanPlugin.js → output/CleanPlugin.js} +66 -24
  462. package/lib/{CopyPlugin.js → output/CopyPlugin.js} +142 -67
  463. package/lib/{ManifestPlugin.js → output/ManifestPlugin.js} +91 -17
  464. package/lib/output/SSRManifestPlugin.js +349 -0
  465. package/lib/performance/AnalyzableBailoutsPlugin.js +1 -1
  466. package/lib/performance/AsyncChunkWaterfallsPlugin.js +1 -1
  467. package/lib/performance/BroadContextsPlugin.js +4 -4
  468. package/lib/performance/CacheEffectivenessPlugin.js +5 -7
  469. package/lib/performance/ConflictingResourceHintsPlugin.js +1 -1
  470. package/lib/performance/DuplicateModulesPlugin.js +3 -4
  471. package/lib/performance/DuplicatePackagesPlugin.js +3 -3
  472. package/lib/performance/DynamicExportsPlugin.js +2 -2
  473. package/lib/performance/EvalUsagePlugin.js +3 -3
  474. package/lib/performance/HotspotsPlugin.js +11 -10
  475. package/lib/performance/LargeModulesPlugin.js +2 -3
  476. package/lib/performance/LegacyJavascriptPlugin.js +1 -2
  477. package/lib/performance/MissingSideEffectsPlugin.js +2 -3
  478. package/lib/performance/MissingSourceMapsPlugin.js +5 -6
  479. package/lib/performance/PureAnnotationsPlugin.js +3 -3
  480. package/lib/performance/RedundantDynamicImportsPlugin.js +6 -8
  481. package/lib/performance/ScopeHoistingBailoutsPlugin.js +2 -2
  482. package/lib/performance/SizeLimitsPlugin.js +13 -16
  483. package/lib/performance/TopLevelThisPlugin.js +8 -7
  484. package/lib/performance/UnsplitVendorsPlugin.js +1 -2
  485. package/lib/performance/UnusedAliasesPlugin.js +6 -7
  486. package/lib/performance/UnusedAssetsPlugin.js +5 -5
  487. package/lib/performance/UnusedDefinesPlugin.js +2 -2
  488. package/lib/performance/UnusedExternalsPlugin.js +3 -4
  489. package/lib/performance/UnusedFederationPlugin.js +2 -4
  490. package/lib/performance/UnusedModulesPlugin.js +5 -4
  491. package/lib/performance/getModuleSize.js +1 -1
  492. package/lib/performance/hasOnlyUnusedExports.js +4 -4
  493. package/lib/performance/isOnlyReexported.js +7 -6
  494. package/lib/{AutomaticPrefetchPlugin.js → prefetch/AutomaticPrefetchPlugin.js} +4 -5
  495. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +2 -2
  496. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +7 -9
  497. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +4 -4
  498. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +4 -4
  499. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +4 -4
  500. package/lib/{dependencies → prefetch}/PrefetchDependency.js +1 -1
  501. package/lib/{PrefetchPlugin.js → prefetch/PrefetchPlugin.js} +2 -2
  502. package/lib/prefetch/ResourceHintPlugin.js +82 -65
  503. package/lib/prefetch/ResourceHintRuntimeModule.js +3 -3
  504. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -13
  505. package/lib/prefetch/parseResourceHintOptions.js +4 -3
  506. package/lib/{ProvidePlugin.js → provide/ProvidePlugin.js} +7 -7
  507. package/lib/{dependencies → provide}/ProvidedDependency.js +14 -13
  508. package/lib/{IgnorePlugin.js → resolve/IgnorePlugin.js} +30 -13
  509. package/lib/{NormalModuleReplacementPlugin.js → resolve/NormalModuleReplacementPlugin.js} +4 -4
  510. package/lib/{ResolverFactory.js → resolve/ResolverFactory.js} +18 -5
  511. package/lib/resolve/getResolveOptionsKey.js +59 -0
  512. package/lib/rules/RuleSetCompiler.js +27 -46
  513. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +2 -2
  514. package/lib/runtime/AsyncModuleRuntimeModule.js +10 -9
  515. package/lib/runtime/AutoPublicPathRuntimeModule.js +5 -5
  516. package/lib/runtime/BaseUriRuntimeModule.js +3 -3
  517. package/lib/runtime/ChunkNameRuntimeModule.js +2 -2
  518. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +2 -2
  519. package/lib/runtime/CompatRuntimeModule.js +4 -4
  520. package/lib/runtime/ConcatenationWrapRuntimeModule.js +2 -2
  521. package/lib/runtime/ConstructRequireRuntimeModule.js +2 -2
  522. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +2 -2
  523. package/lib/runtime/CreateScriptRuntimeModule.js +2 -2
  524. package/lib/runtime/CreateScriptUrlRuntimeModule.js +2 -2
  525. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +6 -6
  526. package/lib/runtime/EnsureChunkRuntimeModule.js +4 -4
  527. package/lib/runtime/GetChunkFilenameRuntimeModule.js +9 -10
  528. package/lib/runtime/GetFullHashRuntimeModule.js +2 -2
  529. package/lib/runtime/GetMainFilenameRuntimeModule.js +4 -4
  530. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +3 -3
  531. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +3 -3
  532. package/lib/runtime/GlobalRuntimeModule.js +5 -7
  533. package/lib/runtime/HasOwnPropertyRuntimeModule.js +3 -3
  534. package/lib/runtime/HelperRuntimeModule.js +16 -1
  535. package/lib/runtime/LoadScriptRuntimeModule.js +3 -3
  536. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +135 -102
  537. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +2 -2
  538. package/lib/runtime/NonceRuntimeModule.js +2 -2
  539. package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -4
  540. package/lib/runtime/PublicPathRuntimeModule.js +2 -2
  541. package/lib/runtime/RelativeUrlRuntimeModule.js +2 -2
  542. package/lib/{RuntimeGlobals.js → runtime/RuntimeGlobals.js} +18 -1
  543. package/lib/runtime/RuntimeIdRuntimeModule.js +4 -4
  544. package/lib/{RuntimeModule.js → runtime/RuntimeModule.js} +36 -21
  545. package/lib/{RuntimePlugin.js → runtime/RuntimePlugin.js} +48 -50
  546. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +2 -2
  547. package/lib/runtime/SpecNamespaceObjectRuntimeModule.js +2 -2
  548. package/lib/runtime/StartupChunkDependenciesPlugin.js +2 -2
  549. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +5 -5
  550. package/lib/runtime/StartupEntrypointRuntimeModule.js +3 -3
  551. package/lib/runtime/SystemContextRuntimeModule.js +2 -2
  552. package/lib/runtime/ToBinaryRuntimeModule.js +3 -3
  553. package/lib/runtime/WorkerRuntimeModule.js +1 -1
  554. package/lib/runtime/baseUri.js +1 -1
  555. package/lib/schemes/DataUriPlugin.js +4 -7
  556. package/lib/schemes/HttpUriPlugin.js +67 -11
  557. package/lib/schemes/VirtualUrlPlugin.js +50 -16
  558. package/lib/serialization/AggregateErrorSerializer.js +2 -2
  559. package/lib/serialization/BinaryMiddleware.js +9 -9
  560. package/lib/serialization/FileMiddleware.js +19 -19
  561. package/lib/serialization/ObjectMiddleware.js +77 -49
  562. package/lib/serialization/SerializerMiddleware.js +2 -2
  563. package/lib/serialization/SingleItemMiddleware.js +4 -2
  564. package/lib/sharing/ConsumeSharedFallbackDependency.js +9 -1
  565. package/lib/sharing/ConsumeSharedModule.js +18 -14
  566. package/lib/sharing/ConsumeSharedPlugin.js +148 -42
  567. package/lib/sharing/ConsumeSharedRuntimeModule.js +8 -8
  568. package/lib/sharing/ProvideForSharedDependency.js +9 -1
  569. package/lib/sharing/ProvideSharedDependency.js +1 -1
  570. package/lib/sharing/ProvideSharedModule.js +11 -9
  571. package/lib/sharing/ProvideSharedModuleFactory.js +2 -2
  572. package/lib/sharing/ProvideSharedPlugin.js +111 -20
  573. package/lib/sharing/SharePlugin.js +102 -9
  574. package/lib/sharing/ShareRuntimeModule.js +6 -6
  575. package/lib/sharing/resolveMatchedConfigs.js +1 -1
  576. package/lib/{util → sharing}/semver.js +19 -19
  577. package/lib/sharing/utils.js +59 -2
  578. package/lib/stats/DefaultStatsFactoryPlugin.js +25 -23
  579. package/lib/stats/DefaultStatsPresetPlugin.js +1 -1
  580. package/lib/stats/DefaultStatsPrinterPlugin.js +3 -3
  581. package/lib/{MultiStats.js → stats/MultiStats.js} +4 -4
  582. package/lib/{Stats.js → stats/Stats.js} +4 -4
  583. package/lib/stats/StatsFactory.js +14 -13
  584. package/lib/{ChunkTemplate.js → template/ChunkTemplate.js} +7 -7
  585. package/lib/{ConditionalInitFragment.js → template/ConditionalInitFragment.js} +3 -3
  586. package/lib/template/DependencyTemplate.js +77 -0
  587. package/lib/{DependencyTemplates.js → template/DependencyTemplates.js} +9 -4
  588. package/lib/template/InitFragment.js +223 -0
  589. package/lib/{MainTemplate.js → template/MainTemplate.js} +11 -11
  590. package/lib/{ModuleInfoHeaderPlugin.js → template/ModuleInfoHeaderPlugin.js} +30 -8
  591. package/lib/{ModuleTemplate.js → template/ModuleTemplate.js} +6 -6
  592. package/lib/{RuntimeTemplate.js → template/RuntimeTemplate.js} +178 -106
  593. package/lib/{Template.js → template/Template.js} +13 -11
  594. package/lib/{TemplatedPathPlugin.js → template/TemplatedPathPlugin.js} +35 -82
  595. package/lib/typescript/TypeScriptPlugin.js +5 -6
  596. package/lib/util/LocConverter.js +4 -7
  597. package/lib/util/RequestShortener.js +44 -0
  598. package/lib/util/SortableSet.js +87 -22
  599. package/lib/util/SourceProcessor.js +364 -66
  600. package/lib/util/TupleSet.js +27 -27
  601. package/lib/util/WeakTupleMap.js +10 -12
  602. package/lib/util/buildDiagnostics.js +2 -2
  603. package/lib/util/comparators.js +10 -10
  604. package/lib/util/concatenate.js +32 -151
  605. package/lib/util/createHooksRegistry.js +1 -2
  606. package/lib/util/createMappings.js +111 -0
  607. package/lib/util/dataURL.js +96 -18
  608. package/lib/util/deprecation.js +1 -1
  609. package/lib/util/extractComments.js +118 -0
  610. package/lib/util/formatLocation.js +1 -1
  611. package/lib/util/globUtils.js +197 -16
  612. package/lib/util/haltVisitors.js +51 -0
  613. package/lib/util/handlerKeys.js +2 -2
  614. package/lib/util/hash/wasm-hash.js +3 -4
  615. package/lib/util/identifier.js +117 -1
  616. package/lib/util/implicitTypeLoaderFallback.js +6 -4
  617. package/lib/util/internalSerializables.js +295 -103
  618. package/lib/util/magicComment.js +12 -7
  619. package/lib/util/makeSerializable.js +23 -4
  620. package/lib/util/parseJson.js +1 -1
  621. package/lib/util/preloadModuleType.js +5 -2
  622. package/lib/util/registerExternalSerializer.js +2 -2
  623. package/lib/util/removeBOM.js +1 -1
  624. package/lib/util/runtime.js +1 -1
  625. package/lib/util/serialization.js +4 -1
  626. package/lib/util/source.js +2 -2
  627. package/lib/util/terminalColors.js +161 -0
  628. package/lib/{wasm-async → wasm}/AsyncWasmCompileRuntimeModule.js +5 -5
  629. package/lib/{wasm-async → wasm}/AsyncWasmLoadingRuntimeModule.js +5 -5
  630. package/lib/{wasm-async → wasm}/AsyncWasmModule.js +9 -5
  631. package/lib/{wasm-async → wasm}/AsyncWebAssemblyGenerator.js +11 -6
  632. package/lib/{wasm-async → wasm}/AsyncWebAssemblyJavascriptGenerator.js +16 -11
  633. package/lib/{wasm-async → wasm}/AsyncWebAssemblyModulesPlugin.js +26 -10
  634. package/lib/{wasm-async → wasm}/AsyncWebAssemblyParser.js +8 -8
  635. package/lib/wasm/EnableWasmLoadingPlugin.js +1 -1
  636. package/lib/{wasm-async → wasm}/UniversalCompileAsyncWasmPlugin.js +9 -7
  637. package/lib/wasm/wasmModuleFilename.js +2 -2
  638. package/lib/wasm-sync/SyncWasmModule.js +3 -3
  639. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +11 -12
  640. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +3 -3
  641. package/lib/wasm-sync/WebAssemblyGenerator.js +15 -9
  642. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +19 -16
  643. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +9 -7
  644. package/lib/wasm-sync/WebAssemblyParser.js +6 -6
  645. package/lib/wasm-sync/WebAssemblyUtils.js +8 -9
  646. package/lib/{MultiWatching.js → watch/MultiWatching.js} +3 -3
  647. package/lib/{WatchIgnorePlugin.js → watch/WatchIgnorePlugin.js} +43 -9
  648. package/lib/{Watching.js → watch/Watching.js} +8 -8
  649. package/lib/web/FetchCompileAsyncWasmPlugin.js +8 -6
  650. package/lib/web/FetchCompileWasmPlugin.js +6 -4
  651. package/lib/web/JsonpChunkLoadingPlugin.js +3 -3
  652. package/lib/web/JsonpChunkLoadingRuntimeModule.js +6 -6
  653. package/lib/web/JsonpTemplatePlugin.js +1 -1
  654. package/lib/webpack.js +27 -17
  655. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +3 -3
  656. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +6 -6
  657. package/package.json +70 -40
  658. package/schemas/WebpackOptions.check.js +2 -1
  659. package/schemas/WebpackOptions.d.json.ts +2 -0
  660. package/schemas/WebpackOptions.json +294 -74
  661. package/schemas/plugins/BannerPlugin.check.js +2 -1
  662. package/schemas/plugins/BannerPlugin.json +29 -2
  663. package/schemas/plugins/HtmlGeneratorOptions.check.js +1 -0
  664. package/schemas/plugins/HtmlParserOptions.check.js +2 -1
  665. package/schemas/plugins/IgnorePlugin.check.js +1 -0
  666. package/schemas/plugins/IgnorePlugin.d.json.ts +2 -0
  667. package/schemas/plugins/IgnorePlugin.json +1 -1
  668. package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -0
  669. package/schemas/plugins/ManifestPlugin.check.js +1 -0
  670. package/schemas/plugins/ManifestPlugin.json +3 -3
  671. package/schemas/plugins/ProgressPlugin.check.js +2 -1
  672. package/schemas/plugins/ProgressPlugin.json +2 -7
  673. package/schemas/plugins/SSRManifestPlugin.check.js +7 -0
  674. package/schemas/plugins/SSRManifestPlugin.json +20 -0
  675. package/schemas/plugins/SourceMapDevToolPlugin.check.js +2 -1
  676. package/schemas/plugins/SourceMapDevToolPlugin.json +44 -12
  677. package/schemas/plugins/WatchIgnorePlugin.check.js +2 -1
  678. package/schemas/plugins/WatchIgnorePlugin.json +12 -3
  679. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -0
  680. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -0
  681. package/schemas/plugins/asset/AssetParserOptions.check.js +1 -0
  682. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -0
  683. package/schemas/plugins/container/ContainerPlugin.check.js +2 -1
  684. package/schemas/plugins/container/ContainerPlugin.json +8 -0
  685. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -0
  686. package/schemas/plugins/container/ExternalsType.check.js +1 -0
  687. package/schemas/plugins/container/ModuleFederationPlugin.check.js +2 -1
  688. package/schemas/plugins/container/ModuleFederationPlugin.json +40 -0
  689. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -0
  690. package/schemas/plugins/css/CssGeneratorOptions.check.js +1 -0
  691. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +1 -0
  692. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -0
  693. package/schemas/plugins/css/CssParserOptions.check.js +1 -0
  694. package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -0
  695. package/schemas/plugins/dll/DllPlugin.check.js +1 -0
  696. package/schemas/plugins/dll/DllReferencePlugin.check.js +2 -1
  697. package/schemas/plugins/dll/DllReferencePlugin.json +3 -18
  698. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +1 -0
  699. package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js +1 -0
  700. package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.js +1 -0
  701. package/schemas/plugins/json/JsonModulesPluginGenerator.check.js +1 -0
  702. package/schemas/plugins/json/JsonModulesPluginParser.check.js +1 -0
  703. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -0
  704. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -0
  705. package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.js +1 -0
  706. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -0
  707. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -0
  708. package/schemas/plugins/schemes/VirtualUrlPlugin.check.js +1 -0
  709. package/schemas/plugins/sharing/ConsumeSharedPlugin.check.js +2 -1
  710. package/schemas/plugins/sharing/ConsumeSharedPlugin.json +32 -0
  711. package/schemas/plugins/sharing/ProvideSharedPlugin.check.js +2 -1
  712. package/schemas/plugins/sharing/ProvideSharedPlugin.json +32 -0
  713. package/schemas/plugins/sharing/SharePlugin.check.js +2 -1
  714. package/schemas/plugins/sharing/SharePlugin.json +32 -0
  715. package/types.d.ts +13915 -8414
  716. package/lib/ErrorHelpers.js +0 -107
  717. package/lib/LazyBarrel.js +0 -388
  718. package/lib/dependencies/HarmonyAcceptImportDependency.js +0 -39
  719. package/lib/dependencies/HarmonyModulesPlugin.js +0 -192
  720. package/lib/javascript/ChunkFormatHelpers.js +0 -71
  721. package/lib/javascript/grammar.js +0 -5546
  722. package/lib/javascript/parser.js +0 -1494
  723. package/lib/javascript/regexpData.js +0 -51
  724. package/lib/performance/getSourceModules.js +0 -22
  725. package/lib/util/Semaphore.js +0 -65
  726. package/lib/util/objectToMap.js +0 -15
  727. package/schemas/WebpackOptions.check.d.ts +0 -7
  728. package/schemas/_container.json +0 -155
  729. package/schemas/_sharing.json +0 -118
  730. package/schemas/plugins/BannerPlugin.check.d.ts +0 -7
  731. package/schemas/plugins/HtmlGeneratorOptions.check.d.ts +0 -7
  732. package/schemas/plugins/HtmlParserOptions.check.d.ts +0 -7
  733. package/schemas/plugins/IgnorePlugin.check.d.ts +0 -7
  734. package/schemas/plugins/LoaderOptionsPlugin.check.d.ts +0 -7
  735. package/schemas/plugins/ManifestPlugin.check.d.ts +0 -7
  736. package/schemas/plugins/ProgressPlugin.check.d.ts +0 -7
  737. package/schemas/plugins/SourceMapDevToolPlugin.check.d.ts +0 -7
  738. package/schemas/plugins/WatchIgnorePlugin.check.d.ts +0 -7
  739. package/schemas/plugins/asset/AssetGeneratorOptions.check.d.ts +0 -7
  740. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.d.ts +0 -7
  741. package/schemas/plugins/asset/AssetParserOptions.check.d.ts +0 -7
  742. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.d.ts +0 -7
  743. package/schemas/plugins/container/ContainerPlugin.check.d.ts +0 -7
  744. package/schemas/plugins/container/ContainerReferencePlugin.check.d.ts +0 -7
  745. package/schemas/plugins/container/ExternalsType.check.d.ts +0 -7
  746. package/schemas/plugins/container/ModuleFederationPlugin.check.d.ts +0 -7
  747. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.d.ts +0 -7
  748. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +0 -7
  749. package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +0 -7
  750. package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +0 -7
  751. package/schemas/plugins/css/CssParserOptions.check.d.ts +0 -7
  752. package/schemas/plugins/debug/ProfilingPlugin.check.d.ts +0 -7
  753. package/schemas/plugins/dll/DllPlugin.check.d.ts +0 -7
  754. package/schemas/plugins/dll/DllReferencePlugin.check.d.ts +0 -7
  755. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.d.ts +0 -7
  756. package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.d.ts +0 -7
  757. package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.d.ts +0 -7
  758. package/schemas/plugins/json/JsonModulesPluginGenerator.check.d.ts +0 -7
  759. package/schemas/plugins/json/JsonModulesPluginParser.check.d.ts +0 -7
  760. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.d.ts +0 -7
  761. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.d.ts +0 -7
  762. package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.d.ts +0 -7
  763. package/schemas/plugins/optimize/MinChunkSizePlugin.check.d.ts +0 -7
  764. package/schemas/plugins/schemes/HttpUriPlugin.check.d.ts +0 -7
  765. package/schemas/plugins/schemes/VirtualUrlPlugin.check.d.ts +0 -7
  766. package/schemas/plugins/sharing/ConsumeSharedPlugin.check.d.ts +0 -7
  767. package/schemas/plugins/sharing/ProvideSharedPlugin.check.d.ts +0 -7
  768. package/schemas/plugins/sharing/SharePlugin.check.d.ts +0 -7
  769. /package/lib/{validateSchema.js → config/validateSchema.js} +0 -0
  770. /package/lib/{util → css}/conventions.js +0 -0
  771. /package/lib/{util → css}/topologicalSort.js +0 -0
  772. /package/lib/dependencies/{getFunctionExpression.js → helpers/getFunctionExpression.js} +0 -0
  773. /package/lib/{util → externals}/extractUrlAndGlobal.js +0 -0
  774. /package/lib/{util → fs}/StackedCacheMap.js +0 -0
  775. /package/lib/{util → javascript}/StackedMap.js +0 -0
  776. /package/lib/{ModuleProfile.js → module/ModuleProfile.js} +0 -0
  777. /package/lib/{ModuleSourceTypeConstants.js → module/ModuleSourceTypeConstants.js} +0 -0
  778. /package/lib/{ModuleTypeConstants.js → module/ModuleTypeConstants.js} +0 -0
  779. /package/lib/{OptimizationStages.js → optimize/OptimizationStages.js} +0 -0
  780. /package/lib/{util → optimize}/Queue.js +0 -0
  781. /package/lib/{util → stats}/smartGrouping.js +0 -0
@@ -4,21 +4,22 @@
4
4
 
5
5
  "use strict";
6
6
 
7
- const Parser = require("../Parser");
8
- const ConstDependency = require("../dependencies/ConstDependency");
9
- const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
10
- const HtmlInlineHtmlDependency = require("../dependencies/HtmlInlineHtmlDependency");
11
- const HtmlInlineScriptDependency = require("../dependencies/HtmlInlineScriptDependency");
12
- const HtmlInlineStyleDependency = require("../dependencies/HtmlInlineStyleDependency");
13
- const HtmlSourceDependency = require("../dependencies/HtmlSourceDependency");
14
- const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
7
+ const ConstDependency = require("../dependencies/core/ConstDependency");
8
+ const StaticExportsDependency = require("../dependencies/core/StaticExportsDependency");
9
+ const HtmlEntryDependency = require("../dependencies/html/HtmlEntryDependency");
10
+ const HtmlInlineHtmlDependency = require("../dependencies/html/HtmlInlineHtmlDependency");
11
+ const HtmlInlineScriptDependency = require("../dependencies/html/HtmlInlineScriptDependency");
12
+ const HtmlInlineStyleDependency = require("../dependencies/html/HtmlInlineStyleDependency");
13
+ const HtmlSourceDependency = require("../dependencies/html/HtmlSourceDependency");
15
14
  const WebpackError = require("../errors/WebpackError");
15
+ const Parser = require("../module/Parser");
16
16
  const ResourceHintPlugin = require("../prefetch/ResourceHintPlugin");
17
17
  const parseResourceHintOptions = require("../prefetch/parseResourceHintOptions");
18
+ const ModuleInfoHeaderPlugin = require("../template/ModuleInfoHeaderPlugin");
18
19
  const LazySet = require("../util/LazySet");
19
20
  const LocConverter = require("../util/LocConverter");
20
21
  const createHash = require("../util/createHash");
21
- const { contextify } = require("../util/identifier");
22
+ const { contextify, getRequestBaseName } = require("../util/identifier");
22
23
  const {
23
24
  createMagicCommentContext,
24
25
  parseMagicComment,
@@ -26,12 +27,13 @@ const {
26
27
  } = require("../util/magicComment");
27
28
  const memoize = require("../util/memoize");
28
29
  const { JAVASCRIPT_SCRIPT_TYPES } = require("./data");
30
+ const { SVG_TAG_ADJUST } = require("./data");
31
+ const { SourceProcessor } = require("./syntax");
29
32
  const {
30
- NS_HTML,
31
- NS_SVG,
33
+ Field,
34
+ Flag,
32
35
  NodeType,
33
- SVG_TAG_ADJUST,
34
- SourceProcessor,
36
+ Part,
35
37
  baseTag,
36
38
  buildHeadTags,
37
39
  decodeEntities,
@@ -43,7 +45,7 @@ const {
43
45
  parseMsapplicationTask,
44
46
  parseSrc,
45
47
  parseSrcset
46
- } = require("./syntax");
48
+ } = require("./syntax-parser");
47
49
 
48
50
  const getUnsupportedFeatureWarning = memoize(() =>
49
51
  require("../errors/UnsupportedFeatureWarning")
@@ -59,10 +61,10 @@ const getCommentCompilationWarning = memoize(() =>
59
61
 
60
62
  /** @import { HtmlParserOptions } from "../../declarations/WebpackOptions" */
61
63
  /** @import { Range } from "../javascript/JavascriptParser" */
62
- /** @import Module, { BuildInfo, BuildMeta } from "../Module" */
64
+ /** @import Module, { BuildInfo, BuildMeta } from "../module/Module" */
63
65
  /** @import { FileSystemDependencies } from "../Compilation" */
64
- /** @import NormalModule from "../NormalModule" */
65
- /** @import { ParserState, PreparsedAst } from "../Parser" */
66
+ /** @import NormalModule from "../module/NormalModule" */
67
+ /** @import { ParserState, PreparsedAst } from "../module/Parser" */
66
68
  /** @import { HtmlModuleBuildInfo } from "./HtmlModule" */
67
69
 
68
70
  /**
@@ -78,7 +80,8 @@ const getCommentCompilationWarning = memoize(() =>
78
80
  */
79
81
  /** @typedef {(source: string, context: HtmlTemplateContext) => string} HtmlTemplateFunction */
80
82
 
81
- /** @import { ParsedSource } from "./syntax" */
83
+ /** @import { ParsedSource } from "./syntax-parser" */
84
+ /** @import { MagicCommentOptions } from "../util/magicComment" */
82
85
 
83
86
  // Cheap pre-filter for a `style="..."` attribute: only route it through the
84
87
  // CSS pipeline when it can hold a URL-bearing function (`url()` / `src()` /
@@ -90,10 +93,9 @@ const STYLE_ATTR_URL_REGEXP = /url\(|src\(|image\(|image-set\(/i;
90
93
  // hold a `url(...)` FuncIRI. Most are plain colors/keywords (`#fff`, `red`).
91
94
  const FUNC_IRI_URL_REGEXP = /url\(/i;
92
95
 
93
- // Cheap pre-filter for `<iframe srcdoc>` markup: only spin up a nested HTML
94
- // module when the document can reference an asset — via any attribute (`src=`,
95
- // `href=`, `style=`, …), a CSS `url(...)`, or a CSS `@import`. Pure
96
- // formatting/text markup (`<p>hi</p>`) rewrites to itself, so skip it.
96
+ // Cheap pre-filter for `<iframe srcdoc>`: a nested HTML module is only worth
97
+ // building when the markup can reference an asset — any attribute, a CSS
98
+ // `url(...)` or an `@import`. Pure text markup rewrites to itself.
97
99
  const SRCDOC_ASSET_REGEXP = /[=]|url\(|@import/i;
98
100
 
99
101
  // A URL carrying its own scheme (`https:`, `data:`, …) ignores the document
@@ -106,6 +108,12 @@ const CHARSET_DECLARATION_REGEXP = /charset\s*=/i;
106
108
  // CSP/fetch attributes copied verbatim onto a synthesized sibling `<link>` /
107
109
  // `<script>` (`HtmlEntryDependency`). Fixed output order, independent of
108
110
  // source order.
111
+ /**
112
+ * @param {import("./syntax-parser").HtmlPath} path walk path at an element
113
+ * @returns {boolean} whether the element is in the HTML namespace
114
+ */
115
+ const isHtmlElement = (path) => !path.flag(Flag.svg) && !path.flag(Flag.mathml);
116
+
109
117
  const COPYABLE_SIBLING_ATTRS = ["nonce", "crossorigin", "referrerpolicy"];
110
118
 
111
119
  const CC_QUOTATION = '"'.charCodeAt(0);
@@ -116,54 +124,135 @@ const CC_SLASH = "/".charCodeAt(0);
116
124
  * Byte-exact source span of an attribute including the single leading
117
125
  * whitespace (` name`, ` name=value`, ` name="value"`), mirroring the
118
126
  * tokenizer's end-of-attribute rule (`valueEnd + 1` past the closing quote).
119
- * @param {import("./syntax").HtmlPath} path walk path (used only for attribute-ref reads)
127
+ * @param {import("./syntax-parser").HtmlPath} path walk path (used only for attribute-ref reads)
120
128
  * @param {string} source HTML source
121
- * @param {import("./syntax").HtmlAttributeRef} attr attribute ref
129
+ * @param {import("./syntax-parser").HtmlAttributeRef} attr attribute ref
122
130
  * @returns {string} the attribute's source slice
123
131
  */
124
132
  const attrSourceSpan = (path, source, attr) => {
125
- const valueStart = path.attributeValueStart(attr);
126
- const valueEnd = path.attributeValueEnd(attr);
133
+ const valueStart = path.startOf(Part.value, attr);
134
+ const valueEnd = path.endOf(Part.value, attr);
127
135
  const end =
128
136
  valueStart === -1
129
- ? path.attributeNameEnd(attr)
137
+ ? path.endOf(Part.name, attr)
130
138
  : source.charCodeAt(valueStart - 1) === CC_QUOTATION ||
131
139
  source.charCodeAt(valueStart - 1) === CC_APOSTROPHE
132
140
  ? valueEnd + 1
133
141
  : valueEnd;
134
- return source.slice(path.attributeNameStart(attr) - 1, end);
142
+ return source.slice(path.startOf(Part.name, attr) - 1, end);
135
143
  };
136
144
 
137
145
  /**
138
146
  * Source span of a tag's `integrity` attribute (offsets relative to
139
147
  * `elementStart`, leading whitespace and quotes included), so the template can
140
148
  * drop the content-specific author value without re-parsing. Null when absent.
141
- * @param {import("./syntax").HtmlPath} path walk path (for attribute reads)
149
+ * @param {import("./syntax-parser").HtmlPath} path walk path (for attribute reads)
142
150
  * @param {string} source HTML source
143
151
  * @param {number} elementStart offset of the tag's opening `<`
144
152
  * @returns {Range | null} the span, or null when there is no `integrity`
145
153
  */
146
154
  const captureIntegrityRange = (path, source, elementStart) => {
147
- const integrityAttr = path.findAttribute("integrity");
148
- if (integrityAttr === 0 || path.attributeNameStart(integrityAttr) < 0) {
155
+ const integrityAttr = path.fieldNamed(Field.attributes, "integrity");
156
+ if (integrityAttr === 0 || path.startOf(Part.name, integrityAttr) < 0) {
149
157
  return null;
150
158
  }
151
- let rs = path.attributeNameStart(integrityAttr);
159
+ let rs = path.startOf(Part.name, integrityAttr);
152
160
  while (rs > 0 && isAsciiWhitespace(source.charCodeAt(rs - 1))) {
153
161
  rs--;
154
162
  }
155
163
  let re;
156
- const ivs = path.attributeValueStart(integrityAttr);
164
+ const ivs = path.startOf(Part.value, integrityAttr);
157
165
  if (ivs === -1) {
158
- re = path.attributeNameEnd(integrityAttr);
166
+ re = path.endOf(Part.name, integrityAttr);
159
167
  } else {
160
168
  const q = source.charCodeAt(ivs - 1);
161
- const ive = path.attributeValueEnd(integrityAttr);
169
+ const ive = path.endOf(Part.value, integrityAttr);
162
170
  re = q === CC_QUOTATION || q === CC_APOSTROPHE ? ive + 1 : ive;
163
171
  }
164
172
  return [rs - elementStart, re - elementStart];
165
173
  };
166
174
 
175
+ /**
176
+ * Whether a span holds nothing a script body could have read — whitespace and
177
+ * comments only. Scanned rather than matched: the pattern for it backtracks.
178
+ * @param {string} source HTML source
179
+ * @param {number} start offset the span starts at
180
+ * @param {number} end offset the span ends at
181
+ * @returns {boolean} true when no node of the span reaches the DOM
182
+ */
183
+ const isEmptyRunGap = (source, start, end) => {
184
+ let offset = start;
185
+ while (offset < end) {
186
+ if (isAsciiWhitespace(source.charCodeAt(offset))) {
187
+ offset++;
188
+ continue;
189
+ }
190
+ if (!source.startsWith("<!--", offset)) return false;
191
+ const close = source.indexOf("-->", offset + 4);
192
+ if (close === -1 || close + 3 > end) return false;
193
+ offset = close + 3;
194
+ }
195
+ return true;
196
+ };
197
+
198
+ // What an entry name keeps from a page's path. The mapping is reversible, so
199
+ // two pages of one compilation can never sanitize to the same name.
200
+ const ENTRY_NAME_KEPT_REGEXP = /[^\w.]/g;
201
+ const ENTRY_NAME_EXTENSION_REGEXP = /\.[^./\\]*$/;
202
+ const ENTRY_NAME_TRIM_REGEXP = /^[-.]+|[-.]+$/g;
203
+
204
+ /**
205
+ * Names the entries a page's tags are extracted under, after the page itself.
206
+ * A `data:` document has no path to be named after, so it keeps a digest of
207
+ * the one thing that tells it from another such document.
208
+ * @param {string} pagePath the page's path, relative to the compiler context
209
+ * @param {import("../util/Hash").HashFunction | undefined} hashFunction `output.hashFunction`
210
+ * @returns {string} the prefix every entry name of this page starts with
211
+ */
212
+ const entryNamePrefix = (pagePath, hashFunction) => {
213
+ if (pagePath.startsWith("data:")) {
214
+ const digest = createHash(hashFunction || "md4")
215
+ .update(pagePath)
216
+ .digest("hex")
217
+ .slice(0, 8);
218
+ return `data-${digest}`;
219
+ }
220
+ return pagePath
221
+ .replace(ENTRY_NAME_EXTENSION_REGEXP, "")
222
+ .replace(ENTRY_NAME_KEPT_REGEXP, (character) => {
223
+ if (character === "-") return "--";
224
+ if (character === "/" || character === "\\") return "-";
225
+ return `_${character.charCodeAt(0).toString(16)}_`;
226
+ })
227
+ .replace(ENTRY_NAME_TRIM_REGEXP, "");
228
+ };
229
+
230
+ /**
231
+ * @typedef {object} HtmlChunkNameData
232
+ * @property {string} page the page's path, escaped for use in a name
233
+ * @property {string} name the tag's own basename, empty for an inline body
234
+ * @property {number} index the tag's position in the page, across all kinds
235
+ * @property {"script" | "script-module" | "modulepreload" | "stylesheet" | "html" | "preload" | "prefetch"} type what the tag is extracted as
236
+ */
237
+
238
+ /** @typedef {(data: HtmlChunkNameData) => string} HtmlChunkNameFn */
239
+
240
+ const CHUNK_NAME_PLACEHOLDER_REGEXP = /\[(page|name|index|type)\]/g;
241
+
242
+ /**
243
+ * End offset of a raw-text element, its closing tag included. `contentEnd`
244
+ * sits at the `</` that ended the body, and at the body's end without one.
245
+ * @param {string} source HTML source
246
+ * @param {number} contentEnd end offset of the element's raw text
247
+ * @returns {number} offset just past the element
248
+ */
249
+ const rawTextElementEnd = (source, contentEnd) => {
250
+ const close = source.startsWith("</", contentEnd)
251
+ ? source.indexOf(">", contentEnd)
252
+ : -1;
253
+ return close === -1 ? contentEnd : close + 1;
254
+ };
255
+
167
256
  /**
168
257
  * @param {Map<string, string>} attributes attributes
169
258
  * @param {string} name name
@@ -349,8 +438,8 @@ const isLinkStylesheet = (attributes) => {
349
438
  /** @typedef {SourceType | ((attrs: Map<string, string>, css: boolean) => SourceType)} SourceTypeOrResolver */
350
439
  /** @typedef {(attributes: Map<string, string>, value: string) => boolean} SourceFilter */
351
440
  /** @typedef {{ tag?: string, attribute: string, type: SourceType, filter?: SourceFilter }} SourceEntry */
352
- /** A `type` plus optional gates: `filter` (the decoded attribute map + the decoded value; return false to skip — covers both cross-attribute checks and cheap value checks) and `namespace` (restrict to an element namespace, e.g. SVG). */
353
- /** @typedef {{ type: SourceTypeOrResolver, filter?: SourceFilter, namespace?: number }} SourceItem */
441
+ /** A `type` plus optional gates: `filter` (the decoded attribute map + the decoded value; return false to skip — covers both cross-attribute checks and cheap value checks) and `namespace` (restrict to an element namespace, by its `Flag`, e.g. SVG). */
442
+ /** @typedef {{ type: SourceTypeOrResolver, filter?: SourceFilter, namespace?: typeof Flag.svg | typeof Flag.mathml }} SourceItem */
354
443
  /** A tag→attribute lookup; a `undefined` value marks a built-in source disabled via `sources` (`type: false`). */
355
444
  /** @typedef {Record<string, SourceItem | undefined>} SourceBucket */
356
445
  /** @typedef {Record<string, SourceBucket>} SourceTable */
@@ -365,15 +454,15 @@ const isLinkStylesheet = (attributes) => {
365
454
  * `constructor`, or `toString` resolve to inherited values at lookup
366
455
  * time — producing bogus dependencies and letting `sources: false` be
367
456
  * bypassed.
368
- * @param {...(Record<string, EXPECTED_ANY> | undefined)} bags property bags
369
- * @returns {EXPECTED_ANY} null-prototype dictionary
457
+ * @template T
458
+ * @param {...(Record<string, T> | undefined)} bags property bags
459
+ * @returns {Record<string, T>} null-prototype dictionary
370
460
  */
371
461
  const dict = (...bags) => Object.assign(Object.create(null), ...bags);
372
462
 
373
- // Shared `SourceItem` singletons used by the built-in defaults —
374
- // keeping one instance per kind stabilizes V8's hidden classes across
375
- // lookups in the walk. `srcset` is its own type; the walk picks the
376
- // `parseSrcset` parser for it and otherwise treats it like `src`.
463
+ // One shared `SourceItem` per kind, so the walk's lookups stay on a single V8
464
+ // hidden class. `srcset` is its own type: the walk picks `parseSrcset` for it
465
+ // and otherwise treats it like `src`.
377
466
  /** @type {SourceItem} */
378
467
  const PLAIN_SRC = { type: "src", filter: undefined };
379
468
  /** @type {SourceItem} */
@@ -389,10 +478,9 @@ const LINK_HREF = {
389
478
  type: (attrs, css) => {
390
479
  if (isLinkModulePreload(attrs)) return "modulepreload";
391
480
  if (css && isLinkStylesheet(attrs)) return "stylesheet";
392
- // `rel="preload"/"prefetch"` with `as="script"` (or `as="style"` when
393
- // `experiments.css` is on) becomes a bundled, non-executing entry whose
394
- // `href` is rewritten to the built chunk; other `as` targets (image,
395
- // font, fetch, …) stay plain asset URLs.
481
+ // `rel="preload"/"prefetch"` with `as="script"` — or `as="style"` under
482
+ // `experiments.css` — becomes a non-executing entry pointing at the built
483
+ // chunk; every other `as` target stays a plain asset URL.
396
484
  const rel = getAttributeValue(attrs, "rel");
397
485
  if (rel) {
398
486
  const rels = rel.trim().toLowerCase().split(/\s+/);
@@ -446,11 +534,9 @@ const META_CONTENT = {
446
534
  filter: filterMetaContent
447
535
  };
448
536
 
449
- // Built-in lookup table, written directly in its final resolved shape:
450
- // `DEFAULT_SOURCES_BY_TAG[tag][attribute] = item`. No module-load
451
- // loop, no separate array representation — every parser created with
452
- // the default `sources` config just references this table and pays
453
- // zero per-parser work.
537
+ // Written in its final resolved shape, `[tag][attribute] = item`, rather than
538
+ // built from an array at module load: a parser on the default `sources` config
539
+ // references this table and pays nothing per instance.
454
540
  /** @type {Record<string, Record<string, SourceItem>>} */
455
541
  const DEFAULT_SOURCES_BY_TAG = dict({
456
542
  // Obsolete Java-applet element; `code`/`object` are single class/object URLs.
@@ -489,13 +575,14 @@ const DEFAULT_SOURCES_BY_TAG = dict({
489
575
  th: dict({ background: PLAIN_SRC }),
490
576
  track: dict({ src: PLAIN_SRC }),
491
577
  video: dict({ poster: PLAIN_SRC, src: PLAIN_SRC }),
492
- // SVG. Tag names match the tree builder's adjusted camelCase
493
- // (`feImage`/`textPath`/`linearGradient`/`radialGradient`). `href`/
494
- // `xlink:href` reference another element/resource; fragment-only `#id`
495
- // values are left untouched, so only external `file.svg#id` is rewritten.
496
- // `color-profile`'s `xlink:href` points at an external ICC profile file.
497
- // `cursor`/`font-face-uri` point at an external image/font file; `altGlyph`/
498
- // `glyphRef`/`tref` are legacy element references (removed in SVG 2).
578
+ // WHY: SVG. Tag names match the tree builder's adjusted camelCase
579
+ // (`feImage`/`textPath`/`linearGradient`/`radialGradient`). `href` and
580
+ // `xlink:href` reference another element or resource, and a fragment-only
581
+ // `#id` value is left untouched, so only an external `file.svg#id` is
582
+ // rewritten. `color-profile`'s `xlink:href` points at an external ICC profile
583
+ // file; `cursor` and `font-face-uri` at an external image or font file; and
584
+ // `altGlyph`, `glyphRef` and `tref` are legacy element references, removed in
585
+ // SVG 2.
499
586
  altGlyph: dict({ "xlink:href": PLAIN_SRC, href: PLAIN_SRC }),
500
587
  "color-profile": dict({ "xlink:href": PLAIN_SRC, href: PLAIN_SRC }),
501
588
  cursor: dict({ "xlink:href": PLAIN_SRC, href: PLAIN_SRC }),
@@ -515,33 +602,30 @@ const DEFAULT_SOURCES_BY_TAG = dict({
515
602
  // clip-path, …) are handled separately during the walk (`parseCssUrls`).
516
603
  });
517
604
 
518
- // SVG presentation attributes (`fill`, `stroke`, …) carry CSS `url(...)`
519
- // FuncIRIs; `parseCssUrls` extracts external refs as assets (internal
520
- // `url(#id)` is left untouched). They apply to every SVG-namespace element, so
521
- // the item is `namespace`-gated rather than placed in a tag bucket. The filter
522
- // is a cheap pre-check skipping the common plain values (`red`, `none`, `#fff`).
605
+ // WHY: SVG presentation attributes (`fill`, `stroke`, …) carry CSS `url(...)`
606
+ // FuncIRIs, whose external refs `parseCssUrls` extracts as assets, leaving an
607
+ // internal `url(#id)` untouched. They apply to every SVG-namespace element, so
608
+ // the item is `namespace`-gated rather than placed in a tag bucket, and the
609
+ // filter is a cheap pre-check skipping the common plain values (`red`, `none`).
523
610
  /** @type {SourceItem} */
524
611
  const SVG_CSS_URL = {
525
612
  type: "css-url",
526
613
  filter: (attributes, value) => FUNC_IRI_URL_REGEXP.test(value),
527
- namespace: NS_SVG
614
+ namespace: Flag.svg
528
615
  };
529
616
 
530
- // The global `style=""` attribute (a CSS declaration list), available on every
531
- // tag and even with `sources: false`. Like every `stylesheet-style*` source it
532
- // only emits when `experiments.css` is on (checked where the dependency is
533
- // created); the filter is a cheap pre-check skipping declarations without a
534
- // `url()`/`src()`/… .
617
+ // The global `style=""` attribute, available on every tag and even under
618
+ // `sources: false`. Like every `stylesheet-style*` source it only emits when
619
+ // `experiments.css` is on, checked where the dependency is created.
535
620
  /** @type {SourceItem} */
536
621
  const STYLE_ATTRIBUTE = {
537
622
  type: "stylesheet-style-attribute",
538
623
  filter: (attributes, value) => STYLE_ATTR_URL_REGEXP.test(value)
539
624
  };
540
625
 
541
- // Any-tag sources — applied to every element as a fallback and folded into
542
- // each tag bucket, so the walk resolves one object per element and reads one
543
- // property per attribute. `DEFAULT` (svg presentation + style) is active
544
- // unless `sources: false`; only the always-on style attribute survives `false`.
626
+ // Any-tag sources, folded into each tag bucket so the walk resolves one object
627
+ // per element and one property per attribute. `sources: false` leaves only the
628
+ // always-on style attribute.
545
629
  /** @type {Record<string, SourceItem>} */
546
630
  const DEFAULT_ANY_SOURCES = dict({ style: STYLE_ATTRIBUTE });
547
631
  for (const name of [
@@ -625,10 +709,9 @@ const styleContentFilter = (attrs) => {
625
709
  return t === "" || t === "text/css";
626
710
  };
627
711
 
628
- // Element-body sources, independent of the `sources` option (even `sources:
629
- // false`): inline `<script>` bodies are always processed; the `<style>` body
630
- // only emits when `experiments.css` is on (checked where the dependency is
631
- // created, like every `stylesheet-style*` source).
712
+ // Element-body sources, independent of the `sources` option: a `<script>` body
713
+ // is always processed, while a `<style>` body only emits when `experiments.css`
714
+ // is on, checked where the dependency is created.
632
715
  /** @type {Record<string, ContentSourceItem>} */
633
716
  const CONTENT_SOURCES = dict({
634
717
  script: { type: scriptContentType, filter: scriptContentFilter },
@@ -649,11 +732,11 @@ class HtmlParser extends Parser {
649
732
  this.template = options.template;
650
733
  /** @type {import("../../declarations/WebpackOptions").UrlHintRule[] | undefined} */
651
734
  this._urlHints = options.urlHints;
652
- // `as` selects the parse mode — the HTML analog of the CSS parser's `as`.
653
- // `"document"` (default) parses a full page; any other value is the
654
- // context element whose inner HTML the source is parsed as (a fragment),
655
- // so context-sensitive tags (`<tr>`, `<td>`, `<option>`, …) in a partial
656
- // are kept, not dropped. `"template"` is the neutral generic fragment.
735
+ // `as` selects the parse mode: `"document"` parses a full page, any other
736
+ // value names the context element whose inner HTML this is, so that a
737
+ // partial's `<tr>`, `<td>` or `<option>` is kept rather than dropped.
738
+ /** @type {string | HtmlChunkNameFn | undefined} */
739
+ this._chunkName = options.chunkName;
657
740
  /** @type {string | undefined} */
658
741
  this.fragmentContext =
659
742
  options.as === undefined || options.as === "document"
@@ -673,13 +756,9 @@ class HtmlParser extends Parser {
673
756
  return;
674
757
  }
675
758
 
676
- // User array — `"..."` anywhere opts the per-tag defaults in as the
677
- // base; the built-in any-tag sources (svg presentation + style) are
678
- // always present. A user entry with no `tag` is an any-tag source (e.g.
679
- // `{ attribute: "data-style", type: "stylesheet-style-attribute" }`).
680
- // User entries override regardless of position. `dict()` keeps every
681
- // table null-prototype (see its doc), and per-tag writes rebuild the
682
- // bucket so the aliased default buckets stay intact.
759
+ // `"..."` anywhere opts the per-tag defaults in as the base, and a user
760
+ // entry with no `tag` is an any-tag source; user entries override wherever
761
+ // they sit. Per-tag writes rebuild the bucket, so the defaults stay intact.
683
762
  /** @type {SourceTable} */
684
763
  const byTag = sources.includes("...")
685
764
  ? dict(DEFAULT_SOURCES_BY_TAG)
@@ -804,27 +883,18 @@ class HtmlParser extends Parser {
804
883
  const css = Boolean(compilation.options.experiments.css);
805
884
  const urlHints = this._urlHints;
806
885
 
807
- // Stable, per-HTML-module prefix used when generating entry names for
808
- // script src / modulepreload references so they don't collide across
809
- // HTML modules in the same compilation. We hash the module's resource
810
- // path (a plain absolute path) — going through `contextify` against
811
- // the compilation root keeps the hash machine-stable for the same
812
- // project layout. Note: `module.identifier()` returns `html|<path>`
813
- // for HTML modules, which doesn't start with `/`, so contextify would
814
- // leave it absolute. `module.resource` is the bare path.
886
+ // An entry name starts with the page's own path, so two pages never claim
887
+ // one — from `resource`, since `identifier()` is `html|<path>`.
815
888
  /** @type {string} */
816
- const resource =
817
- /** @type {EXPECTED_ANY} */ (module).resource || module.identifier();
818
- const moduleHash = createHash(hashFunction || "md4")
819
- .update(context ? contextify(context, resource) : resource)
820
- .digest("hex")
821
- .slice(0, 8);
889
+ const resource = module.resource || module.identifier();
890
+ const entryPrefix = entryNamePrefix(
891
+ context ? contextify(context, resource) : resource,
892
+ hashFunction
893
+ );
822
894
 
823
- // `output.html` head injection: facts are collected during the walk and
824
- // become presentational dependencies afterwards — no later asset pass has
825
- // to re-parse the page. `data:` documents are skipped: synthetic entry
826
- // wrappers already carry the tags and iframe srcdoc pages must stay
827
- // untouched.
895
+ // `output.html` head injection collects facts during the walk and turns
896
+ // them into presentational dependencies after, so no later pass re-parses
897
+ // the page. `data:` documents are skipped — they already carry the tags.
828
898
  const htmlOutputOptions =
829
899
  compilation.options && compilation.options.output
830
900
  ? compilation.options.output.html
@@ -837,6 +907,72 @@ class HtmlParser extends Parser {
837
907
  !resource.startsWith("data:")
838
908
  ? htmlOutputOptions
839
909
  : undefined;
910
+ const chunkNameOption = this._chunkName;
911
+ /** @type {Set<string>} */
912
+ const claimedEntryNames = new Set();
913
+ /** @type {Set<string>} */
914
+ const requestedEntryNames = new Set();
915
+
916
+ /**
917
+ * Claims `base`, counting up from the tag's own position while another tag
918
+ * of this page holds it: one name would merge entries the document parts.
919
+ * @param {string} base the name the tag asks for
920
+ * @param {number} index the tag's position in the page
921
+ * @returns {string} the name it claimed
922
+ */
923
+ const claimEntryName = (base, index) => {
924
+ let claimed = base;
925
+ for (let suffix = index; claimedEntryNames.has(claimed); suffix++) {
926
+ claimed = `${base}-${suffix}`;
927
+ }
928
+ claimedEntryNames.add(claimed);
929
+ return claimed;
930
+ };
931
+
932
+ /**
933
+ * The name a tag's extracted entry claims: what its own
934
+ * `webpackChunkName` comment asked for, else what
935
+ * `module.parser.html.chunkName` makes of it, else the page and the position.
936
+ * @param {string | undefined} requested name from the tag's magic comment
937
+ * @param {string} request the tag's request
938
+ * @param {number} index the tag's position in the page
939
+ * @param {HtmlChunkNameData["type"]} type what the tag is extracted as
940
+ * @returns {string} an entry name no other tag of this page claims
941
+ */
942
+ const entryNameFor = (requested, request, index, type) => {
943
+ let name = requested;
944
+ if (name === undefined && chunkNameOption !== undefined) {
945
+ const tagName = getRequestBaseName(request) || "";
946
+ name =
947
+ typeof chunkNameOption === "function"
948
+ ? chunkNameOption({ page: entryPrefix, name: tagName, index, type })
949
+ : chunkNameOption.replace(
950
+ CHUNK_NAME_PLACEHOLDER_REGEXP,
951
+ (_, placeholder) => {
952
+ if (placeholder === "page") return entryPrefix;
953
+ if (placeholder === "name") return tagName;
954
+ if (placeholder === "index") return `${index}`;
955
+ return type;
956
+ }
957
+ );
958
+ }
959
+ if (typeof name !== "string" || name === "") {
960
+ return claimEntryName(`${entryPrefix}-${index}`, index);
961
+ }
962
+ const claimed = claimEntryName(name, index);
963
+ requestedEntryNames.add(claimed);
964
+ return claimed;
965
+ };
966
+
967
+ /**
968
+ * The name a tag's file is emitted under when the page asked for one, so
969
+ * a named chunk is not left to be called after the tag's url.
970
+ * @param {string} entryName the entry name the tag claimed
971
+ * @returns {string | undefined} the asked-for name, else undefined
972
+ */
973
+ const requestedFileName = (entryName) =>
974
+ requestedEntryNames.has(entryName) ? entryName : undefined;
975
+
840
976
  let doctypeEnd = -1;
841
977
  let htmlTagEnd = -1;
842
978
  // insertion offsets just inside the (possibly implicit) head
@@ -846,10 +982,9 @@ class HtmlParser extends Parser {
846
982
  let inHead = false;
847
983
  // `<template>` contents are inert
848
984
  let headTemplateDepth = 0;
849
- // Depth of open `<template>` elements anywhere in the tree. Template
850
- // content is an inert, separate fragment per spec, so a `<base>` inside
851
- // it must NOT set the document base (`headTemplateDepth` only covers
852
- // templates seen while in `<head>`, so it can't guard body templates).
985
+ // Depth of open `<template>` elements anywhere in the tree: their content
986
+ // is an inert fragment, so a `<base>` inside one must not set the document
987
+ // base. `headTemplateDepth` covers only `<head>`, so it cannot guard this.
853
988
  let templateDepth = 0;
854
989
  let headHasTitle = false;
855
990
  let headHasBase = false;
@@ -857,13 +992,9 @@ class HtmlParser extends Parser {
857
992
  /** @type {Set<string> | undefined} */
858
993
  let headMetaNames;
859
994
 
860
- // Script src / modulepreload references are collected per-type
861
- // during the walk; HtmlModulesPlugin later turns them into real
862
- // entries. `script` and `script-module` entries are chained via a
863
- // leader-only dependOn so they share a runtime.
864
- // `<link rel="modulepreload">` entries are kept independent — they
865
- // must preload without running, so they can never become a runtime
866
- // leader that other entries would import.
995
+ // Collected per type during the walk; HtmlModulesPlugin turns them into
996
+ // entries. `script` and `script-module` chain through a leader-only
997
+ // dependOn; modulepreload stays independent, as it must not run.
867
998
  /**
868
999
  * @typedef {object} HtmlEntryInfo
869
1000
  * @property {string} request
@@ -871,6 +1002,7 @@ class HtmlParser extends Parser {
871
1002
  * @property {number} index position in the document, across all groups — the order the emitted files are named in
872
1003
  * @property {"script" | "script-module" | "modulepreload" | "stylesheet" | "html" | "preload" | "prefetch"} type
873
1004
  * @property {boolean=} css entry emits a CSS chunk (`<link rel="preload" as="style">`), so it needs the CSS filename template
1005
+ * @property {string=} chunkName name the page asked this tag's chunk to claim, which names its file too
874
1006
  */
875
1007
  /** @type {HtmlEntryInfo[]} */
876
1008
  const scriptEntries = [];
@@ -892,28 +1024,40 @@ class HtmlParser extends Parser {
892
1024
  /** @type {HtmlEntryInfo[]} */
893
1025
  const prefetchEntries = [];
894
1026
 
895
- // Offset of the first classic blocking script tag; injected stylesheet
896
- // `<link>`s stay ahead of it. `defer`/`async`/module scripts don't
897
- // anchor — they execute after parsing (and after pending stylesheets),
898
- // so CSS may follow their tags (the order Vite emits).
1027
+ // Offset of the first classic blocking script tag, which injected stylesheet
1028
+ // `<link>`s stay ahead of. `defer`/`async`/module scripts do not anchor: they
1029
+ // run after parsing and after pending stylesheets.
899
1030
  let firstBlockingScriptStart = -1;
900
1031
 
901
1032
  let nextEntryIndex = 0;
902
-
903
- // `<base href>` resolves the relative URLs that follow it. A relative base
904
- // (`./assets/`) rewrites them into a subdirectory — still bundled; a
905
- // root-relative or absolute base (`/`, `https://cdn/`) points them outside
906
- // the build, so those URLs are left untouched. Resolved in the walk below
907
- // from the first `<base href>` seen (`documentBase` undefined until then).
1033
+ // One chunk per run of inline `<script>`: under module output every
1034
+ // extracted tag is deferred, so only what executes between them matters.
1035
+ /** @type {string | undefined} */
1036
+ let inlineRunEntryName;
1037
+ // Element offset of the run's last member — any other `<script>` ends it.
1038
+ let inlineRunTag = -1;
1039
+ // End offset of that member, for the gap a classic run may not span.
1040
+ let inlineRunEnd = -1;
1041
+ // How the run's tags are scheduled, which a member has to share.
1042
+ /** @type {string | undefined} */
1043
+ let inlineRunScheduling;
1044
+ // The run's first tag, which carries the chunk and so the inline request.
1045
+ /** @type {HtmlInlineScriptDependency | undefined} */
1046
+ let inlineRunLeaderDependency;
1047
+
1048
+ // WHY: `<base href>` resolves the relative URLs that follow it. A relative base
1049
+ // (`./assets/`) rewrites them into a subdirectory and they stay bundled; a
1050
+ // root-relative or absolute one (`/`, `https://cdn/`) points outside the
1051
+ // build, so those URLs are left untouched. Resolved in the walk below from
1052
+ // the first `<base href>` seen, `documentBase` being undefined until then.
908
1053
  /** @type {string | undefined} */
909
1054
  let documentBase;
910
1055
  /** @type {string | undefined} */
911
1056
  let baseDir;
912
1057
  let baseIsExternal = false;
913
- // Prepended to the emitted URLs' auto-public-path undo path so the base
914
- // doesn't misdirect them: the browser resolves rewritten (relative)
915
- // output URLs against the base dir, so one `../` per base segment cancels
916
- // it. Undefined for absolute publicPath (no undo path is emitted).
1058
+ // Prepended to the emitted URLs' auto-public-path undo path: the browser
1059
+ // resolves them against the base dir, so one `../` per base segment cancels
1060
+ // it. Undefined for an absolute publicPath, which emits no undo path.
917
1061
  /** @type {string | undefined} */
918
1062
  let baseUrlPrefix;
919
1063
 
@@ -926,6 +1070,12 @@ class HtmlParser extends Parser {
926
1070
  let pendingWebpackIgnore;
927
1071
  /** @type {boolean | undefined} */
928
1072
  let pendingWebpackInline;
1073
+ /**
1074
+ * The name the most recent comment asked the next tag's chunk to claim,
1075
+ * cleared the same way as the flags above.
1076
+ * @type {string | undefined}
1077
+ */
1078
+ let pendingWebpackChunkName;
929
1079
  /**
930
1080
  * Tracks the resource-hint values from the most recent `<!-- webpackPrefetch: … -->`
931
1081
  * (etc.) comment so the next asset URL attribute picks them up.
@@ -936,16 +1086,16 @@ class HtmlParser extends Parser {
936
1086
  const magicCommentContext = this.magicCommentContext;
937
1087
 
938
1088
  /**
939
- * @param {import("./syntax").HtmlPath} path walk path (used only for attribute-ref reads)
940
- * @param {import("./syntax").HtmlAttributeRef} typeAttr type attribute ref (0 = none)
1089
+ * @param {import("./syntax-parser").HtmlPath} path walk path (used only for attribute-ref reads)
1090
+ * @param {import("./syntax-parser").HtmlAttributeRef} typeAttr type attribute ref (0 = none)
941
1091
  * @param {number} nameEnd end offset of the tag name
942
1092
  * @param {string} type type of the script
943
1093
  * @param {string} input source string
944
1094
  */
945
1095
  const reconcileScriptTypeAttr = (path, typeAttr, nameEnd, type, input) => {
946
1096
  const valueStart =
947
- typeAttr !== 0 ? path.attributeValueStart(typeAttr) : -1;
948
- const valueEnd = typeAttr !== 0 ? path.attributeValueEnd(typeAttr) : -1;
1097
+ typeAttr !== 0 ? path.startOf(Part.value, typeAttr) : -1;
1098
+ const valueEnd = typeAttr !== 0 ? path.endOf(Part.value, typeAttr) : -1;
949
1099
  if (outputModule && type === "script") {
950
1100
  // Chunk is an ES module; upgrade the tag.
951
1101
  if (typeAttr !== 0 && valueStart !== -1) {
@@ -962,13 +1112,13 @@ class HtmlParser extends Parser {
962
1112
  // browser doesn't load it under module semantics.
963
1113
  let attrEnd;
964
1114
  if (valueStart === -1) {
965
- attrEnd = path.attributeNameEnd(typeAttr);
1115
+ attrEnd = path.endOf(Part.name, typeAttr);
966
1116
  } else if (input[valueEnd] === '"' || input[valueEnd] === "'") {
967
1117
  attrEnd = valueEnd + 1;
968
1118
  } else {
969
1119
  attrEnd = valueEnd;
970
1120
  }
971
- let attrStart = path.attributeNameStart(typeAttr);
1121
+ let attrStart = path.startOf(Part.name, typeAttr);
972
1122
  if (
973
1123
  attrStart > 0 &&
974
1124
  isAsciiWhitespace(input.charCodeAt(attrStart - 1))
@@ -1004,11 +1154,11 @@ class HtmlParser extends Parser {
1004
1154
  * Classifies the first `<base href>` seen in the walk, setting
1005
1155
  * `documentBase`/`baseDir`/`baseIsExternal`/`baseUrlPrefix` for the URLs
1006
1156
  * that follow it.
1007
- * @param {import("./syntax").HtmlPath} path walk path (for attribute reads)
1008
- * @param {import("./syntax").HtmlAttributeRef} hrefAttr the base's href attribute
1157
+ * @param {import("./syntax-parser").HtmlPath} path walk path (for attribute reads)
1158
+ * @param {import("./syntax-parser").HtmlAttributeRef} hrefAttr the base's href attribute
1009
1159
  */
1010
1160
  const resolveDocumentBase = (path, hrefAttr) => {
1011
- documentBase = decodeEntities(path.attributeValue(hrefAttr), true).trim();
1161
+ documentBase = path.value(hrefAttr).trim();
1012
1162
  if (!documentBase) return;
1013
1163
  if (
1014
1164
  ABSOLUTE_URL_SCHEME_REGEXP.test(documentBase) ||
@@ -1017,10 +1167,9 @@ class HtmlParser extends Parser {
1017
1167
  baseIsExternal = true;
1018
1168
  return;
1019
1169
  }
1020
- // Normalize the base path into its descending directory segments,
1021
- // resolving `.`/`..` like the URL spec. The final segment is the
1022
- // referenced file (dropped) unless the href ends with `/` or a
1023
- // dot-segment; `up` counts `..`s that climb above the document dir.
1170
+ // Normalize the base path into descending directory segments, resolving
1171
+ // `.`/`..` as the URL spec does. The final segment names a file and is
1172
+ // dropped; `up` counts the `..`s climbing above the document dir.
1024
1173
  const parts = documentBase.split("/");
1025
1174
  /** @type {string[]} */
1026
1175
  const dirs = [];
@@ -1048,7 +1197,7 @@ class HtmlParser extends Parser {
1048
1197
 
1049
1198
  // Lazy decoded-attribute map for the current element — parse-scoped
1050
1199
  // to avoid a closure and memo slot per element.
1051
- /** @type {import("./syntax").HtmlPath | undefined} */
1200
+ /** @type {import("./syntax-parser").HtmlPath | undefined} */
1052
1201
  let attrMapPath;
1053
1202
  let attrMapCount = 0;
1054
1203
  /** @type {Map<string, string> | undefined} */
@@ -1056,28 +1205,26 @@ class HtmlParser extends Parser {
1056
1205
  const getAttributesMap = () => {
1057
1206
  if (currentAttributesMap) return currentAttributesMap;
1058
1207
  currentAttributesMap = new Map();
1059
- const path = /** @type {import("./syntax").HtmlPath} */ (attrMapPath);
1208
+ const path = /** @type {import("./syntax-parser").HtmlPath} */ (
1209
+ attrMapPath
1210
+ );
1060
1211
  for (let i = 0; i < attrMapCount; i++) {
1061
- const attr = path.attributeAt(i);
1212
+ const attr = path.field(i, Field.attributes);
1062
1213
  // Decoded values — filters and type resolvers compare what
1063
1214
  // the browser sees (e.g. `rel="&#105;con"` means `icon`)
1064
- currentAttributesMap.set(
1065
- path.attributeName(attr),
1066
- decodeEntities(path.attributeValue(attr), true)
1067
- );
1215
+ currentAttributesMap.set(path.name(attr), path.value(attr));
1068
1216
  }
1069
1217
  return currentAttributesMap;
1070
1218
  };
1071
1219
 
1072
1220
  // TODO implement full HTML parser (WASM)
1073
- // The walker descends into children (and `<template>` content) itself;
1074
- // the Element `exit` clears a pending `webpackIgnore` once an element's
1075
- // children are done (the old `walkChildren` behaviour).
1221
+ // The walker descends into children and `<template>` content itself, and the
1222
+ // Element `exit` clears a pending `webpackIgnore` once they are done.
1076
1223
  new SourceProcessor()
1077
1224
  .use({
1078
1225
  [NodeType.Comment]: (path) => {
1079
- const start = path.start();
1080
- const end = path.end();
1226
+ const start = path.start(path.node);
1227
+ const end = path.end(path.node);
1081
1228
  // comments count toward the head-end insertion anchor
1082
1229
  if (inHead && headTemplateDepth === 0 && end > headLastEnd) {
1083
1230
  headLastEnd = end;
@@ -1095,17 +1242,19 @@ class HtmlParser extends Parser {
1095
1242
  ) {
1096
1243
  pendingWebpackIgnore = undefined;
1097
1244
  pendingWebpackInline = undefined;
1245
+ pendingWebpackChunkName = undefined;
1098
1246
  pendingHints = undefined;
1099
1247
  return;
1100
1248
  }
1101
- const value = path.data();
1249
+ const value = path.value();
1102
1250
  if (!webpackCommentRegExp.test(value)) {
1103
1251
  pendingWebpackIgnore = undefined;
1104
1252
  pendingWebpackInline = undefined;
1253
+ pendingWebpackChunkName = undefined;
1105
1254
  pendingHints = undefined;
1106
1255
  return;
1107
1256
  }
1108
- /** @type {Record<string, EXPECTED_ANY>} */
1257
+ /** @type {MagicCommentOptions} */
1109
1258
  let options;
1110
1259
  try {
1111
1260
  options = parseMagicComment(value, magicCommentContext);
@@ -1125,18 +1274,21 @@ class HtmlParser extends Parser {
1125
1274
  );
1126
1275
  pendingWebpackIgnore = undefined;
1127
1276
  pendingWebpackInline = undefined;
1277
+ pendingWebpackChunkName = undefined;
1128
1278
  pendingHints = undefined;
1129
1279
  return;
1130
1280
  }
1131
1281
  if (
1132
1282
  options.webpackIgnore === undefined &&
1133
1283
  options.webpackInline === undefined &&
1284
+ options.webpackChunkName === undefined &&
1134
1285
  options.webpackPrefetch === undefined &&
1135
1286
  options.webpackPreload === undefined &&
1136
1287
  options.webpackFetchPriority === undefined
1137
1288
  ) {
1138
1289
  pendingWebpackIgnore = undefined;
1139
1290
  pendingWebpackInline = undefined;
1291
+ pendingWebpackChunkName = undefined;
1140
1292
  pendingHints = undefined;
1141
1293
  return;
1142
1294
  }
@@ -1157,6 +1309,7 @@ class HtmlParser extends Parser {
1157
1309
  );
1158
1310
  pendingWebpackIgnore = undefined;
1159
1311
  pendingWebpackInline = undefined;
1312
+ pendingWebpackChunkName = undefined;
1160
1313
  pendingHints = undefined;
1161
1314
  return;
1162
1315
  }
@@ -1177,11 +1330,35 @@ class HtmlParser extends Parser {
1177
1330
  );
1178
1331
  pendingWebpackIgnore = undefined;
1179
1332
  pendingWebpackInline = undefined;
1333
+ pendingWebpackChunkName = undefined;
1334
+ pendingHints = undefined;
1335
+ return;
1336
+ }
1337
+ if (
1338
+ options.webpackChunkName !== undefined &&
1339
+ (typeof options.webpackChunkName !== "string" ||
1340
+ options.webpackChunkName === "")
1341
+ ) {
1342
+ const { line: sl, column: sc } = locConverter.get(start);
1343
+ const { line: el, column: ec } = locConverter.get(end);
1344
+ module.addWarning(
1345
+ new (getUnsupportedFeatureWarning())(
1346
+ `\`webpackChunkName\` expected a non-empty string, but received: ${options.webpackChunkName}.`,
1347
+ {
1348
+ start: { line: sl, column: sc },
1349
+ end: { line: el, column: ec }
1350
+ }
1351
+ )
1352
+ );
1353
+ pendingWebpackIgnore = undefined;
1354
+ pendingWebpackInline = undefined;
1355
+ pendingWebpackChunkName = undefined;
1180
1356
  pendingHints = undefined;
1181
1357
  return;
1182
1358
  }
1183
1359
  pendingWebpackIgnore = options.webpackIgnore;
1184
1360
  pendingWebpackInline = options.webpackInline;
1361
+ pendingWebpackChunkName = options.webpackChunkName;
1185
1362
  if (
1186
1363
  options.webpackPrefetch !== undefined ||
1187
1364
  options.webpackPreload !== undefined ||
@@ -1205,9 +1382,10 @@ class HtmlParser extends Parser {
1205
1382
  },
1206
1383
  [NodeType.Doctype]: (path) => {
1207
1384
  // only visited when head injection is active (see `skip` below)
1208
- if (doctypeEnd === -1) doctypeEnd = path.end();
1385
+ if (doctypeEnd === -1) doctypeEnd = path.end(path.node);
1209
1386
  pendingWebpackIgnore = undefined;
1210
1387
  pendingWebpackInline = undefined;
1388
+ pendingWebpackChunkName = undefined;
1211
1389
  pendingHints = undefined;
1212
1390
  },
1213
1391
  [NodeType.Element]: {
@@ -1217,24 +1395,25 @@ class HtmlParser extends Parser {
1217
1395
  enter: (path) => {
1218
1396
  const ignore = pendingWebpackIgnore === true;
1219
1397
  const forceInline = pendingWebpackInline === true;
1398
+ const chunkName = pendingWebpackChunkName;
1220
1399
  pendingWebpackIgnore = undefined;
1221
1400
  pendingWebpackInline = undefined;
1401
+ pendingWebpackChunkName = undefined;
1222
1402
 
1223
- // `<head>` anchors are collected for every page — they place
1224
- // `inject: "head"` siblings and resource hints; the
1225
- // title/meta/base facts only when configured. Structural, so it
1403
+ // `<head>` anchors are collected for every page, since they place
1404
+ // `inject: "head"` siblings and resource hints. Structural, so this
1226
1405
  // runs even for `webpackIgnore`d elements.
1227
1406
  {
1228
- const name = path.tagName();
1229
- if (name === "template" && path.namespace() === NS_HTML) {
1407
+ const name = path.name();
1408
+ if (name === "template" && isHtmlElement(path)) {
1230
1409
  templateDepth++;
1231
1410
  }
1232
1411
  if (headTemplateDepth > 0) {
1233
- if (name === "template" && path.namespace() === NS_HTML) {
1412
+ if (name === "template" && isHtmlElement(path)) {
1234
1413
  headTemplateDepth++;
1235
1414
  }
1236
1415
  } else if (inHead) {
1237
- if (headOptions !== undefined && path.namespace() === NS_HTML) {
1416
+ if (headOptions !== undefined && isHtmlElement(path)) {
1238
1417
  switch (name) {
1239
1418
  case "title":
1240
1419
  headHasTitle = true;
@@ -1243,50 +1422,48 @@ class HtmlParser extends Parser {
1243
1422
  headHasBase = true;
1244
1423
  break;
1245
1424
  case "meta": {
1246
- if (path.findAttribute("charset") !== 0) {
1247
- headCharsetEnd = path.tagEnd();
1425
+ if (path.fieldNamed(Field.attributes, "charset") !== 0) {
1426
+ headCharsetEnd = path.startOf(Part.content, path.node);
1248
1427
  } else {
1249
- const httpEquiv = path.findAttribute("http-equiv");
1428
+ const httpEquiv = path.fieldNamed(
1429
+ Field.attributes,
1430
+ "http-equiv"
1431
+ );
1250
1432
  const contentAttr =
1251
1433
  httpEquiv !== 0 &&
1252
- decodeEntities(
1253
- path.attributeValue(httpEquiv),
1254
- true
1255
- ).toLowerCase() === "content-type"
1256
- ? path.findAttribute("content")
1434
+ path.value(httpEquiv).toLowerCase() === "content-type"
1435
+ ? path.fieldNamed(Field.attributes, "content")
1257
1436
  : 0;
1258
1437
  if (
1259
1438
  contentAttr !== 0 &&
1260
1439
  CHARSET_DECLARATION_REGEXP.test(
1261
- decodeEntities(
1262
- path.attributeValue(contentAttr),
1263
- true
1264
- )
1440
+ path.value(contentAttr)
1265
1441
  )
1266
1442
  ) {
1267
- headCharsetEnd = path.tagEnd();
1443
+ headCharsetEnd = path.startOf(
1444
+ Part.content,
1445
+ path.node
1446
+ );
1268
1447
  }
1269
1448
  }
1270
- const nameAttr = path.findAttribute("name");
1271
- const propertyAttr = path.findAttribute("property");
1449
+ const nameAttr = path.fieldNamed(
1450
+ Field.attributes,
1451
+ "name"
1452
+ );
1453
+ const propertyAttr = path.fieldNamed(
1454
+ Field.attributes,
1455
+ "property"
1456
+ );
1272
1457
  if (nameAttr !== 0 || propertyAttr !== 0) {
1273
1458
  if (headMetaNames === undefined) {
1274
1459
  headMetaNames = new Set();
1275
1460
  }
1276
1461
  if (nameAttr !== 0) {
1277
- headMetaNames.add(
1278
- decodeEntities(
1279
- path.attributeValue(nameAttr),
1280
- true
1281
- ).toLowerCase()
1282
- );
1462
+ headMetaNames.add(path.value(nameAttr).toLowerCase());
1283
1463
  }
1284
1464
  if (propertyAttr !== 0) {
1285
1465
  headMetaNames.add(
1286
- decodeEntities(
1287
- path.attributeValue(propertyAttr),
1288
- true
1289
- ).toLowerCase()
1466
+ path.value(propertyAttr).toLowerCase()
1290
1467
  );
1291
1468
  }
1292
1469
  }
@@ -1296,23 +1473,22 @@ class HtmlParser extends Parser {
1296
1473
  headTemplateDepth++;
1297
1474
  break;
1298
1475
  }
1299
- } else if (
1300
- name === "template" &&
1301
- path.namespace() === NS_HTML
1302
- ) {
1476
+ } else if (name === "template" && isHtmlElement(path)) {
1303
1477
  headTemplateDepth++;
1304
1478
  }
1305
- if (path.end() > headLastEnd) headLastEnd = path.end();
1306
- } else if (!headSeen && path.namespace() === NS_HTML) {
1479
+ if (path.end(path.node) > headLastEnd) {
1480
+ headLastEnd = path.end(path.node);
1481
+ }
1482
+ } else if (!headSeen && isHtmlElement(path)) {
1307
1483
  if (name === "html") {
1308
- htmlTagEnd = path.tagEnd();
1484
+ htmlTagEnd = path.startOf(Part.content, path.node);
1309
1485
  } else if (name === "head") {
1310
1486
  headSeen = true;
1311
1487
  inHead = true;
1312
1488
  // explicit head has real offsets; an implicit one (head
1313
1489
  // tags are optional in HTML5) anchors after `<html>`,
1314
1490
  // the doctype, or the document start
1315
- const tagEnd = path.tagEnd();
1491
+ const tagEnd = path.startOf(Part.content, path.node);
1316
1492
  headStart =
1317
1493
  tagEnd > 0
1318
1494
  ? tagEnd
@@ -1327,14 +1503,21 @@ class HtmlParser extends Parser {
1327
1503
  }
1328
1504
 
1329
1505
  if (ignore) {
1506
+ // It stays in the document and runs where it stands, so a run
1507
+ // may not span it either.
1508
+ if (path.name() === "script") {
1509
+ inlineRunEntryName = undefined;
1510
+ inlineRunLeaderDependency = undefined;
1511
+ inlineRunScheduling = undefined;
1512
+ }
1330
1513
  return;
1331
1514
  }
1332
1515
 
1333
- const elementName = path.tagName();
1334
- const attributeCount = path.attributeCount();
1335
- const elementStart = path.start();
1336
- const tagEnd = path.tagEnd();
1337
- const nameEnd = path.nameEnd();
1516
+ const elementName = path.name();
1517
+ const attributeCount = path.fieldCount(Field.attributes);
1518
+ const elementStart = path.start(path.node);
1519
+ const tagEnd = path.startOf(Part.content, path.node);
1520
+ const nameEnd = path.endOf(Part.name, path.node);
1338
1521
 
1339
1522
  // The first `<base href>` freezes the base for later URLs — but
1340
1523
  // only one in the real document tree, not inside an inert
@@ -1343,9 +1526,9 @@ class HtmlParser extends Parser {
1343
1526
  documentBase === undefined &&
1344
1527
  templateDepth === 0 &&
1345
1528
  elementName === "base" &&
1346
- path.namespace() === NS_HTML
1529
+ isHtmlElement(path)
1347
1530
  ) {
1348
- const hrefAttr = path.findAttribute("href");
1531
+ const hrefAttr = path.fieldNamed(Field.attributes, "href");
1349
1532
  if (hrefAttr !== 0) resolveDocumentBase(path, hrefAttr);
1350
1533
  }
1351
1534
 
@@ -1373,7 +1556,7 @@ class HtmlParser extends Parser {
1373
1556
  let start;
1374
1557
  /** @type {number} */
1375
1558
  let end;
1376
- /** @type {import("./syntax").HtmlAttributeRef} */
1559
+ /** @type {import("./syntax-parser").HtmlAttributeRef} */
1377
1560
  let attr = 0;
1378
1561
  if (content) {
1379
1562
  if (!bodyItem) continue;
@@ -1383,7 +1566,7 @@ class HtmlParser extends Parser {
1383
1566
  // `skip.text` drops the body `Text` node; the raw content
1384
1567
  // span is [`tagEnd`, `contentEnd`] on the element.
1385
1568
  const bodyStart = tagEnd;
1386
- const bodyEnd = path.contentEnd();
1569
+ const bodyEnd = path.endOf(Part.content, path.node);
1387
1570
  if (bodyEnd <= bodyStart) continue;
1388
1571
  value = source.slice(bodyStart, bodyEnd);
1389
1572
  if (value.trim() === "") continue;
@@ -1394,20 +1577,19 @@ class HtmlParser extends Parser {
1394
1577
  ? bodyItem.type(getAttributesMap(), css)
1395
1578
  : bodyItem.type;
1396
1579
  } else {
1397
- attr = path.attributeAt(i);
1398
- const item = sources[path.attributeName(attr)];
1580
+ attr = path.field(i, Field.attributes);
1581
+ const item = sources[path.name(attr)];
1399
1582
  if (!item) continue;
1400
1583
  if (
1401
1584
  item.namespace !== undefined &&
1402
- path.namespace() !== item.namespace
1585
+ !path.flag(item.namespace)
1403
1586
  ) {
1404
1587
  continue;
1405
1588
  }
1406
1589
  // Adoption-agency clones carry no offsets; skip blank values.
1407
- if (path.attributeValueStart(attr) === -1) {
1408
- continue;
1409
- }
1410
- value = path.attributeValue(attr);
1590
+ const valueStart = path.startOf(Part.value, attr);
1591
+ if (valueStart === -1) continue;
1592
+ value = path.source(valueStart, path.endOf(Part.value, attr));
1411
1593
  if (!value || !/\S/.test(value)) continue;
1412
1594
  const filter = item.filter;
1413
1595
  if (filter) {
@@ -1418,8 +1600,8 @@ class HtmlParser extends Parser {
1418
1600
  : value;
1419
1601
  if (!filter(getAttributesMap(), decoded)) continue;
1420
1602
  }
1421
- start = path.attributeValueStart(attr);
1422
- end = path.attributeValueEnd(attr);
1603
+ start = valueStart;
1604
+ end = path.endOf(Part.value, attr);
1423
1605
  type =
1424
1606
  typeof item.type === "function"
1425
1607
  ? item.type(getAttributesMap(), css)
@@ -1428,30 +1610,44 @@ class HtmlParser extends Parser {
1428
1610
  // A resolved `type` selects the parse algorithm and the dependency
1429
1611
  // kind — the only dispatch in the parser.
1430
1612
  switch (type) {
1431
- // Inline CSS — a `<style>` body (raw, a full stylesheet) or an
1613
+ // Inline CSS — a `<style>` body (a full stylesheet) or an
1432
1614
  // attribute value (decoded, re-escaped on write-back; `*-attribute`
1433
1615
  // is a declaration list). Needs `experiments.css`.
1434
1616
  case "stylesheet-style":
1435
1617
  case "stylesheet-style-attribute": {
1436
1618
  if (!css) break;
1437
- const cssText = content ? value : decodeEntities(value, true);
1619
+ // WHY: an HTML `<style>` body is raw text, so its source is its
1620
+ // text. The same element in a foreign subtree holds character
1621
+ // data, where `&#x2e;a` is the selector `.a` — so the sheet has
1622
+ // to be decoded going in and escaped coming back out, which is
1623
+ // what `characterData` tells the write-back.
1624
+ const characterData = content && !isHtmlElement(path);
1625
+ // A page webpack emitted is one it can be pointed at again,
1626
+ // where a sheet arrives headed by the module the last build
1627
+ // read it as. That header was that build's; this writes its own.
1628
+ const cssText = ModuleInfoHeaderPlugin.stripHeaders(
1629
+ content
1630
+ ? characterData
1631
+ ? decodeEntities(value, false)
1632
+ : value
1633
+ : decodeEntities(value, true)
1634
+ );
1438
1635
  if (cssText.trim() === "") break;
1439
1636
  const dep = new HtmlInlineStyleDependency(
1440
1637
  dataUri("text/css", cssText),
1441
1638
  [start, end],
1442
1639
  content ? false : type === "stylesheet-style-attribute",
1443
- !content
1640
+ !content,
1641
+ characterData
1444
1642
  );
1445
1643
  setLoc(dep, start, end);
1446
1644
  module.addDependency(dep);
1447
1645
  module.addCodeGenerationDependency(dep);
1448
1646
  break;
1449
1647
  }
1450
- // `<iframe srcdoc>`: an entity-encoded HTML document. Feed the
1451
- // decoded markup back through the HTML pipeline as a nested
1452
- // `data:text/html` module. Per spec the value is a full document
1453
- // whose URL is `about:srcdoc`, so its base URL is inherited from
1454
- // this document — asset URLs resolve against this file's context.
1648
+ // `<iframe srcdoc>` is an entity-encoded document, fed back through
1649
+ // the pipeline as a nested `data:text/html` module. Its URL is
1650
+ // `about:srcdoc`, so asset URLs resolve against this file.
1455
1651
  case "srcdoc": {
1456
1652
  const htmlText = decodeEntities(value, true);
1457
1653
  // Only spin up a nested module when there is markup that can
@@ -1478,25 +1674,101 @@ class HtmlParser extends Parser {
1478
1674
  if (content) {
1479
1675
  const scriptType =
1480
1676
  /** @type {"script" | "script-module"} */ (type);
1481
- const request = dataUri("text/javascript", value);
1677
+ // WHY: an HTML `<script>` body is raw text, so its source
1678
+ // is its text. The same element in a foreign subtree holds
1679
+ // character data, where a character reference stands for
1680
+ // what it names — `1 &lt; 2` is `1 < 2` there, but reads
1681
+ // as `1 & lt < 2` when taken as written. Character data
1682
+ // also decodes `&copy=1`, which an attribute keeps whole.
1683
+ const scriptText = isHtmlElement(path)
1684
+ ? value
1685
+ : decodeEntities(value, false);
1686
+ const request = dataUri("text/javascript", scriptText);
1482
1687
  const index = nextEntryIndex++;
1483
- const entryName = `__html_${moduleHash}_${index}`;
1688
+ // Module output upgrades a classic tag, so every extracted
1689
+ // tag defers; without it the authored kind parts the run.
1690
+ const scheduling = outputModule ? "deferred" : scriptType;
1691
+ // `async` fires whenever it loads and a `<template>` body never
1692
+ // does, so neither joins — and only a deferred run spans markup.
1693
+ const joinsRun =
1694
+ templateDepth === 0 &&
1695
+ path.fieldNamed(Field.attributes, "async") === 0 &&
1696
+ (outputModule ||
1697
+ inlineRunEntryName === undefined ||
1698
+ isEmptyRunGap(source, inlineRunEnd, elementStart));
1699
+ /** @type {Range | undefined} */
1700
+ let removeRange;
1701
+ /** @type {string} */
1702
+ let entryName;
1703
+ if (joinsRun) {
1704
+ // A tag the page named leads a run of its own rather than
1705
+ // joining one, so the name covers what follows it.
1706
+ if (
1707
+ chunkName !== undefined ||
1708
+ inlineRunEntryName === undefined ||
1709
+ inlineRunScheduling !== scheduling
1710
+ ) {
1711
+ entryName = entryNameFor(
1712
+ chunkName,
1713
+ request,
1714
+ index,
1715
+ scriptType
1716
+ );
1717
+ inlineRunEntryName = entryName;
1718
+ inlineRunScheduling = scheduling;
1719
+ } else {
1720
+ entryName = inlineRunEntryName;
1721
+ // The body rides in the run's chunk already, so the
1722
+ // element goes rather than gaining a `src`.
1723
+ removeRange = [
1724
+ elementStart,
1725
+ rawTextElementEnd(source, end)
1726
+ ];
1727
+ }
1728
+ inlineRunTag = elementStart;
1729
+ inlineRunEnd = rawTextElementEnd(source, end);
1730
+ } else {
1731
+ entryName = entryNameFor(
1732
+ chunkName,
1733
+ request,
1734
+ index,
1735
+ scriptType
1736
+ );
1737
+ }
1484
1738
  const dep = new HtmlInlineScriptDependency(
1485
1739
  request,
1486
1740
  nameEnd,
1487
1741
  [start, end],
1488
1742
  entryName,
1489
- scriptType === "script-module" ? "esm" : "commonjs"
1743
+ scriptType === "script-module" ? "esm" : "commonjs",
1744
+ removeRange,
1745
+ forceInline
1490
1746
  );
1747
+ if (joinsRun) {
1748
+ if (removeRange === undefined) {
1749
+ inlineRunLeaderDependency = dep;
1750
+ } else if (
1751
+ forceInline &&
1752
+ inlineRunLeaderDependency !== undefined
1753
+ ) {
1754
+ // A run is one chunk, so a tag asking to be written
1755
+ // into the page asks it of the whole run.
1756
+ inlineRunLeaderDependency.forceInline = true;
1757
+ }
1758
+ }
1491
1759
  setLoc(dep, start, end);
1492
1760
  module.addPresentationalDependency(dep);
1493
- reconcileScriptTypeAttr(
1494
- path,
1495
- path.findAttribute("type"),
1496
- nameEnd,
1497
- scriptType,
1498
- source
1499
- );
1761
+ // A dropped tag is not rewritten: an edit inside the
1762
+ // removed range would survive it as loose text.
1763
+ if (removeRange === undefined) {
1764
+ reconcileScriptTypeAttr(
1765
+ path,
1766
+ path.fieldNamed(Field.attributes, "type"),
1767
+ nameEnd,
1768
+ scriptType,
1769
+ source
1770
+ );
1771
+ }
1500
1772
  (scriptType === "script"
1501
1773
  ? scriptEntries
1502
1774
  : scriptModuleEntries
@@ -1504,7 +1776,8 @@ class HtmlParser extends Parser {
1504
1776
  request,
1505
1777
  entryName,
1506
1778
  index,
1507
- type: scriptType
1779
+ type: scriptType,
1780
+ chunkName: requestedFileName(entryName)
1508
1781
  });
1509
1782
  break;
1510
1783
  }
@@ -1547,7 +1820,7 @@ class HtmlParser extends Parser {
1547
1820
  new (getModuleDependencyError())(
1548
1821
  module,
1549
1822
  new WebpackError(
1550
- `Bad value for attribute "${path.attributeName(
1823
+ `Bad value for attribute "${path.name(
1551
1824
  attr
1552
1825
  )}" on element "${elementName}": ${
1553
1826
  /** @type {Error} */ (err).message
@@ -1579,13 +1852,17 @@ class HtmlParser extends Parser {
1579
1852
  }
1580
1853
  const s = start + (map ? map[us] : us);
1581
1854
  const e = start + (map ? map[ue] : ue);
1582
- // `html` links the URL as its own emitted page: the same
1583
- // `HtmlEntryDependency` as `<script src>` / `<link>`, but the `html`
1584
- // kind rewrites to the page's filename and emits no sibling tags.
1585
- // Recorded as an independent entry (no `dependOn`), like an entry point.
1855
+ // `html` links the URL as its own emitted page: the same dependency
1856
+ // as `<script src>`, but rewriting to the page's filename and
1857
+ // emitting no siblings. Independent, like an entry point.
1586
1858
  if (type === "html") {
1587
1859
  const index = nextEntryIndex++;
1588
- const entryName = `__html_${moduleHash}_${index}`;
1860
+ const entryName = entryNameFor(
1861
+ chunkName,
1862
+ request,
1863
+ index,
1864
+ "html"
1865
+ );
1589
1866
  const dep = new HtmlEntryDependency(
1590
1867
  request,
1591
1868
  [s, e],
@@ -1595,24 +1872,33 @@ class HtmlParser extends Parser {
1595
1872
  );
1596
1873
  setLoc(dep, s, e);
1597
1874
  module.addPresentationalDependency(dep);
1598
- htmlLinkEntries.push({ request, entryName, index, type });
1875
+ htmlLinkEntries.push({
1876
+ request,
1877
+ entryName,
1878
+ index,
1879
+ type,
1880
+ chunkName: requestedFileName(entryName)
1881
+ });
1599
1882
  continue;
1600
1883
  }
1601
- // `rel="preload"/"prefetch"` of a bundled resource: an
1602
- // independent, non-executing entry whose `href` is rewritten to
1603
- // the built chunk's URL (CSS for `as="style"`, JS otherwise). No
1604
- // sibling tags — a resource hint references exactly one URL.
1884
+ // `rel="preload"/"prefetch"` of a bundled resource: an independent,
1885
+ // non-executing entry rewritten to the built chunk's URL. No
1886
+ // siblings — a resource hint references exactly one URL.
1605
1887
  if (type === "preload" || type === "prefetch") {
1606
1888
  const as = getAttributeValue(getAttributesMap(), "as");
1607
1889
  const asStyle = as
1608
1890
  ? as.trim().toLowerCase() === "style"
1609
1891
  : false;
1610
1892
  const index = nextEntryIndex++;
1611
- const entryName = `__html_${moduleHash}_${index}`;
1612
- // Tag metadata so the template can mirror `crossorigin`/
1613
- // `integrity` onto a native `preload` `<link>` (integrity-
1614
- // eligible per the SRI spec). `prefetch` gets none — the spec
1615
- // doesn't list it — so its `integrity` is left uncaptured.
1893
+ const entryName = entryNameFor(
1894
+ chunkName,
1895
+ request,
1896
+ index,
1897
+ type
1898
+ );
1899
+ // Tag metadata letting the template mirror `crossorigin` and
1900
+ // `integrity` onto a native `preload` `<link>`. `prefetch` is not
1901
+ // integrity-eligible per the SRI spec, so its is left uncaptured.
1616
1902
  const isNativeLink = elementName === "link";
1617
1903
  const dep = new HtmlEntryDependency(
1618
1904
  request,
@@ -1625,7 +1911,9 @@ class HtmlParser extends Parser {
1625
1911
  isNativeLink,
1626
1912
  "",
1627
1913
  nameEnd,
1628
- isNativeLink && path.findAttribute("crossorigin") !== 0,
1914
+ isNativeLink &&
1915
+ path.fieldNamed(Field.attributes, "crossorigin") !==
1916
+ 0,
1629
1917
  -1,
1630
1918
  type === "preload" && isNativeLink
1631
1919
  ? captureIntegrityRange(path, source, elementStart)
@@ -1642,7 +1930,8 @@ class HtmlParser extends Parser {
1642
1930
  entryName,
1643
1931
  index,
1644
1932
  type,
1645
- css: asStyle
1933
+ css: asStyle,
1934
+ chunkName: requestedFileName(entryName)
1646
1935
  });
1647
1936
  continue;
1648
1937
  }
@@ -1656,7 +1945,12 @@ class HtmlParser extends Parser {
1656
1945
  type === "stylesheet"
1657
1946
  ) {
1658
1947
  const index = nextEntryIndex++;
1659
- const entryName = `__html_${moduleHash}_${index}`;
1948
+ const entryName = entryNameFor(
1949
+ chunkName,
1950
+ request,
1951
+ index,
1952
+ type
1953
+ );
1660
1954
  const willBeModuleScript =
1661
1955
  type === "script-module" ||
1662
1956
  (outputModule && type === "script");
@@ -1687,7 +1981,10 @@ class HtmlParser extends Parser {
1687
1981
  let hasOwnCrossOrigin = false;
1688
1982
  if (elementStart >= 0) {
1689
1983
  for (const copyableName of COPYABLE_SIBLING_ATTRS) {
1690
- const copyableAttr = path.findAttribute(copyableName);
1984
+ const copyableAttr = path.fieldNamed(
1985
+ Field.attributes,
1986
+ copyableName
1987
+ );
1691
1988
  if (copyableAttr !== 0) {
1692
1989
  copyableAttrsText += attrSourceSpan(
1693
1990
  path,
@@ -1700,28 +1997,22 @@ class HtmlParser extends Parser {
1700
1997
  }
1701
1998
  }
1702
1999
  }
1703
- // Blocking-ness of the tag as *emitted*:
1704
- // `reconcileScriptTypeAttr` upgrades every script entry
1705
- // to `type="module"` under `output.module` and strips an
1706
- // authored `type="module"` otherwise — so only non-module
1707
- // output without `defer`/`async` blocks. Non-native
1708
- // elements anchor conservatively (their synthesized
1709
- // siblings may be plain blocking `<script>`s).
2000
+ // Blocking-ness of the tag as emitted, not as authored:
2001
+ // `reconcileScriptTypeAttr` decides the final `type`, so only
2002
+ // non-module output without `defer`/`async` blocks.
1710
2003
  if (
1711
2004
  firstBlockingScriptStart === -1 &&
1712
2005
  (type === "script" || type === "script-module") &&
1713
2006
  !outputModule &&
1714
2007
  (elementName !== nativeTag ||
1715
- (path.findAttribute("defer") === 0 &&
1716
- path.findAttribute("async") === 0))
2008
+ (path.fieldNamed(Field.attributes, "defer") === 0 &&
2009
+ path.fieldNamed(Field.attributes, "async") === 0))
1717
2010
  ) {
1718
2011
  firstBlockingScriptStart = elementStart;
1719
2012
  }
1720
- // Sibling-clone attribute edits, captured from the parsed
1721
- // attributes (offsets relative to the tag) so the template
1722
- // needn't re-parse the tag text: `integrity` is dropped
1723
- // (content-specific) and `script-module` clones are forced
1724
- // to `type="module"` (its value range, else inserted).
2013
+ // Sibling-clone attribute edits, captured as offsets relative to
2014
+ // the tag so the template need not re-parse it: `integrity` is
2015
+ // content-specific and dropped, `script-module` forces `type`.
1725
2016
  const integrityRange =
1726
2017
  elementStart >= 0 && elementName === nativeTag
1727
2018
  ? captureIntegrityRange(path, source, elementStart)
@@ -1733,14 +2024,17 @@ class HtmlParser extends Parser {
1733
2024
  elementName === nativeTag &&
1734
2025
  elementKind === "script-module"
1735
2026
  ) {
1736
- const typeAttr = path.findAttribute("type");
2027
+ const typeAttr = path.fieldNamed(
2028
+ Field.attributes,
2029
+ "type"
2030
+ );
1737
2031
  if (
1738
2032
  typeAttr !== 0 &&
1739
- path.attributeValueStart(typeAttr) >= 0
2033
+ path.startOf(Part.value, typeAttr) >= 0
1740
2034
  ) {
1741
2035
  typeValueRange = [
1742
- path.attributeValueStart(typeAttr) - elementStart,
1743
- path.attributeValueEnd(typeAttr) - elementStart
2036
+ path.startOf(Part.value, typeAttr) - elementStart,
2037
+ path.endOf(Part.value, typeAttr) - elementStart
1744
2038
  ];
1745
2039
  }
1746
2040
  }
@@ -1771,7 +2065,7 @@ class HtmlParser extends Parser {
1771
2065
  ) {
1772
2066
  reconcileScriptTypeAttr(
1773
2067
  path,
1774
- path.findAttribute("type"),
2068
+ path.fieldNamed(Field.attributes, "type"),
1775
2069
  nameEnd,
1776
2070
  type,
1777
2071
  source
@@ -1784,7 +2078,13 @@ class HtmlParser extends Parser {
1784
2078
  : type === "stylesheet"
1785
2079
  ? stylesheetEntries
1786
2080
  : modulePreloadEntries
1787
- ).push({ request, entryName, index, type });
2081
+ ).push({
2082
+ request,
2083
+ entryName,
2084
+ index,
2085
+ type,
2086
+ chunkName: requestedFileName(entryName)
2087
+ });
1788
2088
  } else {
1789
2089
  const dep = new HtmlSourceDependency(request, [s, e]);
1790
2090
  ResourceHintPlugin.applyDefaults(
@@ -1806,10 +2106,17 @@ class HtmlParser extends Parser {
1806
2106
  }
1807
2107
  }
1808
2108
  }
2109
+ // A `<script>` that joined no run ends the open one: the chunk runs
2110
+ // where its first tag stands, so nothing may execute in between.
2111
+ if (elementName === "script" && inlineRunTag !== elementStart) {
2112
+ inlineRunEntryName = undefined;
2113
+ inlineRunLeaderDependency = undefined;
2114
+ inlineRunScheduling = undefined;
2115
+ }
1809
2116
  },
1810
2117
  exit: (path) => {
1811
- if (path.namespace() === NS_HTML) {
1812
- const name = path.tagName();
2118
+ if (isHtmlElement(path)) {
2119
+ const name = path.name();
1813
2120
  if (name === "template") {
1814
2121
  if (templateDepth > 0) templateDepth--;
1815
2122
  if (headTemplateDepth > 0) headTemplateDepth--;
@@ -1819,14 +2126,14 @@ class HtmlParser extends Parser {
1819
2126
  }
1820
2127
  pendingWebpackIgnore = undefined;
1821
2128
  pendingWebpackInline = undefined;
2129
+ pendingWebpackChunkName = undefined;
1822
2130
  pendingHints = undefined;
1823
2131
  }
1824
2132
  }
1825
2133
  })
1826
- // Skip AST output this walk never reads: `text` (script/style bodies are
1827
- // read by offset via `contentEnd`) and `doctype` — unless head injection
1828
- // needs the doctype as an insertion anchor; keep `comments` for
1829
- // magic comments (`webpackIgnore`).
2134
+ // Skip AST output this walk never reads: `text`, since script and style
2135
+ // bodies are read by offset, and `doctype` unless head injection needs it
2136
+ // as an anchor. `comments` stays, for `webpackIgnore`.
1830
2137
  .process(source, {
1831
2138
  fragmentContext: this.fragmentContext,
1832
2139
  skip: { text: true, doctype: headOptions === undefined }
@@ -1881,13 +2188,12 @@ class HtmlParser extends Parser {
1881
2188
  const buildInfo = /** @type {HtmlModuleBuildInfo} */ (module.buildInfo);
1882
2189
  buildInfo.strict = true;
1883
2190
  if (baseUrlPrefix !== undefined) buildInfo.baseUrlPrefix = baseUrlPrefix;
1884
- // Hand off the collected entries to HtmlModulesPlugin; it creates the
1885
- // real compilation entries during the finishMake hook. The `script`
1886
- // and `script-module` groups are chained via a leader-only dependOn
1887
- // so they share a runtime; `modulepreload` and `stylesheet` entries
1888
- // are emitted as independent entries since `<link rel=modulepreload>`
1889
- // must preload without running and stylesheets have no runtime. `html`
1890
- // links are independent page entries too.
2191
+ // WHY: hand the collected entries to HtmlModulesPlugin, which creates the
2192
+ // real compilation entries during the finishMake hook. The `script` and
2193
+ // `script-module` groups chain through a leader-only `dependOn` so they share
2194
+ // a runtime, while `modulepreload` and `stylesheet` entries are independent:
2195
+ // `<link rel=modulepreload>` must preload without running, and a stylesheet
2196
+ // has no runtime. `html` links are independent page entries too.
1891
2197
  if (
1892
2198
  scriptEntries.length > 0 ||
1893
2199
  scriptModuleEntries.length > 0 ||