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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (640) 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 +26 -17
  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 +117 -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 +50 -13
  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 +101 -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 +32 -47
  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 +141 -85
  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 +332 -169
  89. package/lib/RuntimeTemplate.js +2792 -352
  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 +2 -2
  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 +261 -79
  134. package/lib/config/defineConfig.js +10 -2
  135. package/lib/config/getClaimedAssetTypes.js +65 -0
  136. package/lib/config/normalization.js +36 -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 +57 -24
  154. package/lib/css/CssModule.js +10 -7
  155. package/lib/css/CssModulesPlugin.js +168 -88
  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 +5324 -0
  160. package/lib/css/syntax.js +9579 -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 +156 -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 +4 -4
  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 +13 -10
  210. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +78 -12
  211. package/lib/dependencies/HarmonyExportExpressionDependency.js +23 -18
  212. package/lib/dependencies/HarmonyExportHeaderDependency.js +7 -7
  213. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +143 -63
  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 +27 -19
  218. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +31 -24
  219. package/lib/dependencies/HarmonyImportGuard.js +20 -30
  220. package/lib/dependencies/HarmonyImportSideEffectDependency.js +38 -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 +37 -29
  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 +2 -2
  230. package/lib/dependencies/ImportDependency.js +24 -20
  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 +49 -35
  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 +51 -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 +46 -28
  290. package/lib/dependencies/WorkerDependency.js +28 -22
  291. package/lib/dependencies/WorkletDependency.js +15 -14
  292. package/lib/dependencies/getFunctionExpression.js +8 -4
  293. package/lib/dependencies/processExportInfo.js +5 -5
  294. package/lib/dll/DelegatedModule.js +34 -22
  295. package/lib/dll/DelegatedModuleFactoryPlugin.js +15 -7
  296. package/lib/dll/DelegatedPlugin.js +2 -2
  297. package/lib/dll/DllEntryPlugin.js +2 -2
  298. package/lib/dll/DllModule.js +22 -15
  299. package/lib/dll/DllModuleFactory.js +7 -3
  300. package/lib/dll/DllPlugin.js +7 -5
  301. package/lib/dll/DllReferencePlugin.js +10 -7
  302. package/lib/dll/LibManifestPlugin.js +5 -5
  303. package/lib/electron/ElectronTargetPlugin.js +53 -49
  304. package/lib/errors/AsyncChunkWaterfallWarning.js +36 -0
  305. package/lib/errors/AsyncDependencyToInitialChunkError.js +2 -2
  306. package/lib/errors/BroadContextsWarning.js +43 -0
  307. package/lib/errors/BuildCycleError.js +1 -1
  308. package/lib/errors/CacheEffectivenessWarning.js +55 -0
  309. package/lib/errors/ChunkRenderError.js +1 -1
  310. package/lib/errors/CircularDependenciesWarning.js +38 -0
  311. package/lib/errors/CodeGenerationError.js +1 -1
  312. package/lib/errors/CommentCompilationWarning.js +1 -1
  313. package/lib/errors/ConflictingResourceHintsWarning.js +35 -0
  314. package/lib/errors/DuplicateModulesWarning.js +45 -0
  315. package/lib/errors/DynamicExportsWarning.js +30 -0
  316. package/lib/errors/EmbeddedSourceMapsWarning.js +25 -0
  317. package/lib/errors/EntrypointOverlapWarning.js +45 -0
  318. package/lib/errors/EnvironmentNotSupportAsyncWarning.js +2 -2
  319. package/lib/errors/EvalUsageWarning.js +28 -0
  320. package/lib/errors/HookWebpackError.js +5 -5
  321. package/lib/errors/HotspotsWarning.js +57 -0
  322. package/lib/errors/IgnoreErrorModuleFactory.js +7 -3
  323. package/lib/errors/InlinedAssetsWarning.js +36 -0
  324. package/lib/errors/InvalidDependenciesModuleWarning.js +1 -1
  325. package/lib/errors/LargeModulesWarning.js +45 -0
  326. package/lib/errors/LegacyJavascriptWarning.js +48 -0
  327. package/lib/errors/MissingSideEffectsWarning.js +36 -0
  328. package/lib/errors/MixedExportsWarning.js +41 -0
  329. package/lib/errors/ModuleDependencyError.js +13 -16
  330. package/lib/errors/ModuleDependencyWarning.js +5 -15
  331. package/lib/errors/ModuleHashingError.js +1 -1
  332. package/lib/errors/ModuleNotFoundError.js +2 -2
  333. package/lib/errors/ModuleParseError.js +1 -2
  334. package/lib/errors/ModuleRestoreError.js +1 -1
  335. package/lib/errors/ModuleStoreError.js +1 -1
  336. package/lib/errors/NodeStuffInWebError.js +1 -1
  337. package/lib/errors/OsDependentRuleWarning.js +31 -0
  338. package/lib/errors/PureAnnotationsWarning.js +36 -0
  339. package/lib/errors/RedundantDynamicImportWarning.js +31 -0
  340. package/lib/errors/ScopeHoistingBailoutsWarning.js +41 -0
  341. package/lib/errors/SplitChunksCappedWarning.js +41 -0
  342. package/lib/errors/TinyChunksWarning.js +40 -0
  343. package/lib/errors/TopLevelThisWarning.js +34 -0
  344. package/lib/errors/UnsplitVendorsWarning.js +42 -0
  345. package/lib/errors/UnsupportedFeatureWarning.js +1 -1
  346. package/lib/errors/UnusedAliasesWarning.js +29 -0
  347. package/lib/errors/UnusedDefinesWarning.js +29 -0
  348. package/lib/errors/UnusedExternalsWarning.js +29 -0
  349. package/lib/errors/UnusedReexportsWarning.js +42 -0
  350. package/lib/errors/UnusedRuleWarning.js +29 -0
  351. package/lib/errors/WebpackError.js +9 -5
  352. package/lib/errors/deriveStackFromNestedError.js +90 -0
  353. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  354. package/lib/esm/ModuleChunkFormatPlugin.js +37 -19
  355. package/lib/esm/ModuleChunkLoadingPlugin.js +89 -51
  356. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +155 -62
  357. package/lib/hmr/HotModuleReplacement.runtime.js +24 -5
  358. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  359. package/lib/hmr/LazyCompilationPlugin.js +45 -24
  360. package/lib/hmr/lazyCompilationBackend.js +9 -6
  361. package/lib/hmr/parserHooks.js +56 -0
  362. package/lib/html/HtmlGenerator.js +277 -77
  363. package/lib/html/HtmlModule.js +7 -3
  364. package/lib/html/HtmlModulesPlugin.js +282 -162
  365. package/lib/html/HtmlParser.js +31 -86
  366. package/lib/html/data.js +1928 -0
  367. package/lib/html/htmlMinify.js +288 -0
  368. package/lib/html/syntax.js +5557 -1155
  369. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -3
  370. package/lib/ids/DeterministicChunkIdsPlugin.js +1 -1
  371. package/lib/ids/DeterministicModuleIdsPlugin.js +2 -2
  372. package/lib/ids/HashedModuleIdsPlugin.js +6 -2
  373. package/lib/ids/IdHelpers.js +7 -8
  374. package/lib/ids/NamedChunkIdsPlugin.js +1 -1
  375. package/lib/ids/NamedModuleIdsPlugin.js +1 -1
  376. package/lib/ids/NaturalChunkIdsPlugin.js +2 -2
  377. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  378. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -3
  379. package/lib/ids/OccurrenceModuleIdsPlugin.js +7 -3
  380. package/lib/ids/SyncModuleIdsPlugin.js +4 -4
  381. package/lib/index.js +10 -0
  382. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +3 -3
  383. package/lib/javascript/BasicEvaluatedExpression.js +18 -14
  384. package/lib/javascript/ChunkFormatHelpers.js +6 -6
  385. package/lib/javascript/ChunkHelpers.js +1 -1
  386. package/lib/javascript/CommonJsChunkFormatPlugin.js +11 -5
  387. package/lib/javascript/EnableChunkLoadingPlugin.js +2 -2
  388. package/lib/javascript/JavascriptGenerator.js +65 -165
  389. package/lib/javascript/JavascriptModule.js +9 -3
  390. package/lib/javascript/JavascriptModulesPlugin.js +98 -113
  391. package/lib/javascript/JavascriptParser.js +242 -99
  392. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  393. package/lib/javascript/ScopeAnalyzer.js +1094 -0
  394. package/lib/javascript/StartupHelpers.js +55 -9
  395. package/lib/javascript/syntax.js +2678 -232
  396. package/lib/json/JsonData.js +8 -4
  397. package/lib/json/JsonGenerator.js +38 -16
  398. package/lib/json/JsonModule.js +7 -3
  399. package/lib/json/JsonModulesPlugin.js +1 -1
  400. package/lib/json/JsonParser.js +5 -6
  401. package/lib/library/AbstractLibraryPlugin.js +20 -14
  402. package/lib/library/AmdLibraryPlugin.js +11 -7
  403. package/lib/library/AssignLibraryPlugin.js +19 -13
  404. package/lib/library/EnableLibraryPlugin.js +2 -2
  405. package/lib/library/ExportPropertyLibraryPlugin.js +15 -8
  406. package/lib/library/JsonpLibraryPlugin.js +11 -7
  407. package/lib/library/ModuleLibraryPlugin.js +256 -64
  408. package/lib/library/SystemLibraryPlugin.js +12 -8
  409. package/lib/library/UmdLibraryPlugin.js +62 -25
  410. package/lib/loaders/LoaderRunner.js +14 -1
  411. package/lib/loaders/loadLoader.js +8 -4
  412. package/lib/logging/createConsoleLogger.js +7 -4
  413. package/lib/node/CommonJsChunkLoadingPlugin.js +36 -22
  414. package/lib/node/NodeEnvironmentPlugin.js +17 -3
  415. package/lib/node/NodeSourcePlugin.js +1 -1
  416. package/lib/node/NodeTargetPlugin.js +4 -3
  417. package/lib/node/NodeTemplatePlugin.js +1 -1
  418. package/lib/node/NodeWatchFileSystem.js +70 -9
  419. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +35 -38
  420. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +72 -19
  421. package/lib/node/ReadFileCompileWasmPlugin.js +28 -16
  422. package/lib/node/RequireChunkLoadingRuntimeModule.js +35 -38
  423. package/lib/node/nodeConsole.js +7 -3
  424. package/lib/optimize/AggressiveMergingPlugin.js +2 -2
  425. package/lib/optimize/AggressiveSplittingPlugin.js +9 -6
  426. package/lib/optimize/ConcatenatedModule.js +985 -470
  427. package/lib/optimize/ConstExportsPlugin.js +11 -7
  428. package/lib/optimize/EnsureChunkConditionsPlugin.js +3 -3
  429. package/lib/optimize/FlagIncludedChunksPlugin.js +3 -4
  430. package/lib/optimize/InlineExports.js +9 -5
  431. package/lib/optimize/InnerGraph.js +28 -12
  432. package/lib/optimize/InnerGraphPlugin.js +23 -18
  433. package/lib/optimize/LimitChunkCountPlugin.js +7 -3
  434. package/lib/optimize/MangleExportsPlugin.js +7 -8
  435. package/lib/optimize/MergeDuplicateChunksPlugin.js +7 -3
  436. package/lib/optimize/MinChunkSizePlugin.js +7 -3
  437. package/lib/optimize/ModuleConcatenationPlugin.js +51 -35
  438. package/lib/optimize/RealContentHashPlugin.js +10 -6
  439. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -2
  440. package/lib/optimize/RemoveParentModulesPlugin.js +4 -4
  441. package/lib/optimize/RuntimeChunkPlugin.js +2 -2
  442. package/lib/optimize/SideEffectsFlagPlugin.js +262 -39
  443. package/lib/optimize/SplitChunksPlugin.js +86 -24
  444. package/lib/performance/AssetsOverSizeLimitWarning.js +10 -2
  445. package/lib/performance/AsyncChunkWaterfallsPlugin.js +136 -0
  446. package/lib/performance/BroadContextsPlugin.js +142 -0
  447. package/lib/performance/CacheEffectivenessPlugin.js +125 -0
  448. package/lib/performance/ConflictingResourceHintsPlugin.js +99 -0
  449. package/lib/performance/DuplicateModulesPlugin.js +93 -0
  450. package/lib/performance/DuplicatePackagesPlugin.js +119 -0
  451. package/lib/performance/DuplicatePackagesWarning.js +84 -0
  452. package/lib/performance/DynamicExportsPlugin.js +120 -0
  453. package/lib/performance/EmbeddedSourceMapsPlugin.js +71 -0
  454. package/lib/performance/EntrypointOverlapPlugin.js +122 -0
  455. package/lib/performance/EntrypointsOverSizeLimitWarning.js +1 -1
  456. package/lib/performance/EvalUsagePlugin.js +115 -0
  457. package/lib/performance/HotspotsPlugin.js +296 -0
  458. package/lib/performance/InlinedAssetsPlugin.js +99 -0
  459. package/lib/performance/LargeModulesPlugin.js +126 -0
  460. package/lib/performance/LegacyJavascriptPlugin.js +139 -0
  461. package/lib/performance/MissingSideEffectsPlugin.js +138 -0
  462. package/lib/performance/MixedExportsPlugin.js +136 -0
  463. package/lib/performance/OsDependentRuleWarningPlugin.js +178 -0
  464. package/lib/performance/PureAnnotationsPlugin.js +219 -0
  465. package/lib/performance/RedundantDynamicImportsPlugin.js +225 -0
  466. package/lib/performance/RuntimeInLargeChunkWarning.js +27 -0
  467. package/lib/performance/ScopeHoistingBailoutsPlugin.js +164 -0
  468. package/lib/performance/SizeLimitsPlugin.js +139 -7
  469. package/lib/performance/SplitChunksCappedPlugin.js +99 -0
  470. package/lib/performance/TinyChunksPlugin.js +128 -0
  471. package/lib/performance/TopLevelThisPlugin.js +208 -0
  472. package/lib/performance/UnsplitVendorsPlugin.js +112 -0
  473. package/lib/performance/UnusedAliasesPlugin.js +253 -0
  474. package/lib/performance/UnusedDefinesPlugin.js +87 -0
  475. package/lib/performance/UnusedExternalsPlugin.js +110 -0
  476. package/lib/performance/UnusedReexportsPlugin.js +159 -0
  477. package/lib/performance/UnusedRuleWarningPlugin.js +105 -0
  478. package/lib/performance/getModuleSize.js +22 -0
  479. package/lib/performance/getSourceModules.js +22 -0
  480. package/lib/performance/hasOnlyUnusedExports.js +40 -0
  481. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +24 -10
  482. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +63 -46
  483. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +2 -3
  484. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  485. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  486. package/lib/prefetch/ResourceHintPlugin.js +295 -78
  487. package/lib/prefetch/ResourceHintRuntimeModule.js +1 -21
  488. package/lib/prefetch/StartupAssetHintRuntimeModule.js +10 -133
  489. package/lib/prefetch/parseResourceHintOptions.js +31 -4
  490. package/lib/rules/BasicEffectRulePlugin.js +2 -2
  491. package/lib/rules/BasicMatcherRulePlugin.js +8 -4
  492. package/lib/rules/GlobMatcherRulePlugin.js +68 -0
  493. package/lib/rules/ObjectMatcherRulePlugin.js +12 -5
  494. package/lib/rules/RuleSetCompiler.js +146 -12
  495. package/lib/rules/UseEffectRulePlugin.js +18 -11
  496. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +11 -1
  497. package/lib/runtime/AsyncModuleRuntimeModule.js +1 -1
  498. package/lib/runtime/AutoPublicPathRuntimeModule.js +15 -20
  499. package/lib/runtime/BaseUriRuntimeModule.js +33 -7
  500. package/lib/runtime/ChunkNameRuntimeModule.js +10 -0
  501. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +11 -1
  502. package/lib/runtime/CompatRuntimeModule.js +5 -3
  503. package/lib/runtime/ConcatenationWrapRuntimeModule.js +90 -0
  504. package/lib/runtime/ConstructRequireRuntimeModule.js +52 -0
  505. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +8 -6
  506. package/lib/runtime/CreateScriptRuntimeModule.js +11 -1
  507. package/lib/runtime/CreateScriptUrlRuntimeModule.js +11 -1
  508. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +56 -38
  509. package/lib/runtime/EnsureChunkRuntimeModule.js +18 -2
  510. package/lib/runtime/GetChunkFilenameRuntimeModule.js +62 -37
  511. package/lib/runtime/GetFullHashRuntimeModule.js +12 -2
  512. package/lib/runtime/GetMainFilenameRuntimeModule.js +12 -2
  513. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -2
  514. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +16 -3
  515. package/lib/runtime/GlobalRuntimeModule.js +18 -0
  516. package/lib/runtime/HasOwnPropertyRuntimeModule.js +12 -2
  517. package/lib/runtime/LoadScriptRuntimeModule.js +2 -2
  518. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +23 -6
  519. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +22 -6
  520. package/lib/runtime/NonceRuntimeModule.js +10 -0
  521. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -3
  522. package/lib/runtime/PublicPathRuntimeModule.js +12 -2
  523. package/lib/runtime/RelativeUrlRuntimeModule.js +11 -1
  524. package/lib/runtime/RuntimeIdRuntimeModule.js +12 -2
  525. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +11 -1
  526. package/lib/runtime/StartupChunkDependenciesPlugin.js +18 -9
  527. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +3 -3
  528. package/lib/runtime/StartupEntrypointRuntimeModule.js +21 -4
  529. package/lib/runtime/SystemContextRuntimeModule.js +10 -0
  530. package/lib/runtime/ToBinaryRuntimeModule.js +1 -1
  531. package/lib/runtime/WorkerRuntimeModule.js +11 -1
  532. package/lib/runtime/baseUri.js +63 -0
  533. package/lib/schemes/DataUriPlugin.js +1 -1
  534. package/lib/schemes/FileUriPlugin.js +1 -1
  535. package/lib/schemes/HttpUriPlugin.js +24 -15
  536. package/lib/schemes/VirtualUrlPlugin.js +13 -7
  537. package/lib/serialization/AggregateErrorSerializer.js +1 -1
  538. package/lib/serialization/BinaryMiddleware.js +4 -4
  539. package/lib/serialization/ErrorObjectSerializer.js +1 -1
  540. package/lib/serialization/FileMiddleware.js +7 -7
  541. package/lib/serialization/ObjectMiddleware.js +139 -114
  542. package/lib/serialization/PlainObjectSerializer.js +19 -16
  543. package/lib/sharing/ConsumeSharedModule.js +30 -21
  544. package/lib/sharing/ConsumeSharedPlugin.js +18 -10
  545. package/lib/sharing/ConsumeSharedRuntimeModule.js +6 -9
  546. package/lib/sharing/ProvideSharedModule.js +25 -16
  547. package/lib/sharing/ProvideSharedModuleFactory.js +7 -3
  548. package/lib/sharing/ProvideSharedPlugin.js +8 -4
  549. package/lib/sharing/SharePlugin.js +17 -5
  550. package/lib/sharing/ShareRuntimeModule.js +4 -4
  551. package/lib/sharing/resolveMatchedConfigs.js +9 -6
  552. package/lib/sharing/utils.js +1 -3
  553. package/lib/stats/DefaultStatsFactoryPlugin.js +50 -29
  554. package/lib/stats/DefaultStatsPresetPlugin.js +17 -8
  555. package/lib/stats/DefaultStatsPrinterPlugin.js +36 -26
  556. package/lib/stats/StatsFactory.js +25 -26
  557. package/lib/stats/StatsPrinter.js +16 -12
  558. package/lib/typescript/TypeScriptPlugin.js +12 -14
  559. package/lib/url/URLParserPlugin.js +26 -13
  560. package/lib/util/AsyncQueue.js +4 -3
  561. package/lib/util/Hash.js +5 -1
  562. package/lib/util/LazySet.js +35 -22
  563. package/lib/util/LocConverter.js +36 -13
  564. package/lib/util/SourceProcessor.js +1050 -24
  565. package/lib/util/StringXor.js +1 -1
  566. package/lib/util/chainedImports.js +9 -5
  567. package/lib/util/cleverMerge.js +1 -1
  568. package/lib/util/comparators.js +45 -14
  569. package/lib/util/concatenate.js +203 -77
  570. package/lib/util/conventions.js +5 -1
  571. package/lib/util/createHash.js +2 -2
  572. package/lib/util/createHooksRegistry.js +8 -10
  573. package/lib/util/dataURL.js +225 -1
  574. package/lib/util/extractSourceMap.js +4 -3
  575. package/lib/util/findCaseMismatch.js +139 -0
  576. package/lib/util/formatLocation.js +1 -2
  577. package/lib/util/fs.js +22 -5
  578. package/lib/util/globUtils.js +298 -24
  579. package/lib/util/hash/BatchedHash.js +5 -1
  580. package/lib/util/hash/BulkUpdateHash.js +5 -1
  581. package/lib/util/hash/DebugHash.js +5 -1
  582. package/lib/util/hash/hash-digest.js +6 -2
  583. package/lib/util/identifier.js +4 -0
  584. package/lib/util/implicitTypeLoaderFallback.js +1 -1
  585. package/lib/util/internalSerializables.js +6 -0
  586. package/lib/util/lazyModule.js +56 -0
  587. package/lib/util/makeSerializable.js +7 -3
  588. package/lib/util/matchAlias.js +25 -0
  589. package/lib/util/mimeTypes.js +11 -5
  590. package/lib/util/nonNumericOnlyHash.js +4 -3
  591. package/lib/util/parseJson.js +5 -3
  592. package/lib/util/preloadModuleType.js +32 -0
  593. package/lib/util/registerExternalSerializer.js +7 -5
  594. package/lib/util/runtime.js +2 -2
  595. package/lib/util/semver.js +1 -1
  596. package/lib/util/serialization.js +28 -28
  597. package/lib/util/source.js +2 -2
  598. package/lib/util/traverseDestructuringAssignmentProperties.js +6 -2
  599. package/lib/wasm/EnableWasmLoadingPlugin.js +10 -8
  600. package/lib/wasm/wasmModuleFilename.js +54 -0
  601. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +41 -21
  602. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +43 -21
  603. package/lib/wasm-async/AsyncWasmModule.js +3 -3
  604. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +4 -5
  605. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +57 -17
  606. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +34 -18
  607. package/lib/wasm-async/AsyncWebAssemblyParser.js +9 -8
  608. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +34 -8
  609. package/lib/wasm-sync/SyncWasmModule.js +2 -2
  610. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +18 -13
  611. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -5
  612. package/lib/wasm-sync/WebAssemblyGenerator.js +18 -17
  613. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +4 -4
  614. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +7 -7
  615. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +24 -11
  616. package/lib/wasm-sync/WebAssemblyParser.js +4 -6
  617. package/lib/wasm-sync/WebAssemblyUtils.js +2 -2
  618. package/lib/web/FetchCompileAsyncWasmPlugin.js +101 -19
  619. package/lib/web/FetchCompileWasmPlugin.js +46 -16
  620. package/lib/web/JsonpChunkLoadingPlugin.js +47 -23
  621. package/lib/web/JsonpChunkLoadingRuntimeModule.js +50 -20
  622. package/lib/web/JsonpTemplatePlugin.js +2 -2
  623. package/lib/webpack.js +22 -11
  624. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +60 -26
  625. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +30 -32
  626. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  627. package/module.d.ts +1 -0
  628. package/package.json +32 -25
  629. package/schemas/WebpackOptions.check.js +1 -1
  630. package/schemas/WebpackOptions.json +670 -36
  631. package/schemas/plugins/HtmlParserOptions.check.js +1 -1
  632. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  633. package/schemas/plugins/container/ContainerPlugin.json +10 -0
  634. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  635. package/schemas/plugins/container/ModuleFederationPlugin.json +10 -0
  636. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +1 -1
  637. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  638. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  639. package/types.d.ts +3144 -454
  640. 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.
