@depup/webpack 5.106.0-depup.0 → 5.109.0-depup.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (667) hide show
  1. package/README.md +9 -11
  2. package/changes.json +16 -24
  3. package/hot/dev-server.js +2 -0
  4. package/lib/APIPlugin.js +60 -35
  5. package/lib/AsyncDependenciesBlock.js +3 -0
  6. package/lib/AutomaticPrefetchPlugin.js +6 -1
  7. package/lib/BannerPlugin.js +13 -5
  8. package/lib/Cache.js +27 -5
  9. package/lib/CacheFacade.js +41 -0
  10. package/lib/Chunk.js +71 -25
  11. package/lib/ChunkGraph.js +141 -9
  12. package/lib/ChunkGroup.js +115 -28
  13. package/lib/ChunkTemplate.js +9 -0
  14. package/lib/CircularModulesPlugin.js +190 -0
  15. package/lib/CleanPlugin.js +23 -26
  16. package/lib/CodeGenerationResults.js +19 -0
  17. package/lib/CompatibilityPlugin.js +54 -37
  18. package/lib/Compilation.js +635 -107
  19. package/lib/Compiler.js +93 -31
  20. package/lib/ConcatenationScope.js +34 -4
  21. package/lib/ConditionalInitFragment.js +6 -0
  22. package/lib/ConstPlugin.js +15 -12
  23. package/lib/ContextExclusionPlugin.js +3 -1
  24. package/lib/ContextModule.js +345 -55
  25. package/lib/ContextModuleFactory.js +193 -51
  26. package/lib/ContextReplacementPlugin.js +8 -1
  27. package/lib/DefinePlugin.js +498 -127
  28. package/lib/DependenciesBlock.js +6 -1
  29. package/lib/Dependency.js +159 -11
  30. package/lib/DependencyTemplate.js +7 -1
  31. package/lib/DependencyTemplates.js +4 -0
  32. package/lib/DotenvPlugin.js +3 -0
  33. package/lib/DynamicEntryPlugin.js +3 -1
  34. package/lib/EntryOptionPlugin.js +42 -2
  35. package/lib/EntryPlugin.js +4 -1
  36. package/lib/Entrypoint.js +5 -1
  37. package/lib/EnvironmentPlugin.js +3 -2
  38. package/lib/ErrorHelpers.js +7 -0
  39. package/lib/EvalDevToolModulePlugin.js +3 -1
  40. package/lib/EvalSourceMapDevToolPlugin.js +11 -11
  41. package/lib/ExportsInfo.js +399 -108
  42. package/lib/ExportsInfoApiPlugin.js +4 -3
  43. package/lib/ExternalModule.js +376 -78
  44. package/lib/ExternalModuleFactoryPlugin.js +75 -3
  45. package/lib/ExternalsPlugin.js +3 -1
  46. package/lib/FileSystemInfo.js +575 -149
  47. package/lib/FlagAllModulesAsUsedPlugin.js +3 -6
  48. package/lib/FlagDependencyExportsPlugin.js +82 -9
  49. package/lib/FlagDependencyUsagePlugin.js +92 -6
  50. package/lib/FlagEntryExportAsUsedPlugin.js +4 -1
  51. package/lib/Generator.js +24 -3
  52. package/lib/HotModuleReplacementPlugin.js +110 -44
  53. package/lib/IgnorePlugin.js +5 -2
  54. package/lib/IgnoreWarningsPlugin.js +2 -1
  55. package/lib/InitFragment.js +15 -0
  56. package/lib/JavascriptMetaInfoPlugin.js +9 -6
  57. package/lib/LazyBarrel.js +389 -0
  58. package/lib/LibraryTemplatePlugin.js +2 -1
  59. package/lib/LoaderOptionsPlugin.js +3 -1
  60. package/lib/LoaderTargetPlugin.js +3 -1
  61. package/lib/MainTemplate.js +15 -0
  62. package/lib/ManifestPlugin.js +9 -2
  63. package/lib/Module.js +121 -60
  64. package/lib/ModuleFactory.js +6 -1
  65. package/lib/ModuleFilenameHelpers.js +5 -2
  66. package/lib/ModuleGraph.js +69 -2
  67. package/lib/ModuleGraphConnection.js +9 -0
  68. package/lib/ModuleInfoHeaderPlugin.js +5 -0
  69. package/lib/ModuleNotFoundError.js +3 -83
  70. package/lib/ModuleProfile.js +27 -1
  71. package/lib/ModuleSourceTypeConstants.js +52 -19
  72. package/lib/ModuleTemplate.js +10 -0
  73. package/lib/ModuleTypeConstants.js +20 -4
  74. package/lib/MultiCompiler.js +59 -4
  75. package/lib/MultiStats.js +9 -0
  76. package/lib/MultiWatching.js +6 -0
  77. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  78. package/lib/NodeStuffPlugin.js +78 -46
  79. package/lib/NormalModule.js +485 -181
  80. package/lib/NormalModuleFactory.js +148 -29
  81. package/lib/NormalModuleReplacementPlugin.js +3 -1
  82. package/lib/NullFactory.js +1 -0
  83. package/lib/OptionsApply.js +1 -0
  84. package/lib/Parser.js +3 -1
  85. package/lib/PlatformPlugin.js +2 -1
  86. package/lib/PrefetchPlugin.js +4 -1
  87. package/lib/ProgressPlugin.js +351 -161
  88. package/lib/ProvidePlugin.js +6 -3
  89. package/lib/RawModule.js +32 -16
  90. package/lib/RecordIdsPlugin.js +9 -0
  91. package/lib/RequestShortener.js +8 -0
  92. package/lib/ResolverFactory.js +5 -0
  93. package/lib/RuntimeGlobals.js +58 -5
  94. package/lib/RuntimeModule.js +22 -7
  95. package/lib/RuntimePlugin.js +104 -26
  96. package/lib/RuntimeTemplate.js +616 -37
  97. package/lib/SelfModuleFactory.js +3 -0
  98. package/lib/SourceMapDevToolModuleOptionsPlugin.js +2 -0
  99. package/lib/SourceMapDevToolPlugin.js +341 -63
  100. package/lib/Stats.js +6 -0
  101. package/lib/Template.js +29 -3
  102. package/lib/TemplatedPathPlugin.js +505 -138
  103. package/lib/UseStrictPlugin.js +3 -2
  104. package/lib/WarnCaseSensitiveModulesPlugin.js +72 -3
  105. package/lib/WarnDeprecatedOptionPlugin.js +6 -2
  106. package/lib/WarnNoModeSetPlugin.js +18 -2
  107. package/lib/WatchIgnorePlugin.js +5 -1
  108. package/lib/Watching.js +25 -3
  109. package/lib/WebpackError.js +3 -74
  110. package/lib/WebpackIsIncludedPlugin.js +4 -2
  111. package/lib/WebpackOptionsApply.js +88 -25
  112. package/lib/WebpackOptionsDefaulter.js +1 -0
  113. package/lib/asset/AssetBytesGenerator.js +28 -10
  114. package/lib/asset/AssetBytesParser.js +1 -0
  115. package/lib/asset/AssetGenerator.js +199 -60
  116. package/lib/asset/AssetModule.js +47 -0
  117. package/lib/asset/AssetModulesPlugin.js +115 -24
  118. package/lib/asset/AssetParser.js +4 -2
  119. package/lib/asset/AssetSourceGenerator.js +26 -8
  120. package/lib/asset/AssetSourceParser.js +1 -0
  121. package/lib/asset/RawDataUrlModule.js +23 -13
  122. package/lib/asset/WebManifestGenerator.js +164 -0
  123. package/lib/asset/WebManifestParser.js +130 -0
  124. package/lib/async-modules/AsyncModuleHelpers.js +1 -0
  125. package/lib/async-modules/AwaitDependenciesInitFragment.js +18 -4
  126. package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
  127. package/lib/async-modules/isGeneratorLowered.js +26 -0
  128. package/lib/buildChunkGraph.js +107 -15
  129. package/lib/bun/BunTargetPlugin.js +42 -0
  130. package/lib/cache/AddBuildDependenciesPlugin.js +3 -1
  131. package/lib/cache/AddManagedPathsPlugin.js +5 -1
  132. package/lib/cache/IdleFileCachePlugin.js +6 -1
  133. package/lib/cache/MemoryCachePlugin.js +1 -1
  134. package/lib/cache/MemoryWithGcCachePlugin.js +4 -1
  135. package/lib/cache/PackFileCacheStrategy.js +43 -7
  136. package/lib/cache/ResolverCachePlugin.js +12 -1
  137. package/lib/cache/getLazyHashedEtag.js +13 -2
  138. package/lib/cache/mergeEtags.js +4 -0
  139. package/lib/cli.js +142 -20
  140. package/lib/config/browserslistTargetHandler.js +141 -0
  141. package/lib/config/defaults.js +591 -41
  142. package/lib/config/defineConfig.js +31 -0
  143. package/lib/config/normalization.js +46 -1
  144. package/lib/config/target.js +200 -2
  145. package/lib/container/ContainerEntryDependency.js +2 -0
  146. package/lib/container/ContainerEntryModule.js +27 -14
  147. package/lib/container/ContainerEntryModuleFactory.js +1 -0
  148. package/lib/container/ContainerExposedDependency.js +6 -2
  149. package/lib/container/ContainerPlugin.js +2 -1
  150. package/lib/container/ContainerReferencePlugin.js +3 -2
  151. package/lib/container/FallbackDependency.js +9 -7
  152. package/lib/container/FallbackItemDependency.js +1 -0
  153. package/lib/container/FallbackModule.js +22 -9
  154. package/lib/container/FallbackModuleFactory.js +1 -0
  155. package/lib/container/ModuleFederationPlugin.js +12 -26
  156. package/lib/container/RemoteModule.js +33 -10
  157. package/lib/container/RemoteRuntimeModule.js +15 -12
  158. package/lib/container/RemoteToExternalDependency.js +1 -0
  159. package/lib/container/options.js +7 -0
  160. package/lib/css/CssGenerator.js +534 -272
  161. package/lib/css/CssInjectStyleRuntimeModule.js +86 -70
  162. package/lib/css/CssLoadingRuntimeModule.js +156 -77
  163. package/lib/{CssModule.js → css/CssModule.js} +72 -37
  164. package/lib/css/CssModulesPlugin.js +356 -204
  165. package/lib/css/CssParser.js +3452 -1950
  166. package/lib/css/syntax.js +4058 -0
  167. package/lib/debug/ProfilingPlugin.js +33 -2
  168. package/lib/deno/DenoTargetPlugin.js +41 -0
  169. package/lib/dependencies/AMDDefineDependency.js +29 -17
  170. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +19 -6
  171. package/lib/dependencies/AMDPlugin.js +6 -3
  172. package/lib/dependencies/AMDRequireArrayDependency.js +13 -11
  173. package/lib/dependencies/AMDRequireContextDependency.js +10 -11
  174. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -0
  175. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +28 -14
  176. package/lib/dependencies/AMDRequireDependency.js +28 -20
  177. package/lib/dependencies/AMDRequireItemDependency.js +1 -0
  178. package/lib/dependencies/AMDRuntimeModules.js +3 -0
  179. package/lib/dependencies/CachedConstDependency.js +9 -1
  180. package/lib/dependencies/CommonJsDependencyHelpers.js +104 -0
  181. package/lib/dependencies/CommonJsExportRequireDependency.js +138 -38
  182. package/lib/dependencies/CommonJsExportsDependency.js +74 -20
  183. package/lib/dependencies/CommonJsExportsParserPlugin.js +246 -15
  184. package/lib/dependencies/CommonJsFullRequireDependency.js +62 -27
  185. package/lib/dependencies/CommonJsImportsParserPlugin.js +187 -24
  186. package/lib/dependencies/CommonJsPlugin.js +7 -4
  187. package/lib/dependencies/CommonJsRequireContextDependency.js +13 -13
  188. package/lib/dependencies/CommonJsRequireDependency.js +135 -13
  189. package/lib/dependencies/CommonJsSelfReferenceDependency.js +60 -16
  190. package/lib/dependencies/ConstDependency.js +22 -12
  191. package/lib/dependencies/ContextDependency.js +13 -2
  192. package/lib/dependencies/ContextDependencyHelpers.js +7 -4
  193. package/lib/dependencies/ContextDependencyTemplateAsId.js +2 -1
  194. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +1 -0
  195. package/lib/dependencies/ContextElementDependency.js +27 -14
  196. package/lib/dependencies/CreateRequireParserPlugin.js +14 -7
  197. package/lib/dependencies/CreateScriptUrlDependency.js +9 -7
  198. package/lib/dependencies/CriticalDependencyWarning.js +3 -1
  199. package/lib/dependencies/CssIcssExportDependency.js +682 -368
  200. package/lib/dependencies/CssIcssImportDependency.js +62 -17
  201. package/lib/dependencies/CssIcssSymbolDependency.js +36 -17
  202. package/lib/dependencies/CssImportDependency.js +37 -1
  203. package/lib/dependencies/CssUrlDependency.js +87 -14
  204. package/lib/dependencies/DelegatedSourceDependency.js +1 -0
  205. package/lib/dependencies/DllEntryDependency.js +12 -13
  206. package/lib/dependencies/DynamicExports.js +5 -0
  207. package/lib/dependencies/EntryDependency.js +1 -0
  208. package/lib/dependencies/ExportBindingInitFragment.js +164 -0
  209. package/lib/dependencies/ExportsInfoDependency.js +18 -12
  210. package/lib/dependencies/ExternalModuleDependency.js +13 -5
  211. package/lib/dependencies/ExternalModuleInitFragment.js +10 -5
  212. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +19 -12
  213. package/lib/dependencies/HarmonyAcceptDependency.js +24 -26
  214. package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -0
  215. package/lib/dependencies/HarmonyCompatibilityDependency.js +33 -14
  216. package/lib/dependencies/HarmonyDetectionParserPlugin.js +108 -30
  217. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +32 -2
  218. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +70 -33
  219. package/lib/dependencies/HarmonyExportExpressionDependency.js +140 -46
  220. package/lib/dependencies/HarmonyExportHeaderDependency.js +11 -9
  221. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +253 -37
  222. package/lib/dependencies/HarmonyExportInitFragment.js +28 -20
  223. package/lib/dependencies/HarmonyExportSpecifierDependency.js +88 -18
  224. package/lib/dependencies/HarmonyExports.js +6 -1
  225. package/lib/dependencies/HarmonyImportDependency.js +59 -3
  226. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +139 -146
  227. package/lib/dependencies/HarmonyImportGuard.js +426 -0
  228. package/lib/dependencies/HarmonyImportSideEffectDependency.js +22 -1
  229. package/lib/dependencies/HarmonyImportSpecifierDependency.js +136 -17
  230. package/lib/{HarmonyLinkingError.js → dependencies/HarmonyLinkingError.js} +6 -3
  231. package/lib/dependencies/HarmonyModulesPlugin.js +11 -1
  232. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +2 -1
  233. package/lib/dependencies/HtmlEntryDependency.js +1295 -0
  234. package/lib/dependencies/HtmlInlineHtmlDependency.js +107 -0
  235. package/lib/dependencies/HtmlInlineScriptDependency.js +126 -0
  236. package/lib/dependencies/HtmlInlineStyleDependency.js +152 -0
  237. package/lib/dependencies/HtmlSourceDependency.js +172 -0
  238. package/lib/dependencies/ImportContextDependency.js +9 -9
  239. package/lib/dependencies/ImportDependency.js +92 -3
  240. package/lib/dependencies/ImportEagerDependency.js +2 -0
  241. package/lib/dependencies/ImportMetaContextDependency.js +1 -0
  242. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +35 -19
  243. package/lib/dependencies/ImportMetaContextPlugin.js +40 -8
  244. package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
  245. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
  246. package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
  247. package/lib/dependencies/ImportMetaHotAcceptDependency.js +2 -0
  248. package/lib/dependencies/ImportMetaHotDeclineDependency.js +2 -0
  249. package/lib/dependencies/ImportMetaPlugin.js +595 -209
  250. package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
  251. package/lib/dependencies/ImportParserPlugin.js +114 -27
  252. package/lib/dependencies/ImportPhase.js +17 -11
  253. package/lib/dependencies/ImportPlugin.js +2 -1
  254. package/lib/dependencies/ImportWeakDependency.js +3 -0
  255. package/lib/dependencies/JsonExportsDependency.js +15 -10
  256. package/lib/dependencies/LoaderDependency.js +2 -0
  257. package/lib/dependencies/LoaderImportDependency.js +3 -0
  258. package/lib/dependencies/LoaderPlugin.js +9 -2
  259. package/lib/dependencies/LocalModule.js +15 -12
  260. package/lib/dependencies/LocalModuleDependency.js +15 -13
  261. package/lib/dependencies/LocalModulesHelpers.js +3 -0
  262. package/lib/dependencies/ModuleDecoratorDependency.js +16 -10
  263. package/lib/dependencies/ModuleDependency.js +14 -0
  264. package/lib/dependencies/ModuleDependencyTemplateAsId.js +1 -0
  265. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +1 -0
  266. package/lib/dependencies/ModuleHotAcceptDependency.js +2 -0
  267. package/lib/dependencies/ModuleHotDeclineDependency.js +2 -0
  268. package/lib/dependencies/ModuleInitFragmentDependency.js +19 -11
  269. package/lib/dependencies/NullDependency.js +2 -0
  270. package/lib/dependencies/PrefetchDependency.js +1 -0
  271. package/lib/dependencies/ProvidedDependency.js +36 -27
  272. package/lib/dependencies/PureExpressionDependency.js +14 -10
  273. package/lib/dependencies/RequireContextDependency.js +1 -0
  274. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -1
  275. package/lib/dependencies/RequireContextPlugin.js +2 -1
  276. package/lib/dependencies/RequireEnsureDependenciesBlock.js +1 -0
  277. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +4 -6
  278. package/lib/dependencies/RequireEnsureDependency.js +16 -13
  279. package/lib/dependencies/RequireEnsureItemDependency.js +1 -0
  280. package/lib/dependencies/RequireEnsurePlugin.js +2 -1
  281. package/lib/dependencies/RequireHeaderDependency.js +7 -4
  282. package/lib/dependencies/RequireIncludeDependency.js +2 -0
  283. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +11 -12
  284. package/lib/dependencies/RequireIncludePlugin.js +2 -1
  285. package/lib/{RequireJsStuffPlugin.js → dependencies/RequireJsStuffPlugin.js} +9 -8
  286. package/lib/dependencies/RequireResolveContextDependency.js +10 -11
  287. package/lib/dependencies/RequireResolveDependency.js +2 -0
  288. package/lib/dependencies/RequireResolveHeaderDependency.js +8 -5
  289. package/lib/dependencies/RuntimeRequirementsDependency.js +11 -8
  290. package/lib/dependencies/StaticExportsDependency.js +13 -10
  291. package/lib/dependencies/SystemPlugin.js +9 -6
  292. package/lib/dependencies/SystemRuntimeModule.js +1 -0
  293. package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
  294. package/lib/dependencies/URLContextDependency.js +8 -7
  295. package/lib/dependencies/URLDependency.js +157 -33
  296. package/lib/dependencies/URLPlugin.js +2 -0
  297. package/lib/dependencies/UnsupportedDependency.js +12 -13
  298. package/lib/dependencies/WebAssemblyExportImportedDependency.js +15 -16
  299. package/lib/dependencies/WebAssemblyImportDependency.js +19 -18
  300. package/lib/dependencies/WebpackIsIncludedDependency.js +3 -0
  301. package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +364 -114
  302. package/lib/dependencies/WorkerDependency.js +111 -27
  303. package/lib/dependencies/WorkletDependency.js +278 -0
  304. package/lib/dependencies/getFunctionExpression.js +1 -0
  305. package/lib/dependencies/processExportInfo.js +14 -11
  306. package/lib/{DelegatedModule.js → dll/DelegatedModule.js} +71 -44
  307. package/lib/{DelegatedModuleFactoryPlugin.js → dll/DelegatedModuleFactoryPlugin.js} +27 -4
  308. package/lib/{DelegatedPlugin.js → dll/DelegatedPlugin.js} +5 -3
  309. package/lib/{DllEntryPlugin.js → dll/DllEntryPlugin.js} +9 -5
  310. package/lib/{DllModule.js → dll/DllModule.js} +36 -24
  311. package/lib/{DllModuleFactory.js → dll/DllModuleFactory.js} +5 -4
  312. package/lib/{DllPlugin.js → dll/DllPlugin.js} +24 -6
  313. package/lib/{DllReferencePlugin.js → dll/DllReferencePlugin.js} +26 -18
  314. package/lib/{LibManifestPlugin.js → dll/LibManifestPlugin.js} +14 -10
  315. package/lib/electron/ElectronTargetPlugin.js +24 -5
  316. package/lib/{AbstractMethodError.js → errors/AbstractMethodError.js} +10 -1
  317. package/lib/{AsyncDependencyToInitialChunkError.js → errors/AsyncDependencyToInitialChunkError.js} +8 -3
  318. package/lib/errors/BuildCycleError.js +1 -1
  319. package/lib/{ChunkRenderError.js → errors/ChunkRenderError.js} +1 -1
  320. package/lib/{CodeGenerationError.js → errors/CodeGenerationError.js} +1 -1
  321. package/lib/{CommentCompilationWarning.js → errors/CommentCompilationWarning.js} +9 -3
  322. package/lib/{ConcurrentCompilationError.js → errors/ConcurrentCompilationError.js} +5 -2
  323. package/lib/{EnvironmentNotSupportAsyncWarning.js → errors/EnvironmentNotSupportAsyncWarning.js} +5 -5
  324. package/lib/{HookWebpackError.js → errors/HookWebpackError.js} +20 -16
  325. package/lib/{IgnoreErrorModuleFactory.js → errors/IgnoreErrorModuleFactory.js} +7 -4
  326. package/lib/{InvalidDependenciesModuleWarning.js → errors/InvalidDependenciesModuleWarning.js} +6 -3
  327. package/lib/errors/JSONParseError.js +115 -0
  328. package/lib/errors/LoaderLoadingError.js +20 -0
  329. package/lib/{ModuleBuildError.js → errors/ModuleBuildError.js} +22 -16
  330. package/lib/{ModuleDependencyError.js → errors/ModuleDependencyError.js} +10 -3
  331. package/lib/{ModuleDependencyWarning.js → errors/ModuleDependencyWarning.js} +13 -5
  332. package/lib/{ModuleError.js → errors/ModuleError.js} +10 -14
  333. package/lib/{ModuleHashingError.js → errors/ModuleHashingError.js} +5 -1
  334. package/lib/errors/ModuleNotFoundError.js +94 -0
  335. package/lib/errors/ModuleParseError.js +141 -0
  336. package/lib/{ModuleRestoreError.js → errors/ModuleRestoreError.js} +4 -1
  337. package/lib/{ModuleStoreError.js → errors/ModuleStoreError.js} +5 -1
  338. package/lib/{ModuleWarning.js → errors/ModuleWarning.js} +13 -14
  339. package/lib/{NodeStuffInWebError.js → errors/NodeStuffInWebError.js} +7 -5
  340. package/lib/errors/NonErrorEmittedError.js +30 -0
  341. package/lib/{UnhandledSchemeError.js → errors/UnhandledSchemeError.js} +9 -2
  342. package/lib/{UnsupportedFeatureWarning.js → errors/UnsupportedFeatureWarning.js} +4 -3
  343. package/lib/errors/WebpackError.js +84 -0
  344. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  345. package/lib/esm/ModuleChunkFormatPlugin.js +52 -15
  346. package/lib/esm/ModuleChunkLoadingPlugin.js +11 -3
  347. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +71 -49
  348. package/lib/hmr/HotModuleReplacement.runtime.js +175 -30
  349. package/lib/hmr/HotModuleReplacementRuntimeModule.js +8 -0
  350. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +173 -26
  351. package/lib/hmr/JavascriptHotModuleReplacementHelper.js +1 -0
  352. package/lib/hmr/LazyCompilationPlugin.js +154 -7
  353. package/lib/hmr/lazyCompilationBackend.js +34 -8
  354. package/lib/html/HtmlGenerator.js +1470 -0
  355. package/lib/html/HtmlModule.js +41 -0
  356. package/lib/html/HtmlModulesPlugin.js +1111 -0
  357. package/lib/html/HtmlParser.js +1970 -0
  358. package/lib/html/favicon.svg +1 -0
  359. package/lib/html/syntax.js +9020 -0
  360. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -1
  361. package/lib/ids/DeterministicChunkIdsPlugin.js +3 -1
  362. package/lib/ids/DeterministicModuleIdsPlugin.js +3 -1
  363. package/lib/ids/HashedModuleIdsPlugin.js +2 -1
  364. package/lib/ids/IdHelpers.js +25 -2
  365. package/lib/ids/NamedChunkIdsPlugin.js +3 -1
  366. package/lib/ids/NamedModuleIdsPlugin.js +3 -1
  367. package/lib/ids/NaturalChunkIdsPlugin.js +1 -1
  368. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  369. package/lib/ids/OccurrenceChunkIdsPlugin.js +2 -1
  370. package/lib/ids/OccurrenceModuleIdsPlugin.js +4 -1
  371. package/lib/ids/SyncModuleIdsPlugin.js +3 -1
  372. package/lib/index.js +66 -15
  373. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +5 -6
  374. package/lib/javascript/BasicEvaluatedExpression.js +370 -49
  375. package/lib/javascript/ChunkFormatHelpers.js +2 -1
  376. package/lib/javascript/ChunkHelpers.js +1 -0
  377. package/lib/javascript/CommonJsChunkFormatPlugin.js +1 -1
  378. package/lib/javascript/EnableChunkLoadingPlugin.js +6 -1
  379. package/lib/javascript/JavascriptGenerator.js +213 -51
  380. package/lib/javascript/JavascriptModule.js +54 -0
  381. package/lib/javascript/JavascriptModulesPlugin.js +579 -183
  382. package/lib/javascript/JavascriptParser.js +1289 -462
  383. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  384. package/lib/javascript/StartupHelpers.js +5 -0
  385. package/lib/javascript/syntax.js +4380 -0
  386. package/lib/json/JsonData.js +5 -0
  387. package/lib/json/JsonGenerator.js +21 -0
  388. package/lib/json/JsonModule.js +40 -0
  389. package/lib/json/JsonModulesPlugin.js +8 -1
  390. package/lib/json/JsonParser.js +18 -27
  391. package/lib/library/AbstractLibraryPlugin.js +17 -2
  392. package/lib/library/AmdLibraryPlugin.js +8 -0
  393. package/lib/library/AssignLibraryPlugin.js +21 -3
  394. package/lib/library/EnableLibraryPlugin.js +8 -2
  395. package/lib/library/ExportPropertyLibraryPlugin.js +10 -0
  396. package/lib/{FalseIIFEUmdWarning.js → library/FalseIIFEUmdWarning.js} +2 -1
  397. package/lib/library/JsonpLibraryPlugin.js +8 -0
  398. package/lib/library/ModuleLibraryPlugin.js +154 -7
  399. package/lib/library/SystemLibraryPlugin.js +11 -3
  400. package/lib/library/UmdLibraryPlugin.js +16 -0
  401. package/lib/loaders/LoaderRunner.js +714 -0
  402. package/lib/loaders/loadLoader.js +100 -0
  403. package/lib/logging/Logger.js +17 -0
  404. package/lib/logging/createConsoleLogger.js +7 -0
  405. package/lib/logging/runtime.js +2 -0
  406. package/lib/logging/truncateArgs.js +2 -0
  407. package/lib/node/CommonJsChunkLoadingPlugin.js +5 -1
  408. package/lib/node/NodeEnvironmentPlugin.js +7 -3
  409. package/lib/node/NodeSourcePlugin.js +1 -1
  410. package/lib/node/NodeTargetPlugin.js +4 -63
  411. package/lib/node/NodeTemplatePlugin.js +3 -1
  412. package/lib/node/NodeWatchFileSystem.js +40 -22
  413. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +13 -9
  414. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +23 -1
  415. package/lib/node/ReadFileCompileWasmPlugin.js +18 -1
  416. package/lib/node/RequireChunkLoadingRuntimeModule.js +21 -16
  417. package/lib/node/nodeBuiltins.js +80 -0
  418. package/lib/node/nodeConsole.js +116 -64
  419. package/lib/optimize/AggressiveMergingPlugin.js +3 -1
  420. package/lib/optimize/AggressiveSplittingPlugin.js +6 -1
  421. package/lib/optimize/ConcatenatedModule.js +585 -116
  422. package/lib/optimize/ConstExportsPlugin.js +211 -0
  423. package/lib/optimize/EnsureChunkConditionsPlugin.js +2 -1
  424. package/lib/optimize/FlagIncludedChunksPlugin.js +15 -4
  425. package/lib/optimize/InlineExports.js +178 -0
  426. package/lib/optimize/InnerGraph.js +374 -262
  427. package/lib/optimize/InnerGraphPlugin.js +246 -117
  428. package/lib/optimize/LimitChunkCountPlugin.js +9 -0
  429. package/lib/optimize/MangleExportsPlugin.js +5 -1
  430. package/lib/optimize/MergeDuplicateChunksPlugin.js +2 -0
  431. package/lib/optimize/MinChunkSizePlugin.js +2 -1
  432. package/lib/optimize/MinMaxSizeWarning.js +5 -4
  433. package/lib/optimize/ModuleConcatenationPlugin.js +159 -34
  434. package/lib/optimize/RealContentHashPlugin.js +125 -50
  435. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -1
  436. package/lib/optimize/RemoveParentModulesPlugin.js +3 -1
  437. package/lib/optimize/RuntimeChunkPlugin.js +2 -1
  438. package/lib/optimize/SideEffectsFlagPlugin.js +381 -55
  439. package/lib/optimize/SplitChunksPlugin.js +54 -6
  440. package/lib/performance/AssetsOverSizeLimitWarning.js +3 -2
  441. package/lib/performance/EntrypointsOverSizeLimitWarning.js +3 -2
  442. package/lib/performance/NoAsyncChunksWarning.js +5 -3
  443. package/lib/performance/SizeLimitsPlugin.js +8 -2
  444. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +1 -0
  445. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +21 -0
  446. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +1 -0
  447. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -1
  448. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +25 -13
  449. package/lib/prefetch/ResourceHintPlugin.js +663 -0
  450. package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
  451. package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
  452. package/lib/prefetch/parseResourceHintOptions.js +103 -0
  453. package/lib/rules/BasicEffectRulePlugin.js +3 -0
  454. package/lib/rules/BasicMatcherRulePlugin.js +3 -0
  455. package/lib/rules/ObjectMatcherRulePlugin.js +3 -0
  456. package/lib/rules/RuleSetCompiler.js +132 -0
  457. package/lib/rules/UseEffectRulePlugin.js +10 -3
  458. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
  459. package/lib/runtime/AsyncModuleRuntimeModule.js +52 -33
  460. package/lib/runtime/AutoPublicPathRuntimeModule.js +22 -9
  461. package/lib/runtime/BaseUriRuntimeModule.js +1 -0
  462. package/lib/runtime/ChunkNameRuntimeModule.js +1 -0
  463. package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
  464. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +2 -1
  465. package/lib/runtime/CompatRuntimeModule.js +2 -0
  466. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
  467. package/lib/runtime/CreateScriptRuntimeModule.js +1 -0
  468. package/lib/runtime/CreateScriptUrlRuntimeModule.js +1 -0
  469. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +34 -4
  470. package/lib/runtime/EnsureChunkRuntimeModule.js +1 -0
  471. package/lib/runtime/GetChunkFilenameRuntimeModule.js +88 -8
  472. package/lib/runtime/GetFullHashRuntimeModule.js +1 -0
  473. package/lib/runtime/GetMainFilenameRuntimeModule.js +1 -0
  474. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -1
  475. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
  476. package/lib/runtime/GlobalRuntimeModule.js +1 -0
  477. package/lib/runtime/HasOwnPropertyRuntimeModule.js +2 -1
  478. package/lib/runtime/HelperRuntimeModule.js +5 -0
  479. package/lib/runtime/LoadScriptRuntimeModule.js +28 -37
  480. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +354 -37
  481. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +2 -1
  482. package/lib/runtime/NonceRuntimeModule.js +1 -0
  483. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -4
  484. package/lib/runtime/PublicPathRuntimeModule.js +1 -0
  485. package/lib/runtime/RelativeUrlRuntimeModule.js +4 -2
  486. package/lib/runtime/RuntimeIdRuntimeModule.js +1 -0
  487. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +38 -0
  488. package/lib/runtime/StartupChunkDependenciesPlugin.js +13 -1
  489. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +2 -1
  490. package/lib/runtime/StartupEntrypointRuntimeModule.js +5 -3
  491. package/lib/runtime/SystemContextRuntimeModule.js +1 -0
  492. package/lib/runtime/ToBinaryRuntimeModule.js +1 -0
  493. package/lib/runtime/WorkerRuntimeModule.js +33 -0
  494. package/lib/schemes/DataUriPlugin.js +14 -2
  495. package/lib/schemes/FileUriPlugin.js +1 -1
  496. package/lib/schemes/HttpUriPlugin.js +86 -4
  497. package/lib/schemes/VirtualUrlPlugin.js +8 -4
  498. package/lib/serialization/AggregateErrorSerializer.js +9 -6
  499. package/lib/serialization/ArraySerializer.js +6 -8
  500. package/lib/serialization/BinaryMiddleware.js +552 -463
  501. package/lib/serialization/DateObjectSerializer.js +4 -2
  502. package/lib/serialization/ErrorObjectSerializer.js +10 -6
  503. package/lib/serialization/FileMiddleware.js +50 -3
  504. package/lib/serialization/MapObjectSerializer.js +7 -9
  505. package/lib/serialization/NullPrototypeObjectSerializer.js +9 -9
  506. package/lib/serialization/ObjectMiddleware.js +73 -13
  507. package/lib/serialization/PlainObjectSerializer.js +16 -8
  508. package/lib/serialization/RegExpObjectSerializer.js +4 -2
  509. package/lib/serialization/Serializer.js +6 -0
  510. package/lib/serialization/SerializerMiddleware.js +14 -2
  511. package/lib/serialization/SetObjectSerializer.js +6 -8
  512. package/lib/serialization/SingleItemMiddleware.js +3 -0
  513. package/lib/sharing/ConsumeSharedFallbackDependency.js +1 -0
  514. package/lib/sharing/ConsumeSharedModule.js +21 -7
  515. package/lib/sharing/ConsumeSharedPlugin.js +11 -11
  516. package/lib/sharing/ConsumeSharedRuntimeModule.js +55 -45
  517. package/lib/sharing/ProvideForSharedDependency.js +1 -0
  518. package/lib/sharing/ProvideSharedDependency.js +34 -15
  519. package/lib/sharing/ProvideSharedModule.js +42 -12
  520. package/lib/sharing/ProvideSharedModuleFactory.js +1 -0
  521. package/lib/sharing/ProvideSharedPlugin.js +13 -8
  522. package/lib/sharing/SharePlugin.js +5 -1
  523. package/lib/sharing/ShareRuntimeModule.js +19 -16
  524. package/lib/sharing/resolveMatchedConfigs.js +6 -2
  525. package/lib/sharing/utils.js +9 -1
  526. package/lib/stats/DefaultStatsFactoryPlugin.js +94 -12
  527. package/lib/stats/DefaultStatsPresetPlugin.js +14 -2
  528. package/lib/stats/DefaultStatsPrinterPlugin.js +64 -18
  529. package/lib/stats/StatsFactory.js +39 -18
  530. package/lib/stats/StatsPrinter.js +16 -2
  531. package/lib/typescript/TypeScriptPlugin.js +210 -0
  532. package/lib/url/URLParserPlugin.js +111 -23
  533. package/lib/util/ArrayHelpers.js +1 -0
  534. package/lib/util/ArrayQueue.js +10 -5
  535. package/lib/util/AsyncQueue.js +154 -74
  536. package/lib/util/Hash.js +2 -2
  537. package/lib/util/IterableHelpers.js +3 -0
  538. package/lib/util/LazyBucketSortedSet.js +26 -0
  539. package/lib/util/LazySet.js +45 -4
  540. package/lib/util/LocConverter.js +64 -0
  541. package/lib/util/ParallelismFactorCalculator.js +1 -0
  542. package/lib/util/Queue.js +6 -3
  543. package/lib/util/Semaphore.js +15 -1
  544. package/lib/util/SetHelpers.js +4 -1
  545. package/lib/util/SortableSet.js +7 -1
  546. package/lib/util/SourceProcessor.js +119 -0
  547. package/lib/util/StackedCacheMap.js +20 -3
  548. package/lib/util/StackedMap.js +162 -43
  549. package/lib/util/StringXor.js +1 -1
  550. package/lib/util/TupleQueue.js +7 -3
  551. package/lib/util/TupleSet.js +14 -0
  552. package/lib/util/URLAbsoluteSpecifier.js +1 -0
  553. package/lib/util/WeakTupleMap.js +60 -1
  554. package/lib/util/binarySearchBounds.js +3 -2
  555. package/lib/util/chainedImports.js +3 -3
  556. package/lib/util/cleverMerge.js +19 -2
  557. package/lib/util/comparators.js +35 -4
  558. package/lib/util/compileBooleanMatcher.js +9 -0
  559. package/lib/util/concatenate.js +80 -24
  560. package/lib/util/conventions.js +46 -1
  561. package/lib/util/createHash.js +0 -1
  562. package/lib/util/createHooksRegistry.js +43 -0
  563. package/lib/util/createMappings.js +118 -0
  564. package/lib/util/dataURL.js +3 -2
  565. package/lib/util/deprecation.js +19 -0
  566. package/lib/util/deterministicGrouping.js +46 -17
  567. package/lib/util/extractSourceMap.js +2 -1
  568. package/lib/util/extractUrlAndGlobal.js +1 -0
  569. package/lib/util/findGraphRoots.js +7 -0
  570. package/lib/{formatLocation.js → util/formatLocation.js} +4 -2
  571. package/lib/{SizeFormatHelpers.js → util/formatSize.js} +10 -3
  572. package/lib/util/fs.js +87 -14
  573. package/lib/util/generateDebugId.js +1 -0
  574. package/lib/util/globUtils.js +710 -0
  575. package/lib/util/hash/BatchedHash.js +1 -0
  576. package/lib/util/hash/BulkUpdateHash.js +1 -0
  577. package/lib/util/hash/DebugHash.js +1 -0
  578. package/lib/util/hash/hash-digest.js +32 -15
  579. package/lib/util/hash/md4.js +1 -1
  580. package/lib/util/hash/wasm-hash.js +5 -0
  581. package/lib/util/hash/xxhash64.js +1 -1
  582. package/lib/util/identifier.js +97 -6
  583. package/lib/util/implicitTypeLoaderFallback.js +62 -0
  584. package/lib/util/internalSerializables.js +102 -60
  585. package/lib/util/magicComment.js +149 -7
  586. package/lib/util/makeSerializable.js +7 -0
  587. package/lib/util/memoize.js +2 -0
  588. package/lib/util/mimeTypes.js +176 -0
  589. package/lib/util/nonNumericOnlyHash.js +31 -1
  590. package/lib/util/numberHash.js +2 -2
  591. package/lib/util/parseJson.js +41 -0
  592. package/lib/util/processAsyncTree.js +8 -0
  593. package/lib/util/property.js +9 -2
  594. package/lib/util/publicPathPlaceholder.js +64 -0
  595. package/lib/util/registerExternalSerializer.js +24 -4
  596. package/lib/util/removeBOM.js +1 -0
  597. package/lib/util/runtime.js +32 -0
  598. package/lib/util/semver.js +15 -0
  599. package/lib/util/serialization.js +2 -0
  600. package/lib/util/smartGrouping.js +8 -0
  601. package/lib/util/source.js +23 -0
  602. package/lib/util/topologicalSort.js +69 -0
  603. package/lib/validateSchema.js +1 -0
  604. package/lib/wasm/EnableWasmLoadingPlugin.js +15 -1
  605. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +25 -18
  606. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +34 -22
  607. package/lib/wasm-async/AsyncWasmModule.js +77 -0
  608. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -0
  609. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +6 -1
  610. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +22 -126
  611. package/lib/wasm-async/AsyncWebAssemblyParser.js +3 -2
  612. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +13 -2
  613. package/lib/wasm-sync/SyncWasmModule.js +39 -0
  614. package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +7 -3
  615. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +86 -19
  616. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -3
  617. package/lib/wasm-sync/WebAssemblyGenerator.js +27 -1
  618. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +9 -3
  619. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +4 -0
  620. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +20 -1
  621. package/lib/wasm-sync/WebAssemblyParser.js +9 -3
  622. package/lib/wasm-sync/WebAssemblyUtils.js +2 -0
  623. package/lib/web/FetchCompileAsyncWasmPlugin.js +29 -1
  624. package/lib/web/FetchCompileWasmPlugin.js +27 -1
  625. package/lib/web/JsonpChunkLoadingPlugin.js +11 -1
  626. package/lib/web/JsonpChunkLoadingRuntimeModule.js +58 -64
  627. package/lib/web/JsonpTemplatePlugin.js +2 -1
  628. package/lib/webpack.js +78 -1
  629. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +10 -1
  630. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +15 -10
  631. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  632. package/module.d.ts +21 -0
  633. package/package.json +79 -77
  634. package/schemas/WebpackOptions.check.js +1 -1
  635. package/schemas/WebpackOptions.json +1117 -79
  636. package/schemas/plugins/{DllPlugin.check.d.ts → HtmlGeneratorOptions.check.d.ts} +1 -1
  637. package/schemas/plugins/HtmlGeneratorOptions.check.js +6 -0
  638. package/schemas/plugins/HtmlGeneratorOptions.json +3 -0
  639. package/schemas/plugins/{DllReferencePlugin.check.d.ts → HtmlParserOptions.check.d.ts} +1 -1
  640. package/schemas/plugins/HtmlParserOptions.check.js +6 -0
  641. package/schemas/plugins/HtmlParserOptions.json +3 -0
  642. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  643. package/schemas/plugins/ProgressPlugin.json +38 -0
  644. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  645. package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
  646. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  647. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  648. package/schemas/plugins/container/ModuleFederationPlugin.json +2 -0
  649. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.d.ts +7 -0
  650. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +6 -0
  651. package/schemas/plugins/css/CssAutoOrModuleParserOptions.json +3 -0
  652. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  653. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  654. package/schemas/plugins/dll/DllPlugin.check.d.ts +7 -0
  655. package/schemas/plugins/dll/DllReferencePlugin.check.d.ts +7 -0
  656. package/types.d.ts +8608 -1159
  657. package/lib/CaseSensitiveModulesWarning.js +0 -72
  658. package/lib/GraphHelpers.js +0 -46
  659. package/lib/ModuleParseError.js +0 -125
  660. package/lib/NoModeWarning.js +0 -23
  661. package/lib/css/CssMergeStyleSheetsRuntimeModule.js +0 -56
  662. package/lib/css/walkCssTokens.js +0 -1843
  663. package/lib/util/AppendOnlyStackedSet.js +0 -78
  664. /package/schemas/plugins/{DllPlugin.check.js → dll/DllPlugin.check.js} +0 -0
  665. /package/schemas/plugins/{DllPlugin.json → dll/DllPlugin.json} +0 -0
  666. /package/schemas/plugins/{DllReferencePlugin.check.js → dll/DllReferencePlugin.check.js} +0 -0
  667. /package/schemas/plugins/{DllReferencePlugin.json → dll/DllReferencePlugin.json} +0 -0
