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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (647) hide show
  1. package/README.md +5 -5
  2. package/changes.json +7 -7
  3. package/lib/APIPlugin.js +123 -17
  4. package/lib/AsyncDependenciesBlock.js +10 -7
  5. package/lib/AutomaticPrefetchPlugin.js +1 -1
  6. package/lib/BannerPlugin.js +10 -6
  7. package/lib/CacheFacade.js +6 -6
  8. package/lib/Chunk.js +14 -11
  9. package/lib/ChunkGraph.js +46 -35
  10. package/lib/ChunkGroup.js +7 -7
  11. package/lib/ChunkTemplate.js +35 -44
  12. package/lib/CircularModulesPlugin.js +205 -28
  13. package/lib/CleanPlugin.js +4 -7
  14. package/lib/CodeGenerationResults.js +11 -8
  15. package/lib/CompatibilityPlugin.js +7 -7
  16. package/lib/Compilation.js +688 -409
  17. package/lib/Compiler.js +53 -38
  18. package/lib/ConcatenationScope.js +107 -8
  19. package/lib/ConditionalInitFragment.js +3 -3
  20. package/lib/ConstPlugin.js +13 -11
  21. package/lib/ContextExclusionPlugin.js +1 -1
  22. package/lib/ContextModule.js +146 -54
  23. package/lib/ContextModuleFactory.js +46 -14
  24. package/lib/ContextReplacementPlugin.js +12 -14
  25. package/lib/DefinePlugin.js +121 -37
  26. package/lib/DependenciesBlock.js +9 -6
  27. package/lib/Dependency.js +36 -16
  28. package/lib/DependencyTemplate.js +11 -12
  29. package/lib/DependencyTemplates.js +3 -3
  30. package/lib/DotenvPlugin.js +91 -26
  31. package/lib/DynamicEntryPlugin.js +8 -4
  32. package/lib/EntryOptionPlugin.js +8 -4
  33. package/lib/EntryPlugin.js +2 -2
  34. package/lib/Entrypoint.js +6 -2
  35. package/lib/EnvironmentPlugin.js +2 -2
  36. package/lib/EvalDevToolModulePlugin.js +8 -4
  37. package/lib/EvalSourceMapDevToolPlugin.js +15 -8
  38. package/lib/ExportsInfo.js +111 -14
  39. package/lib/ExportsInfoApiPlugin.js +2 -4
  40. package/lib/ExternalModule.js +232 -77
  41. package/lib/ExternalModuleFactoryPlugin.js +97 -38
  42. package/lib/ExternalsPlugin.js +10 -6
  43. package/lib/FileSystemInfo.js +44 -70
  44. package/lib/FlagAllModulesAsUsedPlugin.js +2 -3
  45. package/lib/FlagDependencyExportsPlugin.js +76 -19
  46. package/lib/FlagDependencyUsagePlugin.js +40 -49
  47. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  48. package/lib/Generator.js +36 -15
  49. package/lib/HotModuleReplacementPlugin.js +16 -44
  50. package/lib/IgnorePlugin.js +8 -4
  51. package/lib/IgnoreWarningsPlugin.js +2 -2
  52. package/lib/InitFragment.js +8 -4
  53. package/lib/JavascriptMetaInfoPlugin.js +35 -4
  54. package/lib/LazyBarrel.js +3 -4
  55. package/lib/LibraryTemplatePlugin.js +10 -6
  56. package/lib/LoaderOptionsPlugin.js +7 -3
  57. package/lib/LoaderTargetPlugin.js +1 -1
  58. package/lib/MainTemplate.js +49 -42
  59. package/lib/ManifestPlugin.js +12 -11
  60. package/lib/Module.js +62 -33
  61. package/lib/ModuleFactory.js +3 -3
  62. package/lib/ModuleFilenameHelpers.js +9 -4
  63. package/lib/ModuleGraph.js +195 -21
  64. package/lib/ModuleGraphConnection.js +6 -13
  65. package/lib/ModuleInfoHeaderPlugin.js +8 -10
  66. package/lib/ModuleTemplate.js +62 -63
  67. package/lib/MultiCompiler.js +130 -64
  68. package/lib/MultiStats.js +40 -9
  69. package/lib/MultiWatching.js +3 -3
  70. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  71. package/lib/NodeStuffPlugin.js +29 -19
  72. package/lib/NormalModule.js +152 -103
  73. package/lib/NormalModuleFactory.js +555 -110
  74. package/lib/NormalModuleReplacementPlugin.js +5 -8
  75. package/lib/NullFactory.js +6 -2
  76. package/lib/OptionsApply.js +7 -3
  77. package/lib/Parser.js +7 -3
  78. package/lib/PlatformPlugin.js +2 -2
  79. package/lib/PrefetchPlugin.js +1 -1
  80. package/lib/ProgressPlugin.js +16 -13
  81. package/lib/ProvidePlugin.js +3 -5
  82. package/lib/RawModule.js +25 -17
  83. package/lib/RecordIdsPlugin.js +3 -3
  84. package/lib/RequestShortener.js +1 -1
  85. package/lib/ResolverFactory.js +2 -2
  86. package/lib/RuntimeGlobals.js +22 -10
  87. package/lib/RuntimeModule.js +29 -19
  88. package/lib/RuntimePlugin.js +335 -169
  89. package/lib/RuntimeTemplate.js +2761 -316
  90. package/lib/SelfModuleFactory.js +7 -3
  91. package/lib/SourceMapDevToolModuleOptionsPlugin.js +6 -2
  92. package/lib/SourceMapDevToolPlugin.js +30 -20
  93. package/lib/Stats.js +3 -4
  94. package/lib/Template.js +32 -22
  95. package/lib/TemplatedPathPlugin.js +96 -14
  96. package/lib/UseStrictPlugin.js +4 -6
  97. package/lib/WarnCaseSensitiveModulesPlugin.js +4 -4
  98. package/lib/WarnDeprecatedOptionPlugin.js +1 -1
  99. package/lib/WarnNoModeSetPlugin.js +1 -1
  100. package/lib/WatchIgnorePlugin.js +8 -6
  101. package/lib/Watching.js +8 -8
  102. package/lib/WebpackIsIncludedPlugin.js +2 -4
  103. package/lib/WebpackOptionsApply.js +308 -18
  104. package/lib/WebpackOptionsDefaulter.js +6 -2
  105. package/lib/asset/AssetBytesGenerator.js +12 -10
  106. package/lib/asset/AssetBytesParser.js +2 -4
  107. package/lib/asset/AssetGenerator.js +188 -95
  108. package/lib/asset/AssetModule.js +7 -3
  109. package/lib/asset/AssetModulesPlugin.js +110 -38
  110. package/lib/asset/AssetParser.js +9 -7
  111. package/lib/asset/AssetSourceGenerator.js +60 -13
  112. package/lib/asset/AssetSourceParser.js +2 -4
  113. package/lib/asset/RawDataUrlModule.js +24 -16
  114. package/lib/asset/WebManifestGenerator.js +8 -10
  115. package/lib/asset/WebManifestParser.js +24 -10
  116. package/lib/async-modules/AsyncModuleHelpers.js +12 -6
  117. package/lib/async-modules/AwaitDependenciesInitFragment.js +2 -2
  118. package/lib/async-modules/InferAsyncModulesPlugin.js +2 -2
  119. package/lib/async-modules/isGeneratorLowered.js +4 -4
  120. package/lib/buildChunkGraph.js +36 -27
  121. package/lib/bun/BunTargetPlugin.js +1 -1
  122. package/lib/cache/AddBuildDependenciesPlugin.js +1 -1
  123. package/lib/cache/AddManagedPathsPlugin.js +1 -1
  124. package/lib/cache/IdleFileCachePlugin.js +2 -2
  125. package/lib/cache/MemoryCachePlugin.js +18 -10
  126. package/lib/cache/MemoryWithGcCachePlugin.js +34 -22
  127. package/lib/cache/PackFileCacheStrategy.js +30 -23
  128. package/lib/cache/ResolverCachePlugin.js +38 -18
  129. package/lib/cache/getLazyHashedEtag.js +1 -2
  130. package/lib/cache/mergeEtags.js +1 -1
  131. package/lib/cli.js +1 -3
  132. package/lib/config/browserslistTargetHandler.js +41 -5
  133. package/lib/config/defaults.js +270 -78
  134. package/lib/config/defineConfig.js +10 -2
  135. package/lib/config/getClaimedAssetTypes.js +65 -0
  136. package/lib/config/normalization.js +46 -16
  137. package/lib/config/target.js +46 -3
  138. package/lib/container/ContainerEntryDependency.js +1 -1
  139. package/lib/container/ContainerEntryModule.js +24 -15
  140. package/lib/container/ContainerEntryModuleFactory.js +7 -3
  141. package/lib/container/ContainerPlugin.js +9 -10
  142. package/lib/container/ContainerReferencePlugin.js +6 -2
  143. package/lib/container/FallbackDependency.js +1 -1
  144. package/lib/container/FallbackModule.js +24 -17
  145. package/lib/container/FallbackModuleFactory.js +7 -3
  146. package/lib/container/HoistContainerReferencesPlugin.js +6 -11
  147. package/lib/container/ModuleFederationPlugin.js +7 -24
  148. package/lib/container/RemoteModule.js +27 -19
  149. package/lib/container/RemoteRuntimeModule.js +10 -8
  150. package/lib/container/moduleFederationHooks.js +32 -0
  151. package/lib/css/CssGenerator.js +171 -43
  152. package/lib/css/CssInjectStyleRuntimeModule.js +7 -5
  153. package/lib/css/CssLoadingRuntimeModule.js +84 -32
  154. package/lib/css/CssModule.js +10 -7
  155. package/lib/css/CssModulesPlugin.js +172 -100
  156. package/lib/css/CssParser.js +1113 -568
  157. package/lib/css/CssServerStylesRuntimeModule.js +54 -0
  158. package/lib/css/cssMinify.js +168 -0
  159. package/lib/css/data.js +5334 -0
  160. package/lib/css/syntax.js +9647 -232
  161. package/lib/debug/ProfilingPlugin.js +14 -9
  162. package/lib/deno/DenoTargetPlugin.js +1 -1
  163. package/lib/dependencies/AMDDefineDependency.js +112 -87
  164. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +30 -17
  165. package/lib/dependencies/AMDPlugin.js +9 -7
  166. package/lib/dependencies/AMDRequireArrayDependency.js +5 -5
  167. package/lib/dependencies/AMDRequireContextDependency.js +2 -2
  168. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -1
  169. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +25 -14
  170. package/lib/dependencies/AMDRequireDependency.js +8 -7
  171. package/lib/dependencies/AMDRequireItemDependency.js +1 -1
  172. package/lib/dependencies/AMDRuntimeModules.js +21 -1
  173. package/lib/dependencies/BuildTimeConstDependency.js +102 -0
  174. package/lib/dependencies/CachedConstDependency.js +11 -8
  175. package/lib/dependencies/CommonJsDependencyHelpers.js +67 -46
  176. package/lib/dependencies/CommonJsExportRequireDependency.js +121 -45
  177. package/lib/dependencies/CommonJsExportsDependency.js +53 -49
  178. package/lib/dependencies/CommonJsExportsParserPlugin.js +207 -25
  179. package/lib/dependencies/CommonJsFullRequireDependency.js +119 -34
  180. package/lib/dependencies/CommonJsImportsParserPlugin.js +100 -50
  181. package/lib/dependencies/CommonJsObjectExportDependency.js +188 -0
  182. package/lib/dependencies/CommonJsPlugin.js +35 -6
  183. package/lib/dependencies/CommonJsRequireContextDependency.js +5 -6
  184. package/lib/dependencies/CommonJsRequireDependency.js +170 -27
  185. package/lib/dependencies/CommonJsSelfReferenceDependency.js +63 -38
  186. package/lib/dependencies/ConstDependency.js +8 -9
  187. package/lib/dependencies/ContextDependency.js +12 -8
  188. package/lib/dependencies/ContextDependencyHelpers.js +14 -9
  189. package/lib/dependencies/ContextDependencyTemplateAsId.js +4 -4
  190. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +24 -11
  191. package/lib/dependencies/ContextElementDependency.js +31 -12
  192. package/lib/dependencies/CreateRequireParserPlugin.js +12 -7
  193. package/lib/dependencies/CreateScriptUrlDependency.js +4 -4
  194. package/lib/dependencies/CssIcssExportDependency.js +56 -28
  195. package/lib/dependencies/CssIcssImportDependency.js +17 -13
  196. package/lib/dependencies/CssIcssSymbolDependency.js +9 -10
  197. package/lib/dependencies/CssImportDependency.js +18 -9
  198. package/lib/dependencies/CssUrlDependency.js +17 -13
  199. package/lib/dependencies/DllEntryDependency.js +1 -1
  200. package/lib/dependencies/DynamicExports.js +2 -2
  201. package/lib/dependencies/ExportBindingInitFragment.js +36 -9
  202. package/lib/dependencies/ExportsInfoDependency.js +7 -8
  203. package/lib/dependencies/ExternalModuleDependency.js +9 -5
  204. package/lib/dependencies/ExternalModuleInitFragment.js +2 -2
  205. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +8 -5
  206. package/lib/dependencies/HarmonyAcceptDependency.js +5 -5
  207. package/lib/dependencies/HarmonyCompatibilityDependency.js +52 -17
  208. package/lib/dependencies/HarmonyDetectionParserPlugin.js +11 -7
  209. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +23 -14
  210. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +80 -12
  211. package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
  212. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
  213. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +286 -80
  214. package/lib/dependencies/HarmonyExportInitFragment.js +18 -6
  215. package/lib/dependencies/HarmonyExportSpecifierDependency.js +51 -14
  216. package/lib/dependencies/HarmonyExports.js +7 -4
  217. package/lib/dependencies/HarmonyImportDependency.js +121 -60
  218. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +124 -38
  219. package/lib/dependencies/HarmonyImportGuard.js +20 -30
  220. package/lib/dependencies/HarmonyImportSideEffectDependency.js +152 -9
  221. package/lib/dependencies/HarmonyImportSpecifierDependency.js +97 -49
  222. package/lib/dependencies/HarmonyModulesPlugin.js +7 -3
  223. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +1 -3
  224. package/lib/dependencies/HtmlEntryDependency.js +49 -31
  225. package/lib/dependencies/HtmlInlineHtmlDependency.js +7 -8
  226. package/lib/dependencies/HtmlInlineScriptDependency.js +11 -8
  227. package/lib/dependencies/HtmlInlineStyleDependency.js +7 -10
  228. package/lib/dependencies/HtmlSourceDependency.js +22 -14
  229. package/lib/dependencies/ImportContextDependency.js +45 -5
  230. package/lib/dependencies/ImportDependency.js +33 -50
  231. package/lib/dependencies/ImportEagerDependency.js +6 -9
  232. package/lib/dependencies/ImportMetaContextDependency.js +2 -2
  233. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +14 -13
  234. package/lib/dependencies/ImportMetaContextPlugin.js +7 -3
  235. package/lib/dependencies/ImportMetaGlobDependency.js +2 -2
  236. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +2 -3
  237. package/lib/dependencies/ImportMetaGlobHelpers.js +19 -22
  238. package/lib/dependencies/ImportMetaHotAcceptDependency.js +1 -1
  239. package/lib/dependencies/ImportMetaHotDeclineDependency.js +1 -1
  240. package/lib/dependencies/ImportMetaPlugin.js +154 -71
  241. package/lib/dependencies/ImportMetaResolveDependency.js +3 -4
  242. package/lib/dependencies/ImportParserPlugin.js +73 -49
  243. package/lib/dependencies/ImportPhase.js +12 -5
  244. package/lib/dependencies/ImportPlugin.js +7 -3
  245. package/lib/dependencies/ImportWeakDependency.js +6 -9
  246. package/lib/dependencies/JsonExportsDependency.js +11 -7
  247. package/lib/dependencies/LoaderDependency.js +2 -2
  248. package/lib/dependencies/LoaderImportDependency.js +2 -2
  249. package/lib/dependencies/LoaderPlugin.js +11 -7
  250. package/lib/dependencies/LocalModuleDependency.js +5 -5
  251. package/lib/dependencies/LocalModulesHelpers.js +1 -1
  252. package/lib/dependencies/ModuleDecoratorDependency.js +6 -7
  253. package/lib/dependencies/ModuleDependency.js +9 -6
  254. package/lib/dependencies/ModuleDependencyTemplateAsId.js +4 -4
  255. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +3 -3
  256. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  257. package/lib/dependencies/ModuleHotDeclineDependency.js +1 -1
  258. package/lib/dependencies/ModuleInitFragmentDependency.js +24 -10
  259. package/lib/dependencies/NullDependency.js +3 -3
  260. package/lib/dependencies/ProvidedDependency.js +14 -10
  261. package/lib/dependencies/PureExpressionDependency.js +9 -10
  262. package/lib/dependencies/RequireContextDependency.js +2 -2
  263. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -4
  264. package/lib/dependencies/RequireContextPlugin.js +8 -4
  265. package/lib/dependencies/RequireEnsureDependenciesBlock.js +2 -2
  266. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +5 -8
  267. package/lib/dependencies/RequireEnsureDependency.js +8 -7
  268. package/lib/dependencies/RequireEnsurePlugin.js +7 -3
  269. package/lib/dependencies/RequireHeaderDependency.js +50 -12
  270. package/lib/dependencies/RequireIncludeDependency.js +6 -6
  271. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +2 -3
  272. package/lib/dependencies/RequireIncludePlugin.js +7 -3
  273. package/lib/dependencies/RequireJsStuffPlugin.js +7 -3
  274. package/lib/dependencies/RequireResolveContextDependency.js +2 -2
  275. package/lib/dependencies/RequireResolveDependency.js +4 -4
  276. package/lib/dependencies/RequireResolveHeaderDependency.js +4 -4
  277. package/lib/dependencies/RuntimeRequirementsDependency.js +5 -6
  278. package/lib/dependencies/StaticExportsDependency.js +2 -2
  279. package/lib/dependencies/SystemPlugin.js +10 -6
  280. package/lib/dependencies/SystemRuntimeModule.js +10 -0
  281. package/lib/dependencies/TopLevelAwaitDependency.js +11 -7
  282. package/lib/dependencies/URLContextDependency.js +2 -2
  283. package/lib/dependencies/URLDependency.js +110 -64
  284. package/lib/dependencies/URLPlugin.js +7 -3
  285. package/lib/dependencies/UnsupportedDependency.js +4 -4
  286. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -4
  287. package/lib/dependencies/WebAssemblyImportDependency.js +5 -5
  288. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -6
  289. package/lib/dependencies/WorkerAndWorkletPlugin.js +47 -28
  290. package/lib/dependencies/WorkerDependency.js +22 -22
  291. package/lib/dependencies/WorkletDependency.js +18 -21
  292. package/lib/dependencies/getFunctionExpression.js +8 -4
  293. package/lib/dependencies/importOptionsCheck.js +47 -0
  294. package/lib/dependencies/processExportInfo.js +5 -5
  295. package/lib/dll/DelegatedModule.js +34 -22
  296. package/lib/dll/DelegatedModuleFactoryPlugin.js +15 -7
  297. package/lib/dll/DelegatedPlugin.js +2 -2
  298. package/lib/dll/DllEntryPlugin.js +2 -2
  299. package/lib/dll/DllModule.js +22 -15
  300. package/lib/dll/DllModuleFactory.js +7 -3
  301. package/lib/dll/DllPlugin.js +7 -5
  302. package/lib/dll/DllReferencePlugin.js +10 -7
  303. package/lib/dll/LibManifestPlugin.js +5 -5
  304. package/lib/electron/ElectronTargetPlugin.js +53 -49
  305. package/lib/errors/AsyncChunkWaterfallWarning.js +36 -0
  306. package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
  307. package/lib/errors/BroadContextsWarning.js +43 -0
  308. package/lib/errors/BuildCycleError.js +1 -1
  309. package/lib/errors/CacheEffectivenessWarning.js +55 -0
  310. package/lib/errors/ChunkRenderError.js +1 -1
  311. package/lib/errors/CircularDependenciesWarning.js +38 -0
  312. package/lib/errors/CodeGenerationError.js +1 -1
  313. package/lib/errors/CommentCompilationWarning.js +1 -1
  314. package/lib/errors/ConflictingResourceHintsWarning.js +35 -0
  315. package/lib/errors/DotenvFileError.js +29 -0
  316. package/lib/errors/DuplicateModulesWarning.js +45 -0
  317. package/lib/errors/DynamicExportsWarning.js +30 -0
  318. package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
  319. package/lib/errors/EntrypointOverlapWarning.js +45 -0
  320. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  321. package/lib/errors/EvalUsageWarning.js +28 -0
  322. package/lib/errors/HookWebpackError.js +5 -5
  323. package/lib/errors/HotspotsWarning.js +57 -0
  324. package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
  325. package/lib/errors/ImportedBindingAssignmentError.js +30 -0
  326. package/lib/errors/InlinedAssetsWarning.js +36 -0
  327. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  328. package/lib/errors/LargeModulesWarning.js +45 -0
  329. package/lib/errors/LegacyJavascriptWarning.js +48 -0
  330. package/lib/errors/MissingSideEffectsWarning.js +36 -0
  331. package/lib/errors/MixedExportsWarning.js +41 -0
  332. package/lib/errors/ModuleDependencyError.js +13 -16
  333. package/lib/errors/ModuleDependencyWarning.js +5 -15
  334. package/lib/errors/ModuleHashingError.js +1 -1
  335. package/lib/errors/ModuleNotFoundError.js +2 -2
  336. package/lib/errors/ModuleParseError.js +1 -2
  337. package/lib/errors/ModuleRestoreError.js +1 -1
  338. package/lib/errors/ModuleStoreError.js +1 -1
  339. package/lib/errors/NodeStuffInWebError.js +1 -1
  340. package/lib/errors/OsDependentRuleWarning.js +31 -0
  341. package/lib/errors/PureAnnotationsWarning.js +36 -0
  342. package/lib/errors/RedundantDynamicImportWarning.js +31 -0
  343. package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
  344. package/lib/errors/SplitChunksCappedWarning.js +41 -0
  345. package/lib/errors/TinyChunksWarning.js +40 -0
  346. package/lib/errors/TopLevelThisWarning.js +34 -0
  347. package/lib/errors/UnsplitVendorsWarning.js +42 -0
  348. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  349. package/lib/errors/UnusedAliasesWarning.js +29 -0
  350. package/lib/errors/UnusedDefinesWarning.js +29 -0
  351. package/lib/errors/UnusedExternalsWarning.js +29 -0
  352. package/lib/errors/UnusedReexportsWarning.js +42 -0
  353. package/lib/errors/UnusedRuleWarning.js +29 -0
  354. package/lib/errors/WebpackError.js +9 -5
  355. package/lib/errors/deriveStackFromNestedError.js +90 -0
  356. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  357. package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
  358. package/lib/esm/ModuleChunkLoadingPlugin.js +86 -51
  359. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +161 -62
  360. package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
  361. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  362. package/lib/hmr/LazyCompilationPlugin.js +45 -24
  363. package/lib/hmr/lazyCompilationBackend.js +9 -6
  364. package/lib/hmr/parserHooks.js +56 -0
  365. package/lib/html/HtmlGenerator.js +277 -77
  366. package/lib/html/HtmlModule.js +7 -3
  367. package/lib/html/HtmlModulesPlugin.js +366 -200
  368. package/lib/html/HtmlParser.js +31 -86
  369. package/lib/html/data.js +1928 -0
  370. package/lib/html/htmlMinify.js +288 -0
  371. package/lib/html/syntax.js +6034 -1384
  372. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
  373. package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
  374. package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
  375. package/lib/ids/HashedModuleIdsPlugin.js +6 -2
  376. package/lib/ids/IdHelpers.js +7 -8
  377. package/lib/ids/NamedChunkIdsPlugin.js +1 -1
  378. package/lib/ids/NamedModuleIdsPlugin.js +1 -1
  379. package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
  380. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  381. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
  382. package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
  383. package/lib/ids/SyncModuleIdsPlugin.js +4 -4
  384. package/lib/index.js +10 -0
  385. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
  386. package/lib/javascript/BasicEvaluatedExpression.js +18 -14
  387. package/lib/javascript/ChunkFormatHelpers.js +6 -6
  388. package/lib/javascript/ChunkHelpers.js +1 -1
  389. package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
  390. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  391. package/lib/javascript/JavascriptGenerator.js +65 -165
  392. package/lib/javascript/JavascriptModule.js +9 -3
  393. package/lib/javascript/JavascriptModulesPlugin.js +103 -123
  394. package/lib/javascript/JavascriptParser.js +242 -99
  395. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  396. package/lib/javascript/ScopeAnalyzer.js +1094 -0
  397. package/lib/javascript/StartupHelpers.js +55 -9
  398. package/lib/javascript/syntax.js +2678 -232
  399. package/lib/json/JsonData.js +8 -4
  400. package/lib/json/JsonGenerator.js +38 -16
  401. package/lib/json/JsonModule.js +7 -3
  402. package/lib/json/JsonModulesPlugin.js +1 -1
  403. package/lib/json/JsonParser.js +5 -6
  404. package/lib/library/AbstractLibraryPlugin.js +20 -14
  405. package/lib/library/AmdLibraryPlugin.js +11 -7
  406. package/lib/library/AssignLibraryPlugin.js +19 -13
  407. package/lib/library/EnableLibraryPlugin.js +2 -2
  408. package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
  409. package/lib/library/JsonpLibraryPlugin.js +11 -7
  410. package/lib/library/ModuleLibraryPlugin.js +256 -64
  411. package/lib/library/SystemLibraryPlugin.js +12 -8
  412. package/lib/library/UmdLibraryPlugin.js +62 -25
  413. package/lib/loaders/LoaderRunner.js +47 -6
  414. package/lib/loaders/loadLoader.js +8 -4
  415. package/lib/logging/createConsoleLogger.js +7 -4
  416. package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
  417. package/lib/node/NodeEnvironmentPlugin.js +17 -3
  418. package/lib/node/NodeSourcePlugin.js +1 -1
  419. package/lib/node/NodeTargetPlugin.js +4 -3
  420. package/lib/node/NodeTemplatePlugin.js +1 -1
  421. package/lib/node/NodeWatchFileSystem.js +70 -9
  422. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
  423. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +65 -19
  424. package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
  425. package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
  426. package/lib/node/nodeConsole.js +7 -3
  427. package/lib/optimize/AggressiveMergingPlugin.js +2 -2
  428. package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
  429. package/lib/optimize/ConcatenatedModule.js +1030 -476
  430. package/lib/optimize/ConstExportsPlugin.js +16 -7
  431. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  432. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
  433. package/lib/optimize/InlineExports.js +130 -5
  434. package/lib/optimize/InnerGraph.js +28 -12
  435. package/lib/optimize/InnerGraphPlugin.js +23 -18
  436. package/lib/optimize/LimitChunkCountPlugin.js +7 -3
  437. package/lib/optimize/MangleExportsPlugin.js +7 -8
  438. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
  439. package/lib/optimize/MinChunkSizePlugin.js +7 -3
  440. package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
  441. package/lib/optimize/RealContentHashPlugin.js +121 -41
  442. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  443. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  444. package/lib/optimize/RuntimeChunkPlugin.js +2 -2
  445. package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
  446. package/lib/optimize/SplitChunksPlugin.js +86 -24
  447. package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
  448. package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
  449. package/lib/performance/BroadContextsPlugin.js +142 -0
  450. package/lib/performance/CacheEffectivenessPlugin.js +125 -0
  451. package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
  452. package/lib/performance/DuplicateModulesPlugin.js +93 -0
  453. package/lib/performance/DuplicatePackagesPlugin.js +119 -0
  454. package/lib/performance/DuplicatePackagesWarning.js +84 -0
  455. package/lib/performance/DynamicExportsPlugin.js +120 -0
  456. package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
  457. package/lib/performance/EntrypointOverlapPlugin.js +122 -0
  458. package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
  459. package/lib/performance/EvalUsagePlugin.js +115 -0
  460. package/lib/performance/HotspotsPlugin.js +296 -0
  461. package/lib/performance/InlinedAssetsPlugin.js +99 -0
  462. package/lib/performance/LargeModulesPlugin.js +126 -0
  463. package/lib/performance/LegacyJavascriptPlugin.js +139 -0
  464. package/lib/performance/MissingSideEffectsPlugin.js +138 -0
  465. package/lib/performance/MixedExportsPlugin.js +136 -0
  466. package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
  467. package/lib/performance/PureAnnotationsPlugin.js +219 -0
  468. package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
  469. package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
  470. package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
  471. package/lib/performance/SizeLimitsPlugin.js +139 -7
  472. package/lib/performance/SplitChunksCappedPlugin.js +99 -0
  473. package/lib/performance/TinyChunksPlugin.js +128 -0
  474. package/lib/performance/TopLevelThisPlugin.js +208 -0
  475. package/lib/performance/UnsplitVendorsPlugin.js +112 -0
  476. package/lib/performance/UnusedAliasesPlugin.js +253 -0
  477. package/lib/performance/UnusedDefinesPlugin.js +87 -0
  478. package/lib/performance/UnusedExternalsPlugin.js +110 -0
  479. package/lib/performance/UnusedReexportsPlugin.js +159 -0
  480. package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
  481. package/lib/performance/getModuleSize.js +22 -0
  482. package/lib/performance/getSourceModules.js +22 -0
  483. package/lib/performance/hasOnlyUnusedExports.js +40 -0
  484. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
  485. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
  486. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
  487. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  488. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  489. package/lib/prefetch/ResourceHintPlugin.js +295 -79
  490. package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
  491. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
  492. package/lib/prefetch/parseResourceHintOptions.js +31 -4
  493. package/lib/rules/BasicEffectRulePlugin.js +2 -2
  494. package/lib/rules/BasicMatcherRulePlugin.js +8 -4
  495. package/lib/rules/GlobMatcherRulePlugin.js +68 -0
  496. package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
  497. package/lib/rules/RuleSetCompiler.js +146 -12
  498. package/lib/rules/UseEffectRulePlugin.js +18 -11
  499. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
  500. package/lib/runtime/AsyncModuleRuntimeModule.js +6 -2
  501. package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
  502. package/lib/runtime/BaseUriRuntimeModule.js +33 -7
  503. package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
  504. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
  505. package/lib/runtime/CompatRuntimeModule.js +5 -3
  506. package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
  507. package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
  508. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
  509. package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
  510. package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
  511. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
  512. package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
  513. package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
  514. package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
  515. package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
  516. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
  517. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
  518. package/lib/runtime/GlobalRuntimeModule.js +18 -0
  519. package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
  520. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  521. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +34 -7
  522. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
  523. package/lib/runtime/NonceRuntimeModule.js +10 -0
  524. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
  525. package/lib/runtime/PublicPathRuntimeModule.js +12 -2
  526. package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
  527. package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
  528. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
  529. package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
  530. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
  531. package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
  532. package/lib/runtime/SystemContextRuntimeModule.js +10 -0
  533. package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
  534. package/lib/runtime/WorkerRuntimeModule.js +11 -1
  535. package/lib/runtime/baseUri.js +63 -0
  536. package/lib/schemes/DataUriPlugin.js +1 -1
  537. package/lib/schemes/FileUriPlugin.js +1 -1
  538. package/lib/schemes/HttpUriPlugin.js +46 -20
  539. package/lib/schemes/VirtualUrlPlugin.js +13 -7
  540. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  541. package/lib/serialization/BinaryMiddleware.js +4 -4
  542. package/lib/serialization/ErrorObjectSerializer.js +1 -1
  543. package/lib/serialization/FileMiddleware.js +22 -9
  544. package/lib/serialization/ObjectMiddleware.js +139 -114
  545. package/lib/serialization/PlainObjectSerializer.js +19 -16
  546. package/lib/sharing/ConsumeSharedModule.js +30 -21
  547. package/lib/sharing/ConsumeSharedPlugin.js +18 -10
  548. package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
  549. package/lib/sharing/ProvideSharedModule.js +25 -16
  550. package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
  551. package/lib/sharing/ProvideSharedPlugin.js +8 -4
  552. package/lib/sharing/SharePlugin.js +17 -5
  553. package/lib/sharing/ShareRuntimeModule.js +4 -4
  554. package/lib/sharing/resolveMatchedConfigs.js +9 -6
  555. package/lib/sharing/utils.js +1 -3
  556. package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
  557. package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
  558. package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
  559. package/lib/stats/StatsFactory.js +25 -26
  560. package/lib/stats/StatsPrinter.js +16 -12
  561. package/lib/typescript/TypeScriptPlugin.js +20 -24
  562. package/lib/url/URLParserPlugin.js +26 -13
  563. package/lib/util/ArrayQueue.js +3 -3
  564. package/lib/util/AsyncQueue.js +4 -3
  565. package/lib/util/Hash.js +5 -1
  566. package/lib/util/LazySet.js +35 -22
  567. package/lib/util/LocConverter.js +36 -13
  568. package/lib/util/SourceProcessor.js +1066 -24
  569. package/lib/util/StringXor.js +1 -1
  570. package/lib/util/URLAbsoluteSpecifier.js +3 -1
  571. package/lib/util/chainedImports.js +9 -5
  572. package/lib/util/cleverMerge.js +1 -1
  573. package/lib/util/comparators.js +45 -14
  574. package/lib/util/concatenate.js +203 -77
  575. package/lib/util/conventions.js +10 -2
  576. package/lib/util/createHash.js +2 -2
  577. package/lib/util/createHooksRegistry.js +8 -10
  578. package/lib/util/createMappings.js +25 -3
  579. package/lib/util/dataURL.js +225 -1
  580. package/lib/util/extractSourceMap.js +4 -3
  581. package/lib/util/findCaseMismatch.js +139 -0
  582. package/lib/util/formatLocation.js +1 -2
  583. package/lib/util/fs.js +22 -5
  584. package/lib/util/globUtils.js +298 -24
  585. package/lib/util/hash/BatchedHash.js +5 -1
  586. package/lib/util/hash/BulkUpdateHash.js +5 -1
  587. package/lib/util/hash/DebugHash.js +5 -1
  588. package/lib/util/hash/hash-digest.js +6 -2
  589. package/lib/util/identifier.js +4 -0
  590. package/lib/util/implicitTypeLoaderFallback.js +1 -1
  591. package/lib/util/internalSerializables.js +8 -0
  592. package/lib/util/lazyModule.js +56 -0
  593. package/lib/util/makeSerializable.js +7 -3
  594. package/lib/util/matchAlias.js +25 -0
  595. package/lib/util/mimeTypes.js +11 -5
  596. package/lib/util/nonNumericOnlyHash.js +4 -3
  597. package/lib/util/parseJson.js +5 -3
  598. package/lib/util/preloadModuleType.js +32 -0
  599. package/lib/util/registerExternalSerializer.js +7 -5
  600. package/lib/util/removeBOM.js +82 -1
  601. package/lib/util/runtime.js +2 -2
  602. package/lib/util/semver.js +1 -1
  603. package/lib/util/serialization.js +28 -28
  604. package/lib/util/source.js +2 -2
  605. package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
  606. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
  607. package/lib/wasm/wasmModuleFilename.js +54 -0
  608. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +43 -21
  609. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +45 -21
  610. package/lib/wasm-async/AsyncWasmModule.js +3 -3
  611. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
  612. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
  613. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
  614. package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
  615. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +29 -8
  616. package/lib/wasm-sync/SyncWasmModule.js +2 -2
  617. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
  618. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
  619. package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
  620. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
  621. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
  622. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
  623. package/lib/wasm-sync/WebAssemblyParser.js +4 -6
  624. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  625. package/lib/web/FetchCompileAsyncWasmPlugin.js +105 -19
  626. package/lib/web/FetchCompileWasmPlugin.js +48 -16
  627. package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
  628. package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
  629. package/lib/web/JsonpTemplatePlugin.js +2 -2
  630. package/lib/webpack.js +22 -11
  631. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
  632. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
  633. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  634. package/module.d.ts +1 -0
  635. package/package.json +32 -25
  636. package/schemas/WebpackOptions.check.js +1 -1
  637. package/schemas/WebpackOptions.json +667 -34
  638. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  639. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  640. package/schemas/plugins/container/ContainerPlugin.json +10 -0
  641. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  642. package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
  643. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  644. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  645. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  646. package/types.d.ts +3223 -465
  647. package/lib/runtime/CommonJsWrapRuntimeModule.js +0 -37
