@depup/webpack 5.109.2-depup.0 → 5.110.3-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 (647) 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 +46 -35
  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 +107 -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 +91 -26
  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 +111 -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 +40 -49
  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 +152 -103
  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 +335 -169
  89. package/lib/RuntimeTemplate.js +2761 -316
  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 +12 -6
  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 +270 -78
  134. package/lib/config/defineConfig.js +10 -2
  135. package/lib/config/getClaimedAssetTypes.js +65 -0
  136. package/lib/config/normalization.js +46 -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 +84 -32
  154. package/lib/css/CssModule.js +10 -7
  155. package/lib/css/CssModulesPlugin.js +172 -100
  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 +5334 -0
  160. package/lib/css/syntax.js +9647 -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 +170 -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 +24 -11
  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 +23 -14
  210. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +80 -12
  211. package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
  212. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
  213. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +286 -80
  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 +121 -60
  218. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +124 -38
  219. package/lib/dependencies/HarmonyImportGuard.js +20 -30
  220. package/lib/dependencies/HarmonyImportSideEffectDependency.js +152 -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 +49 -31
  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 +45 -5
  230. package/lib/dependencies/ImportDependency.js +33 -50
  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 +73 -49
  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 +50 -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 +47 -28
  290. package/lib/dependencies/WorkerDependency.js +22 -22
  291. package/lib/dependencies/WorkletDependency.js +18 -21
  292. package/lib/dependencies/getFunctionExpression.js +8 -4
  293. package/lib/dependencies/importOptionsCheck.js +47 -0
  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/DotenvFileError.js +29 -0
  316. package/lib/errors/DuplicateModulesWarning.js +45 -0
  317. package/lib/errors/DynamicExportsWarning.js +30 -0
  318. package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
  319. package/lib/errors/EntrypointOverlapWarning.js +45 -0
  320. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  321. package/lib/errors/EvalUsageWarning.js +28 -0
  322. package/lib/errors/HookWebpackError.js +5 -5
  323. package/lib/errors/HotspotsWarning.js +57 -0
  324. package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
  325. package/lib/errors/ImportedBindingAssignmentError.js +30 -0
  326. package/lib/errors/InlinedAssetsWarning.js +36 -0
  327. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  328. package/lib/errors/LargeModulesWarning.js +45 -0
  329. package/lib/errors/LegacyJavascriptWarning.js +48 -0
  330. package/lib/errors/MissingSideEffectsWarning.js +36 -0
  331. package/lib/errors/MixedExportsWarning.js +41 -0
  332. package/lib/errors/ModuleDependencyError.js +13 -16
  333. package/lib/errors/ModuleDependencyWarning.js +5 -15
  334. package/lib/errors/ModuleHashingError.js +1 -1
  335. package/lib/errors/ModuleNotFoundError.js +2 -2
  336. package/lib/errors/ModuleParseError.js +1 -2
  337. package/lib/errors/ModuleRestoreError.js +1 -1
  338. package/lib/errors/ModuleStoreError.js +1 -1
  339. package/lib/errors/NodeStuffInWebError.js +1 -1
  340. package/lib/errors/OsDependentRuleWarning.js +31 -0
  341. package/lib/errors/PureAnnotationsWarning.js +36 -0
  342. package/lib/errors/RedundantDynamicImportWarning.js +31 -0
  343. package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
  344. package/lib/errors/SplitChunksCappedWarning.js +41 -0
  345. package/lib/errors/TinyChunksWarning.js +40 -0
  346. package/lib/errors/TopLevelThisWarning.js +34 -0
  347. package/lib/errors/UnsplitVendorsWarning.js +42 -0
  348. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  349. package/lib/errors/UnusedAliasesWarning.js +29 -0
  350. package/lib/errors/UnusedDefinesWarning.js +29 -0
  351. package/lib/errors/UnusedExternalsWarning.js +29 -0
  352. package/lib/errors/UnusedReexportsWarning.js +42 -0
  353. package/lib/errors/UnusedRuleWarning.js +29 -0
  354. package/lib/errors/WebpackError.js +9 -5
  355. package/lib/errors/deriveStackFromNestedError.js +90 -0
  356. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  357. package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
  358. package/lib/esm/ModuleChunkLoadingPlugin.js +86 -51
  359. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +161 -62
  360. package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
  361. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  362. package/lib/hmr/LazyCompilationPlugin.js +45 -24
  363. package/lib/hmr/lazyCompilationBackend.js +9 -6
  364. package/lib/hmr/parserHooks.js +56 -0
  365. package/lib/html/HtmlGenerator.js +277 -77
  366. package/lib/html/HtmlModule.js +7 -3
  367. package/lib/html/HtmlModulesPlugin.js +366 -200
  368. package/lib/html/HtmlParser.js +31 -86
  369. package/lib/html/data.js +1928 -0
  370. package/lib/html/htmlMinify.js +288 -0
  371. package/lib/html/syntax.js +6034 -1384
  372. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
  373. package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
  374. package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
  375. package/lib/ids/HashedModuleIdsPlugin.js +6 -2
  376. package/lib/ids/IdHelpers.js +7 -8
  377. package/lib/ids/NamedChunkIdsPlugin.js +1 -1
  378. package/lib/ids/NamedModuleIdsPlugin.js +1 -1
  379. package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
  380. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  381. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
  382. package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
  383. package/lib/ids/SyncModuleIdsPlugin.js +4 -4
  384. package/lib/index.js +10 -0
  385. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
  386. package/lib/javascript/BasicEvaluatedExpression.js +18 -14
  387. package/lib/javascript/ChunkFormatHelpers.js +6 -6
  388. package/lib/javascript/ChunkHelpers.js +1 -1
  389. package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
  390. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  391. package/lib/javascript/JavascriptGenerator.js +65 -165
  392. package/lib/javascript/JavascriptModule.js +9 -3
  393. package/lib/javascript/JavascriptModulesPlugin.js +103 -123
  394. package/lib/javascript/JavascriptParser.js +242 -99
  395. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  396. package/lib/javascript/ScopeAnalyzer.js +1094 -0
  397. package/lib/javascript/StartupHelpers.js +55 -9
  398. package/lib/javascript/syntax.js +2678 -232
  399. package/lib/json/JsonData.js +8 -4
  400. package/lib/json/JsonGenerator.js +38 -16
  401. package/lib/json/JsonModule.js +7 -3
  402. package/lib/json/JsonModulesPlugin.js +1 -1
  403. package/lib/json/JsonParser.js +5 -6
  404. package/lib/library/AbstractLibraryPlugin.js +20 -14
  405. package/lib/library/AmdLibraryPlugin.js +11 -7
  406. package/lib/library/AssignLibraryPlugin.js +19 -13
  407. package/lib/library/EnableLibraryPlugin.js +2 -2
  408. package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
  409. package/lib/library/JsonpLibraryPlugin.js +11 -7
  410. package/lib/library/ModuleLibraryPlugin.js +256 -64
  411. package/lib/library/SystemLibraryPlugin.js +12 -8
  412. package/lib/library/UmdLibraryPlugin.js +62 -25
  413. package/lib/loaders/LoaderRunner.js +47 -6
  414. package/lib/loaders/loadLoader.js +8 -4
  415. package/lib/logging/createConsoleLogger.js +7 -4
  416. package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
  417. package/lib/node/NodeEnvironmentPlugin.js +17 -3
  418. package/lib/node/NodeSourcePlugin.js +1 -1
  419. package/lib/node/NodeTargetPlugin.js +4 -3
  420. package/lib/node/NodeTemplatePlugin.js +1 -1
  421. package/lib/node/NodeWatchFileSystem.js +70 -9
  422. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
  423. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +65 -19
  424. package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
  425. package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
  426. package/lib/node/nodeConsole.js +7 -3
  427. package/lib/optimize/AggressiveMergingPlugin.js +2 -2
  428. package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
  429. package/lib/optimize/ConcatenatedModule.js +1030 -476
  430. package/lib/optimize/ConstExportsPlugin.js +16 -7
  431. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  432. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
  433. package/lib/optimize/InlineExports.js +130 -5
  434. package/lib/optimize/InnerGraph.js +28 -12
  435. package/lib/optimize/InnerGraphPlugin.js +23 -18
  436. package/lib/optimize/LimitChunkCountPlugin.js +7 -3
  437. package/lib/optimize/MangleExportsPlugin.js +7 -8
  438. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
  439. package/lib/optimize/MinChunkSizePlugin.js +7 -3
  440. package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
  441. package/lib/optimize/RealContentHashPlugin.js +121 -41
  442. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  443. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  444. package/lib/optimize/RuntimeChunkPlugin.js +2 -2
  445. package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
  446. package/lib/optimize/SplitChunksPlugin.js +86 -24
  447. package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
  448. package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
  449. package/lib/performance/BroadContextsPlugin.js +142 -0
  450. package/lib/performance/CacheEffectivenessPlugin.js +125 -0
  451. package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
  452. package/lib/performance/DuplicateModulesPlugin.js +93 -0
  453. package/lib/performance/DuplicatePackagesPlugin.js +119 -0
  454. package/lib/performance/DuplicatePackagesWarning.js +84 -0
  455. package/lib/performance/DynamicExportsPlugin.js +120 -0
  456. package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
  457. package/lib/performance/EntrypointOverlapPlugin.js +122 -0
  458. package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
  459. package/lib/performance/EvalUsagePlugin.js +115 -0
  460. package/lib/performance/HotspotsPlugin.js +296 -0
  461. package/lib/performance/InlinedAssetsPlugin.js +99 -0
  462. package/lib/performance/LargeModulesPlugin.js +126 -0
  463. package/lib/performance/LegacyJavascriptPlugin.js +139 -0
  464. package/lib/performance/MissingSideEffectsPlugin.js +138 -0
  465. package/lib/performance/MixedExportsPlugin.js +136 -0
  466. package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
  467. package/lib/performance/PureAnnotationsPlugin.js +219 -0
  468. package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
  469. package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
  470. package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
  471. package/lib/performance/SizeLimitsPlugin.js +139 -7
  472. package/lib/performance/SplitChunksCappedPlugin.js +99 -0
  473. package/lib/performance/TinyChunksPlugin.js +128 -0
  474. package/lib/performance/TopLevelThisPlugin.js +208 -0
  475. package/lib/performance/UnsplitVendorsPlugin.js +112 -0
  476. package/lib/performance/UnusedAliasesPlugin.js +253 -0
  477. package/lib/performance/UnusedDefinesPlugin.js +87 -0
  478. package/lib/performance/UnusedExternalsPlugin.js +110 -0
  479. package/lib/performance/UnusedReexportsPlugin.js +159 -0
  480. package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
  481. package/lib/performance/getModuleSize.js +22 -0
  482. package/lib/performance/getSourceModules.js +22 -0
  483. package/lib/performance/hasOnlyUnusedExports.js +40 -0
  484. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
  485. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
  486. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
  487. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  488. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  489. package/lib/prefetch/ResourceHintPlugin.js +295 -79
  490. package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
  491. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
  492. package/lib/prefetch/parseResourceHintOptions.js +31 -4
  493. package/lib/rules/BasicEffectRulePlugin.js +2 -2
  494. package/lib/rules/BasicMatcherRulePlugin.js +8 -4
  495. package/lib/rules/GlobMatcherRulePlugin.js +68 -0
  496. package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
  497. package/lib/rules/RuleSetCompiler.js +146 -12
  498. package/lib/rules/UseEffectRulePlugin.js +18 -11
  499. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
  500. package/lib/runtime/AsyncModuleRuntimeModule.js +6 -2
  501. package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
  502. package/lib/runtime/BaseUriRuntimeModule.js +33 -7
  503. package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
  504. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
  505. package/lib/runtime/CompatRuntimeModule.js +5 -3
  506. package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
  507. package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
  508. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
  509. package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
  510. package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
  511. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
  512. package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
  513. package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
  514. package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
  515. package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
  516. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
  517. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
  518. package/lib/runtime/GlobalRuntimeModule.js +18 -0
  519. package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
  520. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  521. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +34 -7
  522. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
  523. package/lib/runtime/NonceRuntimeModule.js +10 -0
  524. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
  525. package/lib/runtime/PublicPathRuntimeModule.js +12 -2
  526. package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
  527. package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
  528. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
  529. package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
  530. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
  531. package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
  532. package/lib/runtime/SystemContextRuntimeModule.js +10 -0
  533. package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
  534. package/lib/runtime/WorkerRuntimeModule.js +11 -1
  535. package/lib/runtime/baseUri.js +63 -0
  536. package/lib/schemes/DataUriPlugin.js +1 -1
  537. package/lib/schemes/FileUriPlugin.js +1 -1
  538. package/lib/schemes/HttpUriPlugin.js +46 -20
  539. package/lib/schemes/VirtualUrlPlugin.js +13 -7
  540. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  541. package/lib/serialization/BinaryMiddleware.js +4 -4
  542. package/lib/serialization/ErrorObjectSerializer.js +1 -1
  543. package/lib/serialization/FileMiddleware.js +22 -9
  544. package/lib/serialization/ObjectMiddleware.js +139 -114
  545. package/lib/serialization/PlainObjectSerializer.js +19 -16
  546. package/lib/sharing/ConsumeSharedModule.js +30 -21
  547. package/lib/sharing/ConsumeSharedPlugin.js +18 -10
  548. package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
  549. package/lib/sharing/ProvideSharedModule.js +25 -16
  550. package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
  551. package/lib/sharing/ProvideSharedPlugin.js +8 -4
  552. package/lib/sharing/SharePlugin.js +17 -5
  553. package/lib/sharing/ShareRuntimeModule.js +4 -4
  554. package/lib/sharing/resolveMatchedConfigs.js +9 -6
  555. package/lib/sharing/utils.js +1 -3
  556. package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
  557. package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
  558. package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
  559. package/lib/stats/StatsFactory.js +25 -26
  560. package/lib/stats/StatsPrinter.js +16 -12
  561. package/lib/typescript/TypeScriptPlugin.js +20 -24
  562. package/lib/url/URLParserPlugin.js +26 -13
  563. package/lib/util/ArrayQueue.js +3 -3
  564. package/lib/util/AsyncQueue.js +4 -3
  565. package/lib/util/Hash.js +5 -1
  566. package/lib/util/LazySet.js +35 -22
  567. package/lib/util/LocConverter.js +36 -13
  568. package/lib/util/SourceProcessor.js +1066 -24
  569. package/lib/util/StringXor.js +1 -1
  570. package/lib/util/URLAbsoluteSpecifier.js +3 -1
  571. package/lib/util/chainedImports.js +9 -5
  572. package/lib/util/cleverMerge.js +1 -1
  573. package/lib/util/comparators.js +45 -14
  574. package/lib/util/concatenate.js +203 -77
  575. package/lib/util/conventions.js +10 -2
  576. package/lib/util/createHash.js +2 -2
  577. package/lib/util/createHooksRegistry.js +8 -10
  578. package/lib/util/createMappings.js +25 -3
  579. package/lib/util/dataURL.js +225 -1
  580. package/lib/util/extractSourceMap.js +4 -3
  581. package/lib/util/findCaseMismatch.js +139 -0
  582. package/lib/util/formatLocation.js +1 -2
  583. package/lib/util/fs.js +22 -5
  584. package/lib/util/globUtils.js +298 -24
  585. package/lib/util/hash/BatchedHash.js +5 -1
  586. package/lib/util/hash/BulkUpdateHash.js +5 -1
  587. package/lib/util/hash/DebugHash.js +5 -1
  588. package/lib/util/hash/hash-digest.js +6 -2
  589. package/lib/util/identifier.js +4 -0
  590. package/lib/util/implicitTypeLoaderFallback.js +1 -1
  591. package/lib/util/internalSerializables.js +8 -0
  592. package/lib/util/lazyModule.js +56 -0
  593. package/lib/util/makeSerializable.js +7 -3
  594. package/lib/util/matchAlias.js +25 -0
  595. package/lib/util/mimeTypes.js +11 -5
  596. package/lib/util/nonNumericOnlyHash.js +4 -3
  597. package/lib/util/parseJson.js +5 -3
  598. package/lib/util/preloadModuleType.js +32 -0
  599. package/lib/util/registerExternalSerializer.js +7 -5
  600. package/lib/util/removeBOM.js +82 -1
  601. package/lib/util/runtime.js +2 -2
  602. package/lib/util/semver.js +1 -1
  603. package/lib/util/serialization.js +28 -28
  604. package/lib/util/source.js +2 -2
  605. package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
  606. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
  607. package/lib/wasm/wasmModuleFilename.js +54 -0
  608. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +43 -21
  609. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +45 -21
  610. package/lib/wasm-async/AsyncWasmModule.js +3 -3
  611. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
  612. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
  613. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
  614. package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
  615. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +29 -8
  616. package/lib/wasm-sync/SyncWasmModule.js +2 -2
  617. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
  618. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
  619. package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
  620. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
  621. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
  622. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
  623. package/lib/wasm-sync/WebAssemblyParser.js +4 -6
  624. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  625. package/lib/web/FetchCompileAsyncWasmPlugin.js +105 -19
  626. package/lib/web/FetchCompileWasmPlugin.js +48 -16
  627. package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
  628. package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
  629. package/lib/web/JsonpTemplatePlugin.js +2 -2
  630. package/lib/webpack.js +22 -11
  631. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
  632. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
  633. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  634. package/module.d.ts +1 -0
  635. package/package.json +32 -25
  636. package/schemas/WebpackOptions.check.js +1 -1
  637. package/schemas/WebpackOptions.json +667 -34
  638. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  639. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  640. package/schemas/plugins/container/ContainerPlugin.json +10 -0
  641. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  642. package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
  643. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  644. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  645. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  646. package/types.d.ts +3223 -465
  647. 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