@@ -7,19 +7,68 @@
7
7
 
8
8
  const { basename, extname } = require("path");
9
9
  const util = require("util");
10
- const mime = require("mime-types");
11
10
  const Chunk = require("./Chunk");
12
11
  const Module = require("./Module");
12
+ const {
13
+ decode: decodeBase,
14
+ encode: encodeBase
15
+ } = require("./util/hash/hash-digest");
13
16
  const { parseResource } = require("./util/identifier");
17
+ const memoize = require("./util/memoize");
18
+
19
+ const getMimeTypes = memoize(() => require("./util/mimeTypes"));
14
20
 
15
21
  /** @typedef {import("./ChunkGraph")} ChunkGraph */
16
22
  /** @typedef {import("./ChunkGraph").ModuleId} ModuleId */
17
23
  /** @typedef {import("./Compilation").AssetInfo} AssetInfo */
24
+ /** @typedef {import("./Compilation").HashWithDigestFunction} HashWithDigestFunction */
18
25
  /** @typedef {import("./Compilation").PathData} PathData */
26
+ /** @typedef {import("./Compilation").PathDataChunk} PathDataChunk */
27
+ /** @typedef {import("./Compilation").PathDataModule} PathDataModule */
19
28
  /** @typedef {import("./Compiler")} Compiler */