@@ -6,23 +6,60 @@
6
6
 
7
7
  const { RawSource } = require("webpack-sources");
8
8
  const ModuleFilenameHelpers = require("../ModuleFilenameHelpers");
9
+ const {
10
+ ASSET_URL_TYPE,
11
+ JAVASCRIPT_TYPE
12
+ } = require("../ModuleSourceTypeConstants");
9
13
  const RuntimeGlobals = require("../RuntimeGlobals");
10
14
  const CssUrlDependency = require("../dependencies/CssUrlDependency");
11
15
  const HtmlSourceDependency = require("../dependencies/HtmlSourceDependency");
12
16
  const URLDependency = require("../dependencies/URLDependency");
13
- const ResourceHintRuntimeModule = require("./ResourceHintRuntimeModule");
14
- const StartupAssetHintRuntimeModule = require("./StartupAssetHintRuntimeModule");
17
+ const WorkerDependency = require("../dependencies/WorkerDependency");
18
+ const lazyModule = require("../util/lazyModule");
19
+ const memoize = require("../util/memoize");
20
+ const {
21
+ PUBLIC_PATH_AUTO,
22
+ PUBLIC_PATH_FULL_HASH
23
+ } = require("../util/publicPathPlaceholder");
24
+ const { guessAsAttribute } = require("./parseResourceHintOptions");
15
25
  const parseResourceHintOptions = require("./parseResourceHintOptions");
