@depup/webpack 5.109.2-depup.0 → 5.110.1-depup.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (640) hide show
  1. package/README.md +5 -5
  2. package/changes.json +7 -7
  3. package/lib/APIPlugin.js +123 -17
  4. package/lib/AsyncDependenciesBlock.js +10 -7
  5. package/lib/AutomaticPrefetchPlugin.js +1 -1
  6. package/lib/BannerPlugin.js +10 -6
  7. package/lib/CacheFacade.js +6 -6
  8. package/lib/Chunk.js +14 -11
  9. package/lib/ChunkGraph.js +26 -17
  10. package/lib/ChunkGroup.js +7 -7
  11. package/lib/ChunkTemplate.js +35 -44
  12. package/lib/CircularModulesPlugin.js +205 -28
  13. package/lib/CleanPlugin.js +4 -7
  14. package/lib/CodeGenerationResults.js +11 -8
  15. package/lib/CompatibilityPlugin.js +7 -7
  16. package/lib/Compilation.js +688 -409
  17. package/lib/Compiler.js +53 -38
  18. package/lib/ConcatenationScope.js +117 -8
  19. package/lib/ConditionalInitFragment.js +3 -3
  20. package/lib/ConstPlugin.js +13 -11
  21. package/lib/ContextExclusionPlugin.js +1 -1
  22. package/lib/ContextModule.js +146 -54
  23. package/lib/ContextModuleFactory.js +46 -14
  24. package/lib/ContextReplacementPlugin.js +12 -14
  25. package/lib/DefinePlugin.js +121 -37
  26. package/lib/DependenciesBlock.js +9 -6
  27. package/lib/Dependency.js +36 -16
  28. package/lib/DependencyTemplate.js +11 -12
  29. package/lib/DependencyTemplates.js +3 -3
  30. package/lib/DotenvPlugin.js +50 -13
  31. package/lib/DynamicEntryPlugin.js +8 -4
  32. package/lib/EntryOptionPlugin.js +8 -4
  33. package/lib/EntryPlugin.js +2 -2
  34. package/lib/Entrypoint.js +6 -2
  35. package/lib/EnvironmentPlugin.js +2 -2
  36. package/lib/EvalDevToolModulePlugin.js +8 -4
  37. package/lib/EvalSourceMapDevToolPlugin.js +15 -8
  38. package/lib/ExportsInfo.js +101 -14
  39. package/lib/ExportsInfoApiPlugin.js +2 -4
  40. package/lib/ExternalModule.js +232 -77
  41. package/lib/ExternalModuleFactoryPlugin.js +97 -38
  42. package/lib/ExternalsPlugin.js +10 -6
  43. package/lib/FileSystemInfo.js +44 -70
  44. package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
  45. package/lib/FlagDependencyExportsPlugin.js +76 -19
  46. package/lib/FlagDependencyUsagePlugin.js +32 -47
  47. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  48. package/lib/Generator.js +36 -15
  49. package/lib/HotModuleReplacementPlugin.js +16 -44
  50. package/lib/IgnorePlugin.js +8 -4
  51. package/lib/IgnoreWarningsPlugin.js +2 -2
  52. package/lib/InitFragment.js +8 -4
  53. package/lib/JavascriptMetaInfoPlugin.js +35 -4
  54. package/lib/LazyBarrel.js +3 -4
  55. package/lib/LibraryTemplatePlugin.js +10 -6
  56. package/lib/LoaderOptionsPlugin.js +7 -3
  57. package/lib/LoaderTargetPlugin.js +1 -1
  58. package/lib/MainTemplate.js +49 -42
  59. package/lib/ManifestPlugin.js +12 -11
  60. package/lib/Module.js +62 -33
  61. package/lib/ModuleFactory.js +3 -3
  62. package/lib/ModuleFilenameHelpers.js +9 -4
  63. package/lib/ModuleGraph.js +195 -21
  64. package/lib/ModuleGraphConnection.js +6 -13
  65. package/lib/ModuleInfoHeaderPlugin.js +8 -10
  66. package/lib/ModuleTemplate.js +62 -63
  67. package/lib/MultiCompiler.js +130 -64
  68. package/lib/MultiStats.js +40 -9
  69. package/lib/MultiWatching.js +3 -3
  70. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  71. package/lib/NodeStuffPlugin.js +29 -19
  72. package/lib/NormalModule.js +141 -85
  73. package/lib/NormalModuleFactory.js +555 -110
  74. package/lib/NormalModuleReplacementPlugin.js +5 -8
  75. package/lib/NullFactory.js +6 -2
  76. package/lib/OptionsApply.js +7 -3
  77. package/lib/Parser.js +7 -3
  78. package/lib/PlatformPlugin.js +2 -2
  79. package/lib/PrefetchPlugin.js +1 -1
  80. package/lib/ProgressPlugin.js +16 -13
  81. package/lib/ProvidePlugin.js +3 -5
  82. package/lib/RawModule.js +25 -17
  83. package/lib/RecordIdsPlugin.js +3 -3
  84. package/lib/RequestShortener.js +1 -1
  85. package/lib/ResolverFactory.js +2 -2
  86. package/lib/RuntimeGlobals.js +22 -10
  87. package/lib/RuntimeModule.js +29 -19
  88. package/lib/RuntimePlugin.js +332 -169
  89. package/lib/RuntimeTemplate.js +2792 -352
  90. package/lib/SelfModuleFactory.js +7 -3
  91. package/lib/SourceMapDevToolModuleOptionsPlugin.js +6 -2
  92. package/lib/SourceMapDevToolPlugin.js +30 -20
  93. package/lib/Stats.js +3 -4
  94. package/lib/Template.js +32 -22
  95. package/lib/TemplatedPathPlugin.js +96 -14
  96. package/lib/UseStrictPlugin.js +4 -6
  97. package/lib/WarnCaseSensitiveModulesPlugin.js +4 -4
  98. package/lib/WarnDeprecatedOptionPlugin.js +1 -1
  99. package/lib/WarnNoModeSetPlugin.js +1 -1
  100. package/lib/WatchIgnorePlugin.js +8 -6
  101. package/lib/Watching.js +8 -8
  102. package/lib/WebpackIsIncludedPlugin.js +2 -4
  103. package/lib/WebpackOptionsApply.js +308 -18
  104. package/lib/WebpackOptionsDefaulter.js +6 -2
  105. package/lib/asset/AssetBytesGenerator.js +12 -10
  106. package/lib/asset/AssetBytesParser.js +2 -4
  107. package/lib/asset/AssetGenerator.js +188 -95
  108. package/lib/asset/AssetModule.js +7 -3
  109. package/lib/asset/AssetModulesPlugin.js +110 -38
  110. package/lib/asset/AssetParser.js +9 -7
  111. package/lib/asset/AssetSourceGenerator.js +60 -13
  112. package/lib/asset/AssetSourceParser.js +2 -4
  113. package/lib/asset/RawDataUrlModule.js +24 -16
  114. package/lib/asset/WebManifestGenerator.js +8 -10
  115. package/lib/asset/WebManifestParser.js +24 -10
  116. package/lib/async-modules/AsyncModuleHelpers.js +2 -2
  117. package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
  118. package/lib/async-modules/InferAsyncModulesPlugin.js +2 -2
  119. package/lib/async-modules/isGeneratorLowered.js +4 -4
  120. package/lib/buildChunkGraph.js +36 -27
  121. package/lib/bun/BunTargetPlugin.js +1 -1
  122. package/lib/cache/AddBuildDependenciesPlugin.js +1 -1
  123. package/lib/cache/AddManagedPathsPlugin.js +1 -1
  124. package/lib/cache/IdleFileCachePlugin.js +2 -2
  125. package/lib/cache/MemoryCachePlugin.js +18 -10
  126. package/lib/cache/MemoryWithGcCachePlugin.js +34 -22
  127. package/lib/cache/PackFileCacheStrategy.js +30 -23
  128. package/lib/cache/ResolverCachePlugin.js +38 -18
  129. package/lib/cache/getLazyHashedEtag.js +1 -2
  130. package/lib/cache/mergeEtags.js +1 -1
  131. package/lib/cli.js +1 -3
  132. package/lib/config/browserslistTargetHandler.js +41 -5
  133. package/lib/config/defaults.js +261 -79
  134. package/lib/config/defineConfig.js +10 -2
  135. package/lib/config/getClaimedAssetTypes.js +65 -0
  136. package/lib/config/normalization.js +36 -16
  137. package/lib/config/target.js +46 -3
  138. package/lib/container/ContainerEntryDependency.js +1 -1
  139. package/lib/container/ContainerEntryModule.js +24 -15
  140. package/lib/container/ContainerEntryModuleFactory.js +7 -3
  141. package/lib/container/ContainerPlugin.js +9 -10
  142. package/lib/container/ContainerReferencePlugin.js +6 -2
  143. package/lib/container/FallbackDependency.js +1 -1
  144. package/lib/container/FallbackModule.js +24 -17
  145. package/lib/container/FallbackModuleFactory.js +7 -3
  146. package/lib/container/HoistContainerReferencesPlugin.js +6 -11
  147. package/lib/container/ModuleFederationPlugin.js +7 -24
  148. package/lib/container/RemoteModule.js +27 -19
  149. package/lib/container/RemoteRuntimeModule.js +10 -8
  150. package/lib/container/moduleFederationHooks.js +32 -0
  151. package/lib/css/CssGenerator.js +171 -43
  152. package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
  153. package/lib/css/CssLoadingRuntimeModule.js +57 -24
  154. package/lib/css/CssModule.js +10 -7
  155. package/lib/css/CssModulesPlugin.js +168 -88
  156. package/lib/css/CssParser.js +1113 -568
  157. package/lib/css/CssServerStylesRuntimeModule.js +54 -0
  158. package/lib/css/cssMinify.js +168 -0
  159. package/lib/css/data.js +5324 -0
  160. package/lib/css/syntax.js +9579 -232
  161. package/lib/debug/ProfilingPlugin.js +14 -9
  162. package/lib/deno/DenoTargetPlugin.js +1 -1
  163. package/lib/dependencies/AMDDefineDependency.js +112 -87
  164. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +30 -17
  165. package/lib/dependencies/AMDPlugin.js +9 -7
  166. package/lib/dependencies/AMDRequireArrayDependency.js +5 -5
  167. package/lib/dependencies/AMDRequireContextDependency.js +2 -2
  168. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -1
  169. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +25 -14
  170. package/lib/dependencies/AMDRequireDependency.js +8 -7
  171. package/lib/dependencies/AMDRequireItemDependency.js +1 -1
  172. package/lib/dependencies/AMDRuntimeModules.js +21 -1
  173. package/lib/dependencies/BuildTimeConstDependency.js +102 -0
  174. package/lib/dependencies/CachedConstDependency.js +11 -8
  175. package/lib/dependencies/CommonJsDependencyHelpers.js +67 -46
  176. package/lib/dependencies/CommonJsExportRequireDependency.js +121 -45
  177. package/lib/dependencies/CommonJsExportsDependency.js +53 -49
  178. package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
  179. package/lib/dependencies/CommonJsFullRequireDependency.js +119 -34
  180. package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -50
  181. package/lib/dependencies/CommonJsObjectExportDependency.js +188 -0
  182. package/lib/dependencies/CommonJsPlugin.js +35 -6
  183. package/lib/dependencies/CommonJsRequireContextDependency.js +5 -6
  184. package/lib/dependencies/CommonJsRequireDependency.js +156 -27
  185. package/lib/dependencies/CommonJsSelfReferenceDependency.js +63 -38
  186. package/lib/dependencies/ConstDependency.js +8 -9
  187. package/lib/dependencies/ContextDependency.js +12 -8
  188. package/lib/dependencies/ContextDependencyHelpers.js +14 -9
  189. package/lib/dependencies/ContextDependencyTemplateAsId.js +4 -4
  190. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -4
  191. package/lib/dependencies/ContextElementDependency.js +31 -12
  192. package/lib/dependencies/CreateRequireParserPlugin.js +12 -7
  193. package/lib/dependencies/CreateScriptUrlDependency.js +4 -4
  194. package/lib/dependencies/CssIcssExportDependency.js +56 -28
  195. package/lib/dependencies/CssIcssImportDependency.js +17 -13
  196. package/lib/dependencies/CssIcssSymbolDependency.js +9 -10
  197. package/lib/dependencies/CssImportDependency.js +18 -9
  198. package/lib/dependencies/CssUrlDependency.js +17 -13
  199. package/lib/dependencies/DllEntryDependency.js +1 -1
  200. package/lib/dependencies/DynamicExports.js +2 -2
  201. package/lib/dependencies/ExportBindingInitFragment.js +36 -9
  202. package/lib/dependencies/ExportsInfoDependency.js +7 -8
  203. package/lib/dependencies/ExternalModuleDependency.js +9 -5
  204. package/lib/dependencies/ExternalModuleInitFragment.js +2 -2
  205. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +8 -5
  206. package/lib/dependencies/HarmonyAcceptDependency.js +5 -5
  207. package/lib/dependencies/HarmonyCompatibilityDependency.js +52 -17
  208. package/lib/dependencies/HarmonyDetectionParserPlugin.js +11 -7
  209. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +13 -10
  210. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +78 -12
  211. package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
  212. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
  213. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +143 -63
  214. package/lib/dependencies/HarmonyExportInitFragment.js +18 -6
  215. package/lib/dependencies/HarmonyExportSpecifierDependency.js +51 -14
  216. package/lib/dependencies/HarmonyExports.js +7 -4
  217. package/lib/dependencies/HarmonyImportDependency.js +27 -19
  218. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +31 -24
  219. package/lib/dependencies/HarmonyImportGuard.js +20 -30
  220. package/lib/dependencies/HarmonyImportSideEffectDependency.js +38 -9
  221. package/lib/dependencies/HarmonyImportSpecifierDependency.js +97 -49
  222. package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
  223. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
  224. package/lib/dependencies/HtmlEntryDependency.js +37 -29
  225. package/lib/dependencies/HtmlInlineHtmlDependency.js +7 -8
  226. package/lib/dependencies/HtmlInlineScriptDependency.js +11 -8
  227. package/lib/dependencies/HtmlInlineStyleDependency.js +7 -10
  228. package/lib/dependencies/HtmlSourceDependency.js +22 -14
  229. package/lib/dependencies/ImportContextDependency.js +2 -2
  230. package/lib/dependencies/ImportDependency.js +24 -20
  231. package/lib/dependencies/ImportEagerDependency.js +6 -9
  232. package/lib/dependencies/ImportMetaContextDependency.js +2 -2
  233. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +14 -13
  234. package/lib/dependencies/ImportMetaContextPlugin.js +7 -3
  235. package/lib/dependencies/ImportMetaGlobDependency.js +2 -2
  236. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +2 -3
  237. package/lib/dependencies/ImportMetaGlobHelpers.js +19 -22
  238. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -1
  239. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -1
  240. package/lib/dependencies/ImportMetaPlugin.js +154 -71
  241. package/lib/dependencies/ImportMetaResolveDependency.js +3 -4
  242. package/lib/dependencies/ImportParserPlugin.js +49 -35
  243. package/lib/dependencies/ImportPhase.js +12 -5
  244. package/lib/dependencies/ImportPlugin.js +7 -3
  245. package/lib/dependencies/ImportWeakDependency.js +6 -9
  246. package/lib/dependencies/JsonExportsDependency.js +11 -7
  247. package/lib/dependencies/LoaderDependency.js +2 -2
  248. package/lib/dependencies/LoaderImportDependency.js +2 -2
  249. package/lib/dependencies/LoaderPlugin.js +11 -7
  250. package/lib/dependencies/LocalModuleDependency.js +5 -5
  251. package/lib/dependencies/LocalModulesHelpers.js +1 -1
  252. package/lib/dependencies/ModuleDecoratorDependency.js +6 -7
  253. package/lib/dependencies/ModuleDependency.js +9 -6
  254. package/lib/dependencies/ModuleDependencyTemplateAsId.js +4 -4
  255. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +3 -3
  256. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  257. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -1
  258. package/lib/dependencies/ModuleInitFragmentDependency.js +24 -10
  259. package/lib/dependencies/NullDependency.js +3 -3
  260. package/lib/dependencies/ProvidedDependency.js +14 -10
  261. package/lib/dependencies/PureExpressionDependency.js +9 -10
  262. package/lib/dependencies/RequireContextDependency.js +2 -2
  263. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -4
  264. package/lib/dependencies/RequireContextPlugin.js +8 -4
  265. package/lib/dependencies/RequireEnsureDependenciesBlock.js +2 -2
  266. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +5 -8
  267. package/lib/dependencies/RequireEnsureDependency.js +8 -7
  268. package/lib/dependencies/RequireEnsurePlugin.js +7 -3
  269. package/lib/dependencies/RequireHeaderDependency.js +51 -12
  270. package/lib/dependencies/RequireIncludeDependency.js +6 -6
  271. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +2 -3
  272. package/lib/dependencies/RequireIncludePlugin.js +7 -3
  273. package/lib/dependencies/RequireJsStuffPlugin.js +7 -3
  274. package/lib/dependencies/RequireResolveContextDependency.js +2 -2
  275. package/lib/dependencies/RequireResolveDependency.js +4 -4
  276. package/lib/dependencies/RequireResolveHeaderDependency.js +4 -4
  277. package/lib/dependencies/RuntimeRequirementsDependency.js +5 -6
  278. package/lib/dependencies/StaticExportsDependency.js +2 -2
  279. package/lib/dependencies/SystemPlugin.js +10 -6
  280. package/lib/dependencies/SystemRuntimeModule.js +10 -0
  281. package/lib/dependencies/TopLevelAwaitDependency.js +11 -7
  282. package/lib/dependencies/URLContextDependency.js +2 -2
  283. package/lib/dependencies/URLDependency.js +110 -64
  284. package/lib/dependencies/URLPlugin.js +7 -3
  285. package/lib/dependencies/UnsupportedDependency.js +4 -4
  286. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -4
  287. package/lib/dependencies/WebAssemblyImportDependency.js +5 -5
  288. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -6
  289. package/lib/dependencies/WorkerAndWorkletPlugin.js +46 -28
  290. package/lib/dependencies/WorkerDependency.js +28 -22
  291. package/lib/dependencies/WorkletDependency.js +15 -14
  292. package/lib/dependencies/getFunctionExpression.js +8 -4
  293. package/lib/dependencies/processExportInfo.js +5 -5
  294. package/lib/dll/DelegatedModule.js +34 -22
  295. package/lib/dll/DelegatedModuleFactoryPlugin.js +15 -7
  296. package/lib/dll/DelegatedPlugin.js +2 -2
  297. package/lib/dll/DllEntryPlugin.js +2 -2
  298. package/lib/dll/DllModule.js +22 -15
  299. package/lib/dll/DllModuleFactory.js +7 -3
  300. package/lib/dll/DllPlugin.js +7 -5
  301. package/lib/dll/DllReferencePlugin.js +10 -7
  302. package/lib/dll/LibManifestPlugin.js +5 -5
  303. package/lib/electron/ElectronTargetPlugin.js +53 -49
  304. package/lib/errors/AsyncChunkWaterfallWarning.js +36 -0
  305. package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
  306. package/lib/errors/BroadContextsWarning.js +43 -0
  307. package/lib/errors/BuildCycleError.js +1 -1
  308. package/lib/errors/CacheEffectivenessWarning.js +55 -0
  309. package/lib/errors/ChunkRenderError.js +1 -1
  310. package/lib/errors/CircularDependenciesWarning.js +38 -0
  311. package/lib/errors/CodeGenerationError.js +1 -1
  312. package/lib/errors/CommentCompilationWarning.js +1 -1
  313. package/lib/errors/ConflictingResourceHintsWarning.js +35 -0
  314. package/lib/errors/DuplicateModulesWarning.js +45 -0
  315. package/lib/errors/DynamicExportsWarning.js +30 -0
  316. package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
  317. package/lib/errors/EntrypointOverlapWarning.js +45 -0
  318. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  319. package/lib/errors/EvalUsageWarning.js +28 -0
  320. package/lib/errors/HookWebpackError.js +5 -5
  321. package/lib/errors/HotspotsWarning.js +57 -0
  322. package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
  323. package/lib/errors/InlinedAssetsWarning.js +36 -0
  324. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  325. package/lib/errors/LargeModulesWarning.js +45 -0
  326. package/lib/errors/LegacyJavascriptWarning.js +48 -0
  327. package/lib/errors/MissingSideEffectsWarning.js +36 -0
  328. package/lib/errors/MixedExportsWarning.js +41 -0
  329. package/lib/errors/ModuleDependencyError.js +13 -16
  330. package/lib/errors/ModuleDependencyWarning.js +5 -15
  331. package/lib/errors/ModuleHashingError.js +1 -1
  332. package/lib/errors/ModuleNotFoundError.js +2 -2
  333. package/lib/errors/ModuleParseError.js +1 -2
  334. package/lib/errors/ModuleRestoreError.js +1 -1
  335. package/lib/errors/ModuleStoreError.js +1 -1
  336. package/lib/errors/NodeStuffInWebError.js +1 -1
  337. package/lib/errors/OsDependentRuleWarning.js +31 -0
  338. package/lib/errors/PureAnnotationsWarning.js +36 -0
  339. package/lib/errors/RedundantDynamicImportWarning.js +31 -0
  340. package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
  341. package/lib/errors/SplitChunksCappedWarning.js +41 -0
  342. package/lib/errors/TinyChunksWarning.js +40 -0
  343. package/lib/errors/TopLevelThisWarning.js +34 -0
  344. package/lib/errors/UnsplitVendorsWarning.js +42 -0
  345. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  346. package/lib/errors/UnusedAliasesWarning.js +29 -0
  347. package/lib/errors/UnusedDefinesWarning.js +29 -0
  348. package/lib/errors/UnusedExternalsWarning.js +29 -0
  349. package/lib/errors/UnusedReexportsWarning.js +42 -0
  350. package/lib/errors/UnusedRuleWarning.js +29 -0
  351. package/lib/errors/WebpackError.js +9 -5
  352. package/lib/errors/deriveStackFromNestedError.js +90 -0
  353. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  354. package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
  355. package/lib/esm/ModuleChunkLoadingPlugin.js +89 -51
  356. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +155 -62
  357. package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
  358. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  359. package/lib/hmr/LazyCompilationPlugin.js +45 -24
  360. package/lib/hmr/lazyCompilationBackend.js +9 -6
  361. package/lib/hmr/parserHooks.js +56 -0
  362. package/lib/html/HtmlGenerator.js +277 -77
  363. package/lib/html/HtmlModule.js +7 -3
  364. package/lib/html/HtmlModulesPlugin.js +282 -162
  365. package/lib/html/HtmlParser.js +31 -86
  366. package/lib/html/data.js +1928 -0
  367. package/lib/html/htmlMinify.js +288 -0
  368. package/lib/html/syntax.js +5557 -1155
  369. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
  370. package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
  371. package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
  372. package/lib/ids/HashedModuleIdsPlugin.js +6 -2
  373. package/lib/ids/IdHelpers.js +7 -8
  374. package/lib/ids/NamedChunkIdsPlugin.js +1 -1
  375. package/lib/ids/NamedModuleIdsPlugin.js +1 -1
  376. package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
  377. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  378. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
  379. package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
  380. package/lib/ids/SyncModuleIdsPlugin.js +4 -4
  381. package/lib/index.js +10 -0
  382. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
  383. package/lib/javascript/BasicEvaluatedExpression.js +18 -14
  384. package/lib/javascript/ChunkFormatHelpers.js +6 -6
  385. package/lib/javascript/ChunkHelpers.js +1 -1
  386. package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
  387. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  388. package/lib/javascript/JavascriptGenerator.js +65 -165
  389. package/lib/javascript/JavascriptModule.js +9 -3
  390. package/lib/javascript/JavascriptModulesPlugin.js +98 -113
  391. package/lib/javascript/JavascriptParser.js +242 -99
  392. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  393. package/lib/javascript/ScopeAnalyzer.js +1094 -0
  394. package/lib/javascript/StartupHelpers.js +55 -9
  395. package/lib/javascript/syntax.js +2678 -232
  396. package/lib/json/JsonData.js +8 -4
  397. package/lib/json/JsonGenerator.js +38 -16
  398. package/lib/json/JsonModule.js +7 -3
  399. package/lib/json/JsonModulesPlugin.js +1 -1
  400. package/lib/json/JsonParser.js +5 -6
  401. package/lib/library/AbstractLibraryPlugin.js +20 -14
  402. package/lib/library/AmdLibraryPlugin.js +11 -7
  403. package/lib/library/AssignLibraryPlugin.js +19 -13
  404. package/lib/library/EnableLibraryPlugin.js +2 -2
  405. package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
  406. package/lib/library/JsonpLibraryPlugin.js +11 -7
  407. package/lib/library/ModuleLibraryPlugin.js +256 -64
  408. package/lib/library/SystemLibraryPlugin.js +12 -8
  409. package/lib/library/UmdLibraryPlugin.js +62 -25
  410. package/lib/loaders/LoaderRunner.js +14 -1
  411. package/lib/loaders/loadLoader.js +8 -4
  412. package/lib/logging/createConsoleLogger.js +7 -4
  413. package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
  414. package/lib/node/NodeEnvironmentPlugin.js +17 -3
  415. package/lib/node/NodeSourcePlugin.js +1 -1
  416. package/lib/node/NodeTargetPlugin.js +4 -3
  417. package/lib/node/NodeTemplatePlugin.js +1 -1
  418. package/lib/node/NodeWatchFileSystem.js +70 -9
  419. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
  420. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +72 -19
  421. package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
  422. package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
  423. package/lib/node/nodeConsole.js +7 -3
  424. package/lib/optimize/AggressiveMergingPlugin.js +2 -2
  425. package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
  426. package/lib/optimize/ConcatenatedModule.js +985 -470
  427. package/lib/optimize/ConstExportsPlugin.js +11 -7
  428. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  429. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
  430. package/lib/optimize/InlineExports.js +9 -5
  431. package/lib/optimize/InnerGraph.js +28 -12
  432. package/lib/optimize/InnerGraphPlugin.js +23 -18
  433. package/lib/optimize/LimitChunkCountPlugin.js +7 -3
  434. package/lib/optimize/MangleExportsPlugin.js +7 -8
  435. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
  436. package/lib/optimize/MinChunkSizePlugin.js +7 -3
  437. package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
  438. package/lib/optimize/RealContentHashPlugin.js +10 -6
  439. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  440. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  441. package/lib/optimize/RuntimeChunkPlugin.js +2 -2
  442. package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
  443. package/lib/optimize/SplitChunksPlugin.js +86 -24
  444. package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
  445. package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
  446. package/lib/performance/BroadContextsPlugin.js +142 -0
  447. package/lib/performance/CacheEffectivenessPlugin.js +125 -0
  448. package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
  449. package/lib/performance/DuplicateModulesPlugin.js +93 -0
  450. package/lib/performance/DuplicatePackagesPlugin.js +119 -0
  451. package/lib/performance/DuplicatePackagesWarning.js +84 -0
  452. package/lib/performance/DynamicExportsPlugin.js +120 -0
  453. package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
  454. package/lib/performance/EntrypointOverlapPlugin.js +122 -0
  455. package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
  456. package/lib/performance/EvalUsagePlugin.js +115 -0
  457. package/lib/performance/HotspotsPlugin.js +296 -0
  458. package/lib/performance/InlinedAssetsPlugin.js +99 -0
  459. package/lib/performance/LargeModulesPlugin.js +126 -0
  460. package/lib/performance/LegacyJavascriptPlugin.js +139 -0
  461. package/lib/performance/MissingSideEffectsPlugin.js +138 -0
  462. package/lib/performance/MixedExportsPlugin.js +136 -0
  463. package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
  464. package/lib/performance/PureAnnotationsPlugin.js +219 -0
  465. package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
  466. package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
  467. package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
  468. package/lib/performance/SizeLimitsPlugin.js +139 -7
  469. package/lib/performance/SplitChunksCappedPlugin.js +99 -0
  470. package/lib/performance/TinyChunksPlugin.js +128 -0
  471. package/lib/performance/TopLevelThisPlugin.js +208 -0
  472. package/lib/performance/UnsplitVendorsPlugin.js +112 -0
  473. package/lib/performance/UnusedAliasesPlugin.js +253 -0
  474. package/lib/performance/UnusedDefinesPlugin.js +87 -0
  475. package/lib/performance/UnusedExternalsPlugin.js +110 -0
  476. package/lib/performance/UnusedReexportsPlugin.js +159 -0
  477. package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
  478. package/lib/performance/getModuleSize.js +22 -0
  479. package/lib/performance/getSourceModules.js +22 -0
  480. package/lib/performance/hasOnlyUnusedExports.js +40 -0
  481. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
  482. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
  483. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
  484. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  485. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  486. package/lib/prefetch/ResourceHintPlugin.js +295 -78
  487. package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
  488. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
  489. package/lib/prefetch/parseResourceHintOptions.js +31 -4
  490. package/lib/rules/BasicEffectRulePlugin.js +2 -2
  491. package/lib/rules/BasicMatcherRulePlugin.js +8 -4
  492. package/lib/rules/GlobMatcherRulePlugin.js +68 -0
  493. package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
  494. package/lib/rules/RuleSetCompiler.js +146 -12
  495. package/lib/rules/UseEffectRulePlugin.js +18 -11
  496. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
  497. package/lib/runtime/AsyncModuleRuntimeModule.js +1 -1
  498. package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
  499. package/lib/runtime/BaseUriRuntimeModule.js +33 -7
  500. package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
  501. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
  502. package/lib/runtime/CompatRuntimeModule.js +5 -3
  503. package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
  504. package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
  505. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
  506. package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
  507. package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
  508. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
  509. package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
  510. package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
  511. package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
  512. package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
  513. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
  514. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
  515. package/lib/runtime/GlobalRuntimeModule.js +18 -0
  516. package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
  517. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  518. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +23 -6
  519. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
  520. package/lib/runtime/NonceRuntimeModule.js +10 -0
  521. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
  522. package/lib/runtime/PublicPathRuntimeModule.js +12 -2
  523. package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
  524. package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
  525. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
  526. package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
  527. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
  528. package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
  529. package/lib/runtime/SystemContextRuntimeModule.js +10 -0
  530. package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
  531. package/lib/runtime/WorkerRuntimeModule.js +11 -1
  532. package/lib/runtime/baseUri.js +63 -0
  533. package/lib/schemes/DataUriPlugin.js +1 -1
  534. package/lib/schemes/FileUriPlugin.js +1 -1
  535. package/lib/schemes/HttpUriPlugin.js +24 -15
  536. package/lib/schemes/VirtualUrlPlugin.js +13 -7
  537. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  538. package/lib/serialization/BinaryMiddleware.js +4 -4
  539. package/lib/serialization/ErrorObjectSerializer.js +1 -1
  540. package/lib/serialization/FileMiddleware.js +7 -7
  541. package/lib/serialization/ObjectMiddleware.js +139 -114
  542. package/lib/serialization/PlainObjectSerializer.js +19 -16
  543. package/lib/sharing/ConsumeSharedModule.js +30 -21
  544. package/lib/sharing/ConsumeSharedPlugin.js +18 -10
  545. package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
  546. package/lib/sharing/ProvideSharedModule.js +25 -16
  547. package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
  548. package/lib/sharing/ProvideSharedPlugin.js +8 -4
  549. package/lib/sharing/SharePlugin.js +17 -5
  550. package/lib/sharing/ShareRuntimeModule.js +4 -4
  551. package/lib/sharing/resolveMatchedConfigs.js +9 -6
  552. package/lib/sharing/utils.js +1 -3
  553. package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
  554. package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
  555. package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
  556. package/lib/stats/StatsFactory.js +25 -26
  557. package/lib/stats/StatsPrinter.js +16 -12
  558. package/lib/typescript/TypeScriptPlugin.js +12 -14
  559. package/lib/url/URLParserPlugin.js +26 -13
  560. package/lib/util/AsyncQueue.js +4 -3
  561. package/lib/util/Hash.js +5 -1
  562. package/lib/util/LazySet.js +35 -22
  563. package/lib/util/LocConverter.js +36 -13
  564. package/lib/util/SourceProcessor.js +1050 -24
  565. package/lib/util/StringXor.js +1 -1
  566. package/lib/util/chainedImports.js +9 -5
  567. package/lib/util/cleverMerge.js +1 -1
  568. package/lib/util/comparators.js +45 -14
  569. package/lib/util/concatenate.js +203 -77
  570. package/lib/util/conventions.js +5 -1
  571. package/lib/util/createHash.js +2 -2
  572. package/lib/util/createHooksRegistry.js +8 -10
  573. package/lib/util/dataURL.js +225 -1
  574. package/lib/util/extractSourceMap.js +4 -3
  575. package/lib/util/findCaseMismatch.js +139 -0
  576. package/lib/util/formatLocation.js +1 -2
  577. package/lib/util/fs.js +22 -5
  578. package/lib/util/globUtils.js +298 -24
  579. package/lib/util/hash/BatchedHash.js +5 -1
  580. package/lib/util/hash/BulkUpdateHash.js +5 -1
  581. package/lib/util/hash/DebugHash.js +5 -1
  582. package/lib/util/hash/hash-digest.js +6 -2
  583. package/lib/util/identifier.js +4 -0
  584. package/lib/util/implicitTypeLoaderFallback.js +1 -1
  585. package/lib/util/internalSerializables.js +6 -0
  586. package/lib/util/lazyModule.js +56 -0
  587. package/lib/util/makeSerializable.js +7 -3
  588. package/lib/util/matchAlias.js +25 -0
  589. package/lib/util/mimeTypes.js +11 -5
  590. package/lib/util/nonNumericOnlyHash.js +4 -3
  591. package/lib/util/parseJson.js +5 -3
  592. package/lib/util/preloadModuleType.js +32 -0
  593. package/lib/util/registerExternalSerializer.js +7 -5
  594. package/lib/util/runtime.js +2 -2
  595. package/lib/util/semver.js +1 -1
  596. package/lib/util/serialization.js +28 -28
  597. package/lib/util/source.js +2 -2
  598. package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
  599. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
  600. package/lib/wasm/wasmModuleFilename.js +54 -0
  601. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +41 -21
  602. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +43 -21
  603. package/lib/wasm-async/AsyncWasmModule.js +3 -3
  604. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
  605. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
  606. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
  607. package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
  608. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +34 -8
  609. package/lib/wasm-sync/SyncWasmModule.js +2 -2
  610. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
  611. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
  612. package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
  613. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
  614. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
  615. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
  616. package/lib/wasm-sync/WebAssemblyParser.js +4 -6
  617. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  618. package/lib/web/FetchCompileAsyncWasmPlugin.js +101 -19
  619. package/lib/web/FetchCompileWasmPlugin.js +46 -16
  620. package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
  621. package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
  622. package/lib/web/JsonpTemplatePlugin.js +2 -2
  623. package/lib/webpack.js +22 -11
  624. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
  625. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
  626. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  627. package/module.d.ts +1 -0
  628. package/package.json +32 -25
  629. package/schemas/WebpackOptions.check.js +1 -1
  630. package/schemas/WebpackOptions.json +670 -36
  631. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  632. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  633. package/schemas/plugins/container/ContainerPlugin.json +10 -0
  634. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  635. package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
  636. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  637. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  638. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  639. package/types.d.ts +3144 -454
  640. package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