20
29
 
21
30
  const REGEXP = /\[\\*([\w:]+)\\*\]/g;
22
31
 
32
+ /**
33
+ * Placeholder kinds present in a template string, cached so the scan is not
34
+ * repeated for reused templates (e.g. `output.filename`, `localIdentName`).
35
+ * Bounded so dynamic (function-built) paths can't grow it without limit.
36
+ * @type {Map<string, Set<string>>}
37
+ */
38
+ const presentKindsCache = new Map();
39
+ const PRESENT_KINDS_CACHE_MAX = 1000;
40
+
41
+ /**
42
+ * Returns the placeholder kinds (`[kind]` / `[kind:arg]`) a template references,
43
+ * matching the replace pass below so guarding replacer construction by it stays
44
+ * output-identical.
45
+ * @param {string} path template string (already known to contain `[`)
46
+ * @returns {Set<string>} placeholder kinds present
47
+ */
48
+ const getPresentKinds = (path) => {
49
+ const cached = presentKindsCache.get(path);
50
+ if (cached !== undefined) return cached;
51
+ /** @type {Set<string>} */
52
+ const kinds = new Set();
53
+ // `RegExp.exec` loop rather than `String.matchAll` (Node.js 12+) so this
54
+ // stays compatible with the supported Node.js 10 range.
55
+ REGEXP.lastIndex = 0;
56
+ /** @type {RegExpExecArray | null} */
57
+ let m;
58
+ while ((m = REGEXP.exec(path)) !== null) {
59
+ const content = /** @type {string} */ (m[1]);
60
+ if (content.length + 2 === m[0].length) {
61
+ const cm = /^(\w+)(?::\w+)?(?::\w+)?$/.exec(content);
62
+ if (cm) kinds.add(cm[1]);
63
+ }
64
+ }
65
+ if (presentKindsCache.size >= PRESENT_KINDS_CACHE_MAX) {
66
+ presentKindsCache.clear();
67
+ }
68
+ presentKindsCache.set(path, kinds);
69
+ return kinds;
70
+ };
71
+
23
72
  /** @type {PathData["prepareId"]} */
