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