@depup/webpack 5.106.0-depup.0 → 5.109.0-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 (667) hide show
  1. package/README.md +9 -11
  2. package/changes.json +16 -24
  3. package/hot/dev-server.js +2 -0
  4. package/lib/APIPlugin.js +60 -35
  5. package/lib/AsyncDependenciesBlock.js +3 -0
  6. package/lib/AutomaticPrefetchPlugin.js +6 -1
  7. package/lib/BannerPlugin.js +13 -5
  8. package/lib/Cache.js +27 -5
  9. package/lib/CacheFacade.js +41 -0
  10. package/lib/Chunk.js +71 -25
  11. package/lib/ChunkGraph.js +141 -9
  12. package/lib/ChunkGroup.js +115 -28
  13. package/lib/ChunkTemplate.js +9 -0
  14. package/lib/CircularModulesPlugin.js +190 -0
  15. package/lib/CleanPlugin.js +23 -26
  16. package/lib/CodeGenerationResults.js +19 -0
  17. package/lib/CompatibilityPlugin.js +54 -37
  18. package/lib/Compilation.js +635 -107
  19. package/lib/Compiler.js +93 -31
  20. package/lib/ConcatenationScope.js +34 -4
  21. package/lib/ConditionalInitFragment.js +6 -0
  22. package/lib/ConstPlugin.js +15 -12
  23. package/lib/ContextExclusionPlugin.js +3 -1
  24. package/lib/ContextModule.js +345 -55
  25. package/lib/ContextModuleFactory.js +193 -51
  26. package/lib/ContextReplacementPlugin.js +8 -1
  27. package/lib/DefinePlugin.js +498 -127
  28. package/lib/DependenciesBlock.js +6 -1
  29. package/lib/Dependency.js +159 -11
  30. package/lib/DependencyTemplate.js +7 -1
  31. package/lib/DependencyTemplates.js +4 -0
  32. package/lib/DotenvPlugin.js +3 -0
  33. package/lib/DynamicEntryPlugin.js +3 -1
  34. package/lib/EntryOptionPlugin.js +42 -2
  35. package/lib/EntryPlugin.js +4 -1
  36. package/lib/Entrypoint.js +5 -1
  37. package/lib/EnvironmentPlugin.js +3 -2
  38. package/lib/ErrorHelpers.js +7 -0
  39. package/lib/EvalDevToolModulePlugin.js +3 -1
  40. package/lib/EvalSourceMapDevToolPlugin.js +11 -11
  41. package/lib/ExportsInfo.js +399 -108
  42. package/lib/ExportsInfoApiPlugin.js +4 -3
  43. package/lib/ExternalModule.js +376 -78
  44. package/lib/ExternalModuleFactoryPlugin.js +75 -3
  45. package/lib/ExternalsPlugin.js +3 -1
  46. package/lib/FileSystemInfo.js +575 -149
  47. package/lib/FlagAllModulesAsUsedPlugin.js +3 -6
  48. package/lib/FlagDependencyExportsPlugin.js +82 -9
  49. package/lib/FlagDependencyUsagePlugin.js +92 -6
  50. package/lib/FlagEntryExportAsUsedPlugin.js +4 -1
  51. package/lib/Generator.js +24 -3
  52. package/lib/HotModuleReplacementPlugin.js +110 -44
  53. package/lib/IgnorePlugin.js +5 -2
  54. package/lib/IgnoreWarningsPlugin.js +2 -1
  55. package/lib/InitFragment.js +15 -0
  56. package/lib/JavascriptMetaInfoPlugin.js +9 -6
  57. package/lib/LazyBarrel.js +389 -0
  58. package/lib/LibraryTemplatePlugin.js +2 -1
  59. package/lib/LoaderOptionsPlugin.js +3 -1
  60. package/lib/LoaderTargetPlugin.js +3 -1
  61. package/lib/MainTemplate.js +15 -0
  62. package/lib/ManifestPlugin.js +9 -2
  63. package/lib/Module.js +121 -60
  64. package/lib/ModuleFactory.js +6 -1
  65. package/lib/ModuleFilenameHelpers.js +5 -2
  66. package/lib/ModuleGraph.js +69 -2
  67. package/lib/ModuleGraphConnection.js +9 -0
  68. package/lib/ModuleInfoHeaderPlugin.js +5 -0
  69. package/lib/ModuleNotFoundError.js +3 -83
  70. package/lib/ModuleProfile.js +27 -1
  71. package/lib/ModuleSourceTypeConstants.js +52 -19
  72. package/lib/ModuleTemplate.js +10 -0
  73. package/lib/ModuleTypeConstants.js +20 -4
  74. package/lib/MultiCompiler.js +59 -4
  75. package/lib/MultiStats.js +9 -0
  76. package/lib/MultiWatching.js +6 -0
  77. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  78. package/lib/NodeStuffPlugin.js +78 -46
  79. package/lib/NormalModule.js +485 -181
  80. package/lib/NormalModuleFactory.js +148 -29
  81. package/lib/NormalModuleReplacementPlugin.js +3 -1
  82. package/lib/NullFactory.js +1 -0
  83. package/lib/OptionsApply.js +1 -0
  84. package/lib/Parser.js +3 -1
  85. package/lib/PlatformPlugin.js +2 -1
  86. package/lib/PrefetchPlugin.js +4 -1
  87. package/lib/ProgressPlugin.js +351 -161
  88. package/lib/ProvidePlugin.js +6 -3
  89. package/lib/RawModule.js +32 -16
  90. package/lib/RecordIdsPlugin.js +9 -0
  91. package/lib/RequestShortener.js +8 -0
  92. package/lib/ResolverFactory.js +5 -0
  93. package/lib/RuntimeGlobals.js +58 -5
  94. package/lib/RuntimeModule.js +22 -7
  95. package/lib/RuntimePlugin.js +104 -26
  96. package/lib/RuntimeTemplate.js +616 -37
  97. package/lib/SelfModuleFactory.js +3 -0
  98. package/lib/SourceMapDevToolModuleOptionsPlugin.js +2 -0
  99. package/lib/SourceMapDevToolPlugin.js +341 -63
  100. package/lib/Stats.js +6 -0
  101. package/lib/Template.js +29 -3
  102. package/lib/TemplatedPathPlugin.js +505 -138
  103. package/lib/UseStrictPlugin.js +3 -2
  104. package/lib/WarnCaseSensitiveModulesPlugin.js +72 -3
  105. package/lib/WarnDeprecatedOptionPlugin.js +6 -2
  106. package/lib/WarnNoModeSetPlugin.js +18 -2
  107. package/lib/WatchIgnorePlugin.js +5 -1
  108. package/lib/Watching.js +25 -3
  109. package/lib/WebpackError.js +3 -74
  110. package/lib/WebpackIsIncludedPlugin.js +4 -2
  111. package/lib/WebpackOptionsApply.js +88 -25
  112. package/lib/WebpackOptionsDefaulter.js +1 -0
  113. package/lib/asset/AssetBytesGenerator.js +28 -10
  114. package/lib/asset/AssetBytesParser.js +1 -0
  115. package/lib/asset/AssetGenerator.js +199 -60
  116. package/lib/asset/AssetModule.js +47 -0
  117. package/lib/asset/AssetModulesPlugin.js +115 -24
  118. package/lib/asset/AssetParser.js +4 -2
  119. package/lib/asset/AssetSourceGenerator.js +26 -8
  120. package/lib/asset/AssetSourceParser.js +1 -0
  121. package/lib/asset/RawDataUrlModule.js +23 -13
  122. package/lib/asset/WebManifestGenerator.js +164 -0
  123. package/lib/asset/WebManifestParser.js +130 -0
  124. package/lib/async-modules/AsyncModuleHelpers.js +1 -0
  125. package/lib/async-modules/AwaitDependenciesInitFragment.js +18 -4
  126. package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
  127. package/lib/async-modules/isGeneratorLowered.js +26 -0
  128. package/lib/buildChunkGraph.js +107 -15
  129. package/lib/bun/BunTargetPlugin.js +42 -0
  130. package/lib/cache/AddBuildDependenciesPlugin.js +3 -1
  131. package/lib/cache/AddManagedPathsPlugin.js +5 -1
  132. package/lib/cache/IdleFileCachePlugin.js +6 -1
  133. package/lib/cache/MemoryCachePlugin.js +1 -1
  134. package/lib/cache/MemoryWithGcCachePlugin.js +4 -1
  135. package/lib/cache/PackFileCacheStrategy.js +43 -7
  136. package/lib/cache/ResolverCachePlugin.js +12 -1
  137. package/lib/cache/getLazyHashedEtag.js +13 -2
  138. package/lib/cache/mergeEtags.js +4 -0
  139. package/lib/cli.js +142 -20
  140. package/lib/config/browserslistTargetHandler.js +141 -0
  141. package/lib/config/defaults.js +591 -41
  142. package/lib/config/defineConfig.js +31 -0
  143. package/lib/config/normalization.js +46 -1
  144. package/lib/config/target.js +200 -2
  145. package/lib/container/ContainerEntryDependency.js +2 -0
  146. package/lib/container/ContainerEntryModule.js +27 -14
  147. package/lib/container/ContainerEntryModuleFactory.js +1 -0
  148. package/lib/container/ContainerExposedDependency.js +6 -2
  149. package/lib/container/ContainerPlugin.js +2 -1
  150. package/lib/container/ContainerReferencePlugin.js +3 -2
  151. package/lib/container/FallbackDependency.js +9 -7
  152. package/lib/container/FallbackItemDependency.js +1 -0
  153. package/lib/container/FallbackModule.js +22 -9
  154. package/lib/container/FallbackModuleFactory.js +1 -0
  155. package/lib/container/ModuleFederationPlugin.js +12 -26
  156. package/lib/container/RemoteModule.js +33 -10
  157. package/lib/container/RemoteRuntimeModule.js +15 -12
  158. package/lib/container/RemoteToExternalDependency.js +1 -0
  159. package/lib/container/options.js +7 -0
  160. package/lib/css/CssGenerator.js +534 -272
  161. package/lib/css/CssInjectStyleRuntimeModule.js +86 -70
  162. package/lib/css/CssLoadingRuntimeModule.js +156 -77
  163. package/lib/{CssModule.js → css/CssModule.js} +72 -37
  164. package/lib/css/CssModulesPlugin.js +356 -204
  165. package/lib/css/CssParser.js +3452 -1950
  166. package/lib/css/syntax.js +4058 -0
  167. package/lib/debug/ProfilingPlugin.js +33 -2
  168. package/lib/deno/DenoTargetPlugin.js +41 -0
  169. package/lib/dependencies/AMDDefineDependency.js +29 -17
  170. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +19 -6
  171. package/lib/dependencies/AMDPlugin.js +6 -3
  172. package/lib/dependencies/AMDRequireArrayDependency.js +13 -11
  173. package/lib/dependencies/AMDRequireContextDependency.js +10 -11
  174. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -0
  175. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +28 -14
  176. package/lib/dependencies/AMDRequireDependency.js +28 -20
  177. package/lib/dependencies/AMDRequireItemDependency.js +1 -0
  178. package/lib/dependencies/AMDRuntimeModules.js +3 -0
  179. package/lib/dependencies/CachedConstDependency.js +9 -1
  180. package/lib/dependencies/CommonJsDependencyHelpers.js +104 -0
  181. package/lib/dependencies/CommonJsExportRequireDependency.js +138 -38
  182. package/lib/dependencies/CommonJsExportsDependency.js +74 -20
  183. package/lib/dependencies/CommonJsExportsParserPlugin.js +246 -15
  184. package/lib/dependencies/CommonJsFullRequireDependency.js +62 -27
  185. package/lib/dependencies/CommonJsImportsParserPlugin.js +187 -24
  186. package/lib/dependencies/CommonJsPlugin.js +7 -4
  187. package/lib/dependencies/CommonJsRequireContextDependency.js +13 -13
  188. package/lib/dependencies/CommonJsRequireDependency.js +135 -13
  189. package/lib/dependencies/CommonJsSelfReferenceDependency.js +60 -16
  190. package/lib/dependencies/ConstDependency.js +22 -12
  191. package/lib/dependencies/ContextDependency.js +13 -2
  192. package/lib/dependencies/ContextDependencyHelpers.js +7 -4
  193. package/lib/dependencies/ContextDependencyTemplateAsId.js +2 -1
  194. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +1 -0
  195. package/lib/dependencies/ContextElementDependency.js +27 -14
  196. package/lib/dependencies/CreateRequireParserPlugin.js +14 -7
  197. package/lib/dependencies/CreateScriptUrlDependency.js +9 -7
  198. package/lib/dependencies/CriticalDependencyWarning.js +3 -1
  199. package/lib/dependencies/CssIcssExportDependency.js +682 -368
  200. package/lib/dependencies/CssIcssImportDependency.js +62 -17
  201. package/lib/dependencies/CssIcssSymbolDependency.js +36 -17
  202. package/lib/dependencies/CssImportDependency.js +37 -1
  203. package/lib/dependencies/CssUrlDependency.js +87 -14
  204. package/lib/dependencies/DelegatedSourceDependency.js +1 -0
  205. package/lib/dependencies/DllEntryDependency.js +12 -13
  206. package/lib/dependencies/DynamicExports.js +5 -0
  207. package/lib/dependencies/EntryDependency.js +1 -0
  208. package/lib/dependencies/ExportBindingInitFragment.js +164 -0
  209. package/lib/dependencies/ExportsInfoDependency.js +18 -12
  210. package/lib/dependencies/ExternalModuleDependency.js +13 -5
  211. package/lib/dependencies/ExternalModuleInitFragment.js +10 -5
  212. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +19 -12
  213. package/lib/dependencies/HarmonyAcceptDependency.js +24 -26
  214. package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -0
  215. package/lib/dependencies/HarmonyCompatibilityDependency.js +33 -14
  216. package/lib/dependencies/HarmonyDetectionParserPlugin.js +108 -30
  217. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +32 -2
  218. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +70 -33
  219. package/lib/dependencies/HarmonyExportExpressionDependency.js +140 -46
  220. package/lib/dependencies/HarmonyExportHeaderDependency.js +11 -9
  221. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +253 -37
  222. package/lib/dependencies/HarmonyExportInitFragment.js +28 -20
  223. package/lib/dependencies/HarmonyExportSpecifierDependency.js +88 -18
  224. package/lib/dependencies/HarmonyExports.js +6 -1
  225. package/lib/dependencies/HarmonyImportDependency.js +59 -3
  226. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +139 -146
  227. package/lib/dependencies/HarmonyImportGuard.js +426 -0
  228. package/lib/dependencies/HarmonyImportSideEffectDependency.js +22 -1
  229. package/lib/dependencies/HarmonyImportSpecifierDependency.js +136 -17
  230. package/lib/{HarmonyLinkingError.js → dependencies/HarmonyLinkingError.js} +6 -3
  231. package/lib/dependencies/HarmonyModulesPlugin.js +11 -1
  232. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +2 -1
  233. package/lib/dependencies/HtmlEntryDependency.js +1295 -0
  234. package/lib/dependencies/HtmlInlineHtmlDependency.js +107 -0
  235. package/lib/dependencies/HtmlInlineScriptDependency.js +126 -0
  236. package/lib/dependencies/HtmlInlineStyleDependency.js +152 -0
  237. package/lib/dependencies/HtmlSourceDependency.js +172 -0
  238. package/lib/dependencies/ImportContextDependency.js +9 -9
  239. package/lib/dependencies/ImportDependency.js +92 -3
  240. package/lib/dependencies/ImportEagerDependency.js +2 -0
  241. package/lib/dependencies/ImportMetaContextDependency.js +1 -0
  242. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +35 -19
  243. package/lib/dependencies/ImportMetaContextPlugin.js +40 -8
  244. package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
  245. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
  246. package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
  247. package/lib/dependencies/ImportMetaHotAcceptDependency.js +2 -0
  248. package/lib/dependencies/ImportMetaHotDeclineDependency.js +2 -0
  249. package/lib/dependencies/ImportMetaPlugin.js +595 -209
  250. package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
  251. package/lib/dependencies/ImportParserPlugin.js +114 -27
  252. package/lib/dependencies/ImportPhase.js +17 -11
  253. package/lib/dependencies/ImportPlugin.js +2 -1
  254. package/lib/dependencies/ImportWeakDependency.js +3 -0
  255. package/lib/dependencies/JsonExportsDependency.js +15 -10
  256. package/lib/dependencies/LoaderDependency.js +2 -0
  257. package/lib/dependencies/LoaderImportDependency.js +3 -0
  258. package/lib/dependencies/LoaderPlugin.js +9 -2
  259. package/lib/dependencies/LocalModule.js +15 -12
  260. package/lib/dependencies/LocalModuleDependency.js +15 -13
  261. package/lib/dependencies/LocalModulesHelpers.js +3 -0
  262. package/lib/dependencies/ModuleDecoratorDependency.js +16 -10
  263. package/lib/dependencies/ModuleDependency.js +14 -0
  264. package/lib/dependencies/ModuleDependencyTemplateAsId.js +1 -0
  265. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +1 -0
  266. package/lib/dependencies/ModuleHotAcceptDependency.js +2 -0
  267. package/lib/dependencies/ModuleHotDeclineDependency.js +2 -0
  268. package/lib/dependencies/ModuleInitFragmentDependency.js +19 -11
  269. package/lib/dependencies/NullDependency.js +2 -0
  270. package/lib/dependencies/PrefetchDependency.js +1 -0
  271. package/lib/dependencies/ProvidedDependency.js +36 -27
  272. package/lib/dependencies/PureExpressionDependency.js +14 -10
  273. package/lib/dependencies/RequireContextDependency.js +1 -0
  274. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -1
  275. package/lib/dependencies/RequireContextPlugin.js +2 -1
  276. package/lib/dependencies/RequireEnsureDependenciesBlock.js +1 -0
  277. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +4 -6
  278. package/lib/dependencies/RequireEnsureDependency.js +16 -13
  279. package/lib/dependencies/RequireEnsureItemDependency.js +1 -0
  280. package/lib/dependencies/RequireEnsurePlugin.js +2 -1
  281. package/lib/dependencies/RequireHeaderDependency.js +7 -4
  282. package/lib/dependencies/RequireIncludeDependency.js +2 -0
  283. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +11 -12
  284. package/lib/dependencies/RequireIncludePlugin.js +2 -1
  285. package/lib/{RequireJsStuffPlugin.js → dependencies/RequireJsStuffPlugin.js} +9 -8
  286. package/lib/dependencies/RequireResolveContextDependency.js +10 -11
  287. package/lib/dependencies/RequireResolveDependency.js +2 -0
  288. package/lib/dependencies/RequireResolveHeaderDependency.js +8 -5
  289. package/lib/dependencies/RuntimeRequirementsDependency.js +11 -8
  290. package/lib/dependencies/StaticExportsDependency.js +13 -10
  291. package/lib/dependencies/SystemPlugin.js +9 -6
  292. package/lib/dependencies/SystemRuntimeModule.js +1 -0
  293. package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
  294. package/lib/dependencies/URLContextDependency.js +8 -7
  295. package/lib/dependencies/URLDependency.js +157 -33
  296. package/lib/dependencies/URLPlugin.js +2 -0
  297. package/lib/dependencies/UnsupportedDependency.js +12 -13
  298. package/lib/dependencies/WebAssemblyExportImportedDependency.js +15 -16
  299. package/lib/dependencies/WebAssemblyImportDependency.js +19 -18
  300. package/lib/dependencies/WebpackIsIncludedDependency.js +3 -0
  301. package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +364 -114
  302. package/lib/dependencies/WorkerDependency.js +111 -27
  303. package/lib/dependencies/WorkletDependency.js +278 -0
  304. package/lib/dependencies/getFunctionExpression.js +1 -0
  305. package/lib/dependencies/processExportInfo.js +14 -11
  306. package/lib/{DelegatedModule.js → dll/DelegatedModule.js} +71 -44
  307. package/lib/{DelegatedModuleFactoryPlugin.js → dll/DelegatedModuleFactoryPlugin.js} +27 -4
  308. package/lib/{DelegatedPlugin.js → dll/DelegatedPlugin.js} +5 -3
  309. package/lib/{DllEntryPlugin.js → dll/DllEntryPlugin.js} +9 -5
  310. package/lib/{DllModule.js → dll/DllModule.js} +36 -24
  311. package/lib/{DllModuleFactory.js → dll/DllModuleFactory.js} +5 -4
  312. package/lib/{DllPlugin.js → dll/DllPlugin.js} +24 -6
  313. package/lib/{DllReferencePlugin.js → dll/DllReferencePlugin.js} +26 -18
  314. package/lib/{LibManifestPlugin.js → dll/LibManifestPlugin.js} +14 -10
  315. package/lib/electron/ElectronTargetPlugin.js +24 -5
  316. package/lib/{AbstractMethodError.js → errors/AbstractMethodError.js} +10 -1
  317. package/lib/{AsyncDependencyToInitialChunkError.js → errors/AsyncDependencyToInitialChunkError.js} +8 -3
  318. package/lib/errors/BuildCycleError.js +1 -1
  319. package/lib/{ChunkRenderError.js → errors/ChunkRenderError.js} +1 -1
  320. package/lib/{CodeGenerationError.js → errors/CodeGenerationError.js} +1 -1
  321. package/lib/{CommentCompilationWarning.js → errors/CommentCompilationWarning.js} +9 -3
  322. package/lib/{ConcurrentCompilationError.js → errors/ConcurrentCompilationError.js} +5 -2
  323. package/lib/{EnvironmentNotSupportAsyncWarning.js → errors/EnvironmentNotSupportAsyncWarning.js} +5 -5
  324. package/lib/{HookWebpackError.js → errors/HookWebpackError.js} +20 -16
  325. package/lib/{IgnoreErrorModuleFactory.js → errors/IgnoreErrorModuleFactory.js} +7 -4
  326. package/lib/{InvalidDependenciesModuleWarning.js → errors/InvalidDependenciesModuleWarning.js} +6 -3
  327. package/lib/errors/JSONParseError.js +115 -0
  328. package/lib/errors/LoaderLoadingError.js +20 -0
  329. package/lib/{ModuleBuildError.js → errors/ModuleBuildError.js} +22 -16
  330. package/lib/{ModuleDependencyError.js → errors/ModuleDependencyError.js} +10 -3
  331. package/lib/{ModuleDependencyWarning.js → errors/ModuleDependencyWarning.js} +13 -5
  332. package/lib/{ModuleError.js → errors/ModuleError.js} +10 -14
  333. package/lib/{ModuleHashingError.js → errors/ModuleHashingError.js} +5 -1
  334. package/lib/errors/ModuleNotFoundError.js +94 -0
  335. package/lib/errors/ModuleParseError.js +141 -0
  336. package/lib/{ModuleRestoreError.js → errors/ModuleRestoreError.js} +4 -1
  337. package/lib/{ModuleStoreError.js → errors/ModuleStoreError.js} +5 -1
  338. package/lib/{ModuleWarning.js → errors/ModuleWarning.js} +13 -14
  339. package/lib/{NodeStuffInWebError.js → errors/NodeStuffInWebError.js} +7 -5
  340. package/lib/errors/NonErrorEmittedError.js +30 -0
  341. package/lib/{UnhandledSchemeError.js → errors/UnhandledSchemeError.js} +9 -2
  342. package/lib/{UnsupportedFeatureWarning.js → errors/UnsupportedFeatureWarning.js} +4 -3
  343. package/lib/errors/WebpackError.js +84 -0
  344. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  345. package/lib/esm/ModuleChunkFormatPlugin.js +52 -15
  346. package/lib/esm/ModuleChunkLoadingPlugin.js +11 -3
  347. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +71 -49
  348. package/lib/hmr/HotModuleReplacement.runtime.js +175 -30
  349. package/lib/hmr/HotModuleReplacementRuntimeModule.js +8 -0
  350. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +173 -26
  351. package/lib/hmr/JavascriptHotModuleReplacementHelper.js +1 -0
  352. package/lib/hmr/LazyCompilationPlugin.js +154 -7
  353. package/lib/hmr/lazyCompilationBackend.js +34 -8
  354. package/lib/html/HtmlGenerator.js +1470 -0
  355. package/lib/html/HtmlModule.js +41 -0
  356. package/lib/html/HtmlModulesPlugin.js +1111 -0
  357. package/lib/html/HtmlParser.js +1970 -0
  358. package/lib/html/favicon.svg +1 -0
  359. package/lib/html/syntax.js +9020 -0
  360. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -1
  361. package/lib/ids/DeterministicChunkIdsPlugin.js +3 -1
  362. package/lib/ids/DeterministicModuleIdsPlugin.js +3 -1
  363. package/lib/ids/HashedModuleIdsPlugin.js +2 -1
  364. package/lib/ids/IdHelpers.js +25 -2
  365. package/lib/ids/NamedChunkIdsPlugin.js +3 -1
  366. package/lib/ids/NamedModuleIdsPlugin.js +3 -1
  367. package/lib/ids/NaturalChunkIdsPlugin.js +1 -1
  368. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  369. package/lib/ids/OccurrenceChunkIdsPlugin.js +2 -1
  370. package/lib/ids/OccurrenceModuleIdsPlugin.js +4 -1
  371. package/lib/ids/SyncModuleIdsPlugin.js +3 -1
  372. package/lib/index.js +66 -15
  373. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +5 -6
  374. package/lib/javascript/BasicEvaluatedExpression.js +370 -49
  375. package/lib/javascript/ChunkFormatHelpers.js +2 -1
  376. package/lib/javascript/ChunkHelpers.js +1 -0
  377. package/lib/javascript/CommonJsChunkFormatPlugin.js +1 -1
  378. package/lib/javascript/EnableChunkLoadingPlugin.js +6 -1
  379. package/lib/javascript/JavascriptGenerator.js +213 -51
  380. package/lib/javascript/JavascriptModule.js +54 -0
  381. package/lib/javascript/JavascriptModulesPlugin.js +579 -183
  382. package/lib/javascript/JavascriptParser.js +1289 -462
  383. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  384. package/lib/javascript/StartupHelpers.js +5 -0
  385. package/lib/javascript/syntax.js +4380 -0
  386. package/lib/json/JsonData.js +5 -0
  387. package/lib/json/JsonGenerator.js +21 -0
  388. package/lib/json/JsonModule.js +40 -0
  389. package/lib/json/JsonModulesPlugin.js +8 -1
  390. package/lib/json/JsonParser.js +18 -27
  391. package/lib/library/AbstractLibraryPlugin.js +17 -2
  392. package/lib/library/AmdLibraryPlugin.js +8 -0
  393. package/lib/library/AssignLibraryPlugin.js +21 -3
  394. package/lib/library/EnableLibraryPlugin.js +8 -2
  395. package/lib/library/ExportPropertyLibraryPlugin.js +10 -0
  396. package/lib/{FalseIIFEUmdWarning.js → library/FalseIIFEUmdWarning.js} +2 -1
  397. package/lib/library/JsonpLibraryPlugin.js +8 -0
  398. package/lib/library/ModuleLibraryPlugin.js +154 -7
  399. package/lib/library/SystemLibraryPlugin.js +11 -3
  400. package/lib/library/UmdLibraryPlugin.js +16 -0
  401. package/lib/loaders/LoaderRunner.js +714 -0
  402. package/lib/loaders/loadLoader.js +100 -0
  403. package/lib/logging/Logger.js +17 -0
  404. package/lib/logging/createConsoleLogger.js +7 -0
  405. package/lib/logging/runtime.js +2 -0
  406. package/lib/logging/truncateArgs.js +2 -0
  407. package/lib/node/CommonJsChunkLoadingPlugin.js +5 -1
  408. package/lib/node/NodeEnvironmentPlugin.js +7 -3
  409. package/lib/node/NodeSourcePlugin.js +1 -1
  410. package/lib/node/NodeTargetPlugin.js +4 -63
  411. package/lib/node/NodeTemplatePlugin.js +3 -1
  412. package/lib/node/NodeWatchFileSystem.js +40 -22
  413. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +13 -9
  414. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +23 -1
  415. package/lib/node/ReadFileCompileWasmPlugin.js +18 -1
  416. package/lib/node/RequireChunkLoadingRuntimeModule.js +21 -16
  417. package/lib/node/nodeBuiltins.js +80 -0
  418. package/lib/node/nodeConsole.js +116 -64
  419. package/lib/optimize/AggressiveMergingPlugin.js +3 -1
  420. package/lib/optimize/AggressiveSplittingPlugin.js +6 -1
  421. package/lib/optimize/ConcatenatedModule.js +585 -116
  422. package/lib/optimize/ConstExportsPlugin.js +211 -0
  423. package/lib/optimize/EnsureChunkConditionsPlugin.js +2 -1
  424. package/lib/optimize/FlagIncludedChunksPlugin.js +15 -4
  425. package/lib/optimize/InlineExports.js +178 -0
  426. package/lib/optimize/InnerGraph.js +374 -262
  427. package/lib/optimize/InnerGraphPlugin.js +246 -117
  428. package/lib/optimize/LimitChunkCountPlugin.js +9 -0
  429. package/lib/optimize/MangleExportsPlugin.js +5 -1
  430. package/lib/optimize/MergeDuplicateChunksPlugin.js +2 -0
  431. package/lib/optimize/MinChunkSizePlugin.js +2 -1
  432. package/lib/optimize/MinMaxSizeWarning.js +5 -4
  433. package/lib/optimize/ModuleConcatenationPlugin.js +159 -34
  434. package/lib/optimize/RealContentHashPlugin.js +125 -50
  435. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -1
  436. package/lib/optimize/RemoveParentModulesPlugin.js +3 -1
  437. package/lib/optimize/RuntimeChunkPlugin.js +2 -1
  438. package/lib/optimize/SideEffectsFlagPlugin.js +381 -55
  439. package/lib/optimize/SplitChunksPlugin.js +54 -6
  440. package/lib/performance/AssetsOverSizeLimitWarning.js +3 -2
  441. package/lib/performance/EntrypointsOverSizeLimitWarning.js +3 -2
  442. package/lib/performance/NoAsyncChunksWarning.js +5 -3
  443. package/lib/performance/SizeLimitsPlugin.js +8 -2
  444. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +1 -0
  445. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +21 -0
  446. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +1 -0
  447. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -1
  448. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +25 -13
  449. package/lib/prefetch/ResourceHintPlugin.js +663 -0
  450. package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
  451. package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
  452. package/lib/prefetch/parseResourceHintOptions.js +103 -0
  453. package/lib/rules/BasicEffectRulePlugin.js +3 -0
  454. package/lib/rules/BasicMatcherRulePlugin.js +3 -0
  455. package/lib/rules/ObjectMatcherRulePlugin.js +3 -0
  456. package/lib/rules/RuleSetCompiler.js +132 -0
  457. package/lib/rules/UseEffectRulePlugin.js +10 -3
  458. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
  459. package/lib/runtime/AsyncModuleRuntimeModule.js +52 -33
  460. package/lib/runtime/AutoPublicPathRuntimeModule.js +22 -9
  461. package/lib/runtime/BaseUriRuntimeModule.js +1 -0
  462. package/lib/runtime/ChunkNameRuntimeModule.js +1 -0
  463. package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
  464. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +2 -1
  465. package/lib/runtime/CompatRuntimeModule.js +2 -0
  466. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
  467. package/lib/runtime/CreateScriptRuntimeModule.js +1 -0
  468. package/lib/runtime/CreateScriptUrlRuntimeModule.js +1 -0
  469. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +34 -4
  470. package/lib/runtime/EnsureChunkRuntimeModule.js +1 -0
  471. package/lib/runtime/GetChunkFilenameRuntimeModule.js +88 -8
  472. package/lib/runtime/GetFullHashRuntimeModule.js +1 -0
  473. package/lib/runtime/GetMainFilenameRuntimeModule.js +1 -0
  474. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -1
  475. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
  476. package/lib/runtime/GlobalRuntimeModule.js +1 -0
  477. package/lib/runtime/HasOwnPropertyRuntimeModule.js +2 -1
  478. package/lib/runtime/HelperRuntimeModule.js +5 -0
  479. package/lib/runtime/LoadScriptRuntimeModule.js +28 -37
  480. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +354 -37
  481. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +2 -1
  482. package/lib/runtime/NonceRuntimeModule.js +1 -0
  483. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -4
  484. package/lib/runtime/PublicPathRuntimeModule.js +1 -0
  485. package/lib/runtime/RelativeUrlRuntimeModule.js +4 -2
  486. package/lib/runtime/RuntimeIdRuntimeModule.js +1 -0
  487. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +38 -0
  488. package/lib/runtime/StartupChunkDependenciesPlugin.js +13 -1
  489. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +2 -1
  490. package/lib/runtime/StartupEntrypointRuntimeModule.js +5 -3
  491. package/lib/runtime/SystemContextRuntimeModule.js +1 -0
  492. package/lib/runtime/ToBinaryRuntimeModule.js +1 -0
  493. package/lib/runtime/WorkerRuntimeModule.js +33 -0
  494. package/lib/schemes/DataUriPlugin.js +14 -2
  495. package/lib/schemes/FileUriPlugin.js +1 -1
  496. package/lib/schemes/HttpUriPlugin.js +86 -4
  497. package/lib/schemes/VirtualUrlPlugin.js +8 -4
  498. package/lib/serialization/AggregateErrorSerializer.js +9 -6
  499. package/lib/serialization/ArraySerializer.js +6 -8
  500. package/lib/serialization/BinaryMiddleware.js +552 -463
  501. package/lib/serialization/DateObjectSerializer.js +4 -2
  502. package/lib/serialization/ErrorObjectSerializer.js +10 -6
  503. package/lib/serialization/FileMiddleware.js +50 -3
  504. package/lib/serialization/MapObjectSerializer.js +7 -9
  505. package/lib/serialization/NullPrototypeObjectSerializer.js +9 -9
  506. package/lib/serialization/ObjectMiddleware.js +73 -13
  507. package/lib/serialization/PlainObjectSerializer.js +16 -8
  508. package/lib/serialization/RegExpObjectSerializer.js +4 -2
  509. package/lib/serialization/Serializer.js +6 -0
  510. package/lib/serialization/SerializerMiddleware.js +14 -2
  511. package/lib/serialization/SetObjectSerializer.js +6 -8
  512. package/lib/serialization/SingleItemMiddleware.js +3 -0
  513. package/lib/sharing/ConsumeSharedFallbackDependency.js +1 -0
  514. package/lib/sharing/ConsumeSharedModule.js +21 -7
  515. package/lib/sharing/ConsumeSharedPlugin.js +11 -11
  516. package/lib/sharing/ConsumeSharedRuntimeModule.js +55 -45
  517. package/lib/sharing/ProvideForSharedDependency.js +1 -0
  518. package/lib/sharing/ProvideSharedDependency.js +34 -15
  519. package/lib/sharing/ProvideSharedModule.js +42 -12
  520. package/lib/sharing/ProvideSharedModuleFactory.js +1 -0
  521. package/lib/sharing/ProvideSharedPlugin.js +13 -8
  522. package/lib/sharing/SharePlugin.js +5 -1
  523. package/lib/sharing/ShareRuntimeModule.js +19 -16
  524. package/lib/sharing/resolveMatchedConfigs.js +6 -2
  525. package/lib/sharing/utils.js +9 -1
  526. package/lib/stats/DefaultStatsFactoryPlugin.js +94 -12
  527. package/lib/stats/DefaultStatsPresetPlugin.js +14 -2
  528. package/lib/stats/DefaultStatsPrinterPlugin.js +64 -18
  529. package/lib/stats/StatsFactory.js +39 -18
  530. package/lib/stats/StatsPrinter.js +16 -2
  531. package/lib/typescript/TypeScriptPlugin.js +210 -0
  532. package/lib/url/URLParserPlugin.js +111 -23
  533. package/lib/util/ArrayHelpers.js +1 -0
  534. package/lib/util/ArrayQueue.js +10 -5
  535. package/lib/util/AsyncQueue.js +154 -74
  536. package/lib/util/Hash.js +2 -2
  537. package/lib/util/IterableHelpers.js +3 -0
  538. package/lib/util/LazyBucketSortedSet.js +26 -0
  539. package/lib/util/LazySet.js +45 -4
  540. package/lib/util/LocConverter.js +64 -0
  541. package/lib/util/ParallelismFactorCalculator.js +1 -0
  542. package/lib/util/Queue.js +6 -3
  543. package/lib/util/Semaphore.js +15 -1
  544. package/lib/util/SetHelpers.js +4 -1
  545. package/lib/util/SortableSet.js +7 -1
  546. package/lib/util/SourceProcessor.js +119 -0
  547. package/lib/util/StackedCacheMap.js +20 -3
  548. package/lib/util/StackedMap.js +162 -43
  549. package/lib/util/StringXor.js +1 -1
  550. package/lib/util/TupleQueue.js +7 -3
  551. package/lib/util/TupleSet.js +14 -0
  552. package/lib/util/URLAbsoluteSpecifier.js +1 -0
  553. package/lib/util/WeakTupleMap.js +60 -1
  554. package/lib/util/binarySearchBounds.js +3 -2
  555. package/lib/util/chainedImports.js +3 -3
  556. package/lib/util/cleverMerge.js +19 -2
  557. package/lib/util/comparators.js +35 -4
  558. package/lib/util/compileBooleanMatcher.js +9 -0
  559. package/lib/util/concatenate.js +80 -24
  560. package/lib/util/conventions.js +46 -1
  561. package/lib/util/createHash.js +0 -1
  562. package/lib/util/createHooksRegistry.js +43 -0
  563. package/lib/util/createMappings.js +118 -0
  564. package/lib/util/dataURL.js +3 -2
  565. package/lib/util/deprecation.js +19 -0
  566. package/lib/util/deterministicGrouping.js +46 -17
  567. package/lib/util/extractSourceMap.js +2 -1
  568. package/lib/util/extractUrlAndGlobal.js +1 -0
  569. package/lib/util/findGraphRoots.js +7 -0
  570. package/lib/{formatLocation.js → util/formatLocation.js} +4 -2
  571. package/lib/{SizeFormatHelpers.js → util/formatSize.js} +10 -3
  572. package/lib/util/fs.js +87 -14
  573. package/lib/util/generateDebugId.js +1 -0
  574. package/lib/util/globUtils.js +710 -0
  575. package/lib/util/hash/BatchedHash.js +1 -0
  576. package/lib/util/hash/BulkUpdateHash.js +1 -0
  577. package/lib/util/hash/DebugHash.js +1 -0
  578. package/lib/util/hash/hash-digest.js +32 -15
  579. package/lib/util/hash/md4.js +1 -1
  580. package/lib/util/hash/wasm-hash.js +5 -0
  581. package/lib/util/hash/xxhash64.js +1 -1
  582. package/lib/util/identifier.js +97 -6
  583. package/lib/util/implicitTypeLoaderFallback.js +62 -0
  584. package/lib/util/internalSerializables.js +102 -60
  585. package/lib/util/magicComment.js +149 -7
  586. package/lib/util/makeSerializable.js +7 -0
  587. package/lib/util/memoize.js +2 -0
  588. package/lib/util/mimeTypes.js +176 -0
  589. package/lib/util/nonNumericOnlyHash.js +31 -1
  590. package/lib/util/numberHash.js +2 -2
  591. package/lib/util/parseJson.js +41 -0
  592. package/lib/util/processAsyncTree.js +8 -0
  593. package/lib/util/property.js +9 -2
  594. package/lib/util/publicPathPlaceholder.js +64 -0
  595. package/lib/util/registerExternalSerializer.js +24 -4
  596. package/lib/util/removeBOM.js +1 -0
  597. package/lib/util/runtime.js +32 -0
  598. package/lib/util/semver.js +15 -0
  599. package/lib/util/serialization.js +2 -0
  600. package/lib/util/smartGrouping.js +8 -0
  601. package/lib/util/source.js +23 -0
  602. package/lib/util/topologicalSort.js +69 -0
  603. package/lib/validateSchema.js +1 -0
  604. package/lib/wasm/EnableWasmLoadingPlugin.js +15 -1
  605. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +25 -18
  606. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +34 -22
  607. package/lib/wasm-async/AsyncWasmModule.js +77 -0
  608. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -0
  609. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +6 -1
  610. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +22 -126
  611. package/lib/wasm-async/AsyncWebAssemblyParser.js +3 -2
  612. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +13 -2
  613. package/lib/wasm-sync/SyncWasmModule.js +39 -0
  614. package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +7 -3
  615. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +86 -19
  616. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -3
  617. package/lib/wasm-sync/WebAssemblyGenerator.js +27 -1
  618. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +9 -3
  619. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +4 -0
  620. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +20 -1
  621. package/lib/wasm-sync/WebAssemblyParser.js +9 -3
  622. package/lib/wasm-sync/WebAssemblyUtils.js +2 -0
  623. package/lib/web/FetchCompileAsyncWasmPlugin.js +29 -1
  624. package/lib/web/FetchCompileWasmPlugin.js +27 -1
  625. package/lib/web/JsonpChunkLoadingPlugin.js +11 -1
  626. package/lib/web/JsonpChunkLoadingRuntimeModule.js +58 -64
  627. package/lib/web/JsonpTemplatePlugin.js +2 -1
  628. package/lib/webpack.js +78 -1
  629. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +10 -1
  630. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +15 -10
  631. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  632. package/module.d.ts +21 -0
  633. package/package.json +79 -77
  634. package/schemas/WebpackOptions.check.js +1 -1
  635. package/schemas/WebpackOptions.json +1117 -79
  636. package/schemas/plugins/{DllPlugin.check.d.ts → HtmlGeneratorOptions.check.d.ts} +1 -1
  637. package/schemas/plugins/HtmlGeneratorOptions.check.js +6 -0
  638. package/schemas/plugins/HtmlGeneratorOptions.json +3 -0
  639. package/schemas/plugins/{DllReferencePlugin.check.d.ts → HtmlParserOptions.check.d.ts} +1 -1
  640. package/schemas/plugins/HtmlParserOptions.check.js +6 -0
  641. package/schemas/plugins/HtmlParserOptions.json +3 -0
  642. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  643. package/schemas/plugins/ProgressPlugin.json +38 -0
  644. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  645. package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
  646. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  647. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  648. package/schemas/plugins/container/ModuleFederationPlugin.json +2 -0
  649. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.d.ts +7 -0
  650. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +6 -0
  651. package/schemas/plugins/css/CssAutoOrModuleParserOptions.json +3 -0
  652. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  653. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  654. package/schemas/plugins/dll/DllPlugin.check.d.ts +7 -0
  655. package/schemas/plugins/dll/DllReferencePlugin.check.d.ts +7 -0
  656. package/types.d.ts +8608 -1159
  657. package/lib/CaseSensitiveModulesWarning.js +0 -72
  658. package/lib/GraphHelpers.js +0 -46
  659. package/lib/ModuleParseError.js +0 -125
  660. package/lib/NoModeWarning.js +0 -23
  661. package/lib/css/CssMergeStyleSheetsRuntimeModule.js +0 -56
  662. package/lib/css/walkCssTokens.js +0 -1843
  663. package/lib/util/AppendOnlyStackedSet.js +0 -78
  664. /package/schemas/plugins/{DllPlugin.check.js → dll/DllPlugin.check.js} +0 -0
  665. /package/schemas/plugins/{DllPlugin.json → dll/DllPlugin.json} +0 -0
  666. /package/schemas/plugins/{DllReferencePlugin.check.js → dll/DllReferencePlugin.check.js} +0 -0
  667. /package/schemas/plugins/{DllReferencePlugin.json → dll/DllReferencePlugin.json} +0 -0