16
26
 
17
- /** @typedef {import("../Compilation")} Compilation */
18
- /** @typedef {import("../Compiler")} Compiler */
19
- /** @typedef {import("../Module")} Module */
20
- /** @typedef {import("../../declarations/WebpackOptions").ResourceHintsInitial} ResourceHintsConfig */
21
- /** @typedef {import("../../declarations/WebpackOptions").ResourceHintsOptions} ResourceHintsOptions */
22
- /** @typedef {import("../../declarations/WebpackOptions").UrlHintRule} UrlHintRule */
23
- /** @typedef {import("../dependencies/HtmlEntryDependency").HtmlResourceHint} HtmlResourceHint */
24
- /** @typedef {import("../dependencies/HtmlEntryDependency").HtmlResourceHintContext} HtmlResourceHintContext */
25
- /** @typedef {import("./parseResourceHintOptions").ResourceHintOptions} ResourceHintOptions */
27
+ /** @import Chunk from "../Chunk" */
28
+ /** @import ChunkGraph from "../ChunkGraph" */
29
+ /** @import CodeGenerationResults from "../CodeGenerationResults" */
30
+ /** @import Compilation from "../Compilation" */
31
+ /** @import Compiler from "../Compiler" */
32
+ /** @import Module, { RuntimeRequirements } from "../Module" */
33
+
34
+ /**
35
+ * The attributes a `<link>` carries besides its href and `as`.
36
+ * @typedef {object} StartupHintAttributes
37
+ * @property {("low" | "high" | "auto" | undefined)=} fetchPriority
38
+ * @property {string=} type
39
+ * @property {string=} media
40
+ */
41
+
42
+ /**
43
+ * One asset a chunk hints at startup, merged across every reference to it.
44
+ * @typedef {object} AssetHintEntry
45
+ * @property {Module} assetModule the asset the `<link>` points at
46
+ * @property {Module} originModule the chunk module the reference was written in, which is what a baked href is relative to
47
+ * @property {string} request the original request, for guessing the `as` attribute
48
+ * @property {boolean} preload preload rather than prefetch
49
+ * @property {("low" | "high" | "auto" | undefined)} fetchPriority
50
+ * @property {(string | undefined)} as
51
+ * @property {(string | undefined)} type
52
+ * @property {(string | undefined)} media
53
+ */
54
+ /**
55
+ * @import {
56
+ * ResourceHintsInitial as ResourceHintsConfig,
57
+ * ResourceHintsOptions,
58
+ * UrlHintRule
59
+ * } from "../../declarations/WebpackOptions"
60
+ */
61
+ /** @import { HtmlResourceHint } from "../dependencies/HtmlEntryDependency" */
62
+ /** @import { ResourceHintOptions } from "./parseResourceHintOptions" */
26
63
 