- const removeBOM = require("../util/removeBOM");
37
- const HtmlGenerator = require("./HtmlGenerator");
34
+ const { removeBOMFromResult } = require("../util/removeBOM");
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,12 +198,33 @@ 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;
225
+ // The wrapper's own resource — the media type must end here, so that a
226
+ // `data:text/htmlx,` entry (JavaScript to `DataUriPlugin`) is not one.
227
+ const HTML_DATA_URL_RE = /^data:text\/html[,;]/i;
195
228
 
196
229
  /**
197
230
  * Requests an `output.html` page must load for an entry: its `dependOn`
@@ -208,7 +241,12 @@ const collectHtmlEntryRequests = (name, entries) => {
208
241
  const seenRequests = new Set();
209
242
  /** @type {Set<string>} */
210
243
  const visited = new Set();
211
- const walk = (/** @type {string} */ entryName) => {
244
+ /**
245
+ * Collects an entry's non-html requests, `dependOn` entries included.
246
+ * @param {string} entryName entry to walk
247
+ * @returns {void}
248
+ */
249
+ const walk = (entryName) => {
212
250
  if (visited.has(entryName)) return;
213
251
  visited.add(entryName);
214
252
  const desc = entries[entryName];
@@ -299,25 +337,59 @@ class HtmlModulesPlugin {
299
337
  apply(compiler) {
300
338
  const { output } = compiler.options;
301
339
  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
- });
340
+ const globalHtmlOptions =
341
+ typeof htmlOption === "object" ? htmlOption : undefined;
342
+ // Collected while entries are resolved (`entryOption`, before the first
343
+ // compilation) and reported on every compilation; a Set dedupes entries
344
+ // that hit the same problem.
345
+ /** @type {Set<string>} */
346
+ const optionWarnings = new Set();
347
+ compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
348
+ for (const message of optionWarnings) {
349
+ compilation.warnings.push(new WebpackError(message));
317
350
  }
318
- } else if (scriptLoading === "blocking") {
319
- scriptAttr = "";
320
- }
351
+ });
352
+
353
+ // Resolved options per entry that owns a generated page, read back when the
354
+ // page is emitted (`csp`, `integrity`) — one synthetic page module can back
355
+ // several entries, so those can only be applied per emitted asset.
356
+ /** @type {Map<string, OutputHtmlOptions>} */
357
+ const htmlOptionsByEntry = new Map();
358
+ // SRI sentinels are emitted while the page's HTML is generated, before the
359
+ // owning entry is known, so any page asking for integrity turns them on for
360
+ // all of them; pages that don't want SRI drop them again on emit. Authored
361
+ // `.html` pages never reach the entry hook, hence the global seed.
362
+ let anyIntegrity = isIntegrityEnabled(
363
+ globalHtmlOptions && globalHtmlOptions.integrity
364
+ );
365
+
366
+ /**
367
+ * Options for one page: an entry's `html` object overrides `output.html`
368
+ * option by option, `true` inherits it as-is.
369
+ * @param {EntryDescriptionNormalized["html"]} html the entry's `html` value
370
+ * @param {string} name entry name
371
+ * @returns {OutputHtmlOptions} resolved options
372
+ */
373
+ const resolveHtmlOptions = (html, name) => {
374
+ const options =
375
+ typeof html !== "object"
376
+ ? globalHtmlOptions || {}
377
+ : globalHtmlOptions
378
+ ? { ...globalHtmlOptions, ...html }
379
+ : html;
380
+ if (typeof html === "object") {
381
+ for (const option of GLOBAL_ONLY_HTML_OPTIONS) {
382
+ if (html[option] !== undefined) {
383
+ optionWarnings.add(
384
+ `entry "${name}" html.${option} is ignored — ${option} is resolved once per generated page and can only be set on output.html.`
385
+ );
386
+ }
387
+ }
388
+ }
389
+ htmlOptionsByEntry.set(name, options);
390
+ if (isIntegrityEnabled(options.integrity)) anyIntegrity = true;
391
+ return options;
392
+ };
321
393
 
