@depup/webpack 5.106.1-depup.0 → 5.109.2-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 (669) hide show
  1. package/README.md +9 -11
  2. package/bin/webpack.js +12 -0
  3. package/changes.json +16 -24
  4. package/hot/dev-server.js +2 -0
  5. package/lib/APIPlugin.js +60 -35
  6. package/lib/AsyncDependenciesBlock.js +3 -0
  7. package/lib/AutomaticPrefetchPlugin.js +6 -1
  8. package/lib/BannerPlugin.js +13 -5
  9. package/lib/Cache.js +27 -5
  10. package/lib/CacheFacade.js +41 -0
  11. package/lib/Chunk.js +71 -25
  12. package/lib/ChunkGraph.js +153 -19
  13. package/lib/ChunkGroup.js +115 -28
  14. package/lib/ChunkTemplate.js +9 -0
  15. package/lib/CircularModulesPlugin.js +190 -0
  16. package/lib/CleanPlugin.js +27 -28
  17. package/lib/CodeGenerationResults.js +19 -0
  18. package/lib/CompatibilityPlugin.js +85 -37
  19. package/lib/Compilation.js +656 -112
  20. package/lib/Compiler.js +109 -35
  21. package/lib/ConcatenationScope.js +34 -4
  22. package/lib/ConditionalInitFragment.js +6 -0
  23. package/lib/ConstPlugin.js +15 -12
  24. package/lib/ContextExclusionPlugin.js +3 -1
  25. package/lib/ContextModule.js +345 -55
  26. package/lib/ContextModuleFactory.js +193 -51
  27. package/lib/ContextReplacementPlugin.js +8 -1
  28. package/lib/DefinePlugin.js +537 -139
  29. package/lib/DependenciesBlock.js +6 -1
  30. package/lib/Dependency.js +159 -11
  31. package/lib/DependencyTemplate.js +7 -1
  32. package/lib/DependencyTemplates.js +4 -0
  33. package/lib/DotenvPlugin.js +3 -0
  34. package/lib/DynamicEntryPlugin.js +3 -1
  35. package/lib/EntryOptionPlugin.js +42 -2
  36. package/lib/EntryPlugin.js +4 -1
  37. package/lib/Entrypoint.js +5 -1
  38. package/lib/EnvironmentPlugin.js +3 -2
  39. package/lib/ErrorHelpers.js +7 -0
  40. package/lib/EvalDevToolModulePlugin.js +3 -1
  41. package/lib/EvalSourceMapDevToolPlugin.js +11 -11
  42. package/lib/ExportsInfo.js +421 -113
  43. package/lib/ExportsInfoApiPlugin.js +4 -3
  44. package/lib/ExternalModule.js +381 -80
  45. package/lib/ExternalModuleFactoryPlugin.js +75 -3
  46. package/lib/ExternalsPlugin.js +3 -1
  47. package/lib/FileSystemInfo.js +701 -175
  48. package/lib/FlagAllModulesAsUsedPlugin.js +3 -6
  49. package/lib/FlagDependencyExportsPlugin.js +82 -9
  50. package/lib/FlagDependencyUsagePlugin.js +115 -8
  51. package/lib/FlagEntryExportAsUsedPlugin.js +4 -1
  52. package/lib/Generator.js +24 -3
  53. package/lib/HotModuleReplacementPlugin.js +110 -44
  54. package/lib/IgnorePlugin.js +5 -2
  55. package/lib/IgnoreWarningsPlugin.js +2 -1
  56. package/lib/InitFragment.js +33 -30
  57. package/lib/JavascriptMetaInfoPlugin.js +9 -6
  58. package/lib/LazyBarrel.js +389 -0
  59. package/lib/LibraryTemplatePlugin.js +2 -1
  60. package/lib/LoaderOptionsPlugin.js +3 -1
  61. package/lib/LoaderTargetPlugin.js +3 -1
  62. package/lib/MainTemplate.js +15 -0
  63. package/lib/ManifestPlugin.js +9 -2
  64. package/lib/Module.js +121 -57
  65. package/lib/ModuleFactory.js +6 -1
  66. package/lib/ModuleFilenameHelpers.js +18 -4
  67. package/lib/ModuleGraph.js +69 -2
  68. package/lib/ModuleGraphConnection.js +9 -0
  69. package/lib/ModuleInfoHeaderPlugin.js +5 -0
  70. package/lib/ModuleNotFoundError.js +3 -83
  71. package/lib/ModuleProfile.js +27 -1
  72. package/lib/ModuleSourceTypeConstants.js +52 -19
  73. package/lib/ModuleTemplate.js +10 -0
  74. package/lib/ModuleTypeConstants.js +20 -4
  75. package/lib/MultiCompiler.js +59 -4
  76. package/lib/MultiStats.js +9 -0
  77. package/lib/MultiWatching.js +6 -0
  78. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  79. package/lib/NodeStuffPlugin.js +78 -46
  80. package/lib/NormalModule.js +519 -206
  81. package/lib/NormalModuleFactory.js +156 -31
  82. package/lib/NormalModuleReplacementPlugin.js +3 -1
  83. package/lib/NullFactory.js +1 -0
  84. package/lib/OptionsApply.js +1 -0
  85. package/lib/Parser.js +3 -1
  86. package/lib/PlatformPlugin.js +2 -1
  87. package/lib/PrefetchPlugin.js +4 -1
  88. package/lib/ProgressPlugin.js +351 -161
  89. package/lib/ProvidePlugin.js +6 -3
  90. package/lib/RawModule.js +32 -16
  91. package/lib/RecordIdsPlugin.js +9 -0
  92. package/lib/RequestShortener.js +8 -0
  93. package/lib/ResolverFactory.js +5 -0
  94. package/lib/RuntimeGlobals.js +58 -5
  95. package/lib/RuntimeModule.js +22 -7
  96. package/lib/RuntimePlugin.js +123 -118
  97. package/lib/RuntimeTemplate.js +616 -37
  98. package/lib/SelfModuleFactory.js +3 -0
  99. package/lib/SourceMapDevToolModuleOptionsPlugin.js +2 -0
  100. package/lib/SourceMapDevToolPlugin.js +341 -63
  101. package/lib/Stats.js +6 -0
  102. package/lib/Template.js +52 -6
  103. package/lib/TemplatedPathPlugin.js +505 -138
  104. package/lib/UseStrictPlugin.js +3 -2
  105. package/lib/WarnCaseSensitiveModulesPlugin.js +72 -3
  106. package/lib/WarnDeprecatedOptionPlugin.js +6 -2
  107. package/lib/WarnNoModeSetPlugin.js +18 -2
  108. package/lib/WatchIgnorePlugin.js +5 -1
  109. package/lib/Watching.js +25 -3
  110. package/lib/WebpackError.js +3 -74
  111. package/lib/WebpackIsIncludedPlugin.js +4 -2
  112. package/lib/WebpackOptionsApply.js +88 -25
  113. package/lib/WebpackOptionsDefaulter.js +1 -0
  114. package/lib/asset/AssetBytesGenerator.js +28 -10
  115. package/lib/asset/AssetBytesParser.js +1 -0
  116. package/lib/asset/AssetGenerator.js +199 -60
  117. package/lib/asset/AssetModule.js +47 -0
  118. package/lib/asset/AssetModulesPlugin.js +115 -24
  119. package/lib/asset/AssetParser.js +4 -2
  120. package/lib/asset/AssetSourceGenerator.js +26 -8
  121. package/lib/asset/AssetSourceParser.js +1 -0
  122. package/lib/asset/RawDataUrlModule.js +23 -13
  123. package/lib/asset/WebManifestGenerator.js +164 -0
  124. package/lib/asset/WebManifestParser.js +130 -0
  125. package/lib/async-modules/AsyncModuleHelpers.js +1 -0
  126. package/lib/async-modules/AwaitDependenciesInitFragment.js +18 -4
  127. package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
  128. package/lib/async-modules/isGeneratorLowered.js +26 -0
  129. package/lib/buildChunkGraph.js +107 -15
  130. package/lib/bun/BunTargetPlugin.js +42 -0
  131. package/lib/cache/AddBuildDependenciesPlugin.js +3 -1
  132. package/lib/cache/AddManagedPathsPlugin.js +5 -1
  133. package/lib/cache/IdleFileCachePlugin.js +6 -1
  134. package/lib/cache/MemoryCachePlugin.js +1 -1
  135. package/lib/cache/MemoryWithGcCachePlugin.js +4 -1
  136. package/lib/cache/PackFileCacheStrategy.js +302 -12
  137. package/lib/cache/ResolverCachePlugin.js +12 -1
  138. package/lib/cache/getLazyHashedEtag.js +13 -2
  139. package/lib/cache/mergeEtags.js +4 -0
  140. package/lib/cli.js +142 -20
  141. package/lib/config/browserslistTargetHandler.js +141 -0
  142. package/lib/config/defaults.js +612 -43
  143. package/lib/config/defineConfig.js +31 -0
  144. package/lib/config/normalization.js +46 -1
  145. package/lib/config/target.js +200 -2
  146. package/lib/container/ContainerEntryDependency.js +2 -0
  147. package/lib/container/ContainerEntryModule.js +27 -14
  148. package/lib/container/ContainerEntryModuleFactory.js +1 -0
  149. package/lib/container/ContainerExposedDependency.js +6 -2
  150. package/lib/container/ContainerPlugin.js +2 -1
  151. package/lib/container/ContainerReferencePlugin.js +3 -2
  152. package/lib/container/FallbackDependency.js +9 -7
  153. package/lib/container/FallbackItemDependency.js +1 -0
  154. package/lib/container/FallbackModule.js +22 -9
  155. package/lib/container/FallbackModuleFactory.js +1 -0
  156. package/lib/container/HoistContainerReferencesPlugin.js +47 -55
  157. package/lib/container/ModuleFederationPlugin.js +21 -29
  158. package/lib/container/RemoteModule.js +33 -10
  159. package/lib/container/RemoteRuntimeModule.js +15 -12
  160. package/lib/container/RemoteToExternalDependency.js +1 -0
  161. package/lib/container/options.js +7 -0
  162. package/lib/css/CssGenerator.js +540 -272
  163. package/lib/css/CssInjectStyleRuntimeModule.js +86 -70
  164. package/lib/css/CssLoadingRuntimeModule.js +173 -81
  165. package/lib/{CssModule.js → css/CssModule.js} +72 -37
  166. package/lib/css/CssModulesPlugin.js +371 -208
  167. package/lib/css/CssParser.js +3538 -1963
  168. package/lib/css/syntax.js +4155 -0
  169. package/lib/debug/ProfilingPlugin.js +33 -2
  170. package/lib/deno/DenoTargetPlugin.js +41 -0
  171. package/lib/dependencies/AMDDefineDependency.js +29 -17
  172. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +19 -6
  173. package/lib/dependencies/AMDPlugin.js +6 -3
  174. package/lib/dependencies/AMDRequireArrayDependency.js +13 -11
  175. package/lib/dependencies/AMDRequireContextDependency.js +10 -11
  176. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -0
  177. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +28 -14
  178. package/lib/dependencies/AMDRequireDependency.js +28 -20
  179. package/lib/dependencies/AMDRequireItemDependency.js +1 -0
  180. package/lib/dependencies/AMDRuntimeModules.js +3 -0
  181. package/lib/dependencies/CachedConstDependency.js +9 -1
  182. package/lib/dependencies/CommonJsDependencyHelpers.js +104 -0
  183. package/lib/dependencies/CommonJsExportRequireDependency.js +157 -38
  184. package/lib/dependencies/CommonJsExportsDependency.js +74 -20
  185. package/lib/dependencies/CommonJsExportsParserPlugin.js +246 -15
  186. package/lib/dependencies/CommonJsFullRequireDependency.js +91 -27
  187. package/lib/dependencies/CommonJsImportsParserPlugin.js +189 -24
  188. package/lib/dependencies/CommonJsPlugin.js +7 -4
  189. package/lib/dependencies/CommonJsRequireContextDependency.js +13 -13
  190. package/lib/dependencies/CommonJsRequireDependency.js +135 -13
  191. package/lib/dependencies/CommonJsSelfReferenceDependency.js +60 -16
  192. package/lib/dependencies/ConstDependency.js +22 -12
  193. package/lib/dependencies/ContextDependency.js +13 -2
  194. package/lib/dependencies/ContextDependencyHelpers.js +7 -4
  195. package/lib/dependencies/ContextDependencyTemplateAsId.js +2 -1
  196. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +1 -0
  197. package/lib/dependencies/ContextElementDependency.js +27 -14
  198. package/lib/dependencies/CreateRequireParserPlugin.js +14 -7
  199. package/lib/dependencies/CreateScriptUrlDependency.js +9 -7
  200. package/lib/dependencies/CriticalDependencyWarning.js +3 -1
  201. package/lib/dependencies/CssIcssExportDependency.js +681 -367
  202. package/lib/dependencies/CssIcssImportDependency.js +62 -17
  203. package/lib/dependencies/CssIcssSymbolDependency.js +36 -17
  204. package/lib/dependencies/CssImportDependency.js +37 -1
  205. package/lib/dependencies/CssUrlDependency.js +87 -14
  206. package/lib/dependencies/DelegatedSourceDependency.js +1 -0
  207. package/lib/dependencies/DllEntryDependency.js +12 -13
  208. package/lib/dependencies/DynamicExports.js +5 -0
  209. package/lib/dependencies/EntryDependency.js +1 -0
  210. package/lib/dependencies/ExportBindingInitFragment.js +164 -0
  211. package/lib/dependencies/ExportsInfoDependency.js +18 -12
  212. package/lib/dependencies/ExternalModuleDependency.js +13 -5
  213. package/lib/dependencies/ExternalModuleInitFragment.js +10 -5
  214. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +19 -12
  215. package/lib/dependencies/HarmonyAcceptDependency.js +24 -26
  216. package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -0
  217. package/lib/dependencies/HarmonyCompatibilityDependency.js +33 -14
  218. package/lib/dependencies/HarmonyDetectionParserPlugin.js +108 -30
  219. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +34 -3
  220. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +70 -33
  221. package/lib/dependencies/HarmonyExportExpressionDependency.js +133 -43
  222. package/lib/dependencies/HarmonyExportHeaderDependency.js +11 -9
  223. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +268 -44
  224. package/lib/dependencies/HarmonyExportInitFragment.js +28 -20
  225. package/lib/dependencies/HarmonyExportSpecifierDependency.js +88 -18
  226. package/lib/dependencies/HarmonyExports.js +6 -1
  227. package/lib/dependencies/HarmonyImportDependency.js +60 -4
  228. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +139 -146
  229. package/lib/dependencies/HarmonyImportGuard.js +427 -0
  230. package/lib/dependencies/HarmonyImportSideEffectDependency.js +22 -1
  231. package/lib/dependencies/HarmonyImportSpecifierDependency.js +146 -24
  232. package/lib/{HarmonyLinkingError.js → dependencies/HarmonyLinkingError.js} +6 -3
  233. package/lib/dependencies/HarmonyModulesPlugin.js +11 -1
  234. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +2 -1
  235. package/lib/dependencies/HtmlEntryDependency.js +1295 -0
  236. package/lib/dependencies/HtmlInlineHtmlDependency.js +107 -0
  237. package/lib/dependencies/HtmlInlineScriptDependency.js +126 -0
  238. package/lib/dependencies/HtmlInlineStyleDependency.js +152 -0
  239. package/lib/dependencies/HtmlSourceDependency.js +172 -0
  240. package/lib/dependencies/ImportContextDependency.js +9 -9
  241. package/lib/dependencies/ImportDependency.js +92 -3
  242. package/lib/dependencies/ImportEagerDependency.js +2 -0
  243. package/lib/dependencies/ImportMetaContextDependency.js +1 -0
  244. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +35 -19
  245. package/lib/dependencies/ImportMetaContextPlugin.js +40 -8
  246. package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
  247. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
  248. package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
  249. package/lib/dependencies/ImportMetaHotAcceptDependency.js +2 -0
  250. package/lib/dependencies/ImportMetaHotDeclineDependency.js +2 -0
  251. package/lib/dependencies/ImportMetaPlugin.js +595 -209
  252. package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
  253. package/lib/dependencies/ImportParserPlugin.js +114 -27
  254. package/lib/dependencies/ImportPhase.js +17 -11
  255. package/lib/dependencies/ImportPlugin.js +2 -1
  256. package/lib/dependencies/ImportWeakDependency.js +3 -0
  257. package/lib/dependencies/JsonExportsDependency.js +15 -10
  258. package/lib/dependencies/LoaderDependency.js +2 -0
  259. package/lib/dependencies/LoaderImportDependency.js +3 -0
  260. package/lib/dependencies/LoaderPlugin.js +9 -2
  261. package/lib/dependencies/LocalModule.js +15 -12
  262. package/lib/dependencies/LocalModuleDependency.js +15 -13
  263. package/lib/dependencies/LocalModulesHelpers.js +3 -0
  264. package/lib/dependencies/ModuleDecoratorDependency.js +16 -10
  265. package/lib/dependencies/ModuleDependency.js +14 -0
  266. package/lib/dependencies/ModuleDependencyTemplateAsId.js +1 -0
  267. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +1 -0
  268. package/lib/dependencies/ModuleHotAcceptDependency.js +2 -0
  269. package/lib/dependencies/ModuleHotDeclineDependency.js +2 -0
  270. package/lib/dependencies/ModuleInitFragmentDependency.js +19 -11
  271. package/lib/dependencies/NullDependency.js +2 -0
  272. package/lib/dependencies/PrefetchDependency.js +1 -0
  273. package/lib/dependencies/ProvidedDependency.js +36 -27
  274. package/lib/dependencies/PureExpressionDependency.js +14 -10
  275. package/lib/dependencies/RequireContextDependency.js +1 -0
  276. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -1
  277. package/lib/dependencies/RequireContextPlugin.js +2 -1
  278. package/lib/dependencies/RequireEnsureDependenciesBlock.js +1 -0
  279. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +4 -6
  280. package/lib/dependencies/RequireEnsureDependency.js +16 -13
  281. package/lib/dependencies/RequireEnsureItemDependency.js +1 -0
  282. package/lib/dependencies/RequireEnsurePlugin.js +2 -1
  283. package/lib/dependencies/RequireHeaderDependency.js +7 -4
  284. package/lib/dependencies/RequireIncludeDependency.js +2 -0
  285. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +11 -12
  286. package/lib/dependencies/RequireIncludePlugin.js +2 -1
  287. package/lib/{RequireJsStuffPlugin.js → dependencies/RequireJsStuffPlugin.js} +9 -8
  288. package/lib/dependencies/RequireResolveContextDependency.js +10 -11
  289. package/lib/dependencies/RequireResolveDependency.js +2 -0
  290. package/lib/dependencies/RequireResolveHeaderDependency.js +8 -5
  291. package/lib/dependencies/RuntimeRequirementsDependency.js +11 -8
  292. package/lib/dependencies/StaticExportsDependency.js +13 -10
  293. package/lib/dependencies/SystemPlugin.js +9 -6
  294. package/lib/dependencies/SystemRuntimeModule.js +1 -0
  295. package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
  296. package/lib/dependencies/URLContextDependency.js +8 -7
  297. package/lib/dependencies/URLDependency.js +157 -33
  298. package/lib/dependencies/URLPlugin.js +2 -0
  299. package/lib/dependencies/UnsupportedDependency.js +12 -13
  300. package/lib/dependencies/WebAssemblyExportImportedDependency.js +15 -16
  301. package/lib/dependencies/WebAssemblyImportDependency.js +19 -18
  302. package/lib/dependencies/WebpackIsIncludedDependency.js +3 -0
  303. package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +364 -114
  304. package/lib/dependencies/WorkerDependency.js +111 -27
  305. package/lib/dependencies/WorkletDependency.js +278 -0
  306. package/lib/dependencies/getFunctionExpression.js +1 -0
  307. package/lib/dependencies/processExportInfo.js +14 -11
  308. package/lib/{DelegatedModule.js → dll/DelegatedModule.js} +71 -44
  309. package/lib/{DelegatedModuleFactoryPlugin.js → dll/DelegatedModuleFactoryPlugin.js} +27 -4
  310. package/lib/{DelegatedPlugin.js → dll/DelegatedPlugin.js} +5 -3
  311. package/lib/{DllEntryPlugin.js → dll/DllEntryPlugin.js} +9 -5
  312. package/lib/{DllModule.js → dll/DllModule.js} +36 -24
  313. package/lib/{DllModuleFactory.js → dll/DllModuleFactory.js} +5 -4
  314. package/lib/{DllPlugin.js → dll/DllPlugin.js} +24 -6
  315. package/lib/{DllReferencePlugin.js → dll/DllReferencePlugin.js} +26 -18
  316. package/lib/{LibManifestPlugin.js → dll/LibManifestPlugin.js} +14 -10
  317. package/lib/electron/ElectronTargetPlugin.js +24 -5
  318. package/lib/{AbstractMethodError.js → errors/AbstractMethodError.js} +10 -1
  319. package/lib/{AsyncDependencyToInitialChunkError.js → errors/AsyncDependencyToInitialChunkError.js} +8 -3
  320. package/lib/errors/BuildCycleError.js +1 -1
  321. package/lib/{ChunkRenderError.js → errors/ChunkRenderError.js} +1 -1
  322. package/lib/{CodeGenerationError.js → errors/CodeGenerationError.js} +1 -1
  323. package/lib/{CommentCompilationWarning.js → errors/CommentCompilationWarning.js} +9 -3
  324. package/lib/{ConcurrentCompilationError.js → errors/ConcurrentCompilationError.js} +5 -2
  325. package/lib/{EnvironmentNotSupportAsyncWarning.js → errors/EnvironmentNotSupportAsyncWarning.js} +5 -5
  326. package/lib/{HookWebpackError.js → errors/HookWebpackError.js} +20 -16
  327. package/lib/{IgnoreErrorModuleFactory.js → errors/IgnoreErrorModuleFactory.js} +7 -4
  328. package/lib/{InvalidDependenciesModuleWarning.js → errors/InvalidDependenciesModuleWarning.js} +6 -3
  329. package/lib/errors/JSONParseError.js +115 -0
  330. package/lib/errors/LoaderLoadingError.js +20 -0
  331. package/lib/{ModuleBuildError.js → errors/ModuleBuildError.js} +22 -16
  332. package/lib/{ModuleDependencyError.js → errors/ModuleDependencyError.js} +10 -3
  333. package/lib/{ModuleDependencyWarning.js → errors/ModuleDependencyWarning.js} +13 -5
  334. package/lib/{ModuleError.js → errors/ModuleError.js} +10 -14
  335. package/lib/{ModuleHashingError.js → errors/ModuleHashingError.js} +5 -1
  336. package/lib/errors/ModuleNotFoundError.js +94 -0
  337. package/lib/errors/ModuleParseError.js +141 -0
  338. package/lib/{ModuleRestoreError.js → errors/ModuleRestoreError.js} +4 -1
  339. package/lib/{ModuleStoreError.js → errors/ModuleStoreError.js} +5 -1
  340. package/lib/{ModuleWarning.js → errors/ModuleWarning.js} +13 -14
  341. package/lib/{NodeStuffInWebError.js → errors/NodeStuffInWebError.js} +7 -5
  342. package/lib/errors/NonErrorEmittedError.js +30 -0
  343. package/lib/{UnhandledSchemeError.js → errors/UnhandledSchemeError.js} +9 -2
  344. package/lib/{UnsupportedFeatureWarning.js → errors/UnsupportedFeatureWarning.js} +4 -3
  345. package/lib/errors/WebpackError.js +84 -0
  346. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  347. package/lib/esm/ModuleChunkFormatPlugin.js +52 -15
  348. package/lib/esm/ModuleChunkLoadingPlugin.js +11 -3
  349. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +80 -52
  350. package/lib/hmr/HotModuleReplacement.runtime.js +175 -30
  351. package/lib/hmr/HotModuleReplacementRuntimeModule.js +8 -0
  352. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +173 -26
  353. package/lib/hmr/JavascriptHotModuleReplacementHelper.js +1 -0
  354. package/lib/hmr/LazyCompilationPlugin.js +154 -7
  355. package/lib/hmr/lazyCompilationBackend.js +53 -12
  356. package/lib/html/HtmlGenerator.js +1490 -0
  357. package/lib/html/HtmlModule.js +41 -0
  358. package/lib/html/HtmlModulesPlugin.js +1129 -0
  359. package/lib/html/HtmlParser.js +1970 -0
  360. package/lib/html/favicon.svg +1 -0
  361. package/lib/html/syntax.js +9106 -0
  362. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -1
  363. package/lib/ids/DeterministicChunkIdsPlugin.js +3 -1
  364. package/lib/ids/DeterministicModuleIdsPlugin.js +3 -1
  365. package/lib/ids/HashedModuleIdsPlugin.js +2 -1
  366. package/lib/ids/IdHelpers.js +49 -12
  367. package/lib/ids/NamedChunkIdsPlugin.js +3 -1
  368. package/lib/ids/NamedModuleIdsPlugin.js +3 -1
  369. package/lib/ids/NaturalChunkIdsPlugin.js +1 -1
  370. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  371. package/lib/ids/OccurrenceChunkIdsPlugin.js +2 -1
  372. package/lib/ids/OccurrenceModuleIdsPlugin.js +4 -1
  373. package/lib/ids/SyncModuleIdsPlugin.js +3 -1
  374. package/lib/index.js +66 -15
  375. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +5 -6
  376. package/lib/javascript/BasicEvaluatedExpression.js +370 -49
  377. package/lib/javascript/ChunkFormatHelpers.js +2 -1
  378. package/lib/javascript/ChunkHelpers.js +1 -0
  379. package/lib/javascript/CommonJsChunkFormatPlugin.js +1 -1
  380. package/lib/javascript/EnableChunkLoadingPlugin.js +6 -1
  381. package/lib/javascript/JavascriptGenerator.js +213 -51
  382. package/lib/javascript/JavascriptModule.js +54 -0
  383. package/lib/javascript/JavascriptModulesPlugin.js +628 -198
  384. package/lib/javascript/JavascriptParser.js +1334 -471
  385. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  386. package/lib/javascript/StartupHelpers.js +5 -0
  387. package/lib/javascript/syntax.js +5037 -0
  388. package/lib/json/JsonData.js +5 -0
  389. package/lib/json/JsonGenerator.js +21 -0
  390. package/lib/json/JsonModule.js +40 -0
  391. package/lib/json/JsonModulesPlugin.js +8 -1
  392. package/lib/json/JsonParser.js +18 -27
  393. package/lib/library/AbstractLibraryPlugin.js +17 -2
  394. package/lib/library/AmdLibraryPlugin.js +8 -0
  395. package/lib/library/AssignLibraryPlugin.js +21 -3
  396. package/lib/library/EnableLibraryPlugin.js +8 -2
  397. package/lib/library/ExportPropertyLibraryPlugin.js +10 -0
  398. package/lib/{FalseIIFEUmdWarning.js → library/FalseIIFEUmdWarning.js} +2 -1
  399. package/lib/library/JsonpLibraryPlugin.js +8 -0
  400. package/lib/library/ModuleLibraryPlugin.js +154 -7
  401. package/lib/library/SystemLibraryPlugin.js +11 -3
  402. package/lib/library/UmdLibraryPlugin.js +16 -0
  403. package/lib/loaders/LoaderRunner.js +714 -0
  404. package/lib/loaders/loadLoader.js +100 -0
  405. package/lib/logging/Logger.js +17 -0
  406. package/lib/logging/createConsoleLogger.js +7 -0
  407. package/lib/logging/runtime.js +2 -0
  408. package/lib/logging/truncateArgs.js +2 -0
  409. package/lib/node/CommonJsChunkLoadingPlugin.js +5 -1
  410. package/lib/node/NodeEnvironmentPlugin.js +7 -3
  411. package/lib/node/NodeSourcePlugin.js +1 -1
  412. package/lib/node/NodeTargetPlugin.js +4 -63
  413. package/lib/node/NodeTemplatePlugin.js +3 -1
  414. package/lib/node/NodeWatchFileSystem.js +40 -22
  415. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +13 -9
  416. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +33 -3
  417. package/lib/node/ReadFileCompileWasmPlugin.js +28 -3
  418. package/lib/node/RequireChunkLoadingRuntimeModule.js +21 -16
  419. package/lib/node/nodeBuiltins.js +80 -0
  420. package/lib/node/nodeConsole.js +116 -64
  421. package/lib/optimize/AggressiveMergingPlugin.js +22 -16
  422. package/lib/optimize/AggressiveSplittingPlugin.js +6 -1
  423. package/lib/optimize/ConcatenatedModule.js +603 -130
  424. package/lib/optimize/ConstExportsPlugin.js +211 -0
  425. package/lib/optimize/EnsureChunkConditionsPlugin.js +2 -1
  426. package/lib/optimize/FlagIncludedChunksPlugin.js +15 -4
  427. package/lib/optimize/InlineExports.js +178 -0
  428. package/lib/optimize/InnerGraph.js +374 -262
  429. package/lib/optimize/InnerGraphPlugin.js +246 -117
  430. package/lib/optimize/LimitChunkCountPlugin.js +9 -0
  431. package/lib/optimize/MangleExportsPlugin.js +5 -1
  432. package/lib/optimize/MergeDuplicateChunksPlugin.js +2 -0
  433. package/lib/optimize/MinChunkSizePlugin.js +2 -1
  434. package/lib/optimize/MinMaxSizeWarning.js +5 -4
  435. package/lib/optimize/ModuleConcatenationPlugin.js +229 -55
  436. package/lib/optimize/RealContentHashPlugin.js +130 -52
  437. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -1
  438. package/lib/optimize/RemoveParentModulesPlugin.js +3 -1
  439. package/lib/optimize/RuntimeChunkPlugin.js +2 -1
  440. package/lib/optimize/SideEffectsFlagPlugin.js +381 -55
  441. package/lib/optimize/SplitChunksPlugin.js +200 -50
  442. package/lib/performance/AssetsOverSizeLimitWarning.js +3 -2
  443. package/lib/performance/EntrypointsOverSizeLimitWarning.js +3 -2
  444. package/lib/performance/NoAsyncChunksWarning.js +5 -3
  445. package/lib/performance/SizeLimitsPlugin.js +8 -2
  446. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +1 -0
  447. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +21 -0
  448. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +1 -0
  449. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -1
  450. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +25 -13
  451. package/lib/prefetch/ResourceHintPlugin.js +687 -0
  452. package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
  453. package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
  454. package/lib/prefetch/parseResourceHintOptions.js +103 -0
  455. package/lib/rules/BasicEffectRulePlugin.js +3 -0
  456. package/lib/rules/BasicMatcherRulePlugin.js +3 -0
  457. package/lib/rules/ObjectMatcherRulePlugin.js +3 -0
  458. package/lib/rules/RuleSetCompiler.js +132 -0
  459. package/lib/rules/UseEffectRulePlugin.js +10 -3
  460. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
  461. package/lib/runtime/AsyncModuleRuntimeModule.js +52 -33
  462. package/lib/runtime/AutoPublicPathRuntimeModule.js +22 -9
  463. package/lib/runtime/BaseUriRuntimeModule.js +1 -0
  464. package/lib/runtime/ChunkNameRuntimeModule.js +1 -0
  465. package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
  466. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +2 -1
  467. package/lib/runtime/CompatRuntimeModule.js +2 -0
  468. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
  469. package/lib/runtime/CreateScriptRuntimeModule.js +1 -0
  470. package/lib/runtime/CreateScriptUrlRuntimeModule.js +1 -0
  471. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +34 -4
  472. package/lib/runtime/EnsureChunkRuntimeModule.js +1 -0
  473. package/lib/runtime/GetChunkFilenameRuntimeModule.js +88 -8
  474. package/lib/runtime/GetFullHashRuntimeModule.js +1 -0
  475. package/lib/runtime/GetMainFilenameRuntimeModule.js +1 -0
  476. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -1
  477. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
  478. package/lib/runtime/GlobalRuntimeModule.js +1 -0
  479. package/lib/runtime/HasOwnPropertyRuntimeModule.js +2 -1
  480. package/lib/runtime/HelperRuntimeModule.js +5 -0
  481. package/lib/runtime/LoadScriptRuntimeModule.js +28 -37
  482. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +354 -37
  483. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +2 -1
  484. package/lib/runtime/NonceRuntimeModule.js +1 -0
  485. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -4
  486. package/lib/runtime/PublicPathRuntimeModule.js +1 -0
  487. package/lib/runtime/RelativeUrlRuntimeModule.js +4 -2
  488. package/lib/runtime/RuntimeIdRuntimeModule.js +1 -0
  489. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +38 -0
  490. package/lib/runtime/StartupChunkDependenciesPlugin.js +13 -1
  491. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +2 -1
  492. package/lib/runtime/StartupEntrypointRuntimeModule.js +5 -3
  493. package/lib/runtime/SystemContextRuntimeModule.js +1 -0
  494. package/lib/runtime/ToBinaryRuntimeModule.js +1 -0
  495. package/lib/runtime/WorkerRuntimeModule.js +33 -0
  496. package/lib/schemes/DataUriPlugin.js +14 -2
  497. package/lib/schemes/FileUriPlugin.js +1 -1
  498. package/lib/schemes/HttpUriPlugin.js +86 -4
  499. package/lib/schemes/VirtualUrlPlugin.js +8 -4
  500. package/lib/serialization/AggregateErrorSerializer.js +9 -6
  501. package/lib/serialization/ArraySerializer.js +6 -8
  502. package/lib/serialization/BinaryMiddleware.js +427 -1006
  503. package/lib/serialization/DateObjectSerializer.js +4 -2
  504. package/lib/serialization/ErrorObjectSerializer.js +10 -6
  505. package/lib/serialization/FileMiddleware.js +345 -59
  506. package/lib/serialization/MapObjectSerializer.js +7 -9
  507. package/lib/serialization/NullPrototypeObjectSerializer.js +9 -9
  508. package/lib/serialization/ObjectMiddleware.js +73 -13
  509. package/lib/serialization/PlainObjectSerializer.js +16 -8
  510. package/lib/serialization/RegExpObjectSerializer.js +4 -2
  511. package/lib/serialization/Serializer.js +6 -0
  512. package/lib/serialization/SerializerMiddleware.js +14 -2
  513. package/lib/serialization/SetObjectSerializer.js +6 -8
  514. package/lib/serialization/SingleItemMiddleware.js +3 -0
  515. package/lib/sharing/ConsumeSharedFallbackDependency.js +1 -0
  516. package/lib/sharing/ConsumeSharedModule.js +21 -7
  517. package/lib/sharing/ConsumeSharedPlugin.js +11 -11
  518. package/lib/sharing/ConsumeSharedRuntimeModule.js +55 -45
  519. package/lib/sharing/ProvideForSharedDependency.js +1 -0
  520. package/lib/sharing/ProvideSharedDependency.js +34 -15
  521. package/lib/sharing/ProvideSharedModule.js +42 -12
  522. package/lib/sharing/ProvideSharedModuleFactory.js +1 -0
  523. package/lib/sharing/ProvideSharedPlugin.js +13 -8
  524. package/lib/sharing/SharePlugin.js +5 -1
  525. package/lib/sharing/ShareRuntimeModule.js +19 -16
  526. package/lib/sharing/resolveMatchedConfigs.js +6 -2
  527. package/lib/sharing/utils.js +9 -1
  528. package/lib/stats/DefaultStatsFactoryPlugin.js +289 -201
  529. package/lib/stats/DefaultStatsPresetPlugin.js +14 -2
  530. package/lib/stats/DefaultStatsPrinterPlugin.js +74 -170
  531. package/lib/stats/StatsFactory.js +70 -27
  532. package/lib/stats/StatsPrinter.js +16 -2
  533. package/lib/typescript/TypeScriptPlugin.js +210 -0
  534. package/lib/url/URLParserPlugin.js +111 -23
  535. package/lib/util/ArrayHelpers.js +1 -0
  536. package/lib/util/ArrayQueue.js +10 -5
  537. package/lib/util/AsyncQueue.js +154 -74
  538. package/lib/util/Hash.js +2 -2
  539. package/lib/util/IterableHelpers.js +3 -0
  540. package/lib/util/LazyBucketSortedSet.js +26 -0
  541. package/lib/util/LazySet.js +45 -4
  542. package/lib/util/LocConverter.js +64 -0
  543. package/lib/util/ParallelismFactorCalculator.js +1 -0
  544. package/lib/util/Queue.js +6 -3
  545. package/lib/util/Semaphore.js +15 -1
  546. package/lib/util/SetHelpers.js +4 -1
  547. package/lib/util/SortableSet.js +7 -1
  548. package/lib/util/SourceProcessor.js +119 -0
  549. package/lib/util/StackedCacheMap.js +20 -3
  550. package/lib/util/StackedMap.js +162 -43
  551. package/lib/util/StringXor.js +1 -1
  552. package/lib/util/TupleQueue.js +7 -3
  553. package/lib/util/TupleSet.js +14 -0
  554. package/lib/util/URLAbsoluteSpecifier.js +1 -0
  555. package/lib/util/WeakTupleMap.js +60 -1
  556. package/lib/util/binarySearchBounds.js +3 -2
  557. package/lib/util/chainedImports.js +3 -3
  558. package/lib/util/cleverMerge.js +19 -2
  559. package/lib/util/comparators.js +35 -4
  560. package/lib/util/compileBooleanMatcher.js +9 -0
  561. package/lib/util/concatenate.js +80 -24
  562. package/lib/util/conventions.js +46 -1
  563. package/lib/util/createHash.js +0 -1
  564. package/lib/util/createHooksRegistry.js +43 -0
  565. package/lib/util/createMappings.js +118 -0
  566. package/lib/util/dataURL.js +3 -2
  567. package/lib/util/deprecation.js +19 -0
  568. package/lib/util/deterministicGrouping.js +46 -17
  569. package/lib/util/extractSourceMap.js +2 -1
  570. package/lib/util/extractUrlAndGlobal.js +1 -0
  571. package/lib/util/findGraphRoots.js +7 -0
  572. package/lib/{formatLocation.js → util/formatLocation.js} +4 -2
  573. package/lib/{SizeFormatHelpers.js → util/formatSize.js} +10 -3
  574. package/lib/util/fs.js +87 -14
  575. package/lib/util/generateDebugId.js +1 -0
  576. package/lib/util/globUtils.js +710 -0
  577. package/lib/util/hash/BatchedHash.js +1 -0
  578. package/lib/util/hash/BulkUpdateHash.js +1 -0
  579. package/lib/util/hash/DebugHash.js +1 -0
  580. package/lib/util/hash/hash-digest.js +32 -15
  581. package/lib/util/hash/md4.js +1 -1
  582. package/lib/util/hash/wasm-hash.js +5 -0
  583. package/lib/util/hash/xxhash64.js +1 -1
  584. package/lib/util/identifier.js +118 -7
  585. package/lib/util/implicitTypeLoaderFallback.js +62 -0
  586. package/lib/util/internalSerializables.js +102 -60
  587. package/lib/util/magicComment.js +149 -7
  588. package/lib/util/makeSerializable.js +7 -0
  589. package/lib/util/memoize.js +2 -0
  590. package/lib/util/mimeTypes.js +176 -0
  591. package/lib/util/nonNumericOnlyHash.js +31 -1
  592. package/lib/util/numberHash.js +2 -2
  593. package/lib/util/parseJson.js +41 -0
  594. package/lib/util/processAsyncTree.js +8 -0
  595. package/lib/util/property.js +9 -2
  596. package/lib/util/publicPathPlaceholder.js +64 -0
  597. package/lib/util/registerExternalSerializer.js +24 -4
  598. package/lib/util/removeBOM.js +1 -0
  599. package/lib/util/runtime.js +32 -0
  600. package/lib/util/semver.js +15 -0
  601. package/lib/util/serialization.js +2 -0
  602. package/lib/util/smartGrouping.js +8 -0
  603. package/lib/util/source.js +23 -0
  604. package/lib/util/topologicalSort.js +69 -0
  605. package/lib/validateSchema.js +1 -0
  606. package/lib/wasm/EnableWasmLoadingPlugin.js +15 -1
  607. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +25 -18
  608. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +34 -22
  609. package/lib/wasm-async/AsyncWasmModule.js +77 -0
  610. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -0
  611. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +6 -1
  612. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +22 -126
  613. package/lib/wasm-async/AsyncWebAssemblyParser.js +3 -2
  614. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +13 -2
  615. package/lib/wasm-sync/SyncWasmModule.js +39 -0
  616. package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +7 -3
  617. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +86 -19
  618. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -3
  619. package/lib/wasm-sync/WebAssemblyGenerator.js +27 -1
  620. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +9 -3
  621. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +4 -0
  622. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +20 -1
  623. package/lib/wasm-sync/WebAssemblyParser.js +9 -3
  624. package/lib/wasm-sync/WebAssemblyUtils.js +2 -0
  625. package/lib/web/FetchCompileAsyncWasmPlugin.js +29 -1
  626. package/lib/web/FetchCompileWasmPlugin.js +27 -1
  627. package/lib/web/JsonpChunkLoadingPlugin.js +11 -1
  628. package/lib/web/JsonpChunkLoadingRuntimeModule.js +58 -64
  629. package/lib/web/JsonpTemplatePlugin.js +2 -1
  630. package/lib/webpack.js +78 -1
  631. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +10 -1
  632. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +15 -10
  633. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  634. package/module.d.ts +21 -0
  635. package/package.json +79 -77
  636. package/schemas/WebpackOptions.check.js +1 -1
  637. package/schemas/WebpackOptions.json +1173 -80
  638. package/schemas/plugins/{DllPlugin.check.d.ts → HtmlGeneratorOptions.check.d.ts} +1 -1
  639. package/schemas/plugins/HtmlGeneratorOptions.check.js +6 -0
  640. package/schemas/plugins/HtmlGeneratorOptions.json +3 -0
  641. package/schemas/plugins/{DllReferencePlugin.check.d.ts → HtmlParserOptions.check.d.ts} +1 -1
  642. package/schemas/plugins/HtmlParserOptions.check.js +6 -0
  643. package/schemas/plugins/HtmlParserOptions.json +3 -0
  644. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  645. package/schemas/plugins/ProgressPlugin.json +38 -0
  646. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  647. package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
  648. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  649. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  650. package/schemas/plugins/container/ModuleFederationPlugin.json +2 -0
  651. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.d.ts +7 -0
  652. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +6 -0
  653. package/schemas/plugins/css/CssAutoOrModuleParserOptions.json +3 -0
  654. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  655. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  656. package/schemas/plugins/dll/DllPlugin.check.d.ts +7 -0
  657. package/schemas/plugins/dll/DllReferencePlugin.check.d.ts +7 -0
  658. package/types.d.ts +11053 -3019
  659. package/lib/CaseSensitiveModulesWarning.js +0 -72
  660. package/lib/GraphHelpers.js +0 -46
  661. package/lib/ModuleParseError.js +0 -125
  662. package/lib/NoModeWarning.js +0 -23
  663. package/lib/css/CssMergeStyleSheetsRuntimeModule.js +0 -56
  664. package/lib/css/walkCssTokens.js +0 -1843
  665. package/lib/util/AppendOnlyStackedSet.js +0 -78
  666. /package/schemas/plugins/{DllPlugin.check.js → dll/DllPlugin.check.js} +0 -0
  667. /package/schemas/plugins/{DllPlugin.json → dll/DllPlugin.json} +0 -0
  668. /package/schemas/plugins/{DllReferencePlugin.check.js → dll/DllReferencePlugin.check.js} +0 -0
  669. /package/schemas/plugins/{DllReferencePlugin.json → dll/DllReferencePlugin.json} +0 -0