27
64
  /**
28
65
  * @typedef {object} ResolvedResourceHints
@@ -90,6 +127,19 @@ const getPublicPathOrigin = (compilation) => {
90
127
  * @property {(entryName: string) => EntrypointHint[]} getEntrypointHints resolved `<link>`-shaped descriptors for the given entry — auto initial-graph hints plus URL asset hints, then filtered / rewritten through the user function (when `output.resourceHints` is a function). Reads via `stats.entrypoints[name].resourceHints`.
91
128
  */
92
129
 
130
+ // only a build that actually emits a resource hint needs these
131
+ const getResourceHintRuntimeModule = lazyModule(() =>
132
+ require("./ResourceHintRuntimeModule")
133
+ );
134
+ const getStartupAssetHintRuntimeModule = lazyModule(() =>
135
+ require("./StartupAssetHintRuntimeModule")
136
+ );
137
+ // only reached once a build has an html module, so a js-only build never
138
+ // pays for the html generator this drags in
139
+ const getHtmlEntryDependency = memoize(() =>
140
+ require("../dependencies/HtmlEntryDependency")
141
+ );
142
+
93
143
  const PLUGIN_NAME = "ResourceHintPlugin";
94
144
 
95
145
  /** @type {WeakMap<Compilation, CompilationResolver>} */