322
394
  // `output.html` (or an entry's `html`) wraps a non-HTML entry in a
323
395
  // synthetic HTML module so the existing pipeline injects its JS/CSS
@@ -329,6 +401,9 @@ class HtmlModulesPlugin {
329
401
  EntryOptionPlugin.getHooks(compiler).entry.tap(
330
402
  PLUGIN_NAME,
331
403
  (context, name, desc) => {
404
+ // Resolved for every entry, including the authored `.html` ones that
405
+ // need no wrapper below — their page reads back `csp`/`integrity` too.
406
+ const htmlObj = resolveHtmlOptions(desc.html, name);
332
407
  const html = desc.html !== undefined ? desc.html : htmlOption;
333
408
  const imports = desc.import;
334
409
  if (
@@ -338,6 +413,26 @@ class HtmlModulesPlugin {
338
413
  ) {
339
414
  return;
340
415
  }
416
+ const scriptLoading = htmlObj.scriptLoading || "auto";
417
+ // ESM output emits `type="module"` (already deferred), so
418
+ // scriptLoading is ignored under output.module — warn on an
419
+ // explicit defer/blocking.
420
+ let scriptAttr = " defer";
421
+ if (output.module) {
422
+ scriptAttr = "";
423
+ if (scriptLoading === "defer" || scriptLoading === "blocking") {
424
+ const source =
425
+ typeof desc.html === "object" &&
426
+ desc.html.scriptLoading !== undefined
427
+ ? `entry "${name}" html`
428
+ : "output.html";
429
+ optionWarnings.add(
430
+ `${source}.scriptLoading: "${scriptLoading}" is ignored with output.module — ES module scripts are always deferred.`
431
+ );
432
+ }
433
+ } else if (scriptLoading === "blocking") {
434
+ scriptAttr = "";
435
+ }
341
436
  const entries = compiler.options.entry;
342
437
  const requests =
343
438
  typeof entries === "object" && entries[name]
@@ -352,27 +447,13 @@ class HtmlModulesPlugin {
352
447
  scripts.push(`<script${scriptAttr} src="${r}"></script>`);
353
448
  }
354
449
  }
355
- const htmlObj =
356
- typeof html === "object"
357
- ? html
358
- : typeof htmlOption === "object"
359
- ? htmlOption
360
- : {};
361
- const headTags = HtmlParser.buildHeadTags(htmlObj);
450
+ const headTags = getHtmlSyntax().buildHeadTags(htmlObj);
362
451
  // Injected into webpack-generated pages only; each icon's href is a
363
452
  // 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)
453
+ const faviconTag = resolveFaviconLinks(htmlObj.favicon, name)
369
454
  .map(([rel, icon]) => faviconLinkTag(rel, icon))
370
455
  .join("");
371
- const manifest =
372
- typeof html === "object" && html.manifest !== undefined
373
- ? html.manifest
374
- : false;
375
- const manifestTag = manifestLinkTag(manifest, name);
456
+ const manifestTag = manifestLinkTag(htmlObj.manifest, name);
376
457
  const inject = htmlObj.inject;
377
458
  const scriptsInHead =
378
459
  inject === "head" || (inject !== "body" && output.module);
@@ -402,12 +483,13 @@ class HtmlModulesPlugin {
402
483
  // `<link rel="modulepreload">` intact.
403
484
  // Per-compilation state: the HTML modules seen during make (so
404
485
  // `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> }>} */
486
+ // graph), the stylesheet entry names (read in `afterChunks`) and the html
487
+ // options of every emitted page, keyed by its asset name.
488
+ /** @type {WeakMap<import("../Compilation"), { htmlModules: Set<import("../Module")>, stylesheetEntries: Set<string>, htmlAssetOptions: Map<string, OutputHtmlOptions> }>} */
407
489
  const compilationState = new WeakMap();
408
490
  /**
409
491
  * @param {import("../Compilation")} compilation compilation
410
- * @returns {{ htmlModules: Set<import("../Module")>, stylesheetEntries: Set<string>, htmlAssetNames: Set<string> }} per-compilation state
492
+ * @returns {{ htmlModules: Set<import("../Module")>, stylesheetEntries: Set<string>, htmlAssetOptions: Map<string, OutputHtmlOptions> }} per-compilation state
411
493
  */
412
494
  const getState = (compilation) => {
413
495
  let state = compilationState.get(compilation);
@@ -415,7 +497,7 @@ class HtmlModulesPlugin {
415
497
  state = {
416
498
  htmlModules: new Set(),
417
499
  stylesheetEntries: new Set(),
418
- htmlAssetNames: new Set()
500
+ htmlAssetOptions: new Map()
419
501
  };
420
502
  compilationState.set(compilation, state);
421
503
  }
@@ -515,15 +597,10 @@ class HtmlModulesPlugin {
515
597
  );
516
598
  });
517
599
 
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;
600
+ // `csp` injects a `<meta http-equiv="Content-Security-Policy">` and
601
+ // `integrity` resolves the SRI sentinels — both once the page's inline
602
+ // content is final (in `processAssets` below), per page, so an entry's
603
+ // `html` can override them.
527
604
  // `"auto"` marks implicit enablement (no user rule for HTML files) — see
528
605
  // `applyExperimentsDefaults`. Only then loaders win over the built-in type
529
606
  // (e.g. html-webpack-plugin's template loader in its child compiler).
@@ -541,13 +618,20 @@ class HtmlModulesPlugin {
541
618
  );
542
619
  }
543
620
  const { htmlModules } = getState(compilation);
544
- // Record HTML modules as they appear — freshly built
545
- // (`succeedModule`) or restored from cache (`stillValidModule`) —
546
- // so `finishMake` creates their entries without scanning every
547
- // module in the graph. Tracking only records; entries are still
548
- // added (and awaited) in `finishMake`.
549
- const trackHtmlModule = (/** @type {import("../Module")} */ module) => {
550
- if (module.type === HTML_MODULE_TYPE) htmlModules.add(module);
621
+ /**
622
+ * Records HTML modules as they are built or restored, so `finishMake`
623
+ * creates their entries without scanning the whole module graph.
624
+ * @param {import("../Module")} module built or restored module
625
+ * @returns {void}
626
+ */
627
+ const trackHtmlModule = (module) => {
628
+ if (module.type !== HTML_MODULE_TYPE) return;
629
+ // enabled here, not on the compilation hook: an integrity build
630
+ // with no html module must not load the generator
631
+ if (anyIntegrity) {
632
+ getHtmlGenerator().enableIntegritySentinels(compilation);
633
+ }
634
+ htmlModules.add(module);
551
635
  };
552
636
  compilation.hooks.succeedModule.tap(PLUGIN_NAME, trackHtmlModule);
553
637
  compilation.hooks.stillValidModule.tap(PLUGIN_NAME, trackHtmlModule);
@@ -559,7 +643,7 @@ class HtmlModulesPlugin {
559
643
  // with CORS; without `output.crossOriginLoading` the browser
560
644
  // silently ignores `integrity` on cross-origin loads. Warn once
561
645
  // so a CDN deployment doesn't ship no-op integrity attributes.
562
- if (integrityOn && !compilation.outputOptions.crossOriginLoading) {
646
+ if (anyIntegrity && !compilation.outputOptions.crossOriginLoading) {
563
647
  compilation.warnings.push(
564
648
  new WebpackError(
565
649
  '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 +656,32 @@ class HtmlModulesPlugin {
572
656
  stage: Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_HASH + 1
573
657
  },
574
658
  async (assets) => {
575
- const { htmlAssetNames } = getState(compilation);
659
+ const { htmlAssetOptions } = getState(compilation);
576
660
  const hooks = HtmlModulesPlugin.getCompilationHooks(compilation);
577
661
  /** @type {Set<string>} */
578
662
  const inlinedFiles = new Set();
579
663
  for (const name of Object.keys(assets)) {
580
- if (!htmlAssetNames.has(name)) continue;
664
+ const pageOptions = htmlAssetOptions.get(name);
665
+ if (pageOptions === undefined) continue;
581
666
  const content = assets[name].source();
582
667
  if (typeof content !== "string") continue;
668
+ const { csp, integrity } = pageOptions;
583
669
  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
- );
670
+ // Sentinels are emitted whenever any page wants SRI, so a page
671
+ // that doesn't drops them again here.
672
+ if (resolved.includes("__WEBPACK_HTML_INTEGRITY__")) {
673
+ resolved = isIntegrityEnabled(integrity)
674
+ ? getHtmlGenerator().resolveChunkIntegritySentinels(
675
+ resolved,
676
+ compilation,
677
+ /** @type {import("./HtmlGenerator").HtmlIntegrity} */ (
678
+ integrity
679
+ )
680
+ )
681
+ : getHtmlGenerator().stripChunkIntegritySentinels(resolved);
595
682
  }
596
683
  if (resolved.includes("__WEBPACK_HTML_INLINE__")) {
597
- resolved = HtmlGenerator.resolveChunkInlineSentinels(
684
+ resolved = getHtmlGenerator().resolveChunkInlineSentinels(
598
685
  resolved,
599
686
  compilation,
600
687
  name,
@@ -613,15 +700,15 @@ class HtmlModulesPlugin {
613
700
  });
614
701
  const transformTags = hooks.transformTags.taps.length > 0;
615
702
  if (injected.length > 0 || transformTags || csp) {
616
- const model = HtmlGenerator.collectHtml(resolved);
617
- HtmlGenerator.addInjectedTags(model, injected);
703
+ const model = getHtmlGenerator().collectHtml(resolved);
704
+ getHtmlGenerator().addInjectedTags(model, injected);
618
705
  if (transformTags) {
619
706
  await hooks.transformTags.promise(model.tags, {
620
707
  outputName: name,
621
708
  html: resolved
622
709
  });
623
710
  }
624
- resolved = HtmlGenerator.renderHtml(resolved, model, csp);
711
+ resolved = getHtmlGenerator().renderHtml(resolved, model, csp);
625
712
  }
626
713
  // Final, fully-resolved HTML — let plugins transform it (minify,
627
714
  // inject a CSP meta, rewrite tags) before it is written.
@@ -636,28 +723,64 @@ class HtmlModulesPlugin {
636
723
  // An inlined chunk file is dead weight once nothing else references
637
724
  // it by URL (another page's tag, or the runtime's async chunk map);
638
725
  // a content-hashed filename makes a substring hit a real reference.
726
+ /** @type {Set<string>} */
727
+ const deletionCandidates = new Set(inlinedFiles);
728
+ // A wrapper entry's chunk only rebuilds the page's own markup; the
729
+ // page loads the `<script src>` entries the parser split out of it.
730
+ for (const entrypoint of compilation.entrypoints.values()) {
731
+ const chunk = entrypoint.getEntrypointChunk();
732
+ if (!chunk) continue;
733
+ let wrapperOnly = false;
734
+ for (const entryModule of compilation.chunkGraph.getChunkEntryModulesIterable(
735
+ chunk
736
+ )) {
737
+ const { resource } = /** @type {import("../NormalModule")} */ (
738
+ entryModule
739
+ );
740
+ wrapperOnly =
741
+ typeof resource === "string" &&
742
+ HTML_DATA_URL_RE.test(resource);
743
+ if (!wrapperOnly) break;
744
+ }
745
+ if (!wrapperOnly) continue;
746
+ for (const file of chunk.files) deletionCandidates.add(file);
747
+ }
639
748
  // Materialize each other asset's source once (it can be expensive to
640
- // render) and test all inlined files against it, rather than
641
- // re-materializing every asset per inlined file.
642
- if (inlinedFiles.size > 0) {
749
+ // render) and test all candidates against it, rather than
750
+ // re-materializing every asset per candidate.
751
+ if (deletionCandidates.size > 0) {
643
752
  /** @type {Set<string>} */
644
753
  const stillReferenced = new Set();
645
- for (const name of Object.keys(compilation.assets)) {
646
- if (
647
- inlinedFiles.has(name) ||
648
- stillReferenced.size === inlinedFiles.size
649
- ) {
650
- continue;
651
- }
754
+ /** @type {string[]} */
755
+ const pending = [];
756
+ /**
757
+ * @param {string} name asset whose source may name a candidate
758
+ */
759
+ const markReferenced = (name) => {
652
760
  const source = compilation.assets[name].source();
653
- if (typeof source !== "string") continue;
654
- for (const file of inlinedFiles) {
761
+ if (typeof source !== "string") return;
762
+ for (const file of deletionCandidates) {
655
763
  if (!stillReferenced.has(file) && source.includes(file)) {
656
764
  stillReferenced.add(file);
765
+ pending.push(file);
657
766
  }
658
767
  }
768
+ };
769
+ for (const name of Object.keys(compilation.assets)) {
770
+ if (
771
+ deletionCandidates.has(name) ||
772
+ stillReferenced.size === deletionCandidates.size
773
+ ) {
774
+ continue;
775
+ }
776
+ markReferenced(name);
777
+ }
778
+ // A kept candidate can reference another through its async chunk
779
+ // map, so follow each until nothing new is kept.
780
+ while (pending.length > 0) {
781
+ markReferenced(/** @type {string} */ (pending.pop()));
659
782
  }
660
- for (const file of inlinedFiles) {
783
+ for (const file of deletionCandidates) {
661
784
  if (!stillReferenced.has(file)) compilation.deleteAsset(file);
662
785
  }
663
786
  }
@@ -695,58 +818,6 @@ class HtmlModulesPlugin {
695
818
  compilation.outputOptions.cssChunkFilename;
696
819
  }
697
820
  });
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
821
  compilation.dependencyTemplates.set(
751
822
  StaticExportsDependency,
752
823
  new StaticExportsDependency.Template()
@@ -759,6 +830,74 @@ class HtmlModulesPlugin {
759
830
  ConstDependency,
760
831
  new ConstDependency.Template()
761
832
  );
833
+ // registered when the first html module is prepared, so a build
834
+ // without html never loads these dependency classes
835
+ normalModuleFactory.hooks.prepareModuleType
836
+ .for(HTML_MODULE_TYPE)
837
+ .tap(PLUGIN_NAME, () => {
838
+ const HtmlSourceDependency = require("../dependencies/HtmlSourceDependency");
839
+ const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
840
+ const HtmlInlineScriptDependency = require("../dependencies/HtmlInlineScriptDependency");
841
+ const HtmlInlineStyleDependency = require("../dependencies/HtmlInlineStyleDependency");
842
+ const HtmlInlineHtmlDependency = require("../dependencies/HtmlInlineHtmlDependency");
843
+
844
+ compilation.dependencyFactories.set(
845
+ HtmlSourceDependency,
846
+ normalModuleFactory
847
+ );
848
+ compilation.dependencyTemplates.set(
849
+ HtmlSourceDependency,
850
+ new HtmlSourceDependency.Template()
851
+ );
852
+ compilation.dependencyFactories.set(
853
+ HtmlEntryDependency,
854
+ normalModuleFactory
855
+ );
856
+ compilation.dependencyTemplates.set(
857
+ HtmlEntryDependency,
858
+ new HtmlEntryDependency.Template()
859
+ );
860
+ // Inline `<script>` content is bundled as its own entry — the
861
+ // same pipeline that handles `<script src>` — via a
862
+ // `data:text/javascript,...` request. The dependency
863
+ // template rewrites the original tag to `<script src=…>`.
864
+ compilation.dependencyFactories.set(
865
+ HtmlInlineScriptDependency,
866
+ normalModuleFactory
867
+ );
868
+ compilation.dependencyTemplates.set(
869
+ HtmlInlineScriptDependency,
870
+ new HtmlInlineScriptDependency.Template()
871
+ );
872
+ // Inline `<style>` content is routed through the CSS pipeline
873
+ // as a `data:text/css` module. The dependency template reads
874
+ // the processed CSS text from the CSS module's code
875
+ // generation data (`css-text` channel set by CssGenerator
876
+ // when `exportType` is `"text"`).
877
+ compilation.dependencyFactories.set(
878
+ HtmlInlineStyleDependency,
879
+ normalModuleFactory
880
+ );
881
+ compilation.dependencyTemplates.set(
882
+ HtmlInlineStyleDependency,
883
+ new HtmlInlineStyleDependency.Template()
884
+ );
885
+ // `<iframe srcdoc>` content is routed back through the HTML
886
+ // pipeline as a `data:text/html` module; the template reads the
887
+ // processed HTML from the nested module's `html` channel.
888
+ compilation.dependencyFactories.set(
889
+ HtmlInlineHtmlDependency,
890
+ normalModuleFactory
891
+ );
892
+ compilation.dependencyTemplates.set(
893
+ HtmlInlineHtmlDependency,
894
+ new HtmlInlineHtmlDependency.Template()
895
+ );
896
+ });
897
+ preloadModuleType(normalModuleFactory, PLUGIN_NAME, [
898
+ [HTML_MODULE_TYPE, [getHtmlParser]]
899
+ ]);
900
+
762
901
  normalModuleFactory.hooks.createModuleClass
763
902
  .for(HTML_MODULE_TYPE)
764
903
  .tap(
@@ -777,7 +916,7 @@ class HtmlModulesPlugin {
777
916
  options
778
917
  )
779
918
  );
780
- return new HtmlParser(parserOptions);
919
+ return new (getHtmlParser.loaded())(parserOptions);
781
920
  });
782
921
 
783
922
  normalModuleFactory.hooks.createGenerator
@@ -792,21 +931,24 @@ class HtmlModulesPlugin {
792
931
  options
793
932
  )
794
933
  );
795
- return new HtmlGenerator(generatorOptions, compilation.moduleGraph);
934
+ return new (getHtmlGenerator())(
935
+ generatorOptions,
936
+ compilation.moduleGraph
937
+ );
796
938
  });
797
939
 
798
940
  NormalModule.getCompilationHooks(compilation).processResult.tap(
799
941
  PLUGIN_NAME,
800
942
  (result, module) => {
801
943
  if (module.type === HTML_MODULE_TYPE) {
802
- const [source, ...rest] = result;
944
+ const [source, ...rest] = removeBOMFromResult(result);
803
945
  // `applyTemplate` is a no-op unless `module.parser.html.template`
804
946
  // is set. Running it here (where the returned source becomes the
805
947
  // module's stored source) keeps the parser's dependency offsets
806
948
  // and the generator's render base in sync.
807
949
  const parser = /** @type {HtmlParser} */ (module.parser);
808
950
 
809
- return [parser.applyTemplate(removeBOM(source), module), ...rest];
951
+ return [parser.applyTemplate(source, module), ...rest];
810
952
  }
811
953
 
812
954
  return result;
@@ -845,15 +987,15 @@ class HtmlModulesPlugin {
845
987
  /** @type {WeakMap<import("webpack-sources").Source, { resolvedContent: string, contentHash: string }>} */
846
988
  const resolvedSentinelHashCache = new WeakMap();
847
989
 
848
- // Compute a linked/entry HTML page's emitted filename + chunk-URL-resolved
849
- // content + content hash for one (module, chunk). Shared by the emit loop
850
- // below and the page-link resolver. The content hash covers only the
851
- // chunk-URL-resolved source — links to *other* pages stay sentinels here,
852
- // so a page's filename doesn't depend on the filenames of pages it links to.
853
- const computePageEmit = (
854
- /** @type {NormalModule} */ module,
855
- /** @type {import("../Chunk")} */ chunk
856
- ) => {
990
+ /**
991
+ * Computes an HTML page's emitted filename, chunk-URL-resolved content and
992
+ * content hash. Links to other pages stay sentinels, so a page's filename
993
+ * never depends on the filenames of the pages it links to.
994
+ * @param {NormalModule} module the page's html module
995
+ * @param {import("../Chunk")} chunk chunk the page is emitted from
996
+ * @returns {{ resolvedContent: string, contentHash: string, filename: string, info: import("../Compilation").AssetInfo } | undefined} the page's emit, or `undefined` when it generates no html
997
+ */
998
+ const computePageEmit = (module, chunk) => {
857
999
  const { chunkGraph, outputOptions } = compilation;
858
1000
  const codeGenResult =
859
1001
  /** @type {import("../CodeGenerationResults")} */ (
@@ -872,9 +1014,9 @@ class HtmlModulesPlugin {
872
1014
  // Asset URL sentinels (from `HtmlEntryDependency` resource-hint
873
1015
  // tags) resolve here too — deferred from template.apply so it
874
1016
  // doesn't race with asset-module codegen.
875
- const resolvedContent = HtmlGenerator.resolveAssetUrlSentinels(
876
- HtmlGenerator.embedInlineChunkHashes(
877
- HtmlGenerator.resolveChunkUrlSentinels(
1017
+ const resolvedContent = getHtmlGenerator().resolveAssetUrlSentinels(
1018
+ getHtmlGenerator().embedInlineChunkHashes(
1019
+ getHtmlGenerator().resolveChunkUrlSentinels(
878
1020
  /** @type {string} */ (placeholderSource.source()),
879
1021
  compilation
880
1022
  ),
@@ -897,11 +1039,14 @@ class HtmlModulesPlugin {
897
1039
  const sourceFilename =
898
1040
  resource.startsWith("data:text/html") && chunk.name
899
1041
  ? chunk.name
900
- : makePathsRelative(
901
- compiler.context,
902
- /** @type {string} */ (resource),
903
- compiler.root
904
- ).replace(/^\.\//, "");
1042
+ : toTemplateSourceFileName(
1043
+ makePathsRelative(
1044
+ compiler.context,
1045
+ /** @type {string} */ (resource),
1046
+ compiler.root
1047
+ ).replace(/^\.\//, ""),
1048
+ compilation
1049
+ );
905
1050
  const filenameTemplate = HtmlModulesPlugin.getChunkFilenameTemplate(
906
1051
  chunk,
907
1052
  outputOptions
@@ -927,14 +1072,15 @@ class HtmlModulesPlugin {
927
1072
  };
928
1073
  };
929
1074
 
930
- // Emitted filename of a linked `type: "html"` page, keyed by its entry
931
- // name. Looked up from the page's own entry chunk so it's independent of
932
- // chunk render order; cached for the compilation.
933
1075
  /** @type {Map<string, string>} */
934
1076
  const htmlPageFilenameCache = new Map();
935
- const computePageFilenameByEntry = (
936
- /** @type {string} */ entryName
937
- ) => {
1077
+ /**
1078
+ * Emitted filename of a linked `type: "html"` page, read from the page's
1079
+ * own entry chunk so chunk render order cannot affect it.
1080
+ * @param {string} entryName entry name of the linked page
1081
+ * @returns {string} the page's emitted filename, `"data:,"` when it has none
1082
+ */
1083
+ const computePageFilenameByEntry = (entryName) => {
938
1084
  const cached = htmlPageFilenameCache.get(entryName);
939
1085
  if (cached !== undefined) return cached;
940
1086
  let filename = "data:,";
@@ -1012,10 +1158,11 @@ class HtmlModulesPlugin {
1012
1158
  // Resolve linked-page (`type: "html"`) sentinels to each page's
1013
1159
  // emitted filename before the undo path, so the href is relative to
1014
1160
  // this page.
1015
- const finalContent = HtmlGenerator.resolveHtmlPageUrlSentinels(
1016
- resolvedContent,
1017
- computePageFilenameByEntry
1018
- )
1161
+ const finalContent = getHtmlGenerator()
1162
+ .resolveHtmlPageUrlSentinels(
1163
+ resolvedContent,
1164
+ computePageFilenameByEntry
1165
+ )
1019
1166
  .split(autoPlaceholder)
1020
1167
  .join(undoPath);
1021
1168
  const finalSource = new RawSource(finalContent);
@@ -1033,8 +1180,14 @@ class HtmlModulesPlugin {
1033
1180
  outputOptions
1034
1181
  );
1035
1182
 
1036
- // Track HTML pages for the integrity sentinel pass (never JS chunks).
1037
- getState(compilation).htmlAssetNames.add(filename);
1183
+ // Track HTML pages (never JS chunks) with the html options of the
1184
+ // entry that owns them, read back by the emit passes below.
1185
+ getState(compilation).htmlAssetOptions.set(
1186
+ filename,
1187
+ (chunk.name && htmlOptionsByEntry.get(chunk.name)) ||
1188
+ globalHtmlOptions ||
1189
+ {}
1190
+ );
1038
1191
 
1039
1192
  result.push({
1040
1193
  render: () => finalSource,
@@ -1060,6 +1213,13 @@ class HtmlModulesPlugin {
1060
1213
  if (htmlModules.size === 0) return source;
1061
1214
  const raw = source.source();
1062
1215
  if (typeof raw !== "string") return source;
1216
+ // Every sentinel shares this prefix — one scan answers the common
1217
+ // sentinel-free case instead of five.
1218
+ if (!raw.includes("__WEBPACK_HTML_")) {
1219
+ return source;
1220
+ }
1221
+ // Exact re-check on a prefix hit: the autoPlaceholder strip below is
1222
+ // not sentinel-guarded, so bare-prefix false positives must bail here.
1063
1223
  if (
1064
1224
  !raw.includes("__WEBPACK_HTML_CHUNK_URL__") &&
1065
1225
  !raw.includes("__WEBPACK_HTML_PAGE_URL__") &&
@@ -1072,20 +1232,26 @@ class HtmlModulesPlugin {
1072
1232
  // Strip integrity and inline sentinels (not resolve): a JS chunk
1073
1233
  // can't hold real SRI hashes for its own not-yet-final bytes, and
1074
1234
  // 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
1235
+ const resolved = getHtmlGenerator()
1236
+ .stripChunkIntegritySentinels(
1237
+ getHtmlGenerator()
1238
+ .resolveAssetUrlSentinels(
1239
+ getHtmlGenerator().resolveHtmlPageUrlSentinels(
1240
+ getHtmlGenerator().resolveChunkUrlSentinels(
1241
+ raw,
1242
+ compilation
1243
+ ),
1244
+ computePageFilenameByEntry
1245
+ ),
1246
+ compilation
1247
+ )
1248
+ .split(autoPlaceholder)
1249
+ .join("")
1082
1250
  )
1083
- .split(autoPlaceholder)
1084
- .join("")
1085
- ).replace(
1086
- /__WEBPACK_HTML_INLINE__[0-9a-f]+__[a-z]+(?:__[0-9a-f]+)?__END__/g,
1087
- ""
1088
- );
1251
+ .replace(
1252
+ /__WEBPACK_HTML_INLINE__[0-9a-f]+__[a-z]+(?:__[0-9a-f]+)?__END__/g,
1253
+ ""
1254
+ );
1089
1255
  if (resolved === raw) return source;
1090
1256
  const chunkId = String(renderContext.chunk.id);
1091
1257
  const prior = sentinelResolvedSourceCache.get(chunkId);