@@ -14,12 +14,8 @@ const HotUpdateChunk = require("../HotUpdateChunk");
14
14
  const { HTML_TYPE } = require("../ModuleSourceTypeConstants");
15
15
  const { HTML_MODULE_TYPE } = require("../ModuleTypeConstants");
16
16
  const NormalModule = require("../NormalModule");
17
+ const { toTemplateSourceFileName } = require("../TemplatedPathPlugin");
17
18
  const ConstDependency = require("../dependencies/ConstDependency");
18
- const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
19
- const HtmlInlineHtmlDependency = require("../dependencies/HtmlInlineHtmlDependency");
20
- const HtmlInlineScriptDependency = require("../dependencies/HtmlInlineScriptDependency");
21
- const HtmlInlineStyleDependency = require("../dependencies/HtmlInlineStyleDependency");
22
- const HtmlSourceDependency = require("../dependencies/HtmlSourceDependency");
23
19
  const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
24
20
  const WebpackError = require("../errors/WebpackError");
25
21
  const JavascriptModulesPlugin = require("../javascript/JavascriptModulesPlugin");
@@ -28,24 +24,40 @@ const createHash = require("../util/createHash");
28
24
  const createHooksRegistry = require("../util/createHooksRegistry");
29
25
  const { getUndoPath, makePathsRelative } = require("../util/identifier");