@@ -114,16 +164,6 @@ const isUrlAssetDep = (dep) =>
114
164
  dep instanceof CssUrlDependency ||
115
165
  dep instanceof HtmlSourceDependency;
116
166
 
117
- /**
118
- * True for the CSS / HTML URL-asset deps whose templates don't run for JS
119
- * output — the plugin lifts their hint flags into JS runtime requirements
120
- * itself. JS `URLDependency` lifts its own, so it is excluded here.
121
- * @param {import("../Dependency")} dep dependency
122
- * @returns {dep is CssUrlDependency | HtmlSourceDependency} whether it is a CSS/HTML URL asset dep
123
- */
124
- const isCssOrHtmlUrlAssetDep = (dep) =>
125
- dep instanceof CssUrlDependency || dep instanceof HtmlSourceDependency;
126
-
127
167
  /**
128
168
  * Entry chunk name for a hint's `hostChunks` (Vite's `hostId`); the id is a
129
169
  * stable fallback for unnamed chunks.
@@ -260,7 +300,12 @@ const collectEntrypointHints = (compilation, entryName, hints) => {
260
300
  const out = [];
261
301
  /** @type {Set<string>} */
262
302
  const seenKeys = new Set();
263
- const push = (/** @type {EntrypointHint} */ h) => {
303
+ /**
304
+ * Appends a hint, dropping one already emitted for the same rel + href.
305
+ * @param {EntrypointHint} h hint to append
306
+ * @returns {void}
307
+ */
308
+ const push = (h) => {
264
309
  const key = `${h.rel}\0${h.href}`;
265
310
  if (seenKeys.has(key)) return;
266
311
  seenKeys.add(key);
@@ -327,9 +372,7 @@ const collectEntrypointHints = (compilation, entryName, hints) => {
327
372
  /** @type {{ filename?: string }} */
328
373
  (target.buildInfo);
329
374
  if (!buildInfo || !buildInfo.filename) continue;
330
- const asAttribute =
331
- dep.asAttribute ||
332
- ResourceHintRuntimeModule.guessAsAttribute(dep.request);
375
+ const asAttribute = dep.asAttribute || guessAsAttribute(dep.request);
333
376
  /** @type {EntrypointHint} */
334
377
  const h = {
335
378
  rel: dep.preload ? "preload" : "prefetch",
@@ -348,14 +391,13 @@ const collectEntrypointHints = (compilation, entryName, hints) => {
348
391
  // `stats.entrypoints[name].resourceHints` see `"js"`.
349
392
  let hostType = /** @type {"html" | "js"} */ ("js");
350
393
 
351
- const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
352
-
353
394
  outer: for (const module of compilation.modules) {
354
395
  if (!module.getSourceTypes || !module.getSourceTypes().has("html")) {
355
396
  continue;
356
397
  }
357
398
  const presDeps = module.presentationalDependencies;
358
399
  if (!presDeps) continue;
400
+ const HtmlEntryDependency = getHtmlEntryDependency();
359
401
  for (const dep of presDeps) {
360
402
  if (
361
403
  dep instanceof HtmlEntryDependency &&
@@ -377,6 +419,208 @@ const collectEntrypointHints = (compilation, entryName, hints) => {
377
419
  );
378
420
  };
379
421
 
422
+ /**
423
+ * Renders the `<link>` calls a chunk fires at startup, for every asset and worker
424
+ * chunk it references with a resource hint. Run while runtime requirements are still
425
+ * open, so what an href reads is added to `set` rather than assumed: an href spelled
426
+ * as a literal leaves `.p` and `.u` out of the chunk entirely.
427
+ * @param {Chunk} chunk the chunk the calls are emitted into
428
+ * @param {Compilation} compilation the compilation
429
+ * @param {ChunkGraph} chunkGraph the chunk graph
430
+ * @param {CodeGenerationResults} codeGenerationResults the code generation results
431
+ * @param {RuntimeRequirements} set the chunk's runtime requirements
432
+ * @returns {string[]} one call per hinted asset, in emission order
433
+ */
434
+ const collectStartupAssetHintLines = (
435
+ chunk,
436
+ compilation,
437
+ chunkGraph,
438
+ codeGenerationResults,
439
+ set
440
+ ) => {
441
+ const { moduleGraph, runtimeTemplate } = compilation;
442
+ const resolver =
443
+ /** @type {CompilationResolver} */
444
+ (compilationResolvers.get(compilation));
445
+ /** @type {string[]} */
446
+ const lines = [];
447
+
448
+ /**
449
+ * @param {string} fn the `<link>` helper
450
+ * @param {string} href the href expression
451
+ * @param {string} as the `as` attribute
452
+ * @param {StartupHintAttributes} attributes the remaining attributes
453
+ * @returns {void}
454
+ */
455
+ const push = (fn, href, as, attributes) => {
456
+ set.add(fn);
457
+ lines.push(
458
+ `${fn}(${href}, ${JSON.stringify(as)}, ${
459
+ attributes.type ? JSON.stringify(attributes.type) : "undefined"
460
+ }, ${attributes.media ? JSON.stringify(attributes.media) : "undefined"}, ${
461
+ attributes.fetchPriority
462
+ ? JSON.stringify(attributes.fetchPriority)
463
+ : "undefined"
464
+ });`
465
+ );
466
+ };
467
+
468
+ // The analyzable worker form can't wrap its own href without losing the literal
469
+ // specifier, so its `<link>` fires here — keyed by chunk, hence a separate pass.
470
+ /** @type {Set<string | number>} */
471
+ const seenWorkerChunks = new Set();
472
+ for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
473
+ for (const block of module.blocks) {
474
+ for (const dep of block.dependencies) {
475
+ if (!(dep instanceof WorkerDependency)) continue;
476
+ const hint = dep.options.resourceHint;
477
+ if (!hint || (!hint.preload && !hint.prefetch)) continue;
478
+ const group = chunkGraph.getBlockChunkGroup(block);
479
+ if (!group) continue;
480
+ const workerChunk =
481
+ /** @type {import("../Entrypoint")} */
482
+ (group).getEntrypointChunk();
483
+ if (workerChunk.id === null || seenWorkerChunks.has(workerChunk.id)) {
484
+ continue;
485
+ }
486
+ seenWorkerChunks.add(workerChunk.id);
487
+ // The same specifier the `new Worker(...)` call site bakes, asked of the
488
+ // same module, so the two agree on whether a literal is spellable.
489
+ const specifier = runtimeTemplate.getAnalyzableWorkerUrl(
490
+ dep.options.publicPath,
491
+ workerChunk,
492
+ module,
493
+ chunkGraph,
494
+ set
495
+ );
496
+ // Without one the call site keeps the runtime form, where it wraps its own
497
+ // href — firing the `<link>` here too would emit the call twice.
498
+ if (specifier === null) continue;
499
+ push(
500
+ hint.preload
501
+ ? RuntimeGlobals.preloadAsset
502
+ : RuntimeGlobals.prefetchAsset,
503
+ `${runtimeTemplate.importMetaUrl(specifier)}.href`,
504
+ hint.as || "script",
505
+ hint
506
+ );
507
+ }
508
+ }
509
+ }
510
+
511
+ // Dedupe per asset module so two references can't emit two `<link>`s: `preload`
512
+ // wins over `prefetch`, and the last explicit attribute override sticks.
513
+ /** @type {Map<string, AssetHintEntry>} */
514
+ const perAsset = new Map();
515
+ for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
516
+ const deps =
517
+ /** @type {{ dependencies?: import("../Dependency")[] }} */
518
+ (module).dependencies;
519
+ if (!deps) continue;
520
+ for (const dep of deps) {
521
+ if (!isUrlAssetDep(dep)) continue;
522
+ if (!dep.prefetch && !dep.preload) continue;
523
+ const assetModule = moduleGraph.getModule(dep);
524
+ if (!assetModule) continue;
525
+ // Already a `<link>` in the html `<head>` emitted by `HtmlEntryDependency`,
526
+ // so the runtime hint would leave the DOM with two tags for one url.
527
+ if (resolver.isHtmlHinted(assetModule)) continue;
528
+ const key = assetModule.identifier();
529
+ const urlDep =
530
+ /** @type {URLDependency & Partial<CssUrlDependency> & Partial<HtmlSourceDependency>} */
531
+ (dep);
532
+ const existing = perAsset.get(key);
533
+ if (existing) {
534
+ if (dep.preload) existing.preload = true;
535
+ if (dep.fetchPriority) existing.fetchPriority = dep.fetchPriority;
536
+ if (urlDep.asAttribute) existing.as = urlDep.asAttribute;
537
+ if (urlDep.typeAttribute) existing.type = urlDep.typeAttribute;
538
+ if (urlDep.mediaAttribute) existing.media = urlDep.mediaAttribute;
539
+ } else {
540
+ perAsset.set(key, {
541
+ assetModule: /** @type {Module} */ (assetModule),
542
+ originModule: module,
543
+ request: dep.request,
544
+ preload: Boolean(dep.preload),
545
+ fetchPriority: dep.fetchPriority,
546
+ as: urlDep.asAttribute,
547
+ type: urlDep.typeAttribute,
548
+ media: urlDep.mediaAttribute
549
+ });
550
+ }
551
+ }
552
+ }
553
+
554
+ for (const entry of perAsset.values()) {
555
+ const { assetModule } = entry;
556
+ let href;
557
+ // An asset with a javascript wrapper exposes its url through it; one without has
558
+ // no `__webpack_modules__` entry to require.
559
+ if (assetModule.getSourceTypes().has(JAVASCRIPT_TYPE)) {
560
+ href = runtimeTemplate.moduleRaw({
561
+ chunkGraph,
562
+ module: assetModule,
563
+ request: entry.request,
564
+ runtimeRequirements: set,
565
+ weak: false
566
+ });
567
+ } else {
568
+ const has = codeGenerationResults.has(assetModule, chunk.runtime);
569
+ const urlData = has
570
+ ? codeGenerationResults.getData(assetModule, chunk.runtime, "url")
571
+ : undefined;
572
+ const resolved = urlData && urlData[ASSET_URL_TYPE];
573
+ // A generator `publicPath` overrides `output.publicPath`, so prefer it; only the
574
+ // two placeholders below are still unresolved when this runs.
575
+ const templated =
576
+ typeof resolved === "string" &&
577
+ (resolved.includes(PUBLIC_PATH_AUTO) ||
578
+ resolved.includes(PUBLIC_PATH_FULL_HASH));
579
+ if (typeof resolved === "string" && !templated) {
580
+ href = JSON.stringify(resolved);
581
+ } else {
582
+ const filename = has
583
+ ? codeGenerationResults.getData(
584
+ assetModule,
585
+ chunk.runtime,
586
+ "filename"
587
+ )
588
+ : undefined;
589
+ if (typeof filename !== "string") continue;
590
+ // The literal the `new URL()` call site bakes, asked of the same module —
591
+ // but written into a runtime module, which no `eval` devtool wraps.
592
+ const specifier = runtimeTemplate.supportsAnalyzable(
593
+ "url-runtime",
594
+ chunkGraph,
595
+ entry.originModule
596
+ )
597
+ ? runtimeTemplate.getAnalyzableAssetUrl(
598
+ entry.originModule,
599
+ chunkGraph,
600
+ filename,
601
+ chunk.runtime
602
+ )
603
+ : null;
604
+ if (specifier !== null) {
605
+ href = `${runtimeTemplate.importMetaUrl(specifier)}.href`;
606
+ } else {
607
+ set.add(RuntimeGlobals.publicPath);
608
+ href = `${RuntimeGlobals.publicPath} + ${JSON.stringify(filename)}`;
609
+ }
610
+ }
611
+ }
612
+ push(
613
+ entry.preload
614
+ ? RuntimeGlobals.preloadAsset
615
+ : RuntimeGlobals.prefetchAsset,
616
+ href,
617
+ entry.as || guessAsAttribute(entry.request),
618
+ entry
619
+ );
620
+ }
621
+ return lines;
622
+ };
623
+
380
624
  /**
381
625
  * Adds runtime support for `__webpack_require__.PA` / `__webpack_require__.LA`,
382
626
  * the helpers that inject `<link rel="prefetch">` / `<link rel="preload">`
@@ -493,8 +737,6 @@ class ResourceHintPlugin {
493
737
  apply(compiler) {
494
738
  const hints = this._hints;
495
739
 
496
- const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
497
-
498
740
  compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
499
741
  // Lazy-computed on first access — walk every HTML module's
500
742
  // `HtmlEntryDependency`s, resolve each named entry, and collect
@@ -521,6 +763,7 @@ class ResourceHintPlugin {
521
763
  // they don't affect module resolution, only rendering.
522
764
  const presDeps = module.presentationalDependencies;
523
765
  if (!presDeps) continue;
766
+ const HtmlEntryDependency = getHtmlEntryDependency();
524
767
  for (const dep of presDeps) {
525
768
  if (
526
769
  !(dep instanceof HtmlEntryDependency) ||
@@ -583,56 +826,28 @@ class ResourceHintPlugin {
583
826
  getEntrypointHints: (entryName) =>
584
827
  collectEntrypointHints(compilation, entryName, hints)
585
828
  });
586
- // CSS `url(...)` and HTML `<img src>` / `<link href>` deps store
587
- // hint flags but their dep templates don't run for the JS
588
- // output, so we need to lift those flags into the JS chunk's
589
- // runtime requirements ourselves. Iterate only css/html modules
590
- // (pure-JS chunks skip the walk entirely).
829
+ // Rendered here, not in the runtime module: requirements are still open, so a
830
+ // literal href costs no `.p`/`.u`, and async chunks are reached as well.
591
831
  compilation.hooks.additionalChunkRuntimeRequirements.tap(
592
832
  PLUGIN_NAME,
593
- (chunk, set, { chunkGraph }) => {
594
- if (hints === "none") return;
595
- let hasPrefetch = false;
596
- let hasPreload = false;
597
- for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
598
- const deps =
599
- /** @type {{ dependencies?: import("../Dependency")[] }} */
600
- (module).dependencies;
601
- if (!deps) continue;
602
- for (const dep of deps) {
603
- if (!isCssOrHtmlUrlAssetDep(dep)) continue;
604
- if (dep.prefetch) hasPrefetch = true;
605
- if (dep.preload) hasPreload = true;
606
- if (hasPrefetch && hasPreload) break;
607
- }
608
- if (hasPrefetch && hasPreload) break;
609
- }
610
- // Attach the startup-hint runtime module to *this* chunk
611
- // (covering async chunks too) — `runtimeRequirementInTree`
612
- // alone would only attach it to the runtime chunk, so a
613
- // hinted `new URL(...)` in an async chunk would never
614
- // fire its `<link>` injection. We add it whenever this
615
- // chunk already pulls in `startupAssetHints` (via JS
616
- // `URLDependency` template) or whenever CSS / HTML lifts
617
- // it in here.
618
- if (
619
- hasPrefetch ||
620
- hasPreload ||
621
- set.has(RuntimeGlobals.startupAssetHints)
622
- ) {
623
- set.add(RuntimeGlobals.startupAssetHints);
624
- // CSS-only asset modules aren't in JS `__webpack_modules__`,
625
- // so the startup-hint runtime falls back to
626
- // `__webpack_require__.p + "filename"`. Make sure
627
- // `publicPath` is in this chunk's runtime.
628
- set.add(RuntimeGlobals.publicPath);
629
- if (hasPrefetch) set.add(RuntimeGlobals.prefetchAsset);
630
- if (hasPreload) set.add(RuntimeGlobals.preloadAsset);
631
- compilation.addRuntimeModule(
632
- chunk,
633
- new StartupAssetHintRuntimeModule()
634
- );
635
- }
833
+ (chunk, set, { chunkGraph, codeGenerationResults }) => {
834
+ // Browser markup, and no DOM to put it in — the call sites skip their
835
+ // hints under build-time execution too (`URLDependency`).
836
+ if (hints === "none" || chunkGraph.buildTimeExecution) return;
837
+ const lines = collectStartupAssetHintLines(
838
+ chunk,
839
+ compilation,
840
+ chunkGraph,
841
+ codeGenerationResults,
842
+ set
843
+ );
844
+ if (lines.length === 0) return;
845
+ set.add(RuntimeGlobals.startupAssetHints);
846
+ compilation.addLazyRuntimeModule(
847
+ chunk,
848
+ getStartupAssetHintRuntimeModule,
849
+ (Ctor) => new Ctor(lines)
850
+ );
636
851
  }
637
852
  );
638
853
  for (const [rel, runtimeGlobal] of /** @type {const} */ ([
@@ -642,9 +857,10 @@ class ResourceHintPlugin {
642
857
  compilation.hooks.runtimeRequirementInTree
643
858
  .for(runtimeGlobal)
644
859
  .tap(PLUGIN_NAME, (chunk) => {
645
- compilation.addRuntimeModule(
860
+ compilation.addLazyRuntimeModule(
646
861
  chunk,
647
- new ResourceHintRuntimeModule(rel)
862
+ getResourceHintRuntimeModule,
863
+ (Ctor) => new Ctor(rel)
648
864
  );
649
865
  });
650
866
  }
@@ -9,6 +9,7 @@ const Compilation = require("../Compilation");
9
9
  const RuntimeGlobals = require("../RuntimeGlobals");
10
10
  const RuntimeModule = require("../RuntimeModule");
11
11
  const Template = require("../Template");
12
+ const { guessAsAttribute } = require("./parseResourceHintOptions");
12
13
 
13
14
  /**
14
15
  * @typedef {object} ResourceHintRuntimeModulePluginHooks
@@ -19,27 +20,6 @@ const Template = require("../Template");
19
20
  /** @type {WeakMap<Compilation, ResourceHintRuntimeModulePluginHooks>} */
20
21
  const compilationHooksMap = new WeakMap();
21
22
 
22
- /**
23
- * Maps a request/filename to the value of the `<link>` `as` attribute. Best
24
- * effort — falls back to `"fetch"` when the type cannot be guessed. Pattern
25
- * matches against the path part, ignoring any query string suffix.
26
- * @param {string} request request/filename
27
- * @returns {string} value for the `as` attribute
28
- */
29
- const guessAsAttribute = (request) => {
30
- if (/\.(png|jpe?g|gif|svg|webp|avif|bmp|ico|tiff?)(\?.*)?$/i.test(request)) {
31
- return "image";
32
- }
33
- if (/\.(woff2?|ttf|otf|eot)(\?.*)?$/i.test(request)) return "font";
34
- if (/\.css(\?.*)?$/i.test(request)) return "style";
35
- if (/\.[cm]?jsx?(\?.*)?$/i.test(request)) return "script";
36
- if (/\.[cm]?tsx?(\?.*)?$/i.test(request)) return "script";
37
- if (/\.(mp3|wav|flac|aac|m4a|ogg|oga)(\?.*)?$/i.test(request)) return "audio";
38
- if (/\.(mp4|webm|mkv|mov|m4v|ogv|avi)(\?.*)?$/i.test(request)) return "video";
39
- if (/\.vtt(\?.*)?$/i.test(request)) return "track";
40
- return "fetch";
41
- };
42
-
43
23
  class ResourceHintRuntimeModule extends RuntimeModule {
44
24
  /**
45
25
  * @param {Compilation} compilation the compilation
@@ -7,16 +7,8 @@
7
7
  const RuntimeGlobals = require("../RuntimeGlobals");
8
8
  const RuntimeModule = require("../RuntimeModule");
9
9
  const Template = require("../Template");
10
- const CssUrlDependency = require("../dependencies/CssUrlDependency");
11
- const HtmlSourceDependency = require("../dependencies/HtmlSourceDependency");
12
- const URLDependency = require("../dependencies/URLDependency");
13
- const ResourceHintRuntimeModule = require("./ResourceHintRuntimeModule");
14
10
 
15
- /** @typedef {import("../Chunk")} Chunk */
16
- /** @typedef {import("../ChunkGraph")} ChunkGraph */
17
- /** @typedef {import("../Compilation")} Compilation */
18
- /** @typedef {import("../Module")} Module */
19
- /** @typedef {import("../ModuleGraph")} ModuleGraph */
11
+ /** @import Compilation from "../Compilation" */
20
12
 
21
13
  /**
22
14
  * Fires `<link rel="prefetch">` / `<link rel="preload">` for every asset
@@ -25,10 +17,17 @@ const ResourceHintRuntimeModule = require("./ResourceHintRuntimeModule");
25
17
  * user module evaluates, so by the time user code reaches the
26
18
  * corresponding `new URL(...)` (or hands the URL to `<img>`, `fetch`,
27
19
  * `new Worker`, etc.), the browser already has the response in flight.
20
+ *
21
+ * The calls themselves are rendered by `ResourceHintPlugin`, while runtime
22
+ * requirements are still open — see `collectStartupAssetHintLines`.
28
23
  */
29
24
  class StartupAssetHintRuntimeModule extends RuntimeModule {
30
- constructor() {
25
+ /**
26
+ * @param {string[]} lines the `<link>` calls this chunk fires at startup
27
+ */
28
+ constructor(lines) {
31
29
  super("startup asset hints", RuntimeModule.STAGE_TRIGGER);
30
+ this._lines = lines;
32
31
  }
33
32
 
34
33
  /**
@@ -37,129 +36,7 @@ class StartupAssetHintRuntimeModule extends RuntimeModule {
37
36
  */
38
37
  generate() {
39
38
  const compilation = /** @type {Compilation} */ (this.compilation);
40
- const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph);
41
- const moduleGraph = /** @type {ModuleGraph} */ (compilation.moduleGraph);
42
- const runtimeTemplate = compilation.runtimeTemplate;
43
- const chunk = /** @type {Chunk} */ (this.chunk);
44
- const runtimeRequirements =
45
- /** @type {Set<string>} */
46
- (chunkGraph.getTreeRuntimeRequirements(chunk));
47
-
48
- // Dedupe per asset module: if the same asset is referenced twice
49
- // (e.g. CSS rule says `prefetch`, a JS magic comment says
50
- // `preload`), pick `preload` over `prefetch` and keep the most
51
- // recently seen explicit attribute overrides. Avoids emitting a
52
- // duplicate `<link>` and ordering-dependent winners.
53
- /**
54
- * @typedef {object} AssetHintEntry
55
- * @property {import("../Module")} assetModule
56
- * @property {string} request
57
- * @property {boolean} preload
58
- * @property {("low" | "high" | "auto" | undefined)} fetchPriority
59
- * @property {(string | undefined)} as
60
- * @property {(string | undefined)} type
61
- * @property {(string | undefined)} media
62
- */
63
- // Per-asset dedupe vs the HTML-head emission by `HtmlEntryDependency`:
64
- // if the asset is reachable from an HTML entrypoint's chunks, its
65
- // `<link>` lands in that HTML `<head>` already — skip the runtime
66
- // hint for that asset so the DOM doesn't carry two tags for one URL.
67
- // Set is computed once per compilation from the module graph (stable
68
- // across cache reads), never from a mutable cross-module marker.
69
- const ResourceHintPlugin = require("./ResourceHintPlugin");
70
-
71
- // `output.resourceHints: "none"` is a hard off switch — the plugin's
72
- // runtime-requirements hook already skips adding this module then, so no
73
- // `"none"` guard is needed here.
74
- const { isHtmlHinted } =
75
- ResourceHintPlugin.getCompilationResolver(compilation);
76
-
77
- /** @type {Map<string, AssetHintEntry>} */
78
- const perAsset = new Map();
79
- for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
80
- const deps =
81
- /** @type {{ dependencies?: import("../Dependency")[] }} */
82
- (module).dependencies;
83
- if (!deps) continue;
84
- for (const dep of deps) {
85
- if (
86
- !(dep instanceof URLDependency) &&
87
- !(dep instanceof CssUrlDependency) &&
88
- !(dep instanceof HtmlSourceDependency)
89
- ) {
90
- continue;
91
- }
92
- if (!dep.prefetch && !dep.preload) continue;
93
- const assetModule = moduleGraph.getModule(dep);
94
- if (!assetModule) continue;
95
- if (isHtmlHinted(assetModule)) continue;
96
- const key = assetModule.identifier();
97
- const urlDep =
98
- /** @type {URLDependency & Partial<CssUrlDependency> & Partial<HtmlSourceDependency>} */
99
- (dep);
100
- const existing = perAsset.get(key);
101
- if (existing) {
102
- if (dep.preload) existing.preload = true;
103
- if (dep.fetchPriority) existing.fetchPriority = dep.fetchPriority;
104
- if (urlDep.asAttribute) existing.as = urlDep.asAttribute;
105
- if (urlDep.typeAttribute) existing.type = urlDep.typeAttribute;
106
- if (urlDep.mediaAttribute) existing.media = urlDep.mediaAttribute;
107
- } else {
108
- perAsset.set(key, {
109
- assetModule: /** @type {Module} */ (assetModule),
110
- request: dep.request,
111
- preload: Boolean(dep.preload),
112
- fetchPriority: dep.fetchPriority,
113
- as: urlDep.asAttribute,
114
- type: urlDep.typeAttribute,
115
- media: urlDep.mediaAttribute
116
- });
117
- }
118
- }
119
- }
120
- const lines = [];
121
- for (const entry of perAsset.values()) {
122
- const fn = entry.preload
123
- ? RuntimeGlobals.preloadAsset
124
- : RuntimeGlobals.prefetchAsset;
125
- // For CSS-only assets (referenced from `url(...)` but never
126
- // from JS) the module produces no JS source, so
127
- // `__webpack_require__(id)` would throw at runtime. Use the
128
- // emitted filename + publicPath directly in that case; asset
129
- // modules referenced from JS stay on the existing `moduleRaw`
130
- // path which yields the same URL.
131
- const hasJsSourceType = entry.assetModule
132
- .getSourceTypes()
133
- .has("javascript");
134
- let hrefExpr;
135
- if (hasJsSourceType) {
136
- hrefExpr = runtimeTemplate.moduleRaw({
137
- chunkGraph,
138
- module: entry.assetModule,
139
- request: entry.request,
140
- runtimeRequirements,
141
- weak: false
142
- });
143
- } else {
144
- const buildInfo =
145
- /** @type {{ filename?: string }} */
146
- (entry.assetModule.buildInfo);
147
- if (!buildInfo || !buildInfo.filename) continue;
148
- runtimeRequirements.add(RuntimeGlobals.publicPath);
149
- hrefExpr = `${RuntimeGlobals.publicPath} + ${JSON.stringify(buildInfo.filename)}`;
150
- }
151
- const as =
152
- entry.as || ResourceHintRuntimeModule.guessAsAttribute(entry.request);
153
- lines.push(
154
- `${fn}(${hrefExpr}, ${JSON.stringify(as)}, ${
155
- entry.type ? JSON.stringify(entry.type) : "undefined"
156
- }, ${entry.media ? JSON.stringify(entry.media) : "undefined"}, ${
157
- entry.fetchPriority
158
- ? JSON.stringify(entry.fetchPriority)
159
- : "undefined"
160
- });`
161
- );
162
- }
39
+ const lines = this._lines;
163
40
  if (lines.length === 0) return null;
164
41
  // `__webpack_nonce__` set inside the entry module is too late — the
165
42
  // entry hasn't run yet. Read the nonce off the `<script>` tag that