@@ -0,0 +1,1295 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ */
4
+
5
+ "use strict";
6
+
7
+ const {
8
+ CSS_IMPORT_TYPE,
9
+ CSS_TYPE,
10
+ JAVASCRIPT_TYPE
11
+ } = require("../ModuleSourceTypeConstants");
12
+ const HtmlGenerator = require("../html/HtmlGenerator");
13
+ const ResourceHintPlugin = require("../prefetch/ResourceHintPlugin");
14
+ const ResourceHintRuntimeModule = require("../prefetch/ResourceHintRuntimeModule");
15
+ const makeSerializable = require("../util/makeSerializable");
16
+ const ModuleDependency = require("./ModuleDependency");
17
+
18
+ /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
19
+ /** @typedef {import("../Chunk")} Chunk */
20
+ /** @typedef {import("../ChunkGraph")} ChunkGraph */
21
+ /** @typedef {import("../Dependency")} Dependency */
22
+ /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
23
+ /** @typedef {import("../Entrypoint")} Entrypoint */
24
+ /** @typedef {import("../javascript/JavascriptParser").Range} Range */
25
+ /** @typedef {"script" | "script-module" | "modulepreload" | "stylesheet" | "html" | "preload" | "prefetch"} HtmlEntryElementKind */
26
+
27
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext<[string, string, HtmlEntryElementKind, number, number, boolean, string, number, boolean, number, (Range | null), (Range | null), boolean, number, number]>} ObjectDeserializerContext */
28
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext<[string, string, HtmlEntryElementKind, number, number, boolean, string, number, boolean, number, (Range | null), (Range | null), boolean, number, number]>} ObjectSerializerContext */
29
+
30
+ class HtmlEntryDependency extends ModuleDependency {
31
+ /**
32
+ * Creates an instance of HtmlEntryDependency.
33
+ * @param {string} request request
34
+ * @param {Range} range range of the attribute value in the source
35
+ * @param {string} entryName name of the entry this script src is bundled into
36
+ * @param {string=} category dependency category used for resolving and grouping
37
+ * @param {HtmlEntryElementKind=} elementKind shape of the originating HTML element; used when expanding sibling tags for split/runtime chunks
38
+ * @param {number=} tagStart position of the opening `<` of the originating tag in the source; sibling tags emitted for additional entry chunks are inserted right before this
39
+ * @param {number=} tagOpenEnd position of the character immediately after the opening tag's `>` in the source; combined with `tagStart` this lets the template clone the original opening tag verbatim (preserving attributes like `nonce`, `crossorigin`, `referrerpolicy`, `defer`, `async`) when generating sibling tags
40
+ * @param {boolean=} tagIsNative whether the originating element is the native tag for `elementKind` (`<script>` / `<link>`); decided at parse time from the tag name so the template needn't re-parse the source text. A custom element mapped to a `script`/`stylesheet` source `type` is non-native and gets a freshly synthesized sibling tag instead of a verbatim clone
41
+ * @param {string=} copyableAttrsText the originating tag's `nonce`/`crossorigin`/`referrerpolicy` attribute source spans (leading-space-prefixed, in that fixed order), captured at parse time so synthesized sibling `<link>`/`<script>` tags carry the same CSP/fetch policy without the template re-parsing the tag text; empty when none are present
42
+ * @param {number=} tagNameEnd position right after the originating tag's name (e.g. after `<script`), captured at parse time so the template can insert a `crossorigin` attribute without re-scanning the tag text for the name boundary
43
+ * @param {boolean=} hasOwnCrossOrigin whether the originating tag already carries a `crossorigin` attribute; when true the author's value wins and `output.crossOriginLoading` is not applied
44
+ * @param {number=} cssAnchor source offset of the first classic blocking `<script>` tag (not `defer`/`async`/module — those execute after parsing and after pending stylesheets); injected stylesheet `<link>`s are kept ahead of it. -1 when the document has no blocking script, letting CSS follow `defer`/module script tags (the order Vite emits)
45
+ * @param {Range | null=} integrityRange source span of the originating tag's `integrity` attribute (offsets relative to `tagStart`, leading whitespace and quotes included), captured at parse time so cloned sibling tags can drop it without re-parsing; null when absent
46
+ * @param {Range | null=} typeValueRange source span of the originating tag's `type` attribute value (offsets relative to `tagStart`), captured at parse time so `script-module` sibling clones can force `type="module"` in place; null when there is no value to rewrite (a `type="module"` is then inserted instead)
47
+ * @param {boolean=} forceInline `<!-- webpackInline: true -->` was set before this tag; takes precedence over `output.html.inline`
48
+ * @param {number=} headOpenEnd position just inside the (possibly implicit) `<head>` — after its opening tag, else after `<html>` or the doctype — captured from the parse so the template needn't re-scan the source (a text scan would match markup inside comments); resource hints are inserted here. -1 when unknown
49
+ * @param {number=} headAnchor position right after the last node inside `<head>` (the same anchor `output.html` title/meta injection uses); `inject: "head"` sibling tags are inserted here. -1 when the document has no usable head (insertion then falls back to the entry tag)
50
+ */
51
+ constructor(
52
+ request,
53
+ range,
54
+ entryName,
55
+ category,
56
+ elementKind,
57
+ tagStart,
58
+ tagOpenEnd,
59
+ tagIsNative,
60
+ copyableAttrsText,
61
+ tagNameEnd,
62
+ hasOwnCrossOrigin,
63
+ cssAnchor,
64
+ integrityRange,
65
+ typeValueRange,
66
+ forceInline,
67
+ headOpenEnd,
68
+ headAnchor
69
+ ) {
70
+ super(request);
71
+ this.range = range;
72
+ /** @type {string} */
73
+ this.entryName = entryName;
74
+ /** @type {string} */
75
+ this._category = category || "commonjs";
76
+ /** @type {HtmlEntryElementKind} */
77
+ this.elementKind = elementKind || "script";
78
+ /** @type {number} */
79
+ this.tagStart = tagStart === undefined ? -1 : tagStart;
80
+ /** @type {number} */
81
+ this.tagOpenEnd = tagOpenEnd === undefined ? -1 : tagOpenEnd;
82
+ /** @type {boolean} */
83
+ this.tagIsNative = tagIsNative !== false;
84
+ /** @type {string} */
85
+ this.copyableAttrsText = copyableAttrsText || "";
86
+ /** @type {number} */
87
+ this.tagNameEnd = tagNameEnd === undefined ? -1 : tagNameEnd;
88
+ /** @type {boolean} */
89
+ this.hasOwnCrossOrigin = hasOwnCrossOrigin === true;
90
+ /** @type {number} */
91
+ this.cssAnchor = cssAnchor === undefined ? -1 : cssAnchor;
92
+ /** @type {Range | null} */
93
+ this.integrityRange = integrityRange || null;
94
+ /** @type {Range | null} */
95
+ this.typeValueRange = typeValueRange || null;
96
+ /** @type {boolean} */
97
+ this.forceInline = forceInline === true;
98
+ /** @type {number} */
99
+ this.headOpenEnd = headOpenEnd === undefined ? -1 : headOpenEnd;
100
+ /** @type {number} */
101
+ this.headAnchor = headAnchor === undefined ? -1 : headAnchor;
102
+ }
103
+
104
+ get type() {
105
+ return "html entry";
106
+ }
107
+
108
+ get category() {
109
+ return this._category;
110
+ }
111
+
112
+ /**
113
+ * Serializes this instance into the provided serializer context.
114
+ * @param {ObjectSerializerContext} context context
115
+ */
116
+ serialize(context) {
117
+ context
118
+ .write(this.entryName)
119
+ .write(this._category)
120
+ .write(this.elementKind)
121
+ .write(this.tagStart)
122
+ .write(this.tagOpenEnd)
123
+ .write(this.tagIsNative)
124
+ .write(this.copyableAttrsText)
125
+ .write(this.tagNameEnd)
126
+ .write(this.hasOwnCrossOrigin)
127
+ .write(this.cssAnchor)
128
+ .write(this.integrityRange)
129
+ .write(this.typeValueRange)
130
+ .write(this.forceInline)
131
+ .write(this.headOpenEnd)
132
+ .write(this.headAnchor);
133
+ super.serialize(context);
134
+ }
135
+
136
+ /**
137
+ * Restores this instance from the provided deserializer context.
138
+ * @param {ObjectDeserializerContext} context context
139
+ */
140
+ deserialize(context) {
141
+ this.entryName = context.read();
142
+ const c1 = context.rest;
143
+ this._category = c1.read();
144
+ const c2 = c1.rest;
145
+ this.elementKind = c2.read();
146
+ const c3 = c2.rest;
147
+ this.tagStart = c3.read();
148
+ const c4 = c3.rest;
149
+ this.tagOpenEnd = c4.read();
150
+ const c5 = c4.rest;
151
+ this.tagIsNative = c5.read();
152
+ const c6 = c5.rest;
153
+ this.copyableAttrsText = c6.read();
154
+ const c7 = c6.rest;
155
+ this.tagNameEnd = c7.read();
156
+ const c8 = c7.rest;
157
+ this.hasOwnCrossOrigin = c8.read();
158
+ const c9 = c8.rest;
159
+ this.cssAnchor = c9.read();
160
+ const c10 = c9.rest;
161
+ this.integrityRange = c10.read();
162
+ const c11 = c10.rest;
163
+ this.typeValueRange = c11.read();
164
+ const c12 = c11.rest;
165
+ this.forceInline = c12.read();
166
+ const c13 = c12.rest;
167
+ this.headOpenEnd = c13.read();
168
+ const c14 = c13.rest;
169
+ this.headAnchor = c14.read();
170
+ super.deserialize(c14.rest);
171
+ }
172
+ }
173
+
174
+ /**
175
+ * @param {Entrypoint} entrypoint entrypoint
176
+ * @returns {Chunk[]} every chunk this entrypoint needs in load order: the
177
+ * runtime chunk first (when `optimization.runtimeChunk` splits it off), then
178
+ * any intermediate chunks (e.g. from `optimization.splitChunks`), and finally
179
+ * the entry chunk itself. The entry chunk is always returned last so callers
180
+ * can identify it as the tag whose `src`/`href` attribute is being rewritten
181
+ * in place. Chunks that are already loaded by an ancestor (`dependOn`) entry's
182
+ * own script tag — i.e. the parent entrypoint's entry chunk *and* its runtime
183
+ * chunk — are skipped, otherwise they would be loaded twice when the same
184
+ * HTML contains tags for both the leader and the dependant entries.
185
+ */
186
+ const getEntrypointChunksInLoadOrder = (entrypoint) => {
187
+ const entryChunk = /** @type {Chunk} */ (entrypoint.getEntrypointChunk());
188
+ const runtimeChunk = entrypoint.getRuntimeChunk();
189
+
190
+ /** @type {Set<Chunk>} */
191
+ const chunksLoadedByAncestorTags = new Set();
192
+ /** @type {Set<import("../ChunkGroup")>} */
193
+ const visitedGroups = new Set();
194
+ const walk = (/** @type {import("../ChunkGroup")} */ group) => {
195
+ if (visitedGroups.has(group)) return;
196
+ visitedGroups.add(group);
197
+ for (const parent of group.parentsIterable) {
198
+ if (
199
+ typeof (/** @type {Entrypoint} */ (parent).getEntrypointChunk) ===
200
+ "function"
201
+ ) {
202
+ const parentEntry =
203
+ /** @type {Entrypoint} */
204
+ (parent).getEntrypointChunk();
205
+ if (parentEntry) chunksLoadedByAncestorTags.add(parentEntry);
206
+ const parentRuntime =
207
+ /** @type {Entrypoint} */
208
+ (parent).getRuntimeChunk();
209
+ if (parentRuntime) chunksLoadedByAncestorTags.add(parentRuntime);
210
+ }
211
+ walk(parent);
212
+ }
213
+ };
214
+ walk(entrypoint);
215
+
216
+ /** @type {Chunk[]} */
217
+ const ordered = [];
218
+ /** @type {Set<Chunk>} */
219
+ const seen = new Set();
220
+ const push = (/** @type {Chunk | null | undefined} */ chunk) => {
221
+ if (!chunk || seen.has(chunk) || chunk === entryChunk) return;
222
+ if (chunksLoadedByAncestorTags.has(chunk)) return;
223
+ seen.add(chunk);
224
+ ordered.push(chunk);
225
+ };
226
+ if (runtimeChunk !== entryChunk) {
227
+ push(runtimeChunk);
228
+ }
229
+ for (const chunk of entrypoint.chunks) {
230
+ push(chunk);
231
+ }
232
+ ordered.push(entryChunk);
233
+ return ordered;
234
+ };
235
+
236
+ /**
237
+ * Whether webpack will emit a `.js` file for this chunk that must be
238
+ * loaded with a `<script>` tag. Covers three independent reasons a
239
+ * chunk needs JS output: it owns one or more JS-source-type modules;
240
+ * it has entry modules whose source types include JavaScript (entry
241
+ * modules don't show up in `getChunkModulesIterableBySourceType` until
242
+ * they're connected as regular modules — this is why
243
+ * `JavascriptModulesPlugin#_chunkHasJs` checks them separately); or it
244
+ * is a runtime chunk — `chunk.hasRuntime()` — which produces a `.js`
245
+ * file holding the webpack runtime, but its `RuntimeModule`s live in
246
+ * a separate `runtimeModules` set and are *not* surfaced via
247
+ * `getChunkModulesIterableBySourceType`. Missing the runtime case
248
+ * would cause a `runtimeChunk`-split chunk to fall out of the
249
+ * `<script>` list and re-emerge after the chunks that depend on it,
250
+ * producing `__webpack_require__ is not defined` at load time.
251
+ * @param {Chunk} chunk chunk
252
+ * @param {ChunkGraph} chunkGraph chunk graph
253
+ * @returns {boolean} true if the chunk emits a `.js` file
254
+ */
255
+ const chunkHasJs = (chunk, chunkGraph) => {
256
+ if (chunk.hasRuntime()) return true;
257
+ if (chunkGraph.getNumberOfEntryModules(chunk) > 0) {
258
+ for (const module of chunkGraph.getChunkEntryModulesIterable(chunk)) {
259
+ if (chunkGraph.getModuleSourceTypes(module).has(JAVASCRIPT_TYPE)) {
260
+ return true;
261
+ }
262
+ }
263
+ }
264
+ return Boolean(
265
+ chunkGraph.getChunkModulesIterableBySourceType(chunk, JAVASCRIPT_TYPE)
266
+ );
267
+ };
268
+
269
+ /**
270
+ * Whether webpack will emit a `.css` file for this chunk that must be
271
+ * loaded with a `<link rel="stylesheet">` tag. Matches
272
+ * `CssModulesPlugin.chunkHasCss` exactly — both regular CSS modules
273
+ * and pure `@import` placeholder modules count, since the latter
274
+ * still contribute a `.css` asset to the chunk.
275
+ * @param {Chunk} chunk chunk
276
+ * @param {ChunkGraph} chunkGraph chunk graph
277
+ * @returns {boolean} true if the chunk emits a `.css` file
278
+ */
279
+ const chunkHasCss = (chunk, chunkGraph) =>
280
+ Boolean(chunkGraph.getChunkModulesIterableBySourceType(chunk, CSS_TYPE)) ||
281
+ Boolean(
282
+ chunkGraph.getChunkModulesIterableBySourceType(chunk, CSS_IMPORT_TYPE)
283
+ );
284
+
285
+ /**
286
+ * Deterministic tie-break key for CSS link ordering. `chunk.name` and
287
+ * `chunk.id` are both stable strings (when present); one of them is set for
288
+ * every chunk webpack emits. We can't rely on `Array.prototype.sort` being
289
+ * stable — webpack still supports Node 10.13 where V8's sort is not guaranteed
290
+ * stable for arrays larger than ten elements — so any time
291
+ * `firstCssModulePostOrderIndex` returns the same value for two chunks (most
292
+ * commonly when several chunks have no reachable CSS module in the entrypoint's
293
+ * dependency walk and all map to `Infinity`) this key picks the canonical order.
294
+ * Computed once per chunk when building the sort array rather than per
295
+ * comparison.
296
+ * @param {Chunk} chunk chunk
297
+ * @returns {string} the tie-break key
298
+ */
299
+ const cssChunkSortKey = (chunk) =>
300
+ `${chunk.name || ""} ${
301
+ chunk.id === null || chunk.id === undefined ? "" : chunk.id
302
+ }`;
303
+
304
+ /**
305
+ * Sort comparator for the CSS sibling emission order. Direct subtraction
306
+ * would yield `NaN` when both indices are `Infinity` (the documented
307
+ * fallback for chunks whose CSS modules the entrypoint's walk never
308
+ * reaches), and `Array#sort` doesn't promise stable ordering on the legacy
309
+ * Node 10 targets this repo still supports — so the tie-breaker must always
310
+ * run when the indices match, including the `Infinity === Infinity` case.
311
+ * @param {{ index: number, key: string }} a first entry
312
+ * @param {{ index: number, key: string }} b second entry
313
+ * @returns {-1 | 0 | 1} sort order
314
+ */
315
+ const compareCssChunkOrder = (a, b) => {
316
+ if (a.index < b.index) return -1;
317
+ if (a.index > b.index) return 1;
318
+ if (a.key < b.key) return -1;
319
+ if (a.key > b.key) return 1;
320
+ return 0;
321
+ };
322
+
323
+ const CSS_SOURCE_TYPES = [CSS_TYPE, CSS_IMPORT_TYPE];
324
+
325
+ /**
326
+ * Smallest post-order index among the CSS modules of a chunk, taken
327
+ * from the entrypoint's view of the dependency graph. Used to sort
328
+ * sibling CSS chunks so they appear in source import order in the
329
+ * extracted HTML — `entrypoint.chunks` itself does not give that
330
+ * ordering for arbitrary splitChunks layouts. Considers both
331
+ * `CSS_TYPE` and `CSS_IMPORT_TYPE` modules so a chunk made up
332
+ * exclusively of `@import` placeholder modules (e.g. when splitChunks
333
+ * separates them from their target CSS) still sorts by its true
334
+ * source position rather than collapsing to `Infinity` and relying on
335
+ * the chunk-name tie-breaker.
336
+ * @param {Chunk} chunk chunk
337
+ * @param {Entrypoint} entrypoint entrypoint the chunk belongs to
338
+ * @param {ChunkGraph} chunkGraph chunk graph
339
+ * @returns {number} the lowest post-order index of any CSS or
340
+ * CSS-import module in the chunk, or `Number.POSITIVE_INFINITY` when
341
+ * no such module has a defined index (e.g. for a module the
342
+ * entrypoint never reached on its own dependency walk — runtime-only
343
+ * modules, modules reached via `dependOn`, etc.) so such chunks sort
344
+ * last among CSS chunks
345
+ */
346
+ const firstCssModulePostOrderIndex = (chunk, entrypoint, chunkGraph) => {
347
+ let min = Number.POSITIVE_INFINITY;
348
+ for (const sourceType of CSS_SOURCE_TYPES) {
349
+ const modules = chunkGraph.getChunkModulesIterableBySourceType(
350
+ chunk,
351
+ sourceType
352
+ );
353
+ if (!modules) continue;
354
+ for (const module of modules) {
355
+ const idx = entrypoint.getModulePostOrderIndex(module);
356
+ if (idx !== undefined && idx < min) min = idx;
357
+ }
358
+ }
359
+ return min;
360
+ };
361
+
362
+ /**
363
+ * Build a fresh `<link rel="stylesheet" href="…">` for a CSS chunk that
364
+ * was pulled in by a `<script src>` entry — the originating tag was a
365
+ * `<script>`, but the chunk is CSS so cloning the script tag verbatim
366
+ * would produce nonsense (`<script src="…\.css">`). `extra` carries the
367
+ * `nonce`/`crossorigin`/`referrerpolicy` source spans captured from the
368
+ * original element at parse time so the same CSP and fetch policy applies;
369
+ * `defer`/`async`/`type` have no meaning on `<link>` and are dropped.
370
+ * @param {string} extra the copyable CSP/fetch attribute source text (leading-space-prefixed, or empty)
371
+ * @param {string} href URL for the stylesheet
372
+ * @param {string} crossOrigin ` crossorigin="…"` to append from `output.crossOriginLoading`, or `""`
373
+ * @param {string} integrity ` integrity="<sentinel>"` to append when `output.html.integrity` is on, or `""`
374
+ * @returns {string} the sibling `<link>` tag's HTML
375
+ */
376
+ const buildStylesheetLink = (extra, href, crossOrigin, integrity) => {
377
+ const safeHref = href.replace(/"/g, "&quot;");
378
+ return `<link rel="stylesheet" href="${safeHref}"${extra}${crossOrigin}${integrity}>`;
379
+ };
380
+
381
+ /**
382
+ * Build a fresh `<script src="…">` for a JS chunk pulled in by a custom
383
+ * (non-`<script>`) element that the user mapped to `type: "script"` /
384
+ * `"script-module"`. Cloning the custom element verbatim and appending
385
+ * `</script>` (as `cloneTagWithUrl` does for a real `<script>`) would emit
386
+ * mismatched, non-executing markup such as `<my-script src="…"></script>`,
387
+ * so synthesize a real script element instead — copying only the CSP/fetch
388
+ * attributes (`extra`, captured at parse time), since the custom element's
389
+ * other attributes have no defined meaning on a `<script>`.
390
+ * @param {string} extra the copyable CSP/fetch attribute source text (leading-space-prefixed, or empty)
391
+ * @param {string} src URL for the script
392
+ * @param {boolean} isModule whether to emit `type="module"`
393
+ * @param {string} crossOrigin ` crossorigin="…"` to append from `output.crossOriginLoading`, or `""`
394
+ * @param {string} integrity ` integrity="<sentinel>"` to append when `output.html.integrity` is on, or `""`
395
+ * @returns {string} the sibling `<script>` tag's HTML
396
+ */
397
+ const buildScriptTag = (extra, src, isModule, crossOrigin, integrity) => {
398
+ const safeSrc = src.replace(/"/g, "&quot;");
399
+ return `<script${isModule ? ' type="module"' : ""} src="${safeSrc}"${extra}${crossOrigin}${integrity}></script>`;
400
+ };
401
+
402
+ /**
403
+ * Clone the original `<script>`/`<link>` opening tag with its `src`/`href`
404
+ * value swapped for a different chunk URL. Reusing the source text verbatim
405
+ * preserves attributes such as `nonce`, `crossorigin`, `referrerpolicy`,
406
+ * `defer`, and `async` so the sibling tags load with the same semantics as
407
+ * the entry tag that's already there. `integrity` is dropped because it's
408
+ * content-specific. When the original tag was upgraded to a module script
409
+ * (either by the author or by the `output.module` auto-upgrade in
410
+ * `HtmlParser`), the sibling is forced to `type="module"` regardless of what
411
+ * the source originally said. The `integrity`/`type` spans come from the
412
+ * parser (`HtmlParser` captured them off the AST); edits are applied
413
+ * right-to-left so earlier offsets stay valid — no re-parsing of the tag.
414
+ * @param {string} originalTag the opening tag's source text including `>`
415
+ * @param {number} srcStartInTag offset of the src/href value start within `originalTag`
416
+ * @param {number} srcEndInTag offset of the src/href value end within `originalTag`
417
+ * @param {string} newUrl URL to put into the cloned tag's src/href slot
418
+ * @param {HtmlEntryElementKind} elementKind shape of the originating tag
419
+ * @param {string} crossOrigin ` crossorigin="…"` to insert from `output.crossOriginLoading`, or `""`
420
+ * @param {number} tagNameEndInTag offset right after the tag name within `originalTag`, where `crossOrigin`/`integrity` are inserted
421
+ * @param {Range | null} integrityRange `integrity` attribute span within `originalTag` to drop, or null
422
+ * @param {Range | null} typeValueRange `type` value span within `originalTag` to overwrite with `module`, or null to insert `type="module"`
423
+ * @param {string} integrity ` integrity="<sentinel>"` to insert when `output.html.integrity` is on, or `""`
424
+ * @returns {string} the sibling tag's HTML (including a closing `</script>` for script tags)
425
+ */
426
+ const cloneTagWithUrl = (
427
+ originalTag,
428
+ srcStartInTag,
429
+ srcEndInTag,
430
+ newUrl,
431
+ elementKind,
432
+ crossOrigin,
433
+ tagNameEndInTag,
434
+ integrityRange,
435
+ typeValueRange,
436
+ integrity
437
+ ) => {
438
+ const isLink =
439
+ elementKind === "modulepreload" || elementKind === "stylesheet";
440
+
441
+ /** @type {{ start: number, end: number, text: string }[]} */
442
+ const edits = [{ start: srcStartInTag, end: srcEndInTag, text: newUrl }];
443
+
444
+ // Drop the author's `integrity` — content-specific, wrong for another
445
+ // chunk's file. A correct per-chunk one is re-inserted below from
446
+ // `output.html.integrity`.
447
+ if (integrityRange) {
448
+ edits.push({ start: integrityRange[0], end: integrityRange[1], text: "" });
449
+ }
450
+
451
+ // Inserted right after the tag name: `crossorigin` from
452
+ // `output.crossOriginLoading`, then a forced `type="module"` when the tag
453
+ // has no `type` value to rewrite in place.
454
+ let afterName = crossOrigin;
455
+ if (elementKind === "script-module") {
456
+ if (typeValueRange) {
457
+ edits.push({
458
+ start: typeValueRange[0],
459
+ end: typeValueRange[1],
460
+ text: "module"
461
+ });
462
+ } else {
463
+ afterName += ' type="module"';
464
+ }
465
+ }
466
+
467
+ // Per-chunk `integrity` sentinel goes in alongside `crossorigin`/`type`.
468
+ afterName += integrity;
469
+ if (afterName) {
470
+ edits.push({
471
+ start: tagNameEndInTag,
472
+ end: tagNameEndInTag,
473
+ text: afterName
474
+ });
475
+ }
476
+
477
+ edits.sort((a, b) => b.start - a.start);
478
+ let body = originalTag;
479
+ for (const edit of edits) {
480
+ body = body.slice(0, edit.start) + edit.text + body.slice(edit.end);
481
+ }
482
+
483
+ // `<link>` is a void element — no closing tag. `<script>` needs `</script>`.
484
+ return isLink ? body : `${body}</script>`;
485
+ };
486
+
487
+ // ES5 `<link rel="modulepreload">` polyfill (Safari <17, Firefox <115, …):
488
+ // on browsers without native support, fetch each modulepreload target with the
489
+ // tag's own credentials/integrity so the pending module import reuses it. The
490
+ // `.ep` guard makes it idempotent, and the observer catches any later-inserted
491
+ // links. Emitted only when the target environment lacks native support.
492
+ const MODULEPRELOAD_POLYFILL = [
493
+ "(function(){",
494
+ 'var s=document.createElement("link").relList;',
495
+ 'if(s&&s.supports&&s.supports("modulepreload"))return;',
496
+ "function f(e){",
497
+ "if(e.ep)return;e.ep=1;",
498
+ "var o={};",
499
+ "if(e.integrity)o.integrity=e.integrity;",
500
+ "if(e.referrerPolicy)o.referrerPolicy=e.referrerPolicy;",
501
+ 'o.credentials=e.crossOrigin==="use-credentials"?"include":e.crossOrigin==="anonymous"?"omit":"same-origin";',
502
+ "fetch(e.href,o)}",
503
+ "var l=document.querySelectorAll('link[rel=\"modulepreload\"]');",
504
+ "for(var i=0;i<l.length;i++)f(l[i]);",
505
+ "new MutationObserver(function(m){",
506
+ "for(var j=0;j<m.length;j++)",
507
+ "for(var a=m[j].addedNodes,k=0;k<a.length;k++)",
508
+ 'if(a[k].tagName==="LINK"&&a[k].rel==="modulepreload")f(a[k])',
509
+ "}).observe(document,{childList:true,subtree:true})",
510
+ "})();"
511
+ ].join("");
512
+
513
+ // One polyfill `<script>` per rendered page. Keyed by the `ReplaceSource` of a
514
+ // single HTML code-generation pass (shared by all of a page's entry tags, fresh
515
+ // per pass), so multi-`<script>` pages get exactly one and the cache stays correct.
516
+ /** @type {WeakSet<ReplaceSource>} */
517
+ const polyfilledSources = new WeakSet();
518
+
519
+ /** @typedef {"preload" | "prefetch" | "modulepreload" | "preconnect" | "dns-prefetch"} HtmlResourceHintRel */
520
+ /**
521
+ * A custom resource-hint `<link>` (`output.html.resourceHints`). Exactly one of
522
+ * `href` / `chunk` / `entry` names the target; `chunk`/`entry` URLs (hash and
523
+ * public path) are resolved by webpack, `href` is used verbatim.
524
+ * @typedef {object} HtmlResourceHint
525
+ * @property {HtmlResourceHintRel} rel hint relationship
526
+ * @property {string=} href literal URL (external, `preconnect`, or an already-hashed asset)
527
+ * @property {string=} chunk chunk name to hint
528
+ * @property {string=} entry entrypoint name to hint (expands to one hint per initial chunk)
529
+ * @property {string=} as the `as` attribute; defaults to `script` for chunk/entry refs
530
+ * @property {string=} type the `type` attribute (MIME)
531
+ * @property {(boolean | "anonymous" | "use-credentials")=} crossorigin CORS mode (`true` → `anonymous`)
532
+ * @property {string=} media the `media` attribute
533
+ * @property {boolean=} integrity SRI for a chunk/entry ref; follows `output.html.integrity` by default, `false` opts out
534
+ * @property {("low" | "high" | "auto")=} fetchPriority the `fetchpriority` attribute (allowed on `preload`/`modulepreload`/`prefetch`)
535
+ */
536
+ /**
537
+ * @typedef {object} HtmlResourceHintContext
538
+ * @property {string} entryName name of the entry this page loads
539
+ * @property {Entrypoint} entrypoint the entrypoint
540
+ * @property {"html" | "js"} hostType `"html"` when the entry has an extracted HTML page; `"js"` when a JS-only entry is being consulted (SSR framework case)
541
+ * @property {import("../Compilation")} compilation the compilation
542
+ * @property {{ rel: "modulepreload" | "preload" | "prefetch", chunk: string, hostChunks: string[] }[]} defaultHints the auto initial-graph hints (`chunk` / `hostChunks` name the referencing chunk — Vite's `hostId`)
543
+ */
544
+
545
+ /**
546
+ * @param {string} value attribute value
547
+ * @returns {string} value with `"` escaped so it can't break out of the attribute
548
+ */
549
+ const escapeAttr = (value) => String(value).replace(/"/g, "&quot;");
550
+
551
+ /**
552
+ * @param {boolean | "anonymous" | "use-credentials" | undefined} value crossorigin option
553
+ * @returns {string | undefined} ` crossorigin="…"`, or undefined when unset/false
554
+ */
555
+ const crossOriginAttr = (value) => {
556
+ if (value === undefined || value === false) return undefined;
557
+ return ` crossorigin="${value === true ? "anonymous" : value}"`;
558
+ };
559
+
560
+ /**
561
+ * Build one resource-hint `<link>` tag from a resolved href and attributes.
562
+ * @param {HtmlResourceHintRel} rel the `rel`
563
+ * @param {{ href: string, as?: string, type?: string, crossorigin?: string, integrity?: string, media?: string, fetchpriority?: string }} attrs attributes (already href-resolved; `crossorigin`/`integrity` are full ` name="…"` spans)
564
+ * @returns {string} the `<link>` tag
565
+ */
566
+ const buildLinkTag = (rel, attrs) =>
567
+ `<link rel="${rel}"${attrs.as ? ` as="${escapeAttr(attrs.as)}"` : ""}${
568
+ attrs.type ? ` type="${escapeAttr(attrs.type)}"` : ""
569
+ } href="${escapeAttr(attrs.href)}"${attrs.crossorigin || ""}${
570
+ attrs.integrity || ""
571
+ }${attrs.media ? ` media="${escapeAttr(attrs.media)}"` : ""}${
572
+ attrs.fetchpriority
573
+ ? ` fetchpriority="${escapeAttr(attrs.fetchpriority)}"`
574
+ : ""
575
+ }>`;
576
+
577
+ /**
578
+ * Resolve one `output.html.resourceHints` descriptor to zero or more `<link>`
579
+ * tags. A `chunk`/`entry` reference becomes the emitted chunk URL (a sentinel
580
+ * resolved with the final hash and public path), an `href` is used verbatim, and
581
+ * `preconnect`/`dns-prefetch` use only `href`. Unknown chunk/entry names are skipped.
582
+ * @param {HtmlResourceHint} desc the descriptor
583
+ * @param {{ compilation: import("../Compilation"), chunkGraph: ChunkGraph, chunkByName: Map<string, Chunk>, outputCrossOrigin: string, integrityOn: boolean }} ctx resolution context
584
+ * @returns {string[]} the resolved tags
585
+ */
586
+ const resolveResourceHint = (desc, ctx) => {
587
+ const rel = desc.rel;
588
+ if (rel === "preconnect" || rel === "dns-prefetch") {
589
+ if (!desc.href) return [];
590
+ return [
591
+ buildLinkTag(rel, {
592
+ href: desc.href,
593
+ crossorigin: crossOriginAttr(desc.crossorigin),
594
+ media: desc.media
595
+ })
596
+ ];
597
+ }
598
+ if (desc.href) {
599
+ return [
600
+ buildLinkTag(rel, {
601
+ href: desc.href,
602
+ as: desc.as,
603
+ type: desc.type,
604
+ crossorigin: crossOriginAttr(desc.crossorigin),
605
+ media: desc.media,
606
+ fetchpriority: desc.fetchPriority
607
+ })
608
+ ];
609
+ }
610
+ /** @type {Chunk[]} */
611
+ let chunks;
612
+ if (desc.entry) {
613
+ const entrypoint = ctx.compilation.entrypoints.get(desc.entry);
614
+ if (!entrypoint) return [];
615
+ chunks = getEntrypointChunksInLoadOrder(entrypoint);
616
+ } else if (desc.chunk) {
617
+ const chunk = ctx.chunkByName.get(desc.chunk);
618
+ if (!chunk) return [];
619
+ chunks = [chunk];
620
+ } else {
621
+ return [];
622
+ }
623
+ const kind = desc.as === "style" ? "css" : "javascript";
624
+ const as = desc.as || (rel === "modulepreload" ? undefined : "script");
625
+ // A hint targeting another chunk must match how that chunk is fetched, so
626
+ // inherit `output.crossOriginLoading` unless the descriptor overrides it.
627
+ const crossorigin =
628
+ desc.crossorigin !== undefined
629
+ ? crossOriginAttr(desc.crossorigin)
630
+ : ctx.outputCrossOrigin || undefined;
631
+ /** @type {string[]} */
632
+ const tags = [];
633
+ for (const chunk of chunks) {
634
+ const has =
635
+ kind === "css"
636
+ ? chunkHasCss(chunk, ctx.chunkGraph)
637
+ : chunkHasJs(chunk, ctx.chunkGraph);
638
+ if (!has) continue;
639
+ tags.push(
640
+ buildLinkTag(rel, {
641
+ href: HtmlGenerator.makeChunkUrlSentinel(chunk, kind),
642
+ as,
643
+ type: desc.type,
644
+ crossorigin,
645
+ // SRI follows the global `output.html.integrity` policy (like the
646
+ // auto hints); `integrity: false` opts a single hint out. Only
647
+ // `preload`/`modulepreload` are SRI-eligible — `prefetch` is not.
648
+ integrity:
649
+ (rel === "preload" || rel === "modulepreload") &&
650
+ desc.integrity !== false &&
651
+ ctx.integrityOn
652
+ ? ` integrity="${HtmlGenerator.makeChunkIntegritySentinel(chunk, kind)}"`
653
+ : undefined,
654
+ media: desc.media,
655
+ fetchpriority: desc.fetchPriority
656
+ })
657
+ );
658
+ }
659
+ return tags;
660
+ };
661
+
662
+ HtmlEntryDependency.Template = class HtmlEntryDependencyTemplate extends (
663
+ ModuleDependency.Template
664
+ ) {
665
+ /**
666
+ * Applies the plugin by registering its hooks on the compiler.
667
+ * @param {Dependency} dependency the dependency for which the template should be applied
668
+ * @param {ReplaceSource} source the current replace source which can be modified
669
+ * @param {DependencyTemplateContext} templateContext the context object
670
+ * @returns {void}
671
+ */
672
+ apply(dependency, source, templateContext) {
673
+ const { runtimeTemplate } = templateContext;
674
+ const dep = /** @type {HtmlEntryDependency} */ (dependency);
675
+ const compilation = runtimeTemplate.compilation;
676
+
677
+ // A `type: "html"` link points at another emitted page, not a JS/CSS
678
+ // chunk: rewrite the attribute to that page's filename (resolved by
679
+ // HtmlModulesPlugin once it's built) and emit no sibling tags — a page
680
+ // link loads only itself.
681
+ if (dep.elementKind === "html") {
682
+ source.replace(
683
+ dep.range[0],
684
+ dep.range[1] - 1,
685
+ HtmlGenerator.makeHtmlPageUrlSentinel(dep.entryName)
686
+ );
687
+ return;
688
+ }
689
+
690
+ const { chunkGraph } = compilation;
691
+ const { crossOriginLoading } = compilation.outputOptions;
692
+ const entrypoint = /** @type {Entrypoint | undefined} */ (
693
+ compilation.entrypoints.get(dep.entryName)
694
+ );
695
+
696
+ if (!entrypoint) {
697
+ source.replace(dep.range[0], dep.range[1] - 1, "data:,");
698
+ return;
699
+ }
700
+
701
+ const orderedChunks = getEntrypointChunksInLoadOrder(entrypoint);
702
+ const entryChunk = orderedChunks[orderedChunks.length - 1];
703
+
704
+ // `crossorigin` mirrors `output.crossOriginLoading` onto every injected
705
+ // tag. Empty when the option is off or the originating tag already set
706
+ // `crossorigin` (author value wins, flagged at parse time). Mirrors
707
+ // webpack's runtime, which sets `crossOrigin` on chunk-loading scripts,
708
+ // and matches Vite, which emits it on every injected script/stylesheet.
709
+ const crossOrigin =
710
+ crossOriginLoading && !dep.hasOwnCrossOrigin
711
+ ? ` crossorigin="${crossOriginLoading}"`
712
+ : "";
713
+
714
+ // Per-chunk SRI: emit an `integrity` sentinel resolved late (after the
715
+ // chunks' final bytes exist) by `resolveChunkIntegritySentinels`. On when
716
+ // `output.html.integrity` is `true`, a non-empty array, or a function.
717
+ const htmlOption = compilation.outputOptions.html;
718
+ const integrity =
719
+ typeof htmlOption === "object" ? htmlOption.integrity : undefined;
720
+ const integrityOn =
721
+ integrity === true ||
722
+ typeof integrity === "function" ||
723
+ (Array.isArray(integrity) && integrity.length > 0);
724
+ const inject =
725
+ typeof htmlOption === "object" ? htmlOption.inject : undefined;
726
+
727
+ /**
728
+ * Mirror `crossorigin`/`integrity` onto a native entry tag, inserted right
729
+ * after the tag name so they sit alongside any `type="module"` the parser
730
+ * injected. The author's content-specific `integrity` is dropped first (as
731
+ * clones do) so the tag never carries two.
732
+ * @param {Chunk} chunk chunk whose SRI hash the tag references
733
+ * @param {"javascript" | "css"} contentHashType which chunk asset to hash
734
+ * @returns {void}
735
+ */
736
+ const applyEntryTagAttrs = (chunk, contentHashType) => {
737
+ if (!dep.tagIsNative || dep.tagNameEnd < 0) return;
738
+ if (crossOrigin) source.insert(dep.tagNameEnd, crossOrigin);
739
+ if (integrityOn) {
740
+ if (dep.integrityRange) {
741
+ source.replace(
742
+ dep.tagStart + dep.integrityRange[0],
743
+ dep.tagStart + dep.integrityRange[1] - 1,
744
+ ""
745
+ );
746
+ }
747
+ source.insert(
748
+ dep.tagNameEnd,
749
+ ` integrity="${HtmlGenerator.makeChunkIntegritySentinel(
750
+ chunk,
751
+ contentHashType
752
+ )}"`
753
+ );
754
+ }
755
+ };
756
+
757
+ // `rel="preload"/"prefetch"` is a resource hint: rewrite the `href` to the
758
+ // built chunk's URL (CSS for `as="style"`, JS otherwise) and stop — no
759
+ // sibling tags and no execution.
760
+ if (dep.elementKind === "preload" || dep.elementKind === "prefetch") {
761
+ const contentHashType =
762
+ dep.category === "css-import" ? "css" : "javascript";
763
+ source.replace(
764
+ dep.range[0],
765
+ dep.range[1] - 1,
766
+ HtmlGenerator.makeChunkUrlSentinel(entryChunk, contentHashType)
767
+ );
768
+ // `preload` is integrity-eligible per the SRI spec, so mirror
769
+ // `crossorigin`/`integrity` onto it (SRI requires CORS). `prefetch` is a
770
+ // navigation cache hint the spec doesn't cover — leave it a bare href.
771
+ if (dep.elementKind === "preload") {
772
+ applyEntryTagAttrs(entryChunk, contentHashType);
773
+ }
774
+ return;
775
+ }
776
+
777
+ const isStylesheet = dep.elementKind === "stylesheet";
778
+ // Inlined scripts are `type="module"` only for ESM output; classic-IIFE
779
+ // chunks (the default) must stay a plain `<script>`.
780
+ const scriptTypeAttr =
781
+ compilation.outputOptions.module === true ? ' type="module"' : "";
782
+
783
+ const entryContentHashType = isStylesheet ? "css" : "javascript";
784
+ const inlineOption =
785
+ typeof htmlOption === "object" ? htmlOption.inline : undefined;
786
+ /** @type {RegExp[] | null} */
787
+ const inlinePatterns = Array.isArray(inlineOption) ? inlineOption : null;
788
+ /**
789
+ * @param {Chunk} chunk chunk to test
790
+ * @param {"javascript" | "css"} contentType which asset of the chunk is being emitted
791
+ * @returns {boolean} true when this chunk's content should be inlined
792
+ */
793
+ const isChunkInlined = (chunk, contentType) => {
794
+ // A `<link rel="modulepreload">` is a void fetch hint — inlining it would
795
+ // emit an unclosed, executing `<script>`.
796
+ if (dep.elementKind === "modulepreload") return false;
797
+ if (dep.forceInline) return true;
798
+ if (!inlineOption) return false;
799
+ if (inlineOption === true) return true;
800
+ // `"script"`/`"style"` inline by asset type, not chunk name — a chunk's
801
+ // JS and CSS share a name, so only the emitted `contentType` tells them
802
+ // apart.
803
+ if (inlineOption === "script") return contentType === "javascript";
804
+ if (inlineOption === "style") return contentType === "css";
805
+ const name = chunk.name || String(chunk.id);
806
+ return /** @type {RegExp[]} */ (inlinePatterns).some((re) =>
807
+ re.test(name)
808
+ );
809
+ };
810
+
811
+ // Only inline when the HTML module is emitted as a standalone page (extract mode).
812
+ // If it's exported as a JS string, sentinels would end up embedded in the JS chunk.
813
+ const isExtractedHtml = chunkGraph
814
+ .getModuleSourceTypes(
815
+ /** @type {import("../Module")} */ (templateContext.module)
816
+ )
817
+ .has("html");
818
+ const entryInlined =
819
+ isExtractedHtml &&
820
+ dep.tagStart >= 0 &&
821
+ dep.tagOpenEnd > dep.tagStart &&
822
+ isChunkInlined(entryChunk, entryContentHashType);
823
+
824
+ if (entryInlined) {
825
+ const inlineSentinel = HtmlGenerator.makeChunkInlineSentinel(
826
+ entryChunk,
827
+ entryContentHashType
828
+ );
829
+ if (isStylesheet) {
830
+ source.replace(
831
+ dep.tagStart,
832
+ dep.tagOpenEnd - 1,
833
+ `<style>${inlineSentinel}</style>`
834
+ );
835
+ } else {
836
+ source.replace(
837
+ dep.tagStart,
838
+ dep.tagOpenEnd - 1,
839
+ `<script${scriptTypeAttr}>${inlineSentinel}`
840
+ );
841
+ }
842
+ } else {
843
+ source.replace(
844
+ dep.range[0],
845
+ dep.range[1] - 1,
846
+ HtmlGenerator.makeChunkUrlSentinel(entryChunk, entryContentHashType)
847
+ );
848
+ }
849
+
850
+ if (dep.tagStart < 0 || dep.tagOpenEnd <= dep.tagStart) {
851
+ return;
852
+ }
853
+
854
+ const originalContent = /** @type {string} */ (source.original().source());
855
+ const originalTag = originalContent.slice(dep.tagStart, dep.tagOpenEnd);
856
+ const srcStartInTag = dep.range[0] - dep.tagStart;
857
+ const srcEndInTag = dep.range[1] - dep.tagStart;
858
+ const tagIsNative = dep.tagIsNative;
859
+ const tagNameEndInTag = dep.tagNameEnd - dep.tagStart;
860
+
861
+ // Mirror `crossorigin`/`integrity` onto the non-inlined entry tag
862
+ // (siblings get them via the builders below).
863
+ if (!entryInlined) applyEntryTagAttrs(entryChunk, entryContentHashType);
864
+
865
+ // `inject: false` suppresses sibling-chunk tags only; resource hints
866
+ // below still apply (the way to reference the suppressed chunks).
867
+ if (inject !== false) {
868
+ /**
869
+ * @param {Chunk} chunk chunk to emit a sibling tag for
870
+ * @param {"javascript" | "css"} kind content type slice of the chunk to emit
871
+ * @returns {string} a single sibling tag's HTML
872
+ */
873
+ const buildSibling = (chunk, kind) => {
874
+ if (isChunkInlined(chunk, kind)) {
875
+ const sentinel = HtmlGenerator.makeChunkInlineSentinel(chunk, kind);
876
+ return kind === "css"
877
+ ? `<style>${sentinel}</style>`
878
+ : `<script${scriptTypeAttr}>${sentinel}</script>`;
879
+ }
880
+ const url = HtmlGenerator.makeChunkUrlSentinel(chunk, kind);
881
+ const integrityAttr = integrityOn
882
+ ? ` integrity="${HtmlGenerator.makeChunkIntegritySentinel(chunk, kind)}"`
883
+ : "";
884
+ if (kind === "css") {
885
+ // A CSS chunk is always loaded via `<link rel="stylesheet">`.
886
+ // Clone only when the entry tag is itself a native `<link
887
+ // rel="stylesheet">` (so attributes like `media` carry over);
888
+ // a `<script>` entry that imported CSS, or a custom element,
889
+ // gets a freshly synthesized `<link>`.
890
+ if (isStylesheet && tagIsNative) {
891
+ return cloneTagWithUrl(
892
+ originalTag,
893
+ srcStartInTag,
894
+ srcEndInTag,
895
+ url,
896
+ dep.elementKind,
897
+ crossOrigin,
898
+ tagNameEndInTag,
899
+ dep.integrityRange,
900
+ dep.typeValueRange,
901
+ integrityAttr
902
+ );
903
+ }
904
+ return buildStylesheetLink(
905
+ dep.copyableAttrsText,
906
+ url,
907
+ crossOrigin,
908
+ integrityAttr
909
+ );
910
+ }
911
+ // A JS chunk is loaded via `<script>`. Clone a native `<script>`
912
+ // verbatim; synthesize a real `<script>` for custom elements that
913
+ // were mapped to `type: script`/`script-module`.
914
+ if (tagIsNative) {
915
+ return cloneTagWithUrl(
916
+ originalTag,
917
+ srcStartInTag,
918
+ srcEndInTag,
919
+ url,
920
+ dep.elementKind,
921
+ crossOrigin,
922
+ tagNameEndInTag,
923
+ dep.integrityRange,
924
+ dep.typeValueRange,
925
+ integrityAttr
926
+ );
927
+ }
928
+ return buildScriptTag(
929
+ dep.copyableAttrsText,
930
+ url,
931
+ dep.elementKind === "script-module",
932
+ crossOrigin,
933
+ integrityAttr
934
+ );
935
+ };
936
+
937
+ const siblings = [];
938
+ // Parser-derived anchor (a source text scan would match `</head>` inside
939
+ // comments or raw text).
940
+ const headClose = inject === "head" ? dep.headAnchor : -1;
941
+ // When the entry tag is already inside <head> (tagStart < headClose),
942
+ // inserting siblings at headClose would place them after the entry,
943
+ // reversing runtime-before-entry execution order for deferred scripts.
944
+ // Insert before the entry tag instead so the load order is preserved.
945
+ const headAt =
946
+ headClose < 0
947
+ ? -1
948
+ : dep.tagStart < headClose
949
+ ? dep.tagStart
950
+ : headClose;
951
+
952
+ let cssHtml = "";
953
+ let cssAt = -1;
954
+ if (isStylesheet) {
955
+ // `<link rel="stylesheet">` entries are CSS, but a shared/runtime
956
+ // JS-only chunk (e.g. `optimization.runtimeChunk`) can still sit in
957
+ // the entrypoint — only clone the `<link>` for siblings that actually
958
+ // produce a `.css` asset (mirrors the JS branch below), otherwise the
959
+ // link points at a non-existent `.css` file (a 404, or an empty
960
+ // `<style>` when inlined). Attributes like `media` still carry over.
961
+ for (let i = 0; i < orderedChunks.length - 1; i++) {
962
+ if (chunkHasCss(orderedChunks[i], chunkGraph)) {
963
+ siblings.push(buildSibling(orderedChunks[i], "css"));
964
+ }
965
+ }
966
+ } else {
967
+ // CSS chunks are emitted before JS chunks so the cascade is set
968
+ // up before any script runs. Within CSS the order needs to match
969
+ // the source's import order — `entrypoint.chunks` alone doesn't
970
+ // give us that for arbitrary splitChunks layouts (splitChunks
971
+ // inserts each new chunk before the entry chunk via
972
+ // `insertChunk(_, before)`, so split CSS siblings end up in
973
+ // *reverse* of the order they were processed — exactly the
974
+ // html-webpack-plugin#1838 / mini-css-extract#959 symptom). We
975
+ // re-derive the order from the entrypoint's module post-order
976
+ // index, which mirrors the dependency walk and so reflects the
977
+ // import order.
978
+ /** @type {{ chunk: Chunk, index: number, key: string }[]} */
979
+ const cssChunkOrder = [];
980
+ /** @type {Chunk[]} */
981
+ const jsChunks = [];
982
+ for (let i = 0; i < orderedChunks.length - 1; i++) {
983
+ const chunk = orderedChunks[i];
984
+ const hasCss = chunkHasCss(chunk, chunkGraph);
985
+ const hasJs = chunkHasJs(chunk, chunkGraph);
986
+ if (hasCss) {
987
+ cssChunkOrder.push({
988
+ chunk,
989
+ index: firstCssModulePostOrderIndex(
990
+ chunk,
991
+ entrypoint,
992
+ chunkGraph
993
+ ),
994
+ key: cssChunkSortKey(chunk)
995
+ });
996
+ }
997
+ // Anything that isn't CSS-only stays on the JS lane, in the
998
+ // `orderedChunks` order — that preserves the runtime-first /
999
+ // vendor-before-entry invariant of `getEntrypointChunksInLoadOrder`.
1000
+ // Chunks that produce no `.js` and no `.css` (e.g. wasm-only
1001
+ // or asset-only) still get a `<script>` clone here so we
1002
+ // keep prior behavior for users who relied on it.
1003
+ if (hasJs || !hasCss) jsChunks.push(chunk);
1004
+ }
1005
+ // If the entry chunk itself contains CSS (entry JS imports CSS
1006
+ // without splitChunks separating it), fold it into the same CSS
1007
+ // ordering so the entry-chunk `<link>` lands in the correct
1008
+ // cascade position relative to sibling CSS chunks.
1009
+ if (chunkHasCss(entryChunk, chunkGraph)) {
1010
+ cssChunkOrder.push({
1011
+ chunk: entryChunk,
1012
+ index: firstCssModulePostOrderIndex(
1013
+ entryChunk,
1014
+ entrypoint,
1015
+ chunkGraph
1016
+ ),
1017
+ key: cssChunkSortKey(entryChunk)
1018
+ });
1019
+ }
1020
+ cssChunkOrder.sort(compareCssChunkOrder);
1021
+ // Stylesheets always land in <head> when the page has one. A
1022
+ // classic blocking script pins them ahead of itself (`cssAnchor`)
1023
+ // so its execution never awaits later CSS; when every script is
1024
+ // `defer`/module they go to the *end* of head, after the script
1025
+ // tags — Vite's and html-webpack-plugin's order: the scripts
1026
+ // start fetching earlier yet still execute after parsing and
1027
+ // after pending stylesheets.
1028
+ cssAt =
1029
+ dep.headAnchor >= 0
1030
+ ? dep.cssAnchor >= 0 && dep.cssAnchor < dep.headAnchor
1031
+ ? dep.cssAnchor
1032
+ : dep.headAnchor
1033
+ : dep.cssAnchor >= 0
1034
+ ? dep.cssAnchor
1035
+ : dep.tagStart;
1036
+ cssHtml = cssChunkOrder
1037
+ .map(({ chunk }) => buildSibling(chunk, "css"))
1038
+ .join("");
1039
+ for (const chunk of jsChunks) {
1040
+ siblings.push(buildSibling(chunk, "javascript"));
1041
+ }
1042
+ }
1043
+
1044
+ // Same-offset inserts keep call order: CSS goes in before the
1045
+ // sibling scripts only when a blocking script demands CSS-first.
1046
+ if (cssHtml !== "" && dep.cssAnchor >= 0) source.insert(cssAt, cssHtml);
1047
+ if (siblings.length > 0) {
1048
+ source.insert(headAt >= 0 ? headAt : dep.tagStart, siblings.join(""));
1049
+ }
1050
+ if (cssHtml !== "" && dep.cssAnchor < 0) source.insert(cssAt, cssHtml);
1051
+ }
1052
+
1053
+ // Resource hints are opt-in — webpack already loads the initial chunks
1054
+ // via parallel `<script>` tags, so there is no waterfall to prevent by
1055
+ // default. `output.resourceHints` requests them: `true` preloads the
1056
+ // entry's initial dependency chunks (runtime, vendor, split); an array
1057
+ // or function adds custom hints (a function may spread the auto
1058
+ // `defaultHints`). Only for extracted pages — a JS-string HTML export
1059
+ // would embed the sentinels in the JS chunk. URL-referenced assets
1060
+ // (fonts, images) carrying `webpackPrefetch` / `webpackPreload`
1061
+ // (magic-comment or `parser.<type>.urlHints` rule) also emit here.
1062
+ const resourceHintResolver =
1063
+ ResourceHintPlugin.getCompilationResolver(compilation);
1064
+ const resourceHints = resourceHintResolver.hints;
1065
+ if (
1066
+ isExtractedHtml &&
1067
+ (dep.elementKind === "script" || dep.elementKind === "script-module")
1068
+ ) {
1069
+ const isModuleOutput = compilation.outputOptions.module === true;
1070
+
1071
+ /** @type {string[]} */
1072
+ const hints = [];
1073
+
1074
+ // === preconnect channel — cross-origin publicPath (resourceHints.preconnect) ===
1075
+ const rhOptions = compilation.outputOptions.resourceHints;
1076
+ if (rhOptions && rhOptions.preconnect) {
1077
+ const pp = compilation.outputOptions.publicPath;
1078
+ const originMatch =
1079
+ typeof pp === "string" ? /^(https?:)?\/\/[^/?#]+/i.exec(pp) : null;
1080
+ if (originMatch) {
1081
+ hints.push(
1082
+ `<link rel="preconnect" href="${escapeAttr(originMatch[0])}"${crossOrigin}>`
1083
+ );
1084
+ }
1085
+ }
1086
+
1087
+ // === chunks channel — the entry's own initial dependency graph ===
1088
+ if (resourceHints !== undefined && resourceHints !== false) {
1089
+ // The auto initial-graph preload as descriptors carrying their exact
1090
+ // tag, built only when needed (`true`/`"prefetch"` emits them, a
1091
+ // function may spread them). The entry chunk is skipped — it's
1092
+ // already the `<script src>`. ESM uses `modulepreload` (fetch +
1093
+ // parse), classic output `preload as="script"`, and `"prefetch"`
1094
+ // opts into `<link rel="prefetch">` (idle-time fetch, no `as` / no
1095
+ // `integrity` — the spec doesn't list them). Async `import()` chunks
1096
+ // aren't covered here; use `module.parser.javascript.dynamicImport*`
1097
+ // which routes through webpack's on-demand chunk-load runtime.
1098
+ const prefetchMode = resourceHints === "prefetch";
1099
+ const preloadMode = resourceHints === true;
1100
+ /** @type {"modulepreload" | "preload" | "prefetch"} */
1101
+ const rel = prefetchMode
1102
+ ? "prefetch"
1103
+ : isModuleOutput
1104
+ ? "modulepreload"
1105
+ : "preload";
1106
+ /** @type {{ rel: "modulepreload" | "preload" | "prefetch", chunk: string, hostChunks: string[], _tag: string }[]} */
1107
+ const defaultHints = [];
1108
+ if (
1109
+ preloadMode ||
1110
+ prefetchMode ||
1111
+ typeof resourceHints === "function"
1112
+ ) {
1113
+ for (const chunk of orderedChunks) {
1114
+ if (
1115
+ chunk === entryChunk ||
1116
+ isChunkInlined(chunk, "javascript") ||
1117
+ !chunkHasJs(chunk, chunkGraph)
1118
+ ) {
1119
+ continue;
1120
+ }
1121
+ const href = HtmlGenerator.makeChunkUrlSentinel(
1122
+ chunk,
1123
+ "javascript"
1124
+ );
1125
+ const integrityAttr =
1126
+ integrityOn && !prefetchMode
1127
+ ? ` integrity="${HtmlGenerator.makeChunkIntegritySentinel(
1128
+ chunk,
1129
+ "javascript"
1130
+ )}"`
1131
+ : "";
1132
+ // Mirror the entry tag's `nonce`/`crossorigin`/`referrerpolicy`
1133
+ // (and `output.crossOriginLoading`) so the request matches the
1134
+ // sibling `<script>`'s and the browser reuses it instead of
1135
+ // fetching twice.
1136
+ const attrs = `${dep.copyableAttrsText}${crossOrigin}${integrityAttr}`;
1137
+ const tag = prefetchMode
1138
+ ? `<link rel="prefetch" href="${href}"${attrs}>`
1139
+ : isModuleOutput
1140
+ ? `<link rel="modulepreload" href="${href}"${attrs}>`
1141
+ : `<link rel="preload" as="script" href="${href}"${attrs}>`;
1142
+ const chunkName = chunk.name || String(chunk.id);
1143
+ defaultHints.push({
1144
+ rel,
1145
+ chunk: chunkName,
1146
+ hostChunks: [chunkName],
1147
+ _tag: tag
1148
+ });
1149
+ }
1150
+ }
1151
+
1152
+ if (preloadMode || prefetchMode) {
1153
+ for (const d of defaultHints) {
1154
+ hints.push(d._tag);
1155
+ }
1156
+ } else {
1157
+ // Array (custom only) or function (returns the final list, may spread
1158
+ // `defaultHints`). A returned default hint keeps its prebuilt tag; any
1159
+ // other descriptor is resolved through the URL/SRI pipeline.
1160
+ let descriptors = resourceHints;
1161
+ if (typeof resourceHints === "function") {
1162
+ // The page's own entry name (its named entry chunk), not the synthetic
1163
+ // `<script>` entry — that's what users key on.
1164
+ let entryName = dep.entryName;
1165
+ for (const c of chunkGraph.getModuleChunks(
1166
+ /** @type {import("../Module")} */ (templateContext.module)
1167
+ )) {
1168
+ if (c.name) {
1169
+ entryName = c.name;
1170
+ break;
1171
+ }
1172
+ }
1173
+ descriptors = resourceHints({
1174
+ entryName,
1175
+ entrypoint,
1176
+ hostType: "html",
1177
+ compilation,
1178
+ defaultHints
1179
+ });
1180
+ }
1181
+ if (Array.isArray(descriptors) && descriptors.length > 0) {
1182
+ /** @type {Map<string, Chunk>} */
1183
+ const chunkByName = new Map();
1184
+ for (const c of compilation.chunks) {
1185
+ if (c.name) chunkByName.set(c.name, c);
1186
+ }
1187
+ const outputCrossOrigin = crossOriginLoading
1188
+ ? ` crossorigin="${crossOriginLoading}"`
1189
+ : "";
1190
+ const ctx = {
1191
+ compilation,
1192
+ chunkGraph,
1193
+ chunkByName,
1194
+ outputCrossOrigin,
1195
+ integrityOn
1196
+ };
1197
+ for (const desc of descriptors) {
1198
+ if (!desc || typeof desc !== "object") continue;
1199
+ const prebuilt = /** @type {{ _tag?: string }} */ (desc)._tag;
1200
+ if (prebuilt) {
1201
+ hints.push(prebuilt);
1202
+ } else if (desc.rel) {
1203
+ for (const tag of resolveResourceHint(desc, ctx)) {
1204
+ hints.push(tag);
1205
+ }
1206
+ }
1207
+ }
1208
+ }
1209
+ }
1210
+ }
1211
+
1212
+ // === assets channel — URL-referenced assets carrying `prefetch`/`preload` ===
1213
+ // The plugin has already scanned the entrypoint's chunks × modules
1214
+ // once and cached the URL/CSS/HTML asset deps for this entry name;
1215
+ // consume that list here so this template doesn't repeat the walk.
1216
+ // Each unique asset emits one `<link rel="prefetch|preload">` into
1217
+ // the HTML `<head>`; the JS chunk-startup runtime skips it (no
1218
+ // double `<link>` in DOM). URLs are sentinels resolved from asset
1219
+ // codegen data during `HtmlModulesPlugin` render — the asset
1220
+ // module might not have been codegen'd yet at this point.
1221
+ const outputCrossOriginAttr = crossOriginLoading
1222
+ ? ` crossorigin="${crossOriginLoading}"`
1223
+ : "";
1224
+ for (const { module, dep: md } of resourceHintResolver.getHtmlHinted(
1225
+ dep.entryName
1226
+ )) {
1227
+ const rel = md.preload ? "preload" : "prefetch";
1228
+ const asAttr =
1229
+ md.asAttribute ||
1230
+ ResourceHintRuntimeModule.guessAsAttribute(
1231
+ /** @type {import("./URLDependency")} */ (md).request || ""
1232
+ );
1233
+ const typeAttr = md.typeAttribute;
1234
+ const mediaAttr = md.mediaAttribute;
1235
+ const fetchPriority = md.fetchPriority;
1236
+ const href = HtmlGenerator.makeAssetUrlSentinel(module.identifier());
1237
+ const attrs =
1238
+ `${asAttr ? ` as="${escapeAttr(asAttr)}"` : ""}` +
1239
+ `${typeAttr ? ` type="${escapeAttr(typeAttr)}"` : ""}` +
1240
+ ` href="${escapeAttr(href)}"${
1241
+ outputCrossOriginAttr
1242
+ }${mediaAttr ? ` media="${escapeAttr(mediaAttr)}"` : ""}` +
1243
+ `${fetchPriority ? ` fetchpriority="${escapeAttr(fetchPriority)}"` : ""}`;
1244
+ hints.push(`<link rel="${rel}"${attrs}>`);
1245
+ }
1246
+
1247
+ if (hints.length > 0) {
1248
+ // De-duplicate (a custom hint may repeat an auto one), preserving order.
1249
+ /** @type {Set<string>} */
1250
+ const seen = new Set();
1251
+ /** @type {string[]} */
1252
+ const finalHints = [];
1253
+ for (const h of hints) {
1254
+ if (!seen.has(h)) {
1255
+ seen.add(h);
1256
+ finalHints.push(h);
1257
+ }
1258
+ }
1259
+ // When the target environment lacks native `modulepreload` (an
1260
+ // `output.environment` capability, like the JS-feature checks), append
1261
+ // a tiny polyfill once per page so the hints still warm the cache there.
1262
+ // `resourceHints.modulePreloadPolyfill` defaults from the target's
1263
+ // modulepreload support (`output.environment.modulePreload`); `false`
1264
+ // opts out (strict CSP).
1265
+ if (
1266
+ rhOptions &&
1267
+ rhOptions.modulePreloadPolyfill &&
1268
+ !polyfilledSources.has(source) &&
1269
+ finalHints.some((h) => h.startsWith('<link rel="modulepreload"'))
1270
+ ) {
1271
+ polyfilledSources.add(source);
1272
+ finalHints.push(`<script>${MODULEPRELOAD_POLYFILL}</script>`);
1273
+ }
1274
+ // Insert right after the `<head>` open tag (parser-derived) so the
1275
+ // hints are the document's first fetches; fall back to the first
1276
+ // blocking script (else the entry tag) when the page has no
1277
+ // written `<head>` (e.g. an HTML fragment).
1278
+ const hintAt =
1279
+ dep.headOpenEnd >= 0
1280
+ ? dep.headOpenEnd
1281
+ : dep.cssAnchor === -1
1282
+ ? dep.tagStart
1283
+ : dep.cssAnchor;
1284
+ source.insert(hintAt, finalHints.join(""));
1285
+ }
1286
+ }
1287
+ }
1288
+ };
1289
+
1290
+ makeSerializable(
1291
+ HtmlEntryDependency,
1292
+ "webpack/lib/dependencies/HtmlEntryDependency"
1293
+ );
1294
+
1295
+ module.exports = HtmlEntryDependency;