30
26
  const implicitTypeLoaderFallback = require("../util/implicitTypeLoaderFallback");
27
+ const lazyModule = require("../util/lazyModule");
31
28
  const memoize = require("../util/memoize");
32
29
  const { digestNonNumericOnly } = require("../util/nonNumericOnlyHash");
30
+ const preloadModuleType = require("../util/preloadModuleType");
33
31
  const {
34
32
  PUBLIC_PATH_AUTO: autoPlaceholder
35
33
  } = require("../util/publicPathPlaceholder");
36
34
  const removeBOM = require("../util/removeBOM");
37
- const HtmlGenerator = require("./HtmlGenerator");
38
35
  const HtmlModule = require("./HtmlModule");
39
- const HtmlParser = require("./HtmlParser");
40
- const { escapeAttribute } = require("./syntax");
41
36
 
42
- /** @typedef {import("../../declarations/WebpackOptions").EntryDescriptionNormalized} EntryDescriptionNormalized */
37
+ const getMimeTypes = memoize(() => require("../util/mimeTypes"));
38
+
39
+ const getHtmlSyntax = memoize(() => require("./syntax"));
40
+
41
+ // Lazy: this plugin is applied on every build (`experiments.html` defaults on),
42
+ // but the HTML parser and tokenizer are only reached once HTML is in the graph.
43
+ const getHtmlParser = lazyModule(() => require("./HtmlParser"));
44
+
45
+ // html generation only happens once a build actually has an html module
46
+ const getHtmlGenerator = memoize(() => require("./HtmlGenerator"));
47
+
48
+ /**
49
+ * @import {
50
+ * EntryDescriptionNormalized,
51
+ * OutputHtmlOptions,
52
+ * HtmlFaviconIcon
53
+ * } from "../../declarations/WebpackOptions"
54
+ */
43
55
  /** @typedef {import("../../declarations/WebpackOptions").OutputHtmlOptions["favicon"]} FaviconOption */