@@ -327,9 +367,7 @@ const collectEntrypointHints = (compilation, entryName, hints) => {
327
367
  /** @type {{ filename?: string }} */
328
368
  (target.buildInfo);
329
369
  if (!buildInfo || !buildInfo.filename) continue;
330
- const asAttribute =
331
- dep.asAttribute ||
332
- ResourceHintRuntimeModule.guessAsAttribute(dep.request);
370
+ const asAttribute = dep.asAttribute || guessAsAttribute(dep.request);
333
371
  /** @type {EntrypointHint} */
334
372
  const h = {
335
373
  rel: dep.preload ? "preload" : "prefetch",
@@ -348,14 +386,13 @@ const collectEntrypointHints = (compilation, entryName, hints) => {
348
386
  // `stats.entrypoints[name].resourceHints` see `"js"`.
349
387
  let hostType = /** @type {"html" | "js"} */ ("js");
350
388
 
351
- const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
352
-
353
389
  outer: for (const module of compilation.modules) {
354
390
  if (!module.getSourceTypes || !module.getSourceTypes().has("html")) {
355
391
  continue;
356
392
  }
357
393
  const presDeps = module.presentationalDependencies;
358
394
  if (!presDeps) continue;
395
+ const HtmlEntryDependency = getHtmlEntryDependency();
359
396
  for (const dep of presDeps) {
360
397
  if (
361
398
  dep instanceof HtmlEntryDependency &&
@@ -377,6 +414,214 @@ const collectEntrypointHints = (compilation, entryName, hints) => {
377
414
  );
378
415
  };
379
416
 
417
+ /**
418
+ * Renders the `<link>` calls a chunk fires at startup, for every asset and worker
419
+ * chunk it references with a resource hint. Run while runtime requirements are still
420
+ * open, so what an href reads is added to `set` rather than assumed: an href spelled
421
+ * as a literal leaves `.p` and `.u` out of the chunk entirely.
422
+ * @param {Chunk} chunk the chunk the calls are emitted into
423
+ * @param {Compilation} compilation the compilation
424
+ * @param {ChunkGraph} chunkGraph the chunk graph
425
+ * @param {CodeGenerationResults} codeGenerationResults the code generation results
426
+ * @param {RuntimeRequirements} set the chunk's runtime requirements
427
+ * @returns {string[]} one call per hinted asset, in emission order
428
+ */
429
+ const collectStartupAssetHintLines = (
430
+ chunk,
431
+ compilation,
432
+ chunkGraph,
433
+ codeGenerationResults,
434
+ set
435
+ ) => {
436
+ const { moduleGraph, runtimeTemplate } = compilation;
437
+ const resolver =
438
+ /** @type {CompilationResolver} */
439
+ (compilationResolvers.get(compilation));
440
+ /** @type {string[]} */
441
+ const lines = [];
442
+
443
+ /**
444
+ * @param {string} fn the `<link>` helper
445
+ * @param {string} href the href expression
446
+ * @param {string} as the `as` attribute
447
+ * @param {StartupHintAttributes} attributes the remaining attributes
448
+ * @returns {void}
449
+ */
450
+ const push = (fn, href, as, attributes) => {
451
+ set.add(fn);
452
+ lines.push(
453
+ `${fn}(${href}, ${JSON.stringify(as)}, ${
454
+ attributes.type ? JSON.stringify(attributes.type) : "undefined"
455
+ }, ${attributes.media ? JSON.stringify(attributes.media) : "undefined"}, ${
456
+ attributes.fetchPriority
457
+ ? JSON.stringify(attributes.fetchPriority)
458
+ : "undefined"
459
+ });`
460
+ );
461
+ };
462
+
463
+ // The analyzable worker form can't wrap its own href without losing the literal
464
+ // specifier, so its `<link>` fires here — keyed by chunk, hence a separate pass.
465
+ /** @type {Set<string | number>} */
466
+ const seenWorkerChunks = new Set();
467
+ for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
468
+ for (const block of module.blocks) {
469
+ for (const dep of block.dependencies) {
470
+ if (!(dep instanceof WorkerDependency)) continue;
471
+ const hint = dep.options.resourceHint;
472
+ if (!hint || (!hint.preload && !hint.prefetch)) continue;
473
+ const group = chunkGraph.getBlockChunkGroup(block);
474
+ if (!group) continue;
475
+ const workerChunk =
476
+ /** @type {import("../Entrypoint")} */
477
+ (group).getEntrypointChunk();
478
+ if (workerChunk.id === null || seenWorkerChunks.has(workerChunk.id)) {
479
+ continue;
480
+ }
481
+ seenWorkerChunks.add(workerChunk.id);
482
+ // The same specifier the `new Worker(...)` call site bakes, asked of the
483
+ // same module, so the two agree on whether a literal is spellable.
484
+ const specifier = runtimeTemplate.supportsAnalyzable(
485
+ "url",
486
+ chunkGraph,
487
+ module
488
+ )
489
+ ? runtimeTemplate._getAnalyzableChunkSpecifier(
490
+ dep.options.publicPath,
491
+ workerChunk,
492
+ module,
493
+ chunkGraph,
494
+ set
495
+ )
496
+ : null;
497
+ // Without one the call site keeps the runtime form, where it wraps its own
498
+ // href — firing the `<link>` here too would emit the call twice.
499
+ if (specifier === null) continue;
500
+ push(
501
+ hint.preload
502
+ ? RuntimeGlobals.preloadAsset
503
+ : RuntimeGlobals.prefetchAsset,
504
+ `${runtimeTemplate.importMetaUrl(specifier)}.href`,
505
+ hint.as || "script",
506
+ hint
507
+ );
508
+ }
509
+ }
510
+ }
511
+
512
+ // Dedupe per asset module so two references can't emit two `<link>`s: `preload`
513
+ // wins over `prefetch`, and the last explicit attribute override sticks.
514
+ /** @type {Map<string, AssetHintEntry>} */
515
+ const perAsset = new Map();
516
+ for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
517
+ const deps =
518
+ /** @type {{ dependencies?: import("../Dependency")[] }} */
519
+ (module).dependencies;
520
+ if (!deps) continue;
521
+ for (const dep of deps) {
522
+ if (!isUrlAssetDep(dep)) continue;
523
+ if (!dep.prefetch && !dep.preload) continue;
524
+ const assetModule = moduleGraph.getModule(dep);
525
+ if (!assetModule) continue;
526
+ // Already a `<link>` in the html `<head>` emitted by `HtmlEntryDependency`,
527
+ // so the runtime hint would leave the DOM with two tags for one url.
528
+ if (resolver.isHtmlHinted(assetModule)) continue;
529
+ const key = assetModule.identifier();
530
+ const urlDep =
531
+ /** @type {URLDependency & Partial<CssUrlDependency> & Partial<HtmlSourceDependency>} */
532
+ (dep);
533
+ const existing = perAsset.get(key);
534
+ if (existing) {
535
+ if (dep.preload) existing.preload = true;
536
+ if (dep.fetchPriority) existing.fetchPriority = dep.fetchPriority;
537
+ if (urlDep.asAttribute) existing.as = urlDep.asAttribute;
538
+ if (urlDep.typeAttribute) existing.type = urlDep.typeAttribute;
539
+ if (urlDep.mediaAttribute) existing.media = urlDep.mediaAttribute;
540
+ } else {
541
+ perAsset.set(key, {
542
+ assetModule: /** @type {Module} */ (assetModule),
543
+ originModule: module,
544
+ request: dep.request,
545
+ preload: Boolean(dep.preload),
546
+ fetchPriority: dep.fetchPriority,
547
+ as: urlDep.asAttribute,
548
+ type: urlDep.typeAttribute,
549
+ media: urlDep.mediaAttribute
550
+ });
551
+ }
552
+ }
553
+ }
554
+
555
+ for (const entry of perAsset.values()) {
556
+ const { assetModule } = entry;
557
+ let href;
558
+ // An asset with a javascript wrapper exposes its url through it; one without has
559
+ // no `__webpack_modules__` entry to require.
560
+ if (assetModule.getSourceTypes().has(JAVASCRIPT_TYPE)) {
561
+ href = runtimeTemplate.moduleRaw({
562
+ chunkGraph,
563
+ module: assetModule,
564
+ request: entry.request,
565
+ runtimeRequirements: set,
566
+ weak: false
567
+ });
568
+ } else {
569
+ const has = codeGenerationResults.has(assetModule, chunk.runtime);
570
+ const urlData = has
571
+ ? codeGenerationResults.getData(assetModule, chunk.runtime, "url")
572
+ : undefined;
573
+ const resolved = urlData && urlData[ASSET_URL_TYPE];
574
+ // A generator `publicPath` overrides `output.publicPath`, so prefer it; only the
575
+ // two placeholders below are still unresolved when this runs.
576
+ const templated =
577
+ typeof resolved === "string" &&
578
+ (resolved.includes(PUBLIC_PATH_AUTO) ||
579
+ resolved.includes(PUBLIC_PATH_FULL_HASH));
580
+ if (typeof resolved === "string" && !templated) {
581
+ href = JSON.stringify(resolved);
582
+ } else {
583
+ const filename = has
584
+ ? codeGenerationResults.getData(
585
+ assetModule,
586
+ chunk.runtime,
587
+ "filename"
588
+ )
589
+ : undefined;
590
+ if (typeof filename !== "string") continue;
591
+ // The literal the `new URL()` call site bakes, asked of the same module —
592
+ // but written into a runtime module, which no `eval` devtool wraps.
593
+ const specifier = runtimeTemplate.supportsAnalyzable(
594
+ "url-runtime",
595
+ chunkGraph,
596
+ entry.originModule
597
+ )
598
+ ? runtimeTemplate.getAnalyzableAssetUrl(
599
+ entry.originModule,
600
+ chunkGraph,
601
+ filename,
602
+ chunk.runtime
603
+ )
604
+ : null;
605
+ if (specifier !== null) {
606
+ href = `${runtimeTemplate.importMetaUrl(specifier)}.href`;
607
+ } else {
608
+ set.add(RuntimeGlobals.publicPath);
609
+ href = `${RuntimeGlobals.publicPath} + ${JSON.stringify(filename)}`;
610
+ }
611
+ }
612
+ }
613
+ push(
614
+ entry.preload
615
+ ? RuntimeGlobals.preloadAsset
616
+ : RuntimeGlobals.prefetchAsset,
617
+ href,
618
+ entry.as || guessAsAttribute(entry.request),
619
+ entry
620
+ );
621
+ }
622
+ return lines;
623
+ };
624
+
380
625
  /**
381
626
  * Adds runtime support for `__webpack_require__.PA` / `__webpack_require__.LA`,
382
627
  * the helpers that inject `<link rel="prefetch">` / `<link rel="preload">`
@@ -493,8 +738,6 @@ class ResourceHintPlugin {
493
738
  apply(compiler) {
494
739
  const hints = this._hints;
495
740
 
496
- const HtmlEntryDependency = require("../dependencies/HtmlEntryDependency");
497
-
498
741
  compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
499
742
  // Lazy-computed on first access — walk every HTML module's
500
743
  // `HtmlEntryDependency`s, resolve each named entry, and collect
@@ -521,6 +764,7 @@ class ResourceHintPlugin {
521
764
  // they don't affect module resolution, only rendering.
522
765
  const presDeps = module.presentationalDependencies;
523
766
  if (!presDeps) continue;
767
+ const HtmlEntryDependency = getHtmlEntryDependency();
524
768
  for (const dep of presDeps) {
525
769
  if (
526
770
  !(dep instanceof HtmlEntryDependency) ||
@@ -583,56 +827,28 @@ class ResourceHintPlugin {
583
827
  getEntrypointHints: (entryName) =>
584
828
  collectEntrypointHints(compilation, entryName, hints)
585
829
  });
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).
830
+ // Rendered here, not in the runtime module: requirements are still open, so a
831
+ // literal href costs no `.p`/`.u`, and async chunks are reached as well.
591
832
  compilation.hooks.additionalChunkRuntimeRequirements.tap(
592
833
  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
- }
834
+ (chunk, set, { chunkGraph, codeGenerationResults }) => {
835
+ // Browser markup, and no DOM to put it in — the call sites skip their
836
+ // hints under build-time execution too (`URLDependency`).
837
+ if (hints === "none" || chunkGraph.buildTimeExecution) return;
838
+ const lines = collectStartupAssetHintLines(
839
+ chunk,
840
+ compilation,
841
+ chunkGraph,
842
+ codeGenerationResults,
843
+ set
844
+ );
845
+ if (lines.length === 0) return;
846
+ set.add(RuntimeGlobals.startupAssetHints);
847
+ compilation.addLazyRuntimeModule(
848
+ chunk,
849
+ getStartupAssetHintRuntimeModule,
850
+ (Ctor) => new Ctor(lines)
851
+ );
636
852
  }
637
853
  );
638
854
  for (const [rel, runtimeGlobal] of /** @type {const} */ ([
@@ -642,9 +858,10 @@ class ResourceHintPlugin {
642
858
  compilation.hooks.runtimeRequirementInTree
643
859
  .for(runtimeGlobal)
644
860
  .tap(PLUGIN_NAME, (chunk) => {
645
- compilation.addRuntimeModule(
861
+ compilation.addLazyRuntimeModule(
646
862
  chunk,
647
- new ResourceHintRuntimeModule(rel)
863
+ getResourceHintRuntimeModule,
864
+ (Ctor) => new Ctor(rel)
648
865
  );
649
866
  });
650
867
  }
@@ -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