24
73
  const prepareId = (id) => {
25
74
  if (typeof id !== "string") return id;
@@ -36,27 +85,150 @@ const prepareId = (id) => {
36
85
  };
37
86
 
38
87
  /**
88
+ * Defines the replacer function callback.
39
89
  * @callback ReplacerFunction
40
90
  * @param {string} match
41
91
  * @param {string | undefined} arg
42
92
  * @param {string} input
43
93
  */
44
94
 
95
+ /** @typedef {"26" | "32" | "36" | "49" | "52" | "58" | "62"} Base */
96
+
97
+ // `[<digest>]` placeholders may request a digest webpack does not store the
98
+ // hash in; loader-utils calls the URL-safe base64 `base64safe`.
99
+ const BASE_DIGEST = /^base(\d+)$/;
100
+ const SUPPORTED_BASES = new Set(["26", "32", "36", "49", "52", "58", "62"]);
101
+
102
+ // Node < 14.18 lacks the `base64url` Buffer encoding; fall back to base64 + swap.
103
+ let isBase64UrlSupported = false;
104
+ try {
105
+ isBase64UrlSupported = Boolean(Buffer.from("", "base64url"));
106
+ } catch (_err) {
107
+ // Nothing
108
+ }
109
+
110
+ /**
111
+ * @param {string} digest digest name from a `[<hash>:<digest>]` placeholder
112
+ * @returns {boolean} whether a hash can be re-encoded into this digest
113
+ */
114
+ const isSupportedDigest = (digest) => {
115
+ if (digest === "base64url" || digest === "base64safe") return true;
116
+ const base = BASE_DIGEST.exec(digest);
117
+ if (base) return base[1] === "64" || SUPPORTED_BASES.has(base[1]);
118
+ return Buffer.isEncoding(digest);
119
+ };
120
+
121
+ /**
122
+ * Decodes an already-digested hash string back into its raw bytes.
123
+ * @param {string} value digested hash
124
+ * @param {string} digest digest the value is encoded in
125
+ * @returns {Buffer} raw bytes
126
+ */
127
+ const digestToBuffer = (value, digest) => {
128
+ const base = BASE_DIGEST.exec(digest);
129
+ if (base && Number(base[1]) !== 64) {
130
+ return decodeBase(value, /** @type {Base} */ (base[1]));
131
+ }
132
+ if (
133
+ (digest === "base64url" || digest === "base64safe") &&
134
+ !isBase64UrlSupported
135
+ ) {
136
+ return Buffer.from(value.replace(/-/g, "+").replace(/_/g, "/"), "base64");
137
+ }
138
+ return Buffer.from(
139
+ value,
140
+ /** @type {BufferEncoding} */ (
141
+ digest === "base64safe" ? "base64url" : digest
142
+ )
143
+ );
144
+ };
145
+
146
+ /**
147
+ * Encodes raw bytes into the requested digest.
148
+ * @param {Buffer} buffer raw bytes
149
+ * @param {string} digest target digest
150
+ * @returns {string} encoded hash
151
+ */
152
+ const bufferToDigest = (buffer, digest) => {
153
+ const base = BASE_DIGEST.exec(digest);
154
+ if (base && Number(base[1]) !== 64) {
155
+ return encodeBase(buffer, /** @type {Base} */ (base[1]));
156
+ }
157
+ if (
158
+ (digest === "base64url" || digest === "base64safe") &&
159
+ !isBase64UrlSupported
160
+ ) {
161
+ return buffer
162
+ .toString("base64")
163
+ .replace(/\+/g, "-")
164
+ .replace(/\//g, "_")
165
+ .replace(/[=]+$/, "");
166
+ }
167
+ return buffer.toString(
168
+ /** @type {BufferEncoding} */ (
169
+ digest === "base64safe" ? "base64url" : digest
170
+ )
171
+ );
172
+ };
173
+
45
174
  /**
175
+ * Re-encodes a digested hash into another digest (e.g. `[contenthash:base64]`).
176
+ * The source is already truncated to `output.hashDigestLength`, so the result is
177
+ * derived from those bytes, not the full content. Throws on an unknown digest so
178
+ * a typo fails loudly rather than silently keeping the original encoding.
179
+ * @param {string} value digested hash
180
+ * @param {string} fromDigest digest the value is encoded in
181
+ * @param {string} toDigest requested digest
182
+ * @returns {string} re-encoded hash
183
+ */
184
+ const reEncodeDigest = (value, fromDigest, toDigest) => {
185
+ if (toDigest === fromDigest) return value;
186
+ if (!isSupportedDigest(toDigest)) {
187
+ throw new Error(
188
+ `Unsupported hash digest "${toDigest}" in path template (use hex, base64, base64url, or base26/32/36/49/52/58/62)`
189
+ );
190
+ }
191
+ return bufferToDigest(digestToBuffer(value, fromDigest), toDigest);
192
+ };
193
+
194
+ /**
195
+ * Returns hash replacer function.
46
196
  * @param {ReplacerFunction} replacer replacer
47
197
  * @param {((arg0: number) => string) | undefined} handler handler
48
198
  * @param {AssetInfo | undefined} assetInfo asset info
49
199
  * @param {string} hashName hash name
200
+ * @param {string} sourceDigest digest the stored hash is encoded in
201
+ * @param {string=} fullValue untruncated hash, re-encoded for `[<hash>:<digest>]` so the result carries full entropy instead of the `hashDigestLength`-truncated value
202
+ * @param {boolean=} recordDigest record the inline digest on `assetInfo.contenthashDigest` so `RealContentHashPlugin` re-encodes the recomputed hash in it
203
+ * @param {HashWithDigestFunction=} digestHandler builds the value for `[<hash>:<digest>]` in a per-chunk runtime context (the runtime chunk-filename map), where a single re-encode of the whole expression is impossible
50
204
  * @returns {Replacer} hash replacer function
51
205
  */
52
- const hashLength = (replacer, handler, assetInfo, hashName) => {
206
+ const hashLength = (
207
+ replacer,
208
+ handler,
209
+ assetInfo,
210
+ hashName,
211
+ sourceDigest,
212
+ fullValue,
213
+ recordDigest,
214
+ digestHandler
215
+ ) => {
53
216
  /** @type {Replacer} */
54
- const fn = (match, arg, input) => {
217
+ const fn = (match, arg, input, digest) => {
55
218
  /** @type {string} */
56
219
  let result;
57
220
  const length = arg && Number.parseInt(arg, 10);
58
221
 
59
- if (length && handler) {
222
+ if (digest && digestHandler) {
223
+ result = digestHandler(digest, length || undefined);
224
+ } else if (digest) {
225
+ const hash = reEncodeDigest(
226
+ fullValue !== undefined ? fullValue : replacer(match, arg, input),
227
+ sourceDigest,
228
+ digest
229
+ );
230
+ result = length ? hash.slice(0, length) : hash;
231
+ } else if (length && handler) {
60
232
  result = handler(length);
61
233
  } else {
62
234
  const hash = replacer(match, arg, input);
@@ -65,6 +237,12 @@ const hashLength = (replacer, handler, assetInfo, hashName) => {
65
237
  }
66
238
  if (assetInfo) {
67
239
  assetInfo.immutable = true;
240
+ if (digest && recordDigest) {
241
+ // `base64safe` is encoded as `base64url`; record what the value is in.
242
+ (assetInfo.contenthashDigest || (assetInfo.contenthashDigest = {}))[
243
+ result
244
+ ] = digest === "base64safe" ? "base64url" : digest;
245
+ }
68
246
  if (Array.isArray(assetInfo[hashName])) {
69
247
  assetInfo[hashName] = [...assetInfo[hashName], result];
70
248
  } else if (assetInfo[hashName]) {
@@ -79,9 +257,10 @@ const hashLength = (replacer, handler, assetInfo, hashName) => {
79
257
  return fn;
80
258
  };
81
259
 
82
- /** @typedef {(match: string, arg: string | undefined, input: string) => string} Replacer */
260
+ /** @typedef {(match: string, arg: string | undefined, input: string, digest?: string) => string} Replacer */
83
261
 
84
262
  /**
263
+ * Returns replacer.
85
264
  * @param {string | number | null | undefined | (() => string | number | null | undefined)} value value
86
265
  * @param {boolean=} allowEmpty allow empty
87
266
  * @returns {Replacer} replacer
@@ -112,6 +291,7 @@ const replacer = (value, allowEmpty) => {
112
291
  const deprecationCache = new Map();
113
292
  const deprecatedFunction = (() => () => {})();
114
293
  /**
294
+ * Returns function with deprecation output.
115
295
  * @template {(...args: EXPECTED_ANY[]) => EXPECTED_ANY} T
116
296
  * @param {T} fn function
117
297
  * @param {string} message message
@@ -132,17 +312,54 @@ const deprecated = (fn, message, code) => {
132
312
  );
133
313
  };
134
314
 
135
- /** @typedef {(pathData: PathData, assetInfo?: AssetInfo) => string} TemplatePathFn */
136
- /** @typedef {string | TemplatePathFn} TemplatePath */
315
+ /**
316
+ * Callback used to compute a path from contextual data. The type parameter
317
+ * narrows the `pathData` shape when the caller knows it operates in a chunk
318
+ * (`PathDataChunk`) or module (`PathDataModule`) context — defaults to the
319
+ * fully-optional `PathData` for backward compatibility.
320
+ * @template {PathData} [T=PathData]
321
+ * @typedef {(pathData: T, assetInfo?: AssetInfo) => string} TemplatePathFn
322
+ */
323
+
324
+ /**
325
+ * Either a raw template string (e.g. `"[name].[contenthash].js"`) or a
326
+ * generic `TemplatePathFn`. Method signatures that need to thread a narrowed
327
+ * `PathData` shape spell the function side out as `TemplatePathFn<T>`
328
+ * directly — `TemplatePath` itself stays a plain alias so local JSDoc
329
+ * re-imports keep a single shared identity.
330
+ * @typedef {string | TemplatePathFn} TemplatePath
331
+ */
137
332
 
138
333
  /**
139
- * @param {TemplatePath} path the raw path
140
- * @param {PathData} data context data
334
+ * Returns the interpolated path.
335
+ * @template {PathData} [T=PathData]
336
+ * @param {string | TemplatePathFn<T>} path the raw path
337
+ * @param {T} data context data
141
338
  * @param {AssetInfo=} assetInfo extra info about the asset (will be written to)
142
339
  * @returns {string} the interpolated path
143
340
  */
144
341
  const interpolate = (path, data, assetInfo) => {
342
+ if (typeof path === "function") {
343
+ path = path(data, assetInfo);
344
+ }
345
+
346
+ // Literal paths carry no `[placeholder]`, so the whole replacement table
347
+ // and regex pass are pure overhead — building replacers has no side effects
348
+ // (those only fire when a replacer is invoked), so the output is identical.
349
+ if (!path.includes("[")) {
350
+ return path;
351
+ }
352
+
353
+ // Only build replacers for placeholders the template actually uses — most
354
+ // templates reference a handful, so building the whole table per call is
355
+ // wasted work. Replacer construction has no side effects (those fire only
356
+ // when a replacer is invoked, which happens for present kinds), so this is
357
+ // output-identical.
358
+ const presentKinds = getPresentKinds(path);
359
+
145
360
  const chunkGraph = data.chunkGraph;
361
+ // Digest the stored hashes are encoded in, so `[hash:<digest>]` can re-encode.
362
+ const sourceDigest = data.hashDigest || "hex";
146
363
 
147
364
  /** @type {Map<string, Replacer>} */
148
365
  const replacements = new Map();
@@ -159,11 +376,21 @@ const interpolate = (path, data, assetInfo) => {
159
376
  // [path] - /some/path/
160
377
  // [name] - file
161
378
  // [ext] - .js
162
- if (typeof data.filename === "string") {
379
+ if (
380
+ typeof data.filename === "string" &&
381
+ (presentKinds.has("file") ||
382
+ presentKinds.has("query") ||
383
+ presentKinds.has("fragment") ||
384
+ presentKinds.has("path") ||
385
+ presentKinds.has("base") ||
386
+ presentKinds.has("name") ||
387
+ presentKinds.has("ext") ||
388
+ presentKinds.has("filebase"))
389
+ ) {
163
390
  // check that filename is data uri
164
391
  const match = data.filename.match(/^data:([^;,]+)/);
165
392
  if (match) {
166
- const ext = mime.extension(match[1]);
393
+ const ext = getMimeTypes().extension(match[1]);
167
394
  const emptyReplacer = replacer("", true);
168
395
  // "XXXX" used for `updateHash`, so we don't need it here
169
396
  const contentHash =
@@ -172,22 +399,28 @@ const interpolate = (path, data, assetInfo) => {
172
399
  : false;
173
400
  const baseReplacer = contentHash ? replacer(contentHash) : emptyReplacer;
174
401
 
175
- replacements.set("file", emptyReplacer);
176
- replacements.set("query", emptyReplacer);
177
- replacements.set("fragment", emptyReplacer);
178
- replacements.set("path", emptyReplacer);
179
- replacements.set("base", baseReplacer);
180
- replacements.set("name", baseReplacer);
181
- replacements.set("ext", replacer(ext ? `.${ext}` : "", true));
402
+ if (presentKinds.has("file")) replacements.set("file", emptyReplacer);
403
+ if (presentKinds.has("query")) replacements.set("query", emptyReplacer);
404
+ if (presentKinds.has("fragment")) {
405
+ replacements.set("fragment", emptyReplacer);
406
+ }
407
+ if (presentKinds.has("path")) replacements.set("path", emptyReplacer);
408
+ if (presentKinds.has("base")) replacements.set("base", baseReplacer);
409
+ if (presentKinds.has("name")) replacements.set("name", baseReplacer);
410
+ if (presentKinds.has("ext")) {
411
+ replacements.set("ext", replacer(ext ? `.${ext}` : "", true));
412
+ }
182
413
  // Legacy
183
- replacements.set(
184
- "filebase",
185
- deprecated(
186
- baseReplacer,
187
- "[filebase] is now [base]",
188
- "DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_FILENAME"
189
- )
190
- );
414
+ if (presentKinds.has("filebase")) {
415
+ replacements.set(
416
+ "filebase",
417
+ deprecated(
418
+ baseReplacer,
419
+ "[filebase] is now [base]",
420
+ "DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_FILENAME"
421
+ )
422
+ );
423
+ }
191
424
  } else {
192
425
  const { path: file, query, fragment } = parseResource(data.filename);
193
426
 
@@ -196,22 +429,30 @@ const interpolate = (path, data, assetInfo) => {
196
429
  const name = base.slice(0, base.length - ext.length);
197
430
  const path = file.slice(0, file.length - base.length);
198
431
 
199
- replacements.set("file", replacer(file));
200
- replacements.set("query", replacer(query, true));
201
- replacements.set("fragment", replacer(fragment, true));
202
- replacements.set("path", replacer(path, true));
203
- replacements.set("base", replacer(base));
204
- replacements.set("name", replacer(name));
205
- replacements.set("ext", replacer(ext, true));
432
+ if (presentKinds.has("file")) replacements.set("file", replacer(file));
433
+ if (presentKinds.has("query")) {
434
+ replacements.set("query", replacer(query, true));
435
+ }
436
+ if (presentKinds.has("fragment")) {
437
+ replacements.set("fragment", replacer(fragment, true));
438
+ }
439
+ if (presentKinds.has("path")) {
440
+ replacements.set("path", replacer(path, true));
441
+ }
442
+ if (presentKinds.has("base")) replacements.set("base", replacer(base));
443
+ if (presentKinds.has("name")) replacements.set("name", replacer(name));
444
+ if (presentKinds.has("ext")) replacements.set("ext", replacer(ext, true));
206
445
  // Legacy
207
- replacements.set(
208
- "filebase",
209
- deprecated(
210
- replacer(base),
211
- "[filebase] is now [base]",
212
- "DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_FILENAME"
213
- )
214
- );
446
+ if (presentKinds.has("filebase")) {
447
+ replacements.set(
448
+ "filebase",
449
+ deprecated(
450
+ replacer(base),
451
+ "[filebase] is now [base]",
452
+ "DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_FILENAME"
453
+ )
454
+ );
455
+ }
215
456
  }
216
457
  }
217
458
 
@@ -224,25 +465,35 @@ const interpolate = (path, data, assetInfo) => {
224
465
  // Legacy Placeholders
225
466
  //
226
467
  // [hash] - data.hash (3a4b5c6e7f)
227
- if (data.hash) {
468
+ if (data.hash && (presentKinds.has("fullhash") || presentKinds.has("hash"))) {
228
469
  const hashReplacer = hashLength(
229
470
  replacer(data.hash),
230
471
  data.hashWithLength,
231
472
  assetInfo,
232
- "fullhash"
473
+ "fullhash",
474
+ data.fullHashDigest || sourceDigest,
475
+ data.fullHash,
476
+ undefined,
477
+ data.hashWithDigest
233
478
  );
234
479
 
235
- replacements.set("fullhash", hashReplacer);
480
+ if (presentKinds.has("fullhash")) {
481
+ replacements.set("fullhash", hashReplacer);
482
+ }
236
483
 
237
- // Legacy
238
- replacements.set(
239
- "hash",
240
- deprecated(
241
- hashReplacer,
242
- "[hash] is now [fullhash] (also consider using [chunkhash] or [contenthash], see documentation for details)",
243
- "DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_HASH"
244
- )
245
- );
484
+ // Legacy — but a css-loader-style `[hash]` local ident is not deprecated
485
+ if (presentKinds.has("hash")) {
486
+ replacements.set(
487
+ "hash",
488
+ data.hashAsFullHash
489
+ ? hashReplacer
490
+ : deprecated(
491
+ hashReplacer,
492
+ "[hash] is now [fullhash] (also consider using [chunkhash] or [contenthash], see documentation for details)",
493
+ "DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_HASH"
494
+ )
495
+ );
496
+ }
246
497
  }
247
498
 
248
499
  // Chunk Context
@@ -258,33 +509,55 @@ const interpolate = (path, data, assetInfo) => {
258
509
 
259
510
  const contentHashType = data.contentHashType;
260
511
 
261
- const idReplacer = replacer(chunk.id);
262
- const nameReplacer = replacer(chunk.name || chunk.id);
263
- const chunkhashReplacer = hashLength(
264
- replacer(chunk instanceof Chunk ? chunk.renderedHash : chunk.hash),
265
- "hashWithLength" in chunk ? chunk.hashWithLength : undefined,
266
- assetInfo,
267
- "chunkhash"
268
- );
269
- const contenthashReplacer = hashLength(
270
- replacer(
271
- data.contentHash ||
272
- (contentHashType &&
273
- chunk.contentHash &&
274
- chunk.contentHash[contentHashType])
275
- ),
276
- data.contentHashWithLength ||
277
- ("contentHashWithLength" in chunk && chunk.contentHashWithLength
278
- ? chunk.contentHashWithLength[/** @type {string} */ (contentHashType)]
279
- : undefined),
280
- assetInfo,
281
- "contenthash"
282
- );
283
-
284
- replacements.set("id", idReplacer);
285
- replacements.set("name", nameReplacer);
286
- replacements.set("chunkhash", chunkhashReplacer);
287
- replacements.set("contenthash", contenthashReplacer);
512
+ if (presentKinds.has("id")) replacements.set("id", replacer(chunk.id));
513
+ if (presentKinds.has("name")) {
514
+ replacements.set("name", replacer(chunk.name || chunk.id));
515
+ }
516
+ if (presentKinds.has("chunkhash")) {
517
+ replacements.set(
518
+ "chunkhash",
519
+ hashLength(
520
+ replacer(chunk instanceof Chunk ? chunk.renderedHash : chunk.hash),
521
+ "hashWithLength" in chunk ? chunk.hashWithLength : undefined,
522
+ assetInfo,
523
+ "chunkhash",
524
+ sourceDigest,
525
+ chunk.hash,
526
+ undefined,
527
+ "hashWithDigest" in chunk ? chunk.hashWithDigest : undefined
528
+ )
529
+ );
530
+ }
531
+ if (presentKinds.has("contenthash")) {
532
+ const ct = /** @type {string} */ (contentHashType);
533
+ replacements.set(
534
+ "contenthash",
535
+ hashLength(
536
+ replacer(
537
+ data.contentHash ||
538
+ (contentHashType &&
539
+ chunk.contentHash &&
540
+ chunk.contentHash[contentHashType])
541
+ ),
542
+ data.contentHashWithLength ||
543
+ ("contentHashWithLength" in chunk && chunk.contentHashWithLength
544
+ ? chunk.contentHashWithLength[ct]
545
+ : undefined),
546
+ assetInfo,
547
+ "contenthash",
548
+ sourceDigest,
549
+ // full content digest, so a static `[contenthash:<digest>]` re-encodes
550
+ // from full entropy (the runtime path uses `contentHashWithDigest`)
551
+ "contentHashFull" in chunk && chunk.contentHashFull
552
+ ? chunk.contentHashFull[ct]
553
+ : undefined,
554
+ data.realContentHash,
555
+ "contentHashWithDigest" in chunk && chunk.contentHashWithDigest
556
+ ? chunk.contentHashWithDigest[ct]
557
+ : undefined
558
+ )
559
+ );
560
+ }
288
561
  }
289
562
 
290
563
  // Module Context
@@ -300,78 +573,149 @@ const interpolate = (path, data, assetInfo) => {
300
573
  // [modulehash] - module.hash (6237543873.png)
301
574
  if (data.module) {
302
575
  const module = data.module;
576
+ const needId = presentKinds.has("id");
577
+ const needModuleId = presentKinds.has("moduleid");
578
+ // `data.hashAsFullHash` keeps `[hash]` as the `[fullhash]` alias (CSS local
579
+ // idents) instead of repurposing it to the module hash; `[modulehash]` stays.
580
+ const needHash = presentKinds.has("hash") && !data.hashAsFullHash;
581
+
582
+ if (needId || needModuleId) {
583
+ const idReplacer = replacer(() =>
584
+ (data.prepareId || prepareId)(
585
+ module instanceof Module
586
+ ? /** @type {ModuleId} */
587
+ (/** @type {ChunkGraph} */ (chunkGraph).getModuleId(module))
588
+ : module.id
589
+ )
590
+ );
591
+ if (needId) replacements.set("id", idReplacer);
592
+ // Legacy
593
+ if (needModuleId) {
594
+ replacements.set(
595
+ "moduleid",
596
+ deprecated(
597
+ idReplacer,
598
+ "[moduleid] is now [id]",
599
+ "DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_MODULE_ID"
600
+ )
601
+ );
602
+ }
603
+ }
303
604
 
304
- const idReplacer = replacer(() =>
305
- (data.prepareId || prepareId)(
306
- module instanceof Module
307
- ? /** @type {ModuleId} */
308
- (/** @type {ChunkGraph} */ (chunkGraph).getModuleId(module))
309
- : module.id
310
- )
311
- );
312
- const moduleHashReplacer = hashLength(
313
- replacer(() =>
605
+ // `[hash]` aliases module content hash when present, else module hash.
606
+ const wantModuleHash =
607
+ presentKinds.has("modulehash") || (needHash && !data.contentHash);
608
+ const wantContentHash =
609
+ presentKinds.has("contenthash") || (needHash && data.contentHash);
610
+ /** @type {Replacer | undefined} */
611
+ let moduleHashReplacer;
612
+ /** @type {Replacer | undefined} */
613
+ let contentHashReplacer;
614
+ if (wantModuleHash) {
615
+ moduleHashReplacer = hashLength(
616
+ replacer(() =>
617
+ module instanceof Module
618
+ ? /** @type {ChunkGraph} */
619
+ (chunkGraph).getRenderedModuleHash(module, data.runtime)
620
+ : module.hash
621
+ ),
622
+ "hashWithLength" in module ? module.hashWithLength : undefined,
623
+ assetInfo,
624
+ "modulehash",
625
+ sourceDigest,
626
+ // `getModuleHash` is the untruncated digest (`getRenderedModuleHash` is
627
+ // the truncated one), so `[modulehash:<digest>]` re-encodes full entropy
314
628
  module instanceof Module
315
- ? /** @type {ChunkGraph} */
316
- (chunkGraph).getRenderedModuleHash(module, data.runtime)
629
+ ? /** @type {ChunkGraph} */ (chunkGraph).getModuleHash(
630
+ module,
631
+ data.runtime
632
+ )
317
633
  : module.hash
318
- ),
319
- "hashWithLength" in module ? module.hashWithLength : undefined,
320
- assetInfo,
321
- "modulehash"
322
- );
323
- const contentHashReplacer = hashLength(
324
- replacer(/** @type {string} */ (data.contentHash)),
325
- undefined,
326
- assetInfo,
327
- "contenthash"
328
- );
329
-
330
- replacements.set("id", idReplacer);
331
- replacements.set("modulehash", moduleHashReplacer);
332
- replacements.set("contenthash", contentHashReplacer);
333
- replacements.set(
334
- "hash",
335
- data.contentHash ? contentHashReplacer : moduleHashReplacer
336
- );
337
- // Legacy
338
- replacements.set(
339
- "moduleid",
340
- deprecated(
341
- idReplacer,
342
- "[moduleid] is now [id]",
343
- "DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_MODULE_ID"
344
- )
345
- );
634
+ );
635
+ if (presentKinds.has("modulehash")) {
636
+ replacements.set("modulehash", moduleHashReplacer);
637
+ }
638
+ }
639
+ if (wantContentHash) {
640
+ contentHashReplacer = hashLength(
641
+ replacer(/** @type {string} */ (data.contentHash)),
642
+ undefined,
643
+ assetInfo,
644
+ "contenthash",
645
+ sourceDigest,
646
+ // full content digest, so a static `[contenthash:<digest>]` re-encodes
647
+ // from full entropy (asset modules supply it via `contentHashFull`)
648
+ data.contentHashFull,
649
+ data.realContentHash
650
+ );
651
+ if (presentKinds.has("contenthash")) {
652
+ replacements.set("contenthash", contentHashReplacer);
653
+ }
654
+ }
655
+ if (needHash) {
656
+ replacements.set(
657
+ "hash",
658
+ /** @type {Replacer} */
659
+ (data.contentHash ? contentHashReplacer : moduleHashReplacer)
660
+ );
661
+ }
346
662
  }
347
663
 
348
664
  // Other things
349
- if (data.url) {
665
+ //
666
+ // Placeholders
667
+ //
668
+ // [url] - data.url
669
+ // [uniqueName] - data.uniqueName (output.uniqueName)
670
+ // [uniquename] - alias of [uniqueName]
671
+ if (data.url && presentKinds.has("url")) {
350
672
  replacements.set("url", replacer(data.url));
351
673
  }
352
- if (typeof data.runtime === "string") {
353
- replacements.set(
354
- "runtime",
355
- replacer(() =>
356
- (data.prepareId || prepareId)(/** @type {string} */ (data.runtime))
357
- )
358
- );
359
- } else {
360
- replacements.set("runtime", replacer("_"));
674
+ if (
675
+ data.uniqueName !== undefined &&
676
+ (presentKinds.has("uniqueName") || presentKinds.has("uniquename"))
677
+ ) {
678
+ const uniqueNameReplacer = replacer(data.uniqueName);
679
+ if (presentKinds.has("uniqueName")) {
680
+ replacements.set("uniqueName", uniqueNameReplacer);
681
+ }
682
+ if (presentKinds.has("uniquename")) {
683
+ replacements.set("uniquename", uniqueNameReplacer);
684
+ }
361
685
  }
362
-
363
- if (typeof path === "function") {
364
- path = path(data, assetInfo);
686
+ if (presentKinds.has("runtime")) {
687
+ if (typeof data.runtime === "string") {
688
+ replacements.set(
689
+ "runtime",
690
+ replacer(() =>
691
+ (data.prepareId || prepareId)(/** @type {string} */ (data.runtime))
692
+ )
693
+ );
694
+ } else {
695
+ replacements.set("runtime", replacer("_"));
696
+ }
365
697
  }
366
698
 
367
699
  path = path.replace(REGEXP, (match, content) => {
368
700
  if (content.length + 2 === match.length) {
369
- const contentMatch = /^(\w+)(?::(\w+))?$/.exec(content);
701
+ const contentMatch = /^(\w+)(?::(\w+))?(?::(\w+))?$/.exec(content);
370
702
  if (!contentMatch) return match;
371
- const [, kind, arg] = contentMatch;
703
+ const [, kind, arg1, arg2] = contentMatch;
372
704
  const replacer = replacements.get(kind);
373
705
  if (replacer !== undefined) {
374
- return replacer(match, arg, /** @type {string} */ (path));
706
+ // `[kind:length]`, `[kind:digest]` or `[kind:digest:length]`.
707
+ /** @type {string | undefined} */
708
+ let digest;
709
+ /** @type {string | undefined} */
710
+ let length = arg1;
711
+ if (arg2 !== undefined) {
712
+ digest = arg1;
713
+ length = arg2;
714
+ } else if (arg1 !== undefined && !/^\d+$/.test(arg1)) {
715
+ digest = arg1;
716
+ length = undefined;
717
+ }
718
+ return replacer(match, length, /** @type {string} */ (path), digest);
375
719
  }
376
720
  } else if (match.startsWith("[\\") && match.endsWith("\\]")) {
377
721
  return `[${match.slice(2, -2)}]`;
@@ -386,16 +730,39 @@ const plugin = "TemplatedPathPlugin";
386
730
 
387
731
  class TemplatedPathPlugin {
388
732
  /**
389
- * Apply the plugin
733
+ * Applies the plugin by registering its hooks on the compiler.
390
734
  * @param {Compiler} compiler the compiler instance
391
735
  * @returns {void}
392
736
  */
393
737
  apply(compiler) {
394
738
  compiler.hooks.compilation.tap(plugin, (compilation) => {
395
- compilation.hooks.assetPath.tap(plugin, interpolate);
739
+ compilation.hooks.assetPath.tap(plugin, (path, data, assetInfo) => {
740
+ // Default from output options so `[uniqueName]` resolves in every template
741
+ if (data.uniqueName === undefined) {
742
+ data.uniqueName = compilation.outputOptions.uniqueName;
743
+ }
744
+ // Digest the stored hashes use, so `[hash:<digest>]` can re-encode them
745
+ if (data.hashDigest === undefined) {
746
+ data.hashDigest = compilation.outputOptions.hashDigest;
747
+ }
748
+ // Untruncated compilation hash, so `[fullhash:<digest>]` keeps full entropy
749
+ if (data.fullHash === undefined && data.hash === compilation.hash) {
750
+ data.fullHash = compilation.fullHash;
751
+ }
752
+ // `RealContentHashPlugin` rehashes content; flag it so an inline digest
753
+ // on `[contenthash]` is recorded and the recomputed hash re-encodes in it.
754
+ if (data.realContentHash === undefined) {
755
+ data.realContentHash = Boolean(
756
+ compilation.options.optimization.realContentHash
757
+ );
758
+ }
759
+ return interpolate(path, data, assetInfo);
760
+ });
396
761
  });
397
762
  }
398
763
  }
399
764
 
400
765
  module.exports = TemplatedPathPlugin;
766
+ module.exports.getPresentKinds = getPresentKinds;
401
767
  module.exports.interpolate = interpolate;
768
+ module.exports.reEncodeDigest = reEncodeDigest;