44
56
  /** @typedef {import("../../declarations/WebpackOptions").OutputHtmlOptions["manifest"]} ManifestOption */
45
- /** @typedef {import("../../declarations/WebpackOptions").HtmlFaviconIcon} HtmlFaviconIcon */
46
57
  /** @typedef {Exclude<HtmlFaviconIcon, string>} FaviconIcon */
47
- /** @typedef {import("../Compiler")} Compiler */
48
- /** @typedef {import("./HtmlModule").HtmlModuleBuildInfo} HtmlModuleBuildInfo */
58
+ /** @import Compiler from "../Compiler" */
59
+ /** @import { HtmlModuleBuildInfo } from "./HtmlModule" */
60
+ /** @import HtmlParser from "./HtmlParser" */
49
61
  /** @typedef {{ request: string, entryName: string, type: "script" | "script-module" | "modulepreload" | "stylesheet" | "html" | "preload" | "prefetch", css?: boolean }} HtmlEntryInfo */
50
62
 
51
63
  /** @typedef {{ outputName: string }} HtmlTransformHtmlContext */
@@ -114,7 +126,6 @@ const DEFAULT_FAVICON = new URL("./favicon.svg", pathToFileURL(__filename))
114
126
  .href;
115
127
 
116
128
  // mime-db is heavy — only load it when a favicon actually needs a `type`.