@@ -0,0 +1,1111 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ */
4
+
5
+ "use strict";
6
+
7
+ const { pathToFileURL } = require("url");
8
+ const { AsyncSeriesHook, AsyncSeriesWaterfallHook } = require("tapable");
9
+ const { RawSource } = require("webpack-sources");
10
+ const Compilation = require("../Compilation");
11
+ const EntryOptionPlugin = require("../EntryOptionPlugin");
12
+ const EntryPlugin = require("../EntryPlugin");
13
+ const HotUpdateChunk = require("../HotUpdateChunk");
14
+ const { HTML_TYPE } = require("../ModuleSourceTypeConstants");
15
+ const { HTML_MODULE_TYPE } = require("../ModuleTypeConstants");
16
+ const NormalModule = require("../NormalModule");
17
+ 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
+ const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
24
+ const WebpackError = require("../errors/WebpackError");
25
+ const JavascriptModulesPlugin = require("../javascript/JavascriptModulesPlugin");
26
+ const { compareModulesByFullName } = require("../util/comparators");
27
+ const createHash = require("../util/createHash");
28
+ const createHooksRegistry = require("../util/createHooksRegistry");
29
+ const { getUndoPath, makePathsRelative } = require("../util/identifier");
30
+ const implicitTypeLoaderFallback = require("../util/implicitTypeLoaderFallback");
31
+ const memoize = require("../util/memoize");
32
+ const { digestNonNumericOnly } = require("../util/nonNumericOnlyHash");
33
+ const {
34
+ PUBLIC_PATH_AUTO: autoPlaceholder
35
+ } = require("../util/publicPathPlaceholder");
36
+ const removeBOM = require("../util/removeBOM");
37
+ const HtmlGenerator = require("./HtmlGenerator");
38
+ const HtmlModule = require("./HtmlModule");
39
+ const HtmlParser = require("./HtmlParser");
40
+ const { escapeAttribute } = require("./syntax");
41
+
42
+ /** @typedef {import("../../declarations/WebpackOptions").EntryDescriptionNormalized} EntryDescriptionNormalized */
43
+ /** @typedef {import("../../declarations/WebpackOptions").OutputHtmlOptions["favicon"]} FaviconOption */
44
+ /** @typedef {import("../../declarations/WebpackOptions").OutputHtmlOptions["manifest"]} ManifestOption */
45
+ /** @typedef {import("../../declarations/WebpackOptions").HtmlFaviconIcon} HtmlFaviconIcon */
46
+ /** @typedef {Exclude<HtmlFaviconIcon, string>} FaviconIcon */
47
+ /** @typedef {import("../Compiler")} Compiler */
48
+ /** @typedef {import("./HtmlModule").HtmlModuleBuildInfo} HtmlModuleBuildInfo */
49
+ /** @typedef {{ request: string, entryName: string, type: "script" | "script-module" | "modulepreload" | "stylesheet" | "html" | "preload" | "prefetch", css?: boolean }} HtmlEntryInfo */
50
+
51
+ /** @typedef {{ outputName: string }} HtmlTransformHtmlContext */
52
+ /** @typedef {{ outputName: string }} HtmlEmittedContext */
53
+ /**
54
+ * A tag to inject into an emitted page as a structured descriptor. Injected
55
+ * verbatim (not re-bundled) at the `injectTo` position.
56
+ * @typedef {object} HtmlTagDescriptor
57
+ * @property {string} tag tag name, e.g. `"script"` / `"link"` / `"meta"`
58
+ * @property {Record<string, string | boolean | undefined>=} attrs attributes; `true` renders a bare boolean attribute, `false`/`undefined` is omitted
59
+ * @property {string=} children inner content (ignored for void elements like `<link>`/`<meta>`)
60
+ * @property {("head" | "body" | "head-prepend" | "body-prepend")=} injectTo placement; defaults to `"head"`
61
+ * @property {boolean=} voidTag force a void element (no closing tag); inferred from the tag name when omitted
62
+ */
63
+ /** @typedef {{ outputName: string, html: string }} HtmlInjectTagsContext */
64
+ /**
65
+ * A `<script>`/`<link>`/`<style>`/`<meta>` tag already present in an emitted
66
+ * page, exposed for in-place mutation by `transformTags`. Mutate `attrs`, set
67
+ * `remove`, or change `injectTo` to move it; don't reorder the array itself.
68
+ * @typedef {object} HtmlMutableTag
69
+ * @property {string} tag the (lowercased) tag name
70
+ * @property {Record<string, string | boolean | undefined>} attrs mutable attributes; a string value renders `name="value"`, `true` a bare attribute, `false`/`undefined`/deleting the key drops it
71
+ * @property {("head" | "body" | "head-prepend" | "body-prepend")=} injectTo the tag's current region (`"head"`/`"body"`); set a different value to move it there (`*-prepend` to the region's start)
72
+ * @property {boolean=} remove set true to delete the whole element
73
+ */
74
+ /** @typedef {{ outputName: string, html: string }} HtmlTransformTagsContext */
75
+ /**
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)
81
+ */
82
+
83
+ const PLUGIN_NAME = "HtmlModulesPlugin";
84
+
85
+ // Built-in default favicon (the webpack logo). Referenced as a `file:` request
86
+ // so `<link rel="icon">` in the synthetic wrapper flows through the normal
87
+ // asset pipeline — emitted hashed, with the correct publicPath, no direct IO.
88
+ // Resolved from `__filename` (a sibling of this module) — no `path` needed.
89
+ const DEFAULT_FAVICON = new URL("./favicon.svg", pathToFileURL(__filename))
90
+ .href;
91
+
92
+ // mime-db is heavy — only load it when a favicon actually needs a `type`.
93
+ const getMimeTypes = memoize(() => require("../util/mimeTypes"));
94
+
95
+ /**
96
+ * Resolves `output.html.favicon` for one page to `[rel, icon]` pairs.
97
+ * `false`/absent → none; `true` → the webpack logo; a string → one `icon`
98
+ * link; an object maps each `rel` to an icon (a path string, an attributes
99
+ * object, or an array of those for several icons under one `rel`); a function
100
+ * receives the page name and returns any of those. Each icon is normalized to
101
+ * an object so `faviconLinkTag` reads one shape.
102
+ * @param {FaviconOption} favicon favicon option
103
+ * @param {string} name page/entry name
104
+ * @returns {[string, FaviconIcon][]} rel/icon pairs, in order
105
+ */
106
+ const resolveFaviconLinks = (favicon, name) => {
107
+ const value = typeof favicon === "function" ? favicon(name) : favicon;
108
+ if (value === true) return [["icon", { href: DEFAULT_FAVICON }]];
109
+ if (typeof value === "string") return [["icon", { href: value }]];
110
+ if (value && typeof value === "object") {
111
+ /** @type {[string, FaviconIcon][]} */
112
+ const pairs = [];
113
+ for (const [rel, icon] of Object.entries(value)) {
114
+ for (const one of Array.isArray(icon) ? icon : [icon]) {
115
+ pairs.push([rel, typeof one === "string" ? { href: one } : one]);
116
+ }
117
+ }
118
+ return pairs;
119
+ }
120
+ return [];
121
+ };
122
+
123
+ /**
124
+ * @param {string} rel link relation
125
+ * @param {FaviconIcon} icon icon `href` plus optional link attributes
126
+ * @returns {string} a `<link rel=… [attrs…] href=…>` tag; `type` defaults to the file format
127
+ */
128
+ const faviconLinkTag = (rel, icon) => {
129
+ const type = icon.type || getMimeTypes().lookup(icon.href) || "";
130
+ const attrs = [
131
+ `rel="${escapeAttribute(rel)}"`,
132
+ icon.sizes && `sizes="${escapeAttribute(icon.sizes)}"`,
133
+ type && `type="${escapeAttribute(type)}"`,
134
+ icon.media && `media="${escapeAttribute(icon.media)}"`,
135
+ icon.color && `color="${escapeAttribute(icon.color)}"`,
136
+ icon.crossorigin && `crossorigin="${escapeAttribute(icon.crossorigin)}"`,
137
+ `href="${escapeAttribute(icon.href)}"`
138
+ ];
139
+ return `<link ${attrs.filter(Boolean).join(" ")}>`;
140
+ };
141
+
142
+ /**
143
+ * Resolves `output.html.manifest` for one page to a `<link rel="manifest">`
144
+ * tag, or `""` when unset. A string is a path to an existing `.webmanifest`
145
+ * file; an object is serialized to a base64 `data:application/manifest+json`
146
+ * URL (routed to `asset/webmanifest` by a default rule, so its relative icon
147
+ * `src`s are hashed like any request); a function receives the page name.
148
+ * Base64 (not percent-encoding) is required because this tag is embedded in
149
+ * the outer `data:text/html` wrapper, which is itself percent-decoded — a
150
+ * percent-encoded inner URL would be corrupted by that decode.
151
+ * @param {ManifestOption} manifest manifest option
152
+ * @param {string} name page/entry name
153
+ * @returns {string} the `<link>` tag, or ""
154
+ */
155
+ const manifestLinkTag = (manifest, name) => {
156
+ const value = typeof manifest === "function" ? manifest(name) : manifest;
157
+ if (!value) return "";
158
+ const href =
159
+ typeof value === "string"
160
+ ? value
161
+ : `data:application/manifest+json;base64,${Buffer.from(
162
+ JSON.stringify(value),
163
+ "utf8"
164
+ ).toString("base64")}`;
165
+ return `<link rel="manifest" href="${escapeAttribute(href)}">`;
166
+ };
167
+
168
+ // `\.html`/`\.css` request matchers for the synthetic `output.html` wrapper.
169
+ const HTML_REQUEST_RE = /\.html(\?|$)/i;
170
+ const CSS_REQUEST_RE = /\.css(\?|$)/i;
171
+
172
+ /**
173
+ * Requests an `output.html` page must load for an entry: its `dependOn`
174
+ * ancestors first (transitive, deduped — so a diamond loads each once), then
175
+ * the entry's own imports. `.html` imports are dropped (own HTML entries).
176
+ * @param {string} name entry name
177
+ * @param {Record<string, EntryDescriptionNormalized>} entries normalized static entries
178
+ * @returns {string[]} deduped requests in load order
179
+ */
180
+ const collectHtmlEntryRequests = (name, entries) => {
181
+ /** @type {string[]} */
182
+ const requests = [];
183
+ /** @type {Set<string>} */
184
+ const seenRequests = new Set();
185
+ /** @type {Set<string>} */
186
+ const visited = new Set();
187
+ const walk = (/** @type {string} */ entryName) => {
188
+ if (visited.has(entryName)) return;
189
+ visited.add(entryName);
190
+ const desc = entries[entryName];
191
+ if (!desc) return;
192
+ if (desc.dependOn) {
193
+ for (const dep of desc.dependOn) walk(dep);
194
+ }
195
+ if (!desc.import) return;
196
+ for (const request of desc.import) {
197
+ if (HTML_REQUEST_RE.test(request) || seenRequests.has(request)) continue;
198
+ seenRequests.add(request);
199
+ requests.push(request);
200
+ }
201
+ };
202
+ walk(name);
203
+ return requests;
204
+ };
205
+
206
+ /**
207
+ * @param {string} name definition name in `schemas/WebpackOptions.json`
208
+ * @returns {EXPECTED_OBJECT} a schema referencing `#/definitions/<name>`
209
+ */
210
+ const getSchema = (name) => {
211
+ const { definitions } = require("../../schemas/WebpackOptions.json");
212
+
213
+ return {
214
+ definitions,
215
+ oneOf: [{ $ref: `#/definitions/${name}` }]
216
+ };
217
+ };
218
+
219
+ const generatorValidationOptions = {
220
+ name: "Html Modules Plugin",
221
+ baseDataPath: "generator"
222
+ };
223
+
224
+ const parserValidationOptions = {
225
+ name: "Html Modules Plugin",
226
+ baseDataPath: "parser"
227
+ };
228
+
229
+ class HtmlModulesPlugin {
230
+ /**
231
+ * `output.hashFunction`/`hashSalt`/`hashDigest`/`hashDigestLength`
232
+ * digest of `content`, with `nonNumericOnlyHash` applied — webpack's
233
+ * standard `[contenthash]` recipe.
234
+ * @param {string | Buffer} content content to hash
235
+ * @param {import("../../declarations/WebpackOptions").Output} outputOptions output options
236
+ * @returns {string} content hash
237
+ */
238
+ static computeContentHash(content, outputOptions) {
239
+ const hash = createHash(
240
+ /** @type {import("../../declarations/WebpackOptions").HashFunction} */
241
+ (outputOptions.hashFunction)
242
+ );
243
+ if (outputOptions.hashSalt) hash.update(outputOptions.hashSalt);
244
+ hash.update(content);
245
+ return digestNonNumericOnly(
246
+ hash,
247
+ /** @type {string} */ (outputOptions.hashDigest),
248
+ /** @type {number} */ (outputOptions.hashDigestLength)
249
+ );
250
+ }
251
+
252
+ /**
253
+ * Filename template for an extracted HTML page: `output.htmlFilename` for
254
+ * initial chunks, `output.htmlChunkFilename` otherwise — the HTML counterpart
255
+ * of `CssModulesPlugin.getChunkFilenameTemplate`.
256
+ * @param {import("../Chunk")} chunk chunk
257
+ * @param {import("../../declarations/WebpackOptions").Output} outputOptions output options
258
+ * @returns {import("../Chunk").ChunkFilenameTemplate} used filename template
259
+ */
260
+ static getChunkFilenameTemplate(chunk, outputOptions) {
261
+ return chunk.canBeInitial()
262
+ ? /** @type {import("../Chunk").ChunkFilenameTemplate} */ (
263
+ outputOptions.htmlFilename
264
+ )
265
+ : /** @type {import("../Chunk").ChunkFilenameTemplate} */ (
266
+ outputOptions.htmlChunkFilename
267
+ );
268
+ }
269
+
270
+ /**
271
+ * Applies the plugin by registering its hooks on the compiler.
272
+ * @param {Compiler} compiler the compiler instance
273
+ * @returns {void}
274
+ */
275
+ apply(compiler) {
276
+ const { output } = compiler.options;
277
+ 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
+ });
293
+ }
294
+ } else if (scriptLoading === "blocking") {
295
+ scriptAttr = "";
296
+ }
297
+
298
+ // `output.html` (or an entry's `html`) wraps a non-HTML entry in a
299
+ // synthetic HTML module so the existing pipeline injects its JS/CSS
300
+ // chunks and applies the `template` option. `dependOn` ancestors are
301
+ // injected first so the page loads the shared/runtime chunks before
302
+ // the entry's own (see `collectHtmlEntryRequests`). `crossOriginLoading`
303
+ // and SRI are applied to the injected tags centrally in
304
+ // HtmlEntryDependency.
305
+ EntryOptionPlugin.getHooks(compiler).entry.tap(
306
+ PLUGIN_NAME,
307
+ (context, name, desc) => {
308
+ const html = desc.html !== undefined ? desc.html : htmlOption;
309
+ const imports = desc.import;
310
+ if (
311
+ !html ||
312
+ !imports ||
313
+ imports.every((r) => HTML_REQUEST_RE.test(r))
314
+ ) {
315
+ return;
316
+ }
317
+ const entries = compiler.options.entry;
318
+ const requests =
319
+ typeof entries === "object" && entries[name]
320
+ ? collectHtmlEntryRequests(name, entries)
321
+ : imports.filter((r) => !HTML_REQUEST_RE.test(r));
322
+ const links = [];
323
+ const scripts = [];
324
+ for (const r of requests) {
325
+ if (CSS_REQUEST_RE.test(r)) {
326
+ links.push(`<link rel="stylesheet" href="${r}">`);
327
+ } else {
328
+ scripts.push(`<script${scriptAttr} src="${r}"></script>`);
329
+ }
330
+ }
331
+ const htmlObj =
332
+ typeof html === "object"
333
+ ? html
334
+ : typeof htmlOption === "object"
335
+ ? htmlOption
336
+ : {};
337
+ const headTags = HtmlParser.buildHeadTags(htmlObj);
338
+ // Injected into webpack-generated pages only; each icon's href is a
339
+ // 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)
345
+ .map(([rel, icon]) => faviconLinkTag(rel, icon))
346
+ .join("");
347
+ const manifest =
348
+ typeof html === "object" && html.manifest !== undefined
349
+ ? html.manifest
350
+ : false;
351
+ const manifestTag = manifestLinkTag(manifest, name);
352
+ const inject = htmlObj.inject;
353
+ const scriptsInHead =
354
+ inject === "head" || (inject !== "body" && output.module);
355
+ const scriptsFirst = output.module || scriptAttr === " defer";
356
+ const headScripts = scriptsInHead ? scripts.join("") : "";
357
+ return `data:text/html,<!doctype html><html><head>${faviconTag}${manifestTag}${headTags}${
358
+ scriptsFirst
359
+ ? headScripts + links.join("")
360
+ : links.join("") + headScripts
361
+ }</head><body>${scriptsInHead ? "" : scripts.join("")}</body></html>`;
362
+ }
363
+ );
364
+
365
+ // Per-chunk `RawSource` reused across builds when bytes are unchanged:
366
+ // keeping identity stable avoids invalidating `RealContentHashPlugin|analyse`.
367
+ /** @type {Map<string, { content: string, source: import("webpack-sources").RawSource }>} */
368
+ const sentinelResolvedSourceCache = new Map();
369
+
370
+ // `<script src>` and `<link rel="modulepreload">` references collected
371
+ // by HtmlParser become real compilation entries here. The `script`
372
+ // and `script-module` groups are chained via a leader-only dependOn so
373
+ // they share a runtime — the first entry of the group owns it and
374
+ // every subsequent entry sets `dependOn: [leader]`. Modulepreload
375
+ // entries are emitted as independent entries (no dependOn) so they
376
+ // can never be imported as a runtime leader by a later script —
377
+ // that's what keeps the "preload but don't execute" contract of
378
+ // `<link rel="modulepreload">` intact.
379
+ // Per-compilation state: the HTML modules seen during make (so
380
+ // `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> }>} */
383
+ const compilationState = new WeakMap();
384
+ /**
385
+ * @param {import("../Compilation")} compilation compilation
386
+ * @returns {{ htmlModules: Set<import("../Module")>, stylesheetEntries: Set<string>, htmlAssetNames: Set<string> }} per-compilation state
387
+ */
388
+ const getState = (compilation) => {
389
+ let state = compilationState.get(compilation);
390
+ if (state === undefined) {
391
+ state = {
392
+ htmlModules: new Set(),
393
+ stylesheetEntries: new Set(),
394
+ htmlAssetNames: new Set()
395
+ };
396
+ compilationState.set(compilation, state);
397
+ }
398
+ return state;
399
+ };
400
+ compiler.hooks.finishMake.tapAsync(PLUGIN_NAME, (compilation, callback) => {
401
+ const { htmlModules, stylesheetEntries } = getState(compilation);
402
+
403
+ // Collect the entries an HTML module asks for. Only the script chains
404
+ // (`script`, `script-module`) share a runtime via a leader-only
405
+ // `dependOn`; `modulepreload`, `stylesheet` and `html` links are all
406
+ // independent entries (a CSS or page entry must not chain into a JS
407
+ // leader, or the chunk would mix unrelated outputs).
408
+ /** @type {(module: import("../Module")) => { context: string, request: string, name: string, dependOn: string[] | undefined }[]} */
409
+ const collectEntrySpecs = (module) => {
410
+ const { htmlEntries } = /** @type {HtmlModuleBuildInfo} */ (
411
+ module.buildInfo
412
+ );
413
+ if (!htmlEntries) return [];
414
+ const context = /** @type {string} */ (module.context);
415
+ const specs = [];
416
+ for (const [groupKind, group] of Object.entries(htmlEntries)) {
417
+ const isChainGroup =
418
+ groupKind === "script" || groupKind === "script-module";
419
+ /** @type {string | undefined} */
420
+ let leaderName;
421
+ for (const entry of group) {
422
+ const dependOn =
423
+ isChainGroup && leaderName !== undefined
424
+ ? [leaderName]
425
+ : undefined;
426
+ if (isChainGroup && leaderName === undefined) {
427
+ leaderName = entry.entryName;
428
+ }
429
+ // Stylesheet entries and `as="style"` preload/prefetch entries emit
430
+ // a CSS chunk, so they need the CSS filename template below.
431
+ if (groupKind === "stylesheet" || entry.css) {
432
+ stylesheetEntries.add(entry.entryName);
433
+ }
434
+ specs.push({
435
+ context,
436
+ request: entry.request,
437
+ name: entry.entryName,
438
+ dependOn
439
+ });
440
+ }
441
+ }
442
+ return specs;
443
+ };
444
+
445
+ // Push one collected reference as a compilation entry; resolves with
446
+ // the built entry module.
447
+ /** @type {(spec: { context: string, request: string, name: string, dependOn: string[] | undefined }) => Promise<import("../Module") | null>} */
448
+ const addEntry = (spec) =>
449
+ new Promise((resolve, reject) => {
450
+ compilation.addEntry(
451
+ spec.context,
452
+ EntryPlugin.createDependency(spec.request, { name: spec.name }),
453
+ {
454
+ name: spec.name,
455
+ // Each entry gets its own filename from the synthetic entry name so
456
+ // it doesn't collide with `output.filename`. CSS entries set their
457
+ // `.css` name via `cssFilenameTemplate` below; `html` page entries
458
+ // emit their file via `renderManifest`.
459
+ filename: compilation.outputOptions.chunkFilename || "[name].js",
460
+ dependOn: spec.dependOn
461
+ },
462
+ (err, entryModule) =>
463
+ err ? reject(err) : resolve(entryModule || null)
464
+ );
465
+ });
466
+
467
+ // Create one HTML module's entries. A `type: "html"` link is itself an
468
+ // HTML entry, so after it builds we recurse into it — the same handling
469
+ // every HTML entry already gets. `processed` guards diamonds and cycles.
470
+ /** @type {WeakSet<import("../Module")>} */
471
+ const processed = new WeakSet();
472
+ /** @type {(module: import("../Module")) => Promise<void>} */
473
+ const processEntry = async (module) => {
474
+ if (processed.has(module)) return;
475
+ processed.add(module);
476
+ await Promise.all(
477
+ collectEntrySpecs(module).map(async (spec) => {
478
+ const entryModule = await addEntry(spec);
479
+ if (entryModule && entryModule.type === HTML_MODULE_TYPE) {
480
+ await processEntry(entryModule);
481
+ }
482
+ })
483
+ );
484
+ };
485
+ // Seed with the HTML modules seen during make (config entries /
486
+ // imports, fresh or cache-restored); linked pages are reached by
487
+ // recursion above.
488
+ Promise.all([...htmlModules].map(processEntry)).then(
489
+ () => callback(),
490
+ callback
491
+ );
492
+ });
493
+
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;
503
+ // `"auto"` marks implicit enablement (no user rule for HTML files) — see
504
+ // `applyExperimentsDefaults`. Only then loaders win over the built-in type
505
+ // (e.g. html-webpack-plugin's template loader in its child compiler).
506
+ // TODO webpack 6: html defaults to `true`, drop this implicit-only fallback.
507
+ const implicitlyEnabled = compiler.options.experiments.html === "auto";
508
+ compiler.hooks.compilation.tap(
509
+ PLUGIN_NAME,
510
+ (compilation, { normalModuleFactory }) => {
511
+ if (implicitlyEnabled) {
512
+ implicitTypeLoaderFallback(
513
+ normalModuleFactory,
514
+ PLUGIN_NAME,
515
+ /\.html$/i,
516
+ HTML_MODULE_TYPE
517
+ );
518
+ }
519
+ const { htmlModules } = getState(compilation);
520
+ // Record HTML modules as they appear — freshly built
521
+ // (`succeedModule`) or restored from cache (`stillValidModule`) —
522
+ // so `finishMake` creates their entries without scanning every
523
+ // module in the graph. Tracking only records; entries are still
524
+ // added (and awaited) in `finishMake`.
525
+ const trackHtmlModule = (/** @type {import("../Module")} */ module) => {
526
+ if (module.type === HTML_MODULE_TYPE) htmlModules.add(module);
527
+ };
528
+ compilation.hooks.succeedModule.tap(PLUGIN_NAME, trackHtmlModule);
529
+ compilation.hooks.stillValidModule.tap(PLUGIN_NAME, trackHtmlModule);
530
+
531
+ // Resolve integrity and inline sentinels after `RealContentHashPlugin`
532
+ // so final bytes are in place. Only HTML pages carry these sentinels —
533
+ // never JS chunks that embed an HTML string.
534
+ // SRI only takes effect on a cross-origin subresource fetched
535
+ // with CORS; without `output.crossOriginLoading` the browser
536
+ // silently ignores `integrity` on cross-origin loads. Warn once
537
+ // so a CDN deployment doesn't ship no-op integrity attributes.
538
+ if (integrityOn && !compilation.outputOptions.crossOriginLoading) {
539
+ compilation.warnings.push(
540
+ new WebpackError(
541
+ '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.'
542
+ )
543
+ );
544
+ }
545
+ compilation.hooks.processAssets.tapPromise(
546
+ {
547
+ name: PLUGIN_NAME,
548
+ stage: Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_HASH + 1
549
+ },
550
+ async (assets) => {
551
+ const { htmlAssetNames } = getState(compilation);
552
+ const hooks = HtmlModulesPlugin.getCompilationHooks(compilation);
553
+ /** @type {Set<string>} */
554
+ const inlinedFiles = new Set();
555
+ for (const name of Object.keys(assets)) {
556
+ if (!htmlAssetNames.has(name)) continue;
557
+ const content = assets[name].source();
558
+ if (typeof content !== "string") continue;
559
+ 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
+ );
571
+ }
572
+ if (resolved.includes("__WEBPACK_HTML_INLINE__")) {
573
+ resolved = HtmlGenerator.resolveChunkInlineSentinels(
574
+ resolved,
575
+ compilation,
576
+ name,
577
+ inlinedFiles
578
+ );
579
+ }
580
+ // `injectTags` (add tags), `transformTags` (mutate/move/remove the
581
+ // page's own and injected tags), and CSP all run over a single
582
+ // parse: collect the tags/anchors once, let the hooks act, then
583
+ // render every edit — placement, attribute rewrites, moves,
584
+ // removals, CSP hashes/nonce/meta — in one pass. Injected inline
585
+ // `<script>`/`<style>` are hashed like the page's own.
586
+ const injected = await hooks.injectTags.promise([], {
587
+ outputName: name,
588
+ html: resolved
589
+ });
590
+ const transformTags = hooks.transformTags.taps.length > 0;
591
+ if (injected.length > 0 || transformTags || csp) {
592
+ const model = HtmlGenerator.collectHtml(resolved);
593
+ HtmlGenerator.addInjectedTags(model, injected);
594
+ if (transformTags) {
595
+ await hooks.transformTags.promise(model.tags, {
596
+ outputName: name,
597
+ html: resolved
598
+ });
599
+ }
600
+ resolved = HtmlGenerator.renderHtml(resolved, model, csp);
601
+ }
602
+ // Final, fully-resolved HTML — let plugins transform it (minify,
603
+ // inject a CSP meta, rewrite tags) before it is written.
604
+ resolved = await hooks.transformHtml.promise(resolved, {
605
+ outputName: name
606
+ });
607
+ if (resolved !== content) {
608
+ compilation.updateAsset(name, new RawSource(resolved));
609
+ }
610
+ await hooks.htmlEmitted.promise({ outputName: name });
611
+ }
612
+ // An inlined chunk file is dead weight once nothing else references
613
+ // it by URL (another page's tag, or the runtime's async chunk map);
614
+ // a content-hashed filename makes a substring hit a real reference.
615
+ // Materialize each other asset's source once (it can be expensive to
616
+ // render) and test all inlined files against it, rather than
617
+ // re-materializing every asset per inlined file.
618
+ if (inlinedFiles.size > 0) {
619
+ /** @type {Set<string>} */
620
+ const stillReferenced = new Set();
621
+ for (const name of Object.keys(compilation.assets)) {
622
+ if (
623
+ inlinedFiles.has(name) ||
624
+ stillReferenced.size === inlinedFiles.size
625
+ ) {
626
+ continue;
627
+ }
628
+ const source = compilation.assets[name].source();
629
+ if (typeof source !== "string") continue;
630
+ for (const file of inlinedFiles) {
631
+ if (!stillReferenced.has(file) && source.includes(file)) {
632
+ stillReferenced.add(file);
633
+ }
634
+ }
635
+ }
636
+ for (const file of inlinedFiles) {
637
+ if (!stillReferenced.has(file)) compilation.deleteAsset(file);
638
+ }
639
+ }
640
+ }
641
+ );
642
+
643
+ // CSS entries created by `<link rel="stylesheet">` in HTML need
644
+ // their `.css` filename set via `chunk.cssFilenameTemplate`
645
+ // (the field `CssModulesPlugin.getChunkFilenameTemplate` reads).
646
+ // Compilation only flows `options.filename` to `chunk.filenameTemplate`,
647
+ // which controls JS emit — there's no entry-level `cssFilename`.
648
+ // Set it ourselves after chunks are created so each stylesheet
649
+ // entry emits to a distinct file derived from `output.cssFilename`
650
+ // (or `output.cssChunkFilename` for non-initial CSS chunks).
651
+ compilation.hooks.afterChunks.tap(PLUGIN_NAME, () => {
652
+ const { stylesheetEntries } = getState(compilation);
653
+ if (stylesheetEntries.size === 0) return;
654
+ for (const entryName of stylesheetEntries) {
655
+ const entrypoint = compilation.entrypoints.get(entryName);
656
+ if (!entrypoint) continue;
657
+ const chunk = entrypoint.getEntrypointChunk();
658
+ if (!chunk) continue;
659
+ // Each html-derived stylesheet entry uses the
660
+ // `cssChunkFilename` template — even though the entry
661
+ // chunk technically `canBeInitial()`, we deliberately
662
+ // avoid `cssFilename` here because that template often
663
+ // has no per-entry placeholder (it's derived from
664
+ // `output.filename`, which can be a literal like
665
+ // `bundle0.js`), and multiple `<link rel="stylesheet">`
666
+ // tags would then collide on the same emitted `.css`
667
+ // file. `cssChunkFilename` is derived from
668
+ // `output.chunkFilename` which webpack auto-extends
669
+ // with `[id].` when needed, guaranteeing uniqueness.
670
+ chunk.cssFilenameTemplate =
671
+ compilation.outputOptions.cssChunkFilename;
672
+ }
673
+ });
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
+ compilation.dependencyTemplates.set(
727
+ StaticExportsDependency,
728
+ new StaticExportsDependency.Template()
729
+ );
730
+ // `ConstDependency` is used by HtmlParser to insert
731
+ // ` type="module"` into the rewritten <script> tag when
732
+ // `output.module` is on. Register its template so the HTML
733
+ // generator runs the insertion.
734
+ compilation.dependencyTemplates.set(
735
+ ConstDependency,
736
+ new ConstDependency.Template()
737
+ );
738
+ normalModuleFactory.hooks.createModuleClass
739
+ .for(HTML_MODULE_TYPE)
740
+ .tap(
741
+ PLUGIN_NAME,
742
+ (createData, _resolveData) => new HtmlModule(createData)
743
+ );
744
+ normalModuleFactory.hooks.createParser
745
+ .for(HTML_MODULE_TYPE)
746
+ .tap(PLUGIN_NAME, (parserOptions) => {
747
+ compiler.validate(
748
+ () => getSchema("HtmlParserOptions"),
749
+ parserOptions,
750
+ parserValidationOptions,
751
+ (options) =>
752
+ require("../../schemas/plugins/HtmlParserOptions.check")(
753
+ options
754
+ )
755
+ );
756
+ return new HtmlParser(parserOptions);
757
+ });
758
+
759
+ normalModuleFactory.hooks.createGenerator
760
+ .for(HTML_MODULE_TYPE)
761
+ .tap(PLUGIN_NAME, (generatorOptions) => {
762
+ compiler.validate(
763
+ () => getSchema("HtmlGeneratorOptions"),
764
+ generatorOptions,
765
+ generatorValidationOptions,
766
+ (options) =>
767
+ require("../../schemas/plugins/HtmlGeneratorOptions.check")(
768
+ options
769
+ )
770
+ );
771
+ return new HtmlGenerator(generatorOptions, compilation.moduleGraph);
772
+ });
773
+
774
+ NormalModule.getCompilationHooks(compilation).processResult.tap(
775
+ PLUGIN_NAME,
776
+ (result, module) => {
777
+ if (module.type === HTML_MODULE_TYPE) {
778
+ const [source, ...rest] = result;
779
+ // `applyTemplate` is a no-op unless `module.parser.html.template`
780
+ // is set. Running it here (where the returned source becomes the
781
+ // module's stored source) keeps the parser's dependency offsets
782
+ // and the generator's render base in sync.
783
+ const parser = /** @type {HtmlParser} */ (module.parser);
784
+
785
+ return [parser.applyTemplate(removeBOM(source), module), ...rest];
786
+ }
787
+
788
+ return result;
789
+ }
790
+ );
791
+
792
+ // Emit extracted `.html` files for any HTML module that opted
793
+ // into extraction. The opt-in is computed by
794
+ // `HtmlGenerator#_shouldExtract`: `module.generator.html.extract:
795
+ // true` always extracts, `false` never extracts, and when
796
+ // `extract` is unset the generator extracts iff the HTML module
797
+ // is a compilation entry — the iteration below picks up only
798
+ // modules whose generator reported the `html` source type, so
799
+ // that decision is honored implicitly. The HTML content is read
800
+ // from the generator's secondary `"html"` source type (see
801
+ // HtmlGenerator#generate). The filename template comes from
802
+ // `output.htmlFilename` (initial chunks) or
803
+ // `output.htmlChunkFilename` (non-initial chunks), mirroring
804
+ // the CSS pipeline. Path data follows the asset-module pattern —
805
+ // `module` + a relative source `filename`, with `chunk`
806
+ // intentionally omitted so `[name]` resolves to the HTML
807
+ // source's basename (e.g. `page` for `./page.html`) rather
808
+ // than the importing chunk's name (e.g. `main`). A per-module
809
+ // content hash is computed from the rewritten HTML so the
810
+ // template's `[contenthash]` placeholder works; the
811
+ // compilation hash is also forwarded so `[fullhash]` /
812
+ // `[hash]` work in user-supplied templates.
813
+
814
+ // Sentinel-resolved content and its content hash depend only on
815
+ // the HTML-type module source — not on the chunk or output
816
+ // filename — yet `renderManifest` runs per `(chunk, module)`.
817
+ // Memoize so a module landing in multiple chunks resolves and
818
+ // hashes its sentinels once. Scoped to this compilation because
819
+ // sentinel resolution embeds chunk filenames, which change
820
+ // across rebuilds; weakly keyed by source so entries release.
821
+ /** @type {WeakMap<import("webpack-sources").Source, { resolvedContent: string, contentHash: string }>} */
822
+ const resolvedSentinelHashCache = new WeakMap();
823
+
824
+ // Compute a linked/entry HTML page's emitted filename + chunk-URL-resolved
825
+ // content + content hash for one (module, chunk). Shared by the emit loop
826
+ // below and the page-link resolver. The content hash covers only the
827
+ // chunk-URL-resolved source — links to *other* pages stay sentinels here,
828
+ // so a page's filename doesn't depend on the filenames of pages it links to.
829
+ const computePageEmit = (
830
+ /** @type {NormalModule} */ module,
831
+ /** @type {import("../Chunk")} */ chunk
832
+ ) => {
833
+ const { chunkGraph, outputOptions } = compilation;
834
+ const codeGenResult =
835
+ /** @type {import("../CodeGenerationResults")} */ (
836
+ compilation.codeGenerationResults
837
+ ).get(module, chunk.runtime);
838
+ const placeholderSource = codeGenResult.sources.get(HTML_TYPE);
839
+ if (!placeholderSource) return undefined;
840
+ let cached = resolvedSentinelHashCache.get(placeholderSource);
841
+ if (cached === undefined) {
842
+ // Resolve chunk-URL sentinels *before* hashing so the HTML's
843
+ // `[contenthash]` invalidates with the referenced chunks'
844
+ // filenames. Inlined chunks have no URL, so tag their inline
845
+ // sentinels with the chunk content hash — that keeps the emitted
846
+ // bytes (and RealContentHashPlugin's later recompute)
847
+ // content-dependent, so the page hash tracks inlined content too.
848
+ // Asset URL sentinels (from `HtmlEntryDependency` resource-hint
849
+ // tags) resolve here too — deferred from template.apply so it
850
+ // doesn't race with asset-module codegen.
851
+ const resolvedContent = HtmlGenerator.resolveAssetUrlSentinels(
852
+ HtmlGenerator.embedInlineChunkHashes(
853
+ HtmlGenerator.resolveChunkUrlSentinels(
854
+ /** @type {string} */ (placeholderSource.source()),
855
+ compilation
856
+ ),
857
+ compilation
858
+ ),
859
+ compilation
860
+ );
861
+ cached = {
862
+ resolvedContent,
863
+ contentHash: HtmlModulesPlugin.computeContentHash(
864
+ resolvedContent,
865
+ outputOptions
866
+ )
867
+ };
868
+ resolvedSentinelHashCache.set(placeholderSource, cached);
869
+ }
870
+ const resource = module.getResource() || module.resource;
871
+ // Synthetic `output.html` entries are `data:text/html` modules with no
872
+ // real basename — name the file after the entry instead.
873
+ const sourceFilename =
874
+ resource.startsWith("data:text/html") && chunk.name
875
+ ? chunk.name
876
+ : makePathsRelative(
877
+ compiler.context,
878
+ /** @type {string} */ (resource),
879
+ compiler.root
880
+ ).replace(/^\.\//, "");
881
+ const filenameTemplate = HtmlModulesPlugin.getChunkFilenameTemplate(
882
+ chunk,
883
+ outputOptions
884
+ );
885
+ const { path: filename, info } = compilation.getPathWithInfo(
886
+ /** @type {import("../TemplatedPathPlugin").TemplatePath} */
887
+ (filenameTemplate),
888
+ {
889
+ module,
890
+ runtime: chunk.runtime,
891
+ chunkGraph,
892
+ contentHash: cached.contentHash,
893
+ contentHashType: HTML_TYPE,
894
+ filename: sourceFilename,
895
+ hash: compilation.hash
896
+ }
897
+ );
898
+ return {
899
+ resolvedContent: cached.resolvedContent,
900
+ contentHash: cached.contentHash,
901
+ filename,
902
+ info
903
+ };
904
+ };
905
+
906
+ // Emitted filename of a linked `type: "html"` page, keyed by its entry
907
+ // name. Looked up from the page's own entry chunk so it's independent of
908
+ // chunk render order; cached for the compilation.
909
+ /** @type {Map<string, string>} */
910
+ const htmlPageFilenameCache = new Map();
911
+ const computePageFilenameByEntry = (
912
+ /** @type {string} */ entryName
913
+ ) => {
914
+ const cached = htmlPageFilenameCache.get(entryName);
915
+ if (cached !== undefined) return cached;
916
+ let filename = "data:,";
917
+ const entrypoint = compilation.entrypoints.get(entryName);
918
+ const chunk = entrypoint && entrypoint.getEntrypointChunk();
919
+ if (chunk) {
920
+ const modules =
921
+ compilation.chunkGraph.getOrderedChunkModulesIterableBySourceType(
922
+ chunk,
923
+ HTML_TYPE,
924
+ compareModulesByFullName(compilation.compiler)
925
+ );
926
+ const module = modules && modules[Symbol.iterator]().next().value;
927
+ if (module) {
928
+ const emit = computePageEmit(
929
+ /** @type {NormalModule} */ (module),
930
+ chunk
931
+ );
932
+ if (emit) filename = emit.filename;
933
+ }
934
+ }
935
+ htmlPageFilenameCache.set(entryName, filename);
936
+ return filename;
937
+ };
938
+
939
+ compilation.hooks.renderManifest.tap(
940
+ PLUGIN_NAME,
941
+ (result, { chunk }) => {
942
+ // HMR's `HotUpdateChunk`s flow through the same hook
943
+ // but aren't real output chunks — extracting `.html`
944
+ // for them would create stray hot-update HTML files.
945
+ // `CssModulesPlugin` early-returns for the same reason.
946
+ if (chunk instanceof HotUpdateChunk) return result;
947
+ const { chunkGraph } = compilation;
948
+ const modules =
949
+ chunkGraph.getOrderedChunkModulesIterableBySourceType(
950
+ chunk,
951
+ HTML_TYPE,
952
+ compareModulesByFullName(compilation.compiler)
953
+ );
954
+ if (!modules) return result;
955
+ const outputOptions = compilation.outputOptions;
956
+ for (const module of modules) {
957
+ const normalModule = /** @type {NormalModule} */ (module);
958
+ // `<iframe srcdoc>` modules expose `html` only so HtmlInlineHtmlDependency
959
+ // can write the processed markup back into the host attribute — they are
960
+ // never standalone pages. `generator.extract: "inline"` marks them so no
961
+ // `.html` file is emitted; without this they'd collide on the
962
+ // `data:text/html` → chunk-name path (every srcdoc module in a chunk would
963
+ // emit `<chunk>.html`). An O(1) flag check, not a scan.
964
+ const generatorOptions = normalModule.generatorOptions;
965
+ if (generatorOptions && generatorOptions.extract === "inline") {
966
+ continue;
967
+ }
968
+
969
+ const emit = computePageEmit(normalModule, chunk);
970
+ if (!emit) continue;
971
+ const { resolvedContent, contentHash, filename, info } = emit;
972
+
973
+ // Resolve any remaining `[webpack/auto]` placeholders to an undo
974
+ // path computed from the emitted HTML's location, so asset/chunk
975
+ // URLs stay relative to `output.path` even when the page emits into
976
+ // a subdirectory. A relative `<base href>` prepends `../`s so the
977
+ // base can't misdirect the rewritten URLs (see `HtmlParser`).
978
+ const basePrefix =
979
+ /** @type {HtmlModuleBuildInfo} */ (normalModule.buildInfo)
980
+ .baseUrlPrefix || "";
981
+ const undoPath =
982
+ basePrefix +
983
+ getUndoPath(
984
+ filename,
985
+ /** @type {string} */ (outputOptions.path),
986
+ false
987
+ );
988
+ // Resolve linked-page (`type: "html"`) sentinels to each page's
989
+ // emitted filename before the undo path, so the href is relative to
990
+ // this page.
991
+ const finalContent = HtmlGenerator.resolveHtmlPageUrlSentinels(
992
+ resolvedContent,
993
+ computePageFilenameByEntry
994
+ )
995
+ .split(autoPlaceholder)
996
+ .join(undoPath);
997
+ const finalSource = new RawSource(finalContent);
998
+ // The same HTML module can land in multiple chunks with different
999
+ // `htmlFilename`/`htmlChunkFilename` shapes → different `undoPath`s and
1000
+ // final content for the same module id. Include the emitted filename in
1001
+ // the asset cache key and the post-undo-path content in the hash so the
1002
+ // asset cache can't reuse one variant's bytes at another variant's URL.
1003
+ // Unchanged content reuses the memoized hash instead of re-digesting.
1004
+ const finalContentHash =
1005
+ finalContent === resolvedContent
1006
+ ? contentHash
1007
+ : HtmlModulesPlugin.computeContentHash(
1008
+ finalContent,
1009
+ outputOptions
1010
+ );
1011
+
1012
+ // Track HTML pages for the integrity sentinel pass (never JS chunks).
1013
+ getState(compilation).htmlAssetNames.add(filename);
1014
+
1015
+ result.push({
1016
+ render: () => finalSource,
1017
+ filename,
1018
+ info,
1019
+ auxiliary: true,
1020
+ identifier: `htmlModule${chunkGraph.getModuleId(
1021
+ module
1022
+ )}|${filename}`,
1023
+ hash: finalContentHash
1024
+ });
1025
+ }
1026
+ return result;
1027
+ }
1028
+ );
1029
+
1030
+ // Resolve sentinels at JS chunk render time so later passes
1031
+ // (SourceMapDevToolPlugin, size optimizers, RealContentHash) see resolved bytes.
1032
+ const jsHooks =
1033
+ JavascriptModulesPlugin.getCompilationHooks(compilation);
1034
+ jsHooks.render.tap(PLUGIN_NAME, (source, renderContext) => {
1035
+ // No HTML modules ⇒ no sentinels; skip materializing the JS source.
1036
+ if (htmlModules.size === 0) return source;
1037
+ const raw = source.source();
1038
+ if (typeof raw !== "string") return source;
1039
+ if (
1040
+ !raw.includes("__WEBPACK_HTML_CHUNK_URL__") &&
1041
+ !raw.includes("__WEBPACK_HTML_PAGE_URL__") &&
1042
+ !raw.includes("__WEBPACK_HTML_INTEGRITY__") &&
1043
+ !raw.includes("__WEBPACK_HTML_INLINE__") &&
1044
+ !raw.includes("__WEBPACK_HTML_ASSET_URL__")
1045
+ ) {
1046
+ return source;
1047
+ }
1048
+ // Strip integrity and inline sentinels (not resolve): a JS chunk
1049
+ // can't hold real SRI hashes for its own not-yet-final bytes, and
1050
+ // 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
1058
+ )
1059
+ .split(autoPlaceholder)
1060
+ .join("")
1061
+ ).replace(
1062
+ /__WEBPACK_HTML_INLINE__[0-9a-f]+__[a-z]+(?:__[0-9a-f]+)?__END__/g,
1063
+ ""
1064
+ );
1065
+ if (resolved === raw) return source;
1066
+ const chunkId = String(renderContext.chunk.id);
1067
+ const prior = sentinelResolvedSourceCache.get(chunkId);
1068
+ if (prior !== undefined && prior.content === resolved) {
1069
+ return prior.source;
1070
+ }
1071
+ const newSource = new RawSource(resolved);
1072
+ sentinelResolvedSourceCache.set(chunkId, {
1073
+ content: resolved,
1074
+ source: newSource
1075
+ });
1076
+ return newSource;
1077
+ });
1078
+
1079
+ // Prune cache entries for chunks no longer in the graph so a
1080
+ // long watch session can't accumulate stale entries.
1081
+ compilation.hooks.afterSeal.tap(PLUGIN_NAME, () => {
1082
+ if (sentinelResolvedSourceCache.size === 0) return;
1083
+ const live = new Set();
1084
+ for (const chunk of compilation.chunks) {
1085
+ live.add(String(chunk.id));
1086
+ }
1087
+ for (const id of sentinelResolvedSourceCache.keys()) {
1088
+ if (!live.has(id)) sentinelResolvedSourceCache.delete(id);
1089
+ }
1090
+ });
1091
+ }
1092
+ );
1093
+ }
1094
+ }
1095
+
1096
+ /**
1097
+ * Per-compilation hooks for the experimental HTML support.
1098
+ * @param {Compilation} compilation the compilation
1099
+ * @returns {HtmlCompilationHooks} the hooks
1100
+ */
1101
+ 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
+ })
1109
+ );
1110
+
1111
+ module.exports = HtmlModulesPlugin;