117
- const getMimeTypes = memoize(() => require("../util/mimeTypes"));
118
129
 
119
130
  /**
120
131
  * Resolves `output.html.favicon` for one page to `[rel, icon]` pairs.
@@ -150,6 +161,7 @@ const resolveFaviconLinks = (favicon, name) => {
150
161
  * @returns {string} a `<link rel=… [attrs…] href=…>` tag; `type` defaults to the file format
151
162
  */
152
163
  const faviconLinkTag = (rel, icon) => {
164
+ const { escapeAttribute } = getHtmlSyntax();
153
165
  const type = icon.type || getMimeTypes().lookup(icon.href) || "";
154
166
  const attrs = [
155
167
  `rel="${escapeAttribute(rel)}"`,
@@ -186,9 +198,27 @@ const manifestLinkTag = (manifest, name) => {
186
198
  JSON.stringify(value),
187
199
  "utf8"
188
200
  ).toString("base64")}`;
189
- return `<link rel="manifest" href="${escapeAttribute(href)}">`;
201
+ return `<link rel="manifest" href="${getHtmlSyntax().escapeAttribute(
202
+ href
203
+ )}">`;
190
204
  };
191
205
 
206
+ // Decided while the page's HTML is generated, which happens once per module —
207
+ // and one synthetic page module can back several entries — so an entry's `html`
208
+ // object can't override it.
209
+ /** @type {"inline"[]} */
210
+ const GLOBAL_ONLY_HTML_OPTIONS = ["inline"];
211
+
212
+ /**
213
+ * SRI is on when `integrity` names at least one algorithm.
214
+ * @param {OutputHtmlOptions["integrity"]} integrity integrity option
215
+ * @returns {boolean} true when integrity attributes must be emitted
216
+ */
217
+ const isIntegrityEnabled = (integrity) =>
218
+ integrity === true ||
219
+ typeof integrity === "function" ||
220
+ (Array.isArray(integrity) && integrity.length > 0);
221
+
192
222
  // `\.html`/`\.css` request matchers for the synthetic `output.html` wrapper.
193
223
  const HTML_REQUEST_RE = /\.html(\?|$)/i;
194
224
  const CSS_REQUEST_RE = /\.css(\?|$)/i;
@@ -299,25 +329,59 @@ class HtmlModulesPlugin {
299
329
  apply(compiler) {
300
330
  const { output } = compiler.options;
301
331
  const htmlOption = output.html;
302
- const scriptLoading =
303
- (typeof htmlOption === "object" && htmlOption.scriptLoading) || "auto";
304
- // ESM output emits `type="module"` (already deferred), so scriptLoading
305
- // is ignored under output.module — warn on an explicit defer/blocking.
306
- let scriptAttr = " defer";
307
- if (output.module) {
308
- scriptAttr = "";
309
- if (scriptLoading === "defer" || scriptLoading === "blocking") {
310
- compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
311
- compilation.warnings.push(
312
- new WebpackError(
313
- `output.html.scriptLoading: "${scriptLoading}" is ignored with output.module — ES module scripts are always deferred.`
314
- )
315
- );
316
- });
332
+ const globalHtmlOptions =
333
+ typeof htmlOption === "object" ? htmlOption : undefined;
334
+ // Collected while entries are resolved (`entryOption`, before the first
335
+ // compilation) and reported on every compilation; a Set dedupes entries
336
+ // that hit the same problem.
337
+ /** @type {Set<string>} */
338
+ const optionWarnings = new Set();
339
+ compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
340
+ for (const message of optionWarnings) {
341
+ compilation.warnings.push(new WebpackError(message));
317
342
  }
318
- } else if (scriptLoading === "blocking") {
319
- scriptAttr = "";
320
- }
343
+ });
344
+
345
+ // Resolved options per entry that owns a generated page, read back when the
346
+ // page is emitted (`csp`, `integrity`) — one synthetic page module can back
347
+ // several entries, so those can only be applied per emitted asset.
348
+ /** @type {Map<string, OutputHtmlOptions>} */
349
+ const htmlOptionsByEntry = new Map();
350
+ // SRI sentinels are emitted while the page's HTML is generated, before the
351
+ // owning entry is known, so any page asking for integrity turns them on for
352
+ // all of them; pages that don't want SRI drop them again on emit. Authored
353
+ // `.html` pages never reach the entry hook, hence the global seed.
354
+ let anyIntegrity = isIntegrityEnabled(
355
+ globalHtmlOptions && globalHtmlOptions.integrity
356
+ );
357
+
358
+ /**
359
+ * Options for one page: an entry's `html` object overrides `output.html`
360
+ * option by option, `true` inherits it as-is.
361
+ * @param {EntryDescriptionNormalized["html"]} html the entry's `html` value
362
+ * @param {string} name entry name
363
+ * @returns {OutputHtmlOptions} resolved options
364
+ */
365
+ const resolveHtmlOptions = (html, name) => {
366
+ const options =
367
+ typeof html !== "object"
368
+ ? globalHtmlOptions || {}
369
+ : globalHtmlOptions
370
+ ? { ...globalHtmlOptions, ...html }
371
+ : html;
372
+ if (typeof html === "object") {
373
+ for (const option of GLOBAL_ONLY_HTML_OPTIONS) {
374
+ if (html[option] !== undefined) {
375
+ optionWarnings.add(
376
+ `entry "${name}" html.${option} is ignored — ${option} is resolved once per generated page and can only be set on output.html.`
377
+ );
378
+ }
379
+ }
380
+ }
381
+ htmlOptionsByEntry.set(name, options);
382
+ if (isIntegrityEnabled(options.integrity)) anyIntegrity = true;
383
+ return options;
384
+ };
321
385
 
322
386
  // `output.html` (or an entry's `html`) wraps a non-HTML entry in a
323
387
  // synthetic HTML module so the existing pipeline injects its JS/CSS
@@ -329,6 +393,9 @@ class HtmlModulesPlugin {
329
393
  EntryOptionPlugin.getHooks(compiler).entry.tap(
330
394
  PLUGIN_NAME,
331
395
  (context, name, desc) => {
396
+ // Resolved for every entry, including the authored `.html` ones that
397
+ // need no wrapper below — their page reads back `csp`/`integrity` too.
398
+ const htmlObj = resolveHtmlOptions(desc.html, name);
332
399
  const html = desc.html !== undefined ? desc.html : htmlOption;
333
400
  const imports = desc.import;
334
401
  if (
@@ -338,6 +405,26 @@ class HtmlModulesPlugin {
338
405
  ) {
339
406
  return;
340
407
  }
408
+ const scriptLoading = htmlObj.scriptLoading || "auto";
409
+ // ESM output emits `type="module"` (already deferred), so
410
+ // scriptLoading is ignored under output.module — warn on an
411
+ // explicit defer/blocking.
412
+ let scriptAttr = " defer";
413
+ if (output.module) {
414
+ scriptAttr = "";
415
+ if (scriptLoading === "defer" || scriptLoading === "blocking") {
416
+ const source =
417
+ typeof desc.html === "object" &&
418
+ desc.html.scriptLoading !== undefined
419
+ ? `entry "${name}" html`
420
+ : "output.html";
421
+ optionWarnings.add(
422
+ `${source}.scriptLoading: "${scriptLoading}" is ignored with output.module — ES module scripts are always deferred.`
423
+ );
424
+ }
425
+ } else if (scriptLoading === "blocking") {
426
+ scriptAttr = "";
427
+ }
341
428
  const entries = compiler.options.entry;
342
429
  const requests =
343
430
  typeof entries === "object" && entries[name]
@@ -352,27 +439,13 @@ class HtmlModulesPlugin {
352
439
  scripts.push(`<script${scriptAttr} src="${r}"></script>`);
353
440
  }
354
441
  }
355
- const htmlObj =
356
- typeof html === "object"
357
- ? html
358
- : typeof htmlOption === "object"
359
- ? htmlOption
360
- : {};
361
- const headTags = HtmlParser.buildHeadTags(htmlObj);
442
+ const headTags = getHtmlSyntax().buildHeadTags(htmlObj);
362
443
  // Injected into webpack-generated pages only; each icon's href is a
363
444
  // normal request the parser turns into a hashed asset.
364
- const favicon =
365
- typeof html === "object" && html.favicon !== undefined
366
- ? html.favicon
367
- : false;
368
- const faviconTag = resolveFaviconLinks(favicon, name)
445
+ const faviconTag = resolveFaviconLinks(htmlObj.favicon, name)
369
446
  .map(([rel, icon]) => faviconLinkTag(rel, icon))
370
447
  .join("");
371
- const manifest =
372
- typeof html === "object" && html.manifest !== undefined
373
- ? html.manifest
374
- : false;
375
- const manifestTag = manifestLinkTag(manifest, name);
448
+ const manifestTag = manifestLinkTag(htmlObj.manifest, name);
376
449
  const inject = htmlObj.inject;
377
450
  const scriptsInHead =
378
451
  inject === "head" || (inject !== "body" && output.module);
@@ -402,12 +475,13 @@ class HtmlModulesPlugin {
402
475
  // `<link rel="modulepreload">` intact.
403
476
  // Per-compilation state: the HTML modules seen during make (so
404
477
  // `finishMake` creates their entries without scanning the whole module
405
- // graph) and the stylesheet entry names (read in `afterChunks`).
406
- /** @type {WeakMap<import("../Compilation"), { htmlModules: Set<import("../Module")>, stylesheetEntries: Set<string>, htmlAssetNames: Set<string> }>} */
478
+ // graph), the stylesheet entry names (read in `afterChunks`) and the html
479
+ // options of every emitted page, keyed by its asset name.
480
+ /** @type {WeakMap<import("../Compilation"), { htmlModules: Set<import("../Module")>, stylesheetEntries: Set<string>, htmlAssetOptions: Map<string, OutputHtmlOptions> }>} */
407
481
  const compilationState = new WeakMap();
408
482
  /**
409
483
  * @param {import("../Compilation")} compilation compilation
410
- * @returns {{ htmlModules: Set<import("../Module")>, stylesheetEntries: Set<string>, htmlAssetNames: Set<string> }} per-compilation state
484
+ * @returns {{ htmlModules: Set<import("../Module")>, stylesheetEntries: Set<string>, htmlAssetOptions: Map<string, OutputHtmlOptions> }} per-compilation state
411
485
  */
412
486
  const getState = (compilation) => {
413
487
  let state = compilationState.get(compilation);
@@ -415,7 +489,7 @@ class HtmlModulesPlugin {
415
489
  state = {
416
490
  htmlModules: new Set(),
417
491
  stylesheetEntries: new Set(),
418
- htmlAssetNames: new Set()
492
+ htmlAssetOptions: new Map()
419
493
  };
420
494
  compilationState.set(compilation, state);
421
495
  }
@@ -515,15 +589,10 @@ class HtmlModulesPlugin {
515
589
  );
516
590
  });
517
591
 
518
- const integrity =
519
- typeof htmlOption === "object" ? htmlOption.integrity : undefined;
520
- const integrityOn =
521
- integrity === true ||
522
- typeof integrity === "function" ||
523
- (Array.isArray(integrity) && integrity.length > 0);
524
- // `output.html.csp` injects a `<meta http-equiv="Content-Security-Policy">`
525
- // once the page's inline content is final (in `processAssets` below).
526
- const csp = typeof htmlOption === "object" ? htmlOption.csp : undefined;
592
+ // `csp` injects a `<meta http-equiv="Content-Security-Policy">` and
593
+ // `integrity` resolves the SRI sentinels — both once the page's inline
594
+ // content is final (in `processAssets` below), per page, so an entry's
595
+ // `html` can override them.
527
596
  // `"auto"` marks implicit enablement (no user rule for HTML files) — see
528
597
  // `applyExperimentsDefaults`. Only then loaders win over the built-in type
529
598
  // (e.g. html-webpack-plugin's template loader in its child compiler).
@@ -547,7 +616,13 @@ class HtmlModulesPlugin {
547
616
  // module in the graph. Tracking only records; entries are still
548
617
  // added (and awaited) in `finishMake`.
549
618
  const trackHtmlModule = (/** @type {import("../Module")} */ module) => {
550
- if (module.type === HTML_MODULE_TYPE) htmlModules.add(module);
619
+ if (module.type !== HTML_MODULE_TYPE) return;
620
+ // enabled here, not on the compilation hook: an integrity build
621
+ // with no html module must not load the generator
622
+ if (anyIntegrity) {
623
+ getHtmlGenerator().enableIntegritySentinels(compilation);
624
+ }
625
+ htmlModules.add(module);
551
626
  };
552
627
  compilation.hooks.succeedModule.tap(PLUGIN_NAME, trackHtmlModule);
553
628
  compilation.hooks.stillValidModule.tap(PLUGIN_NAME, trackHtmlModule);
@@ -559,7 +634,7 @@ class HtmlModulesPlugin {
559
634
  // with CORS; without `output.crossOriginLoading` the browser
560
635
  // silently ignores `integrity` on cross-origin loads. Warn once
561
636
  // so a CDN deployment doesn't ship no-op integrity attributes.
562
- if (integrityOn && !compilation.outputOptions.crossOriginLoading) {
637
+ if (anyIntegrity && !compilation.outputOptions.crossOriginLoading) {
563
638
  compilation.warnings.push(
564
639
  new WebpackError(
565
640
  'output.html.integrity is set but output.crossOriginLoading is not. Browsers ignore Subresource Integrity on cross-origin requests made without CORS; set output.crossOriginLoading (e.g. "anonymous") if any asset is served from a different origin.'
@@ -572,29 +647,32 @@ class HtmlModulesPlugin {
572
647
  stage: Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_HASH + 1
573
648
  },
574
649
  async (assets) => {
575
- const { htmlAssetNames } = getState(compilation);
650
+ const { htmlAssetOptions } = getState(compilation);
576
651
  const hooks = HtmlModulesPlugin.getCompilationHooks(compilation);
577
652
  /** @type {Set<string>} */
578
653
  const inlinedFiles = new Set();
579
654
  for (const name of Object.keys(assets)) {
580
- if (!htmlAssetNames.has(name)) continue;
655
+ const pageOptions = htmlAssetOptions.get(name);
656
+ if (pageOptions === undefined) continue;
581
657
  const content = assets[name].source();
582
658
  if (typeof content !== "string") continue;
659
+ const { csp, integrity } = pageOptions;
583
660
  let resolved = content;
584
- if (
585
- integrityOn &&
586
- resolved.includes("__WEBPACK_HTML_INTEGRITY__")
587
- ) {
588
- resolved = HtmlGenerator.resolveChunkIntegritySentinels(
589
- resolved,
590
- compilation,
591
- /** @type {import("./HtmlGenerator").HtmlIntegrity} */ (
592
- integrity
593
- )
594
- );
661
+ // Sentinels are emitted whenever any page wants SRI, so a page
662
+ // that doesn't drops them again here.
663
+ if (resolved.includes("__WEBPACK_HTML_INTEGRITY__")) {
664
+ resolved = isIntegrityEnabled(integrity)
665
+ ? getHtmlGenerator().resolveChunkIntegritySentinels(
666
+ resolved,
667
+ compilation,
668
+ /** @type {import("./HtmlGenerator").HtmlIntegrity} */ (
669
+ integrity
670
+ )
671
+ )
672
+ : getHtmlGenerator().stripChunkIntegritySentinels(resolved);
595
673
  }
596
674
  if (resolved.includes("__WEBPACK_HTML_INLINE__")) {
597
- resolved = HtmlGenerator.resolveChunkInlineSentinels(
675
+ resolved = getHtmlGenerator().resolveChunkInlineSentinels(
598
676
  resolved,
599
677
  compilation,
600
678
  name,
@@ -613,15 +691,15 @@ class HtmlModulesPlugin {
613
691
  });
614
692
  const transformTags = hooks.transformTags.taps.length > 0;
615
693
  if (injected.length > 0 || transformTags || csp) {
616
- const model = HtmlGenerator.collectHtml(resolved);
617
- HtmlGenerator.addInjectedTags(model, injected);
694
+ const model = getHtmlGenerator().collectHtml(resolved);
695
+ getHtmlGenerator().addInjectedTags(model, injected);
618
696
  if (transformTags) {
619
697
  await hooks.transformTags.promise(model.tags, {
620
698
  outputName: name,
621
699
  html: resolved
622
700
  });
623
701
  }
624
- resolved = HtmlGenerator.renderHtml(resolved, model, csp);
702
+ resolved = getHtmlGenerator().renderHtml(resolved, model, csp);
625
703
  }
626
704
  // Final, fully-resolved HTML — let plugins transform it (minify,
627
705
  // inject a CSP meta, rewrite tags) before it is written.
@@ -695,58 +773,6 @@ class HtmlModulesPlugin {
695
773
  compilation.outputOptions.cssChunkFilename;
696
774
  }
697
775
  });
698
- compilation.dependencyFactories.set(
699
- HtmlSourceDependency,
700
- normalModuleFactory
701
- );
702
- compilation.dependencyTemplates.set(
703
- HtmlSourceDependency,
704
- new HtmlSourceDependency.Template()
705
- );
706
- compilation.dependencyFactories.set(
707
- HtmlEntryDependency,
708
- normalModuleFactory
709
- );
710
- compilation.dependencyTemplates.set(
711
- HtmlEntryDependency,
712
- new HtmlEntryDependency.Template()
713
- );
714
- // Inline `<script>` content is bundled as its own entry — the
715
- // same pipeline that handles `<script src>` — via a
716
- // `data:text/javascript,...` request. The dependency
717
- // template rewrites the original tag to `<script src=…>`.
718
- compilation.dependencyFactories.set(
719
- HtmlInlineScriptDependency,
720
- normalModuleFactory
721
- );
722
- compilation.dependencyTemplates.set(
723
- HtmlInlineScriptDependency,
724
- new HtmlInlineScriptDependency.Template()
725
- );
726
- // Inline `<style>` content is routed through the CSS pipeline
727
- // as a `data:text/css` module. The dependency template reads
728
- // the processed CSS text from the CSS module's code
729
- // generation data (`css-text` channel set by CssGenerator
730
- // when `exportType` is `"text"`).
731
- compilation.dependencyFactories.set(
732
- HtmlInlineStyleDependency,
733
- normalModuleFactory
734
- );
735
- compilation.dependencyTemplates.set(
736
- HtmlInlineStyleDependency,
737
- new HtmlInlineStyleDependency.Template()
738
- );
739
- // `<iframe srcdoc>` content is routed back through the HTML
740
- // pipeline as a `data:text/html` module; the template reads the
741
- // processed HTML from the nested module's `html` channel.
742
- compilation.dependencyFactories.set(
743
- HtmlInlineHtmlDependency,
744
- normalModuleFactory
745
- );
746
- compilation.dependencyTemplates.set(
747
- HtmlInlineHtmlDependency,
748
- new HtmlInlineHtmlDependency.Template()
749
- );
750
776
  compilation.dependencyTemplates.set(
751
777
  StaticExportsDependency,
752
778
  new StaticExportsDependency.Template()
@@ -759,6 +785,74 @@ class HtmlModulesPlugin {
759
785
  ConstDependency,
760
786
  new ConstDependency.Template()
761
787
  );
788
+ // registered when the first html module is prepared, so a build
789
+ // without html never loads these dependency classes
790
+ normalModuleFactory.hooks.prepareModuleType
791
+ .for(HTML_MODULE_TYPE)
792
+ .tap(PLUGIN_NAME, () => {
793
+ const HtmlSourceDependency = require("../dependencies/HtmlSourceDependency");
794
+ const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
795
+ const HtmlInlineScriptDependency = require("../dependencies/HtmlInlineScriptDependency");
796
+ const HtmlInlineStyleDependency = require("../dependencies/HtmlInlineStyleDependency");
797
+ const HtmlInlineHtmlDependency = require("../dependencies/HtmlInlineHtmlDependency");
798
+
799
+ compilation.dependencyFactories.set(
800
+ HtmlSourceDependency,
801
+ normalModuleFactory
802
+ );
803
+ compilation.dependencyTemplates.set(
804
+ HtmlSourceDependency,
805
+ new HtmlSourceDependency.Template()
806
+ );
807
+ compilation.dependencyFactories.set(
808
+ HtmlEntryDependency,
809
+ normalModuleFactory
810
+ );
811
+ compilation.dependencyTemplates.set(
812
+ HtmlEntryDependency,
813
+ new HtmlEntryDependency.Template()
814
+ );
815
+ // Inline `<script>` content is bundled as its own entry — the
816
+ // same pipeline that handles `<script src>` — via a
817
+ // `data:text/javascript,...` request. The dependency
818
+ // template rewrites the original tag to `<script src=…>`.
819
+ compilation.dependencyFactories.set(
820
+ HtmlInlineScriptDependency,
821
+ normalModuleFactory
822
+ );
823
+ compilation.dependencyTemplates.set(
824
+ HtmlInlineScriptDependency,
825
+ new HtmlInlineScriptDependency.Template()
826
+ );
827
+ // Inline `<style>` content is routed through the CSS pipeline
828
+ // as a `data:text/css` module. The dependency template reads
829
+ // the processed CSS text from the CSS module's code
830
+ // generation data (`css-text` channel set by CssGenerator
831
+ // when `exportType` is `"text"`).
832
+ compilation.dependencyFactories.set(
833
+ HtmlInlineStyleDependency,
834
+ normalModuleFactory
835
+ );
836
+ compilation.dependencyTemplates.set(
837
+ HtmlInlineStyleDependency,
838
+ new HtmlInlineStyleDependency.Template()
839
+ );
840
+ // `<iframe srcdoc>` content is routed back through the HTML
841
+ // pipeline as a `data:text/html` module; the template reads the
842
+ // processed HTML from the nested module's `html` channel.
843
+ compilation.dependencyFactories.set(
844
+ HtmlInlineHtmlDependency,
845
+ normalModuleFactory
846
+ );
847
+ compilation.dependencyTemplates.set(
848
+ HtmlInlineHtmlDependency,
849
+ new HtmlInlineHtmlDependency.Template()
850
+ );
851
+ });
852
+ preloadModuleType(normalModuleFactory, PLUGIN_NAME, [
853
+ [HTML_MODULE_TYPE, [getHtmlParser]]
854
+ ]);
855
+
762
856
  normalModuleFactory.hooks.createModuleClass
763
857
  .for(HTML_MODULE_TYPE)
764
858
  .tap(
@@ -777,7 +871,7 @@ class HtmlModulesPlugin {
777
871
  options
778
872
  )
779
873
  );
780
- return new HtmlParser(parserOptions);
874
+ return new (getHtmlParser.loaded())(parserOptions);
781
875
  });
782
876
 
783
877
  normalModuleFactory.hooks.createGenerator
@@ -792,7 +886,10 @@ class HtmlModulesPlugin {
792
886
  options
793
887
  )
794
888
  );
795
- return new HtmlGenerator(generatorOptions, compilation.moduleGraph);
889
+ return new (getHtmlGenerator())(
890
+ generatorOptions,
891
+ compilation.moduleGraph
892
+ );
796
893
  });
797
894
 
798
895
  NormalModule.getCompilationHooks(compilation).processResult.tap(
@@ -872,9 +969,9 @@ class HtmlModulesPlugin {
872
969
  // Asset URL sentinels (from `HtmlEntryDependency` resource-hint
873
970
  // tags) resolve here too — deferred from template.apply so it
874
971
  // doesn't race with asset-module codegen.
875
- const resolvedContent = HtmlGenerator.resolveAssetUrlSentinels(
876
- HtmlGenerator.embedInlineChunkHashes(
877
- HtmlGenerator.resolveChunkUrlSentinels(
972
+ const resolvedContent = getHtmlGenerator().resolveAssetUrlSentinels(
973
+ getHtmlGenerator().embedInlineChunkHashes(
974
+ getHtmlGenerator().resolveChunkUrlSentinels(
878
975
  /** @type {string} */ (placeholderSource.source()),
879
976
  compilation
880
977
  ),
@@ -897,11 +994,14 @@ class HtmlModulesPlugin {
897
994
  const sourceFilename =
898
995
  resource.startsWith("data:text/html") && chunk.name
899
996
  ? chunk.name
900
- : makePathsRelative(
901
- compiler.context,
902
- /** @type {string} */ (resource),
903
- compiler.root
904
- ).replace(/^\.\//, "");
997
+ : toTemplateSourceFileName(
998
+ makePathsRelative(
999
+ compiler.context,
1000
+ /** @type {string} */ (resource),
1001
+ compiler.root
1002
+ ).replace(/^\.\//, ""),
1003
+ compilation
1004
+ );
905
1005
  const filenameTemplate = HtmlModulesPlugin.getChunkFilenameTemplate(
906
1006
  chunk,
907
1007
  outputOptions
@@ -1012,10 +1112,11 @@ class HtmlModulesPlugin {
1012
1112
  // Resolve linked-page (`type: "html"`) sentinels to each page's
1013
1113
  // emitted filename before the undo path, so the href is relative to
1014
1114
  // this page.
1015
- const finalContent = HtmlGenerator.resolveHtmlPageUrlSentinels(
1016
- resolvedContent,
1017
- computePageFilenameByEntry
1018
- )
1115
+ const finalContent = getHtmlGenerator()
1116
+ .resolveHtmlPageUrlSentinels(
1117
+ resolvedContent,
1118
+ computePageFilenameByEntry
1119
+ )
1019
1120
  .split(autoPlaceholder)
1020
1121
  .join(undoPath);
1021
1122
  const finalSource = new RawSource(finalContent);
@@ -1033,8 +1134,14 @@ class HtmlModulesPlugin {
1033
1134
  outputOptions
1034
1135
  );
1035
1136
 
1036
- // Track HTML pages for the integrity sentinel pass (never JS chunks).
1037
- getState(compilation).htmlAssetNames.add(filename);
1137
+ // Track HTML pages (never JS chunks) with the html options of the
1138
+ // entry that owns them, read back by the emit passes below.
1139
+ getState(compilation).htmlAssetOptions.set(
1140
+ filename,
1141
+ (chunk.name && htmlOptionsByEntry.get(chunk.name)) ||
1142
+ globalHtmlOptions ||
1143
+ {}
1144
+ );
1038
1145
 
1039
1146
  result.push({
1040
1147
  render: () => finalSource,
@@ -1060,6 +1167,13 @@ class HtmlModulesPlugin {
1060
1167
  if (htmlModules.size === 0) return source;
1061
1168
  const raw = source.source();
1062
1169
  if (typeof raw !== "string") return source;
1170
+ // Every sentinel shares this prefix — one scan answers the common
1171
+ // sentinel-free case instead of five.
1172
+ if (!raw.includes("__WEBPACK_HTML_")) {
1173
+ return source;
1174
+ }
1175
+ // Exact re-check on a prefix hit: the autoPlaceholder strip below is
1176
+ // not sentinel-guarded, so bare-prefix false positives must bail here.
1063
1177
  if (
1064
1178
  !raw.includes("__WEBPACK_HTML_CHUNK_URL__") &&
1065
1179
  !raw.includes("__WEBPACK_HTML_PAGE_URL__") &&
@@ -1072,20 +1186,26 @@ class HtmlModulesPlugin {
1072
1186
  // Strip integrity and inline sentinels (not resolve): a JS chunk
1073
1187
  // can't hold real SRI hashes for its own not-yet-final bytes, and
1074
1188
  // inline content belongs only in the final .html, never in JS bundles.
1075
- const resolved = HtmlGenerator.stripChunkIntegritySentinels(
1076
- HtmlGenerator.resolveAssetUrlSentinels(
1077
- HtmlGenerator.resolveHtmlPageUrlSentinels(
1078
- HtmlGenerator.resolveChunkUrlSentinels(raw, compilation),
1079
- computePageFilenameByEntry
1080
- ),
1081
- compilation
1189
+ const resolved = getHtmlGenerator()
1190
+ .stripChunkIntegritySentinels(
1191
+ getHtmlGenerator()
1192
+ .resolveAssetUrlSentinels(
1193
+ getHtmlGenerator().resolveHtmlPageUrlSentinels(
1194
+ getHtmlGenerator().resolveChunkUrlSentinels(
1195
+ raw,
1196
+ compilation
1197
+ ),
1198
+ computePageFilenameByEntry
1199
+ ),
1200
+ compilation
1201
+ )
1202
+ .split(autoPlaceholder)
1203
+ .join("")
1082
1204
  )
1083
- .split(autoPlaceholder)
1084
- .join("")
1085
- ).replace(
1086
- /__WEBPACK_HTML_INLINE__[0-9a-f]+__[a-z]+(?:__[0-9a-f]+)?__END__/g,
1087
- ""
1088
- );
1205
+ .replace(
1206
+ /__WEBPACK_HTML_INLINE__[0-9a-f]+__[a-z]+(?:__[0-9a-f]+)?__END__/g,
1207
+ ""
1208
+ );
1089
1209
  if (resolved === raw) return source;
1090
1210
  const chunkId = String(renderContext.chunk.id);
1091
1211
  const prior = sentinelResolvedSourceCache.get(chunkId);