webpack 5.59.0 → 5.94.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 (570) hide show
  1. package/README.md +48 -38
  2. package/bin/webpack.js +34 -10
  3. package/hot/dev-server.js +19 -5
  4. package/hot/lazy-compilation-node.js +13 -1
  5. package/hot/lazy-compilation-web.js +9 -0
  6. package/hot/log-apply-result.js +5 -0
  7. package/hot/log.js +23 -4
  8. package/hot/only-dev-server.js +3 -2
  9. package/hot/poll.js +5 -2
  10. package/hot/signal.js +6 -2
  11. package/lib/APIPlugin.js +226 -122
  12. package/lib/AbstractMethodError.js +10 -5
  13. package/lib/AsyncDependenciesBlock.js +13 -5
  14. package/lib/AutomaticPrefetchPlugin.js +2 -1
  15. package/lib/BannerPlugin.js +33 -12
  16. package/lib/Cache.js +16 -12
  17. package/lib/CacheFacade.js +13 -16
  18. package/lib/CaseSensitiveModulesWarning.js +8 -8
  19. package/lib/Chunk.js +60 -33
  20. package/lib/ChunkGraph.js +207 -72
  21. package/lib/ChunkGroup.js +40 -20
  22. package/lib/ChunkTemplate.js +43 -0
  23. package/lib/CleanPlugin.js +117 -32
  24. package/lib/CodeGenerationResults.js +8 -7
  25. package/lib/CommentCompilationWarning.js +0 -1
  26. package/lib/CompatibilityPlugin.js +85 -46
  27. package/lib/Compilation.js +712 -392
  28. package/lib/Compiler.js +393 -172
  29. package/lib/ConcatenationScope.js +10 -13
  30. package/lib/ConditionalInitFragment.js +22 -14
  31. package/lib/ConstPlugin.js +104 -64
  32. package/lib/ContextExclusionPlugin.js +3 -3
  33. package/lib/ContextModule.js +283 -108
  34. package/lib/ContextModuleFactory.js +151 -63
  35. package/lib/ContextReplacementPlugin.js +25 -10
  36. package/lib/CssModule.js +166 -0
  37. package/lib/DefinePlugin.js +254 -148
  38. package/lib/DelegatedModule.js +29 -6
  39. package/lib/DelegatedModuleFactoryPlugin.js +42 -22
  40. package/lib/DelegatedPlugin.js +4 -0
  41. package/lib/DependenciesBlock.js +17 -2
  42. package/lib/Dependency.js +58 -29
  43. package/lib/DependencyTemplate.js +24 -3
  44. package/lib/DependencyTemplates.js +2 -2
  45. package/lib/DllEntryPlugin.js +18 -1
  46. package/lib/DllModule.js +21 -4
  47. package/lib/DllModuleFactory.js +2 -1
  48. package/lib/DllPlugin.js +9 -7
  49. package/lib/DllReferencePlugin.js +50 -19
  50. package/lib/EntryOptionPlugin.js +6 -1
  51. package/lib/EntryPlugin.js +7 -4
  52. package/lib/Entrypoint.js +2 -2
  53. package/lib/EnvironmentNotSupportAsyncWarning.js +52 -0
  54. package/lib/EnvironmentPlugin.js +5 -2
  55. package/lib/ErrorHelpers.js +65 -26
  56. package/lib/EvalDevToolModulePlugin.js +37 -13
  57. package/lib/EvalSourceMapDevToolPlugin.js +50 -20
  58. package/lib/ExportsInfo.js +234 -133
  59. package/lib/ExportsInfoApiPlugin.js +31 -15
  60. package/lib/ExternalModule.js +391 -129
  61. package/lib/ExternalModuleFactoryPlugin.js +65 -17
  62. package/lib/FileSystemInfo.js +1038 -523
  63. package/lib/FlagAllModulesAsUsedPlugin.js +27 -27
  64. package/lib/FlagDependencyExportsPlugin.js +352 -349
  65. package/lib/FlagDependencyUsagePlugin.js +10 -10
  66. package/lib/FlagEntryExportAsUsedPlugin.js +26 -23
  67. package/lib/Generator.js +16 -8
  68. package/lib/GraphHelpers.js +3 -2
  69. package/lib/HookWebpackError.js +11 -13
  70. package/lib/HotModuleReplacementPlugin.js +221 -128
  71. package/lib/IgnoreErrorModuleFactory.js +4 -4
  72. package/lib/IgnorePlugin.js +5 -4
  73. package/lib/IgnoreWarningsPlugin.js +6 -9
  74. package/lib/InitFragment.js +39 -15
  75. package/lib/JavascriptMetaInfoPlugin.js +27 -15
  76. package/lib/LibManifestPlugin.js +45 -16
  77. package/lib/LoaderOptionsPlugin.js +13 -3
  78. package/lib/MainTemplate.js +74 -21
  79. package/lib/Module.js +155 -34
  80. package/lib/ModuleBuildError.js +13 -11
  81. package/lib/ModuleDependencyError.js +6 -4
  82. package/lib/ModuleDependencyWarning.js +6 -4
  83. package/lib/ModuleError.js +10 -5
  84. package/lib/ModuleFactory.js +4 -4
  85. package/lib/ModuleFilenameHelpers.js +164 -54
  86. package/lib/ModuleGraph.js +93 -53
  87. package/lib/ModuleGraphConnection.js +27 -13
  88. package/lib/ModuleHashingError.js +29 -0
  89. package/lib/ModuleInfoHeaderPlugin.js +92 -33
  90. package/lib/ModuleNotFoundError.js +5 -2
  91. package/lib/ModuleParseError.js +17 -9
  92. package/lib/ModuleProfile.js +1 -0
  93. package/lib/ModuleRestoreError.js +3 -1
  94. package/lib/ModuleStoreError.js +3 -2
  95. package/lib/ModuleTemplate.js +33 -1
  96. package/lib/ModuleTypeConstants.js +168 -0
  97. package/lib/ModuleWarning.js +10 -5
  98. package/lib/MultiCompiler.js +115 -38
  99. package/lib/MultiStats.js +75 -33
  100. package/lib/MultiWatching.js +6 -2
  101. package/lib/NodeStuffPlugin.js +136 -37
  102. package/lib/NormalModule.js +437 -194
  103. package/lib/NormalModuleFactory.js +313 -116
  104. package/lib/NormalModuleReplacementPlugin.js +10 -4
  105. package/lib/NullFactory.js +1 -1
  106. package/lib/OptimizationStages.js +3 -3
  107. package/lib/Parser.js +1 -1
  108. package/lib/PlatformPlugin.js +39 -0
  109. package/lib/PrefetchPlugin.js +4 -0
  110. package/lib/ProgressPlugin.js +83 -28
  111. package/lib/ProvidePlugin.js +37 -19
  112. package/lib/RawModule.js +18 -5
  113. package/lib/RecordIdsPlugin.js +8 -8
  114. package/lib/RequireJsStuffPlugin.js +22 -15
  115. package/lib/ResolverFactory.js +8 -4
  116. package/lib/RuntimeGlobals.js +99 -65
  117. package/lib/RuntimeModule.js +17 -15
  118. package/lib/RuntimePlugin.js +116 -13
  119. package/lib/RuntimeTemplate.js +304 -102
  120. package/lib/SelfModuleFactory.js +12 -0
  121. package/lib/SizeFormatHelpers.js +2 -4
  122. package/lib/SourceMapDevToolModuleOptionsPlugin.js +4 -0
  123. package/lib/SourceMapDevToolPlugin.js +89 -42
  124. package/lib/Stats.js +12 -7
  125. package/lib/Template.js +30 -33
  126. package/lib/TemplatedPathPlugin.js +102 -34
  127. package/lib/UseStrictPlugin.js +37 -12
  128. package/lib/WarnCaseSensitiveModulesPlugin.js +12 -0
  129. package/lib/WarnDeprecatedOptionPlugin.js +6 -0
  130. package/lib/WatchIgnorePlugin.js +46 -13
  131. package/lib/Watching.js +139 -76
  132. package/lib/WebpackError.js +14 -5
  133. package/lib/WebpackIsIncludedPlugin.js +22 -13
  134. package/lib/WebpackOptionsApply.js +162 -56
  135. package/lib/WebpackOptionsDefaulter.js +10 -3
  136. package/lib/asset/AssetGenerator.js +351 -99
  137. package/lib/asset/AssetModulesPlugin.js +57 -33
  138. package/lib/asset/AssetParser.js +15 -6
  139. package/lib/asset/AssetSourceGenerator.js +30 -10
  140. package/lib/asset/AssetSourceParser.js +8 -2
  141. package/lib/asset/RawDataUrlModule.js +162 -0
  142. package/lib/async-modules/AwaitDependenciesInitFragment.js +16 -13
  143. package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
  144. package/lib/buildChunkGraph.js +376 -420
  145. package/lib/cache/AddManagedPathsPlugin.js +6 -1
  146. package/lib/cache/IdleFileCachePlugin.js +26 -13
  147. package/lib/cache/MemoryCachePlugin.js +1 -1
  148. package/lib/cache/MemoryWithGcCachePlugin.js +13 -7
  149. package/lib/cache/PackFileCacheStrategy.js +172 -94
  150. package/lib/cache/ResolverCachePlugin.js +115 -43
  151. package/lib/cache/getLazyHashedEtag.js +2 -2
  152. package/lib/cache/mergeEtags.js +16 -21
  153. package/lib/cli.js +195 -110
  154. package/lib/config/browserslistTargetHandler.js +106 -41
  155. package/lib/config/defaults.js +572 -154
  156. package/lib/config/normalization.js +361 -322
  157. package/lib/config/target.js +105 -66
  158. package/lib/container/ContainerEntryDependency.js +2 -1
  159. package/lib/container/ContainerEntryModule.js +27 -11
  160. package/lib/container/ContainerEntryModuleFactory.js +1 -1
  161. package/lib/container/ContainerExposedDependency.js +9 -0
  162. package/lib/container/ContainerPlugin.js +18 -12
  163. package/lib/container/ContainerReferencePlugin.js +1 -1
  164. package/lib/container/FallbackDependency.js +13 -0
  165. package/lib/container/FallbackItemDependency.js +3 -0
  166. package/lib/container/FallbackModule.js +19 -8
  167. package/lib/container/FallbackModuleFactory.js +1 -1
  168. package/lib/container/ModuleFederationPlugin.js +2 -0
  169. package/lib/container/RemoteModule.js +17 -4
  170. package/lib/container/RemoteRuntimeModule.js +31 -17
  171. package/lib/container/RemoteToExternalDependency.js +3 -0
  172. package/lib/container/options.js +18 -4
  173. package/lib/css/CssExportsGenerator.js +203 -0
  174. package/lib/css/CssGenerator.js +151 -0
  175. package/lib/css/CssLoadingRuntimeModule.js +592 -0
  176. package/lib/css/CssModulesPlugin.js +888 -0
  177. package/lib/css/CssParser.js +1049 -0
  178. package/lib/css/walkCssTokens.js +775 -0
  179. package/lib/debug/ProfilingPlugin.js +102 -54
  180. package/lib/dependencies/AMDDefineDependency.js +54 -10
  181. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +204 -61
  182. package/lib/dependencies/AMDPlugin.js +44 -24
  183. package/lib/dependencies/AMDRequireArrayDependency.js +34 -10
  184. package/lib/dependencies/AMDRequireContextDependency.js +15 -0
  185. package/lib/dependencies/AMDRequireDependenciesBlock.js +6 -0
  186. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +185 -54
  187. package/lib/dependencies/AMDRequireDependency.js +21 -6
  188. package/lib/dependencies/AMDRequireItemDependency.js +6 -0
  189. package/lib/dependencies/AMDRuntimeModules.js +4 -4
  190. package/lib/dependencies/CachedConstDependency.js +22 -1
  191. package/lib/dependencies/CommonJsDependencyHelpers.js +16 -2
  192. package/lib/dependencies/CommonJsExportRequireDependency.js +77 -47
  193. package/lib/dependencies/CommonJsExportsDependency.js +28 -5
  194. package/lib/dependencies/CommonJsExportsParserPlugin.js +111 -39
  195. package/lib/dependencies/CommonJsFullRequireDependency.js +42 -8
  196. package/lib/dependencies/CommonJsImportsParserPlugin.js +530 -130
  197. package/lib/dependencies/CommonJsPlugin.js +51 -26
  198. package/lib/dependencies/CommonJsRequireContextDependency.js +23 -2
  199. package/lib/dependencies/CommonJsRequireDependency.js +9 -1
  200. package/lib/dependencies/CommonJsSelfReferenceDependency.js +22 -8
  201. package/lib/dependencies/ConstDependency.js +12 -3
  202. package/lib/dependencies/ContextDependency.js +32 -5
  203. package/lib/dependencies/ContextDependencyHelpers.js +92 -62
  204. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -1
  205. package/lib/dependencies/ContextElementDependency.js +41 -4
  206. package/lib/dependencies/CreateScriptUrlDependency.js +22 -1
  207. package/lib/dependencies/CriticalDependencyWarning.js +4 -1
  208. package/lib/dependencies/CssExportDependency.js +156 -0
  209. package/lib/dependencies/CssImportDependency.js +125 -0
  210. package/lib/dependencies/CssLocalIdentifierDependency.js +245 -0
  211. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +111 -0
  212. package/lib/dependencies/CssUrlDependency.js +164 -0
  213. package/lib/dependencies/DelegatedSourceDependency.js +3 -0
  214. package/lib/dependencies/DllEntryDependency.js +14 -0
  215. package/lib/dependencies/DynamicExports.js +15 -11
  216. package/lib/dependencies/ExportsInfoDependency.js +26 -5
  217. package/lib/dependencies/ExternalModuleDependency.js +109 -0
  218. package/lib/dependencies/ExternalModuleInitFragment.js +133 -0
  219. package/lib/dependencies/HarmonyAcceptDependency.js +11 -2
  220. package/lib/dependencies/HarmonyAcceptImportDependency.js +9 -4
  221. package/lib/dependencies/HarmonyCompatibilityDependency.js +6 -5
  222. package/lib/dependencies/HarmonyDetectionParserPlugin.js +29 -3
  223. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +152 -0
  224. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +96 -51
  225. package/lib/dependencies/HarmonyExportExpressionDependency.js +21 -4
  226. package/lib/dependencies/HarmonyExportHeaderDependency.js +13 -0
  227. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +216 -108
  228. package/lib/dependencies/HarmonyExportInitFragment.js +21 -9
  229. package/lib/dependencies/HarmonyExportSpecifierDependency.js +12 -0
  230. package/lib/dependencies/HarmonyExports.js +13 -7
  231. package/lib/dependencies/HarmonyImportDependency.js +65 -19
  232. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +268 -74
  233. package/lib/dependencies/HarmonyImportSideEffectDependency.js +11 -5
  234. package/lib/dependencies/HarmonyImportSpecifierDependency.js +180 -36
  235. package/lib/dependencies/HarmonyModulesPlugin.js +33 -5
  236. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +15 -3
  237. package/lib/dependencies/ImportContextDependency.js +15 -2
  238. package/lib/dependencies/ImportDependency.js +50 -12
  239. package/lib/dependencies/ImportEagerDependency.js +11 -6
  240. package/lib/dependencies/ImportMetaContextDependency.js +42 -0
  241. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +301 -0
  242. package/lib/dependencies/ImportMetaContextPlugin.js +72 -0
  243. package/lib/dependencies/ImportMetaHotAcceptDependency.js +6 -0
  244. package/lib/dependencies/ImportMetaHotDeclineDependency.js +6 -0
  245. package/lib/dependencies/ImportMetaPlugin.js +128 -59
  246. package/lib/dependencies/ImportParserPlugin.js +153 -83
  247. package/lib/dependencies/ImportPlugin.js +21 -7
  248. package/lib/dependencies/ImportWeakDependency.js +11 -6
  249. package/lib/dependencies/JsonExportsDependency.js +38 -30
  250. package/lib/dependencies/LoaderDependency.js +14 -0
  251. package/lib/dependencies/LoaderImportDependency.js +14 -0
  252. package/lib/dependencies/LoaderPlugin.js +54 -40
  253. package/lib/dependencies/LocalModule.js +17 -1
  254. package/lib/dependencies/LocalModuleDependency.js +15 -0
  255. package/lib/dependencies/LocalModulesHelpers.js +22 -4
  256. package/lib/dependencies/ModuleDecoratorDependency.js +9 -1
  257. package/lib/dependencies/ModuleDependency.js +24 -7
  258. package/lib/dependencies/ModuleDependencyTemplateAsId.js +2 -1
  259. package/lib/dependencies/ModuleHotAcceptDependency.js +6 -0
  260. package/lib/dependencies/ModuleHotDeclineDependency.js +6 -0
  261. package/lib/dependencies/PrefetchDependency.js +3 -0
  262. package/lib/dependencies/ProvidedDependency.js +43 -8
  263. package/lib/dependencies/PureExpressionDependency.js +73 -39
  264. package/lib/dependencies/RequireContextDependency.js +6 -16
  265. package/lib/dependencies/RequireContextDependencyParserPlugin.js +14 -6
  266. package/lib/dependencies/RequireContextPlugin.js +20 -7
  267. package/lib/dependencies/RequireEnsureDependenciesBlock.js +7 -0
  268. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +29 -12
  269. package/lib/dependencies/RequireEnsureDependency.js +16 -2
  270. package/lib/dependencies/RequireEnsureItemDependency.js +3 -0
  271. package/lib/dependencies/RequireEnsurePlugin.js +27 -7
  272. package/lib/dependencies/RequireHeaderDependency.js +14 -1
  273. package/lib/dependencies/RequireIncludeDependency.js +6 -1
  274. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +29 -5
  275. package/lib/dependencies/RequireIncludePlugin.js +25 -5
  276. package/lib/dependencies/RequireResolveContextDependency.js +19 -2
  277. package/lib/dependencies/RequireResolveDependency.js +8 -1
  278. package/lib/dependencies/RequireResolveHeaderDependency.js +18 -0
  279. package/lib/dependencies/RuntimeRequirementsDependency.js +9 -1
  280. package/lib/dependencies/StaticExportsDependency.js +8 -0
  281. package/lib/dependencies/SystemPlugin.js +49 -22
  282. package/lib/dependencies/SystemRuntimeModule.js +1 -1
  283. package/lib/dependencies/URLDependency.js +20 -13
  284. package/lib/dependencies/URLPlugin.js +115 -27
  285. package/lib/dependencies/UnsupportedDependency.js +13 -0
  286. package/lib/dependencies/WebAssemblyExportImportedDependency.js +14 -0
  287. package/lib/dependencies/WebAssemblyImportDependency.js +9 -1
  288. package/lib/dependencies/WebpackIsIncludedDependency.js +6 -1
  289. package/lib/dependencies/WorkerDependency.js +47 -3
  290. package/lib/dependencies/WorkerPlugin.js +143 -59
  291. package/lib/dependencies/getFunctionExpression.js +9 -0
  292. package/lib/dependencies/processExportInfo.js +3 -1
  293. package/lib/electron/ElectronTargetPlugin.js +1 -0
  294. package/lib/esm/ExportWebpackRequireRuntimeModule.js +3 -2
  295. package/lib/esm/ModuleChunkFormatPlugin.js +92 -55
  296. package/lib/esm/ModuleChunkLoadingPlugin.js +12 -1
  297. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +141 -25
  298. package/lib/formatLocation.js +1 -2
  299. package/lib/hmr/HotModuleReplacement.runtime.js +37 -25
  300. package/lib/hmr/HotModuleReplacementRuntimeModule.js +2 -1
  301. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +13 -15
  302. package/lib/hmr/LazyCompilationPlugin.js +94 -41
  303. package/lib/hmr/lazyCompilationBackend.js +107 -44
  304. package/lib/ids/ChunkModuleIdRangePlugin.js +12 -3
  305. package/lib/ids/DeterministicChunkIdsPlugin.js +13 -6
  306. package/lib/ids/DeterministicModuleIdsPlugin.js +59 -35
  307. package/lib/ids/HashedModuleIdsPlugin.js +24 -16
  308. package/lib/ids/IdHelpers.js +59 -49
  309. package/lib/ids/NamedChunkIdsPlugin.js +13 -1
  310. package/lib/ids/NamedModuleIdsPlugin.js +20 -12
  311. package/lib/ids/NaturalModuleIdsPlugin.js +10 -13
  312. package/lib/ids/OccurrenceChunkIdsPlugin.js +6 -2
  313. package/lib/ids/OccurrenceModuleIdsPlugin.js +14 -11
  314. package/lib/ids/SyncModuleIdsPlugin.js +146 -0
  315. package/lib/index.js +44 -5
  316. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +9 -7
  317. package/lib/javascript/BasicEvaluatedExpression.js +133 -19
  318. package/lib/javascript/ChunkHelpers.js +33 -0
  319. package/lib/javascript/CommonJsChunkFormatPlugin.js +18 -15
  320. package/lib/javascript/EnableChunkLoadingPlugin.js +11 -6
  321. package/lib/javascript/JavascriptGenerator.js +37 -6
  322. package/lib/javascript/JavascriptModulesPlugin.js +523 -295
  323. package/lib/javascript/JavascriptParser.js +1591 -574
  324. package/lib/javascript/JavascriptParserHelpers.js +58 -37
  325. package/lib/javascript/StartupHelpers.js +69 -47
  326. package/lib/json/JsonData.js +33 -0
  327. package/lib/json/JsonGenerator.js +29 -21
  328. package/lib/json/JsonModulesPlugin.js +13 -7
  329. package/lib/json/JsonParser.js +30 -16
  330. package/lib/library/AbstractLibraryPlugin.js +6 -2
  331. package/lib/library/AmdLibraryPlugin.js +34 -18
  332. package/lib/library/AssignLibraryPlugin.js +68 -32
  333. package/lib/library/EnableLibraryPlugin.js +39 -14
  334. package/lib/library/ExportPropertyLibraryPlugin.js +14 -5
  335. package/lib/library/JsonpLibraryPlugin.js +4 -3
  336. package/lib/library/ModernModuleLibraryPlugin.js +144 -0
  337. package/lib/library/ModuleLibraryPlugin.js +12 -7
  338. package/lib/library/SystemLibraryPlugin.js +6 -4
  339. package/lib/library/UmdLibraryPlugin.js +119 -100
  340. package/lib/logging/Logger.js +59 -6
  341. package/lib/logging/createConsoleLogger.js +25 -40
  342. package/lib/logging/runtime.js +8 -9
  343. package/lib/logging/truncateArgs.js +9 -8
  344. package/lib/node/CommonJsChunkLoadingPlugin.js +18 -2
  345. package/lib/node/NodeEnvironmentPlugin.js +14 -8
  346. package/lib/node/NodeTargetPlugin.js +7 -0
  347. package/lib/node/NodeTemplatePlugin.js +10 -2
  348. package/lib/node/NodeWatchFileSystem.js +100 -50
  349. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +51 -26
  350. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +13 -2
  351. package/lib/node/ReadFileCompileWasmPlugin.js +21 -3
  352. package/lib/node/RequireChunkLoadingRuntimeModule.js +49 -26
  353. package/lib/node/nodeConsole.js +48 -31
  354. package/lib/optimize/AggressiveMergingPlugin.js +10 -4
  355. package/lib/optimize/AggressiveSplittingPlugin.js +26 -21
  356. package/lib/optimize/ConcatenatedModule.js +353 -212
  357. package/lib/optimize/EnsureChunkConditionsPlugin.js +4 -1
  358. package/lib/optimize/FlagIncludedChunksPlugin.js +14 -8
  359. package/lib/optimize/InnerGraph.js +30 -25
  360. package/lib/optimize/InnerGraphPlugin.js +105 -64
  361. package/lib/optimize/LimitChunkCountPlugin.js +32 -9
  362. package/lib/optimize/MangleExportsPlugin.js +7 -2
  363. package/lib/optimize/MinMaxSizeWarning.js +6 -1
  364. package/lib/optimize/ModuleConcatenationPlugin.js +150 -83
  365. package/lib/optimize/RealContentHashPlugin.js +99 -43
  366. package/lib/optimize/RemoveParentModulesPlugin.js +131 -48
  367. package/lib/optimize/RuntimeChunkPlugin.js +15 -2
  368. package/lib/optimize/SideEffectsFlagPlugin.js +119 -63
  369. package/lib/optimize/SplitChunksPlugin.js +129 -78
  370. package/lib/performance/SizeLimitsPlugin.js +22 -8
  371. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +4 -2
  372. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +4 -1
  373. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +8 -5
  374. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -3
  375. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +5 -3
  376. package/lib/rules/BasicEffectRulePlugin.js +7 -1
  377. package/lib/rules/BasicMatcherRulePlugin.js +8 -1
  378. package/lib/rules/ObjectMatcherRulePlugin.js +19 -2
  379. package/lib/rules/RuleSetCompiler.js +53 -32
  380. package/lib/rules/UseEffectRulePlugin.js +42 -36
  381. package/lib/runtime/AsyncModuleRuntimeModule.js +56 -69
  382. package/lib/runtime/AutoPublicPathRuntimeModule.js +25 -9
  383. package/lib/runtime/BaseUriRuntimeModule.js +35 -0
  384. package/lib/runtime/ChunkNameRuntimeModule.js +1 -1
  385. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +5 -2
  386. package/lib/runtime/CompatRuntimeModule.js +7 -2
  387. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
  388. package/lib/runtime/CreateScriptRuntimeModule.js +38 -0
  389. package/lib/runtime/CreateScriptUrlRuntimeModule.js +13 -36
  390. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +6 -3
  391. package/lib/runtime/EnsureChunkRuntimeModule.js +29 -15
  392. package/lib/runtime/GetChunkFilenameRuntimeModule.js +56 -43
  393. package/lib/runtime/GetFullHashRuntimeModule.js +4 -3
  394. package/lib/runtime/GetMainFilenameRuntimeModule.js +5 -2
  395. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +98 -0
  396. package/lib/runtime/GlobalRuntimeModule.js +1 -1
  397. package/lib/runtime/HasOwnPropertyRuntimeModule.js +5 -2
  398. package/lib/runtime/LoadScriptRuntimeModule.js +61 -45
  399. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +5 -2
  400. package/lib/runtime/NonceRuntimeModule.js +24 -0
  401. package/lib/runtime/OnChunksLoadedRuntimeModule.js +4 -2
  402. package/lib/runtime/PublicPathRuntimeModule.js +9 -2
  403. package/lib/runtime/RelativeUrlRuntimeModule.js +5 -2
  404. package/lib/runtime/RuntimeIdRuntimeModule.js +6 -2
  405. package/lib/runtime/StartupChunkDependenciesPlugin.js +15 -0
  406. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +36 -28
  407. package/lib/runtime/StartupEntrypointRuntimeModule.js +13 -9
  408. package/lib/runtime/SystemContextRuntimeModule.js +1 -1
  409. package/lib/schemes/DataUriPlugin.js +16 -3
  410. package/lib/schemes/HttpUriPlugin.js +336 -120
  411. package/lib/serialization/ArraySerializer.js +22 -6
  412. package/lib/serialization/BinaryMiddleware.js +212 -33
  413. package/lib/serialization/DateObjectSerializer.js +16 -4
  414. package/lib/serialization/ErrorObjectSerializer.js +23 -6
  415. package/lib/serialization/FileMiddleware.js +187 -86
  416. package/lib/serialization/MapObjectSerializer.js +25 -8
  417. package/lib/serialization/NullPrototypeObjectSerializer.js +26 -8
  418. package/lib/serialization/ObjectMiddleware.js +96 -66
  419. package/lib/serialization/PlainObjectSerializer.js +51 -14
  420. package/lib/serialization/RegExpObjectSerializer.js +17 -5
  421. package/lib/serialization/Serializer.js +23 -5
  422. package/lib/serialization/SerializerMiddleware.js +8 -8
  423. package/lib/serialization/SetObjectSerializer.js +22 -6
  424. package/lib/serialization/SingleItemMiddleware.js +2 -2
  425. package/lib/serialization/types.js +2 -2
  426. package/lib/sharing/ConsumeSharedFallbackDependency.js +3 -0
  427. package/lib/sharing/ConsumeSharedModule.js +40 -17
  428. package/lib/sharing/ConsumeSharedPlugin.js +139 -102
  429. package/lib/sharing/ConsumeSharedRuntimeModule.js +144 -130
  430. package/lib/sharing/ProvideForSharedDependency.js +0 -1
  431. package/lib/sharing/ProvideSharedDependency.js +17 -0
  432. package/lib/sharing/ProvideSharedModule.js +19 -6
  433. package/lib/sharing/ProvideSharedModuleFactory.js +1 -1
  434. package/lib/sharing/ProvideSharedPlugin.js +37 -30
  435. package/lib/sharing/SharePlugin.js +2 -2
  436. package/lib/sharing/ShareRuntimeModule.js +20 -10
  437. package/lib/sharing/resolveMatchedConfigs.js +6 -5
  438. package/lib/sharing/utils.js +338 -34
  439. package/lib/stats/DefaultStatsFactoryPlugin.js +660 -396
  440. package/lib/stats/DefaultStatsPresetPlugin.js +85 -25
  441. package/lib/stats/DefaultStatsPrinterPlugin.js +525 -145
  442. package/lib/stats/StatsFactory.js +128 -57
  443. package/lib/stats/StatsPrinter.js +77 -46
  444. package/lib/util/ArrayHelpers.js +35 -1
  445. package/lib/util/ArrayQueue.js +15 -22
  446. package/lib/util/AsyncQueue.js +37 -16
  447. package/lib/util/IterableHelpers.js +3 -4
  448. package/lib/util/LazyBucketSortedSet.js +60 -44
  449. package/lib/util/LazySet.js +11 -2
  450. package/lib/util/MapHelpers.js +17 -5
  451. package/lib/util/ParallelismFactorCalculator.js +11 -1
  452. package/lib/util/Queue.js +9 -3
  453. package/lib/util/Semaphore.js +4 -7
  454. package/lib/util/SetHelpers.js +5 -5
  455. package/lib/util/SortableSet.js +19 -6
  456. package/lib/util/StackedCacheMap.js +33 -3
  457. package/lib/util/StackedMap.js +1 -3
  458. package/lib/util/StringXor.js +46 -0
  459. package/lib/util/TupleQueue.js +9 -3
  460. package/lib/util/TupleSet.js +15 -5
  461. package/lib/util/URLAbsoluteSpecifier.js +8 -8
  462. package/lib/util/WeakTupleMap.js +70 -28
  463. package/lib/util/binarySearchBounds.js +51 -9
  464. package/lib/util/chainedImports.js +97 -0
  465. package/lib/util/cleverMerge.js +51 -36
  466. package/lib/util/comparators.js +146 -83
  467. package/lib/util/compileBooleanMatcher.js +35 -7
  468. package/lib/util/conventions.js +126 -0
  469. package/lib/util/create-schema-validation.js +9 -2
  470. package/lib/util/createHash.js +49 -14
  471. package/lib/util/deprecation.js +48 -15
  472. package/lib/util/deterministicGrouping.js +71 -39
  473. package/lib/util/extractUrlAndGlobal.js +3 -0
  474. package/lib/util/findGraphRoots.js +7 -5
  475. package/lib/util/fs.js +419 -94
  476. package/lib/util/hash/BatchedHash.js +10 -4
  477. package/lib/util/hash/md4.js +20 -0
  478. package/lib/util/hash/wasm-hash.js +163 -0
  479. package/lib/util/hash/xxhash64.js +7 -141
  480. package/lib/util/identifier.js +140 -93
  481. package/lib/util/internalSerializables.js +22 -0
  482. package/lib/util/makeSerializable.js +7 -0
  483. package/lib/util/memoize.js +10 -10
  484. package/lib/util/mergeScope.js +76 -0
  485. package/lib/util/nonNumericOnlyHash.js +22 -0
  486. package/lib/util/numberHash.js +84 -34
  487. package/lib/util/objectToMap.js +0 -1
  488. package/lib/util/processAsyncTree.js +7 -1
  489. package/lib/util/propertyAccess.js +7 -55
  490. package/lib/util/propertyName.js +77 -0
  491. package/lib/util/registerExternalSerializer.js +2 -2
  492. package/lib/util/runtime.js +188 -133
  493. package/lib/util/semver.js +64 -56
  494. package/lib/util/serialization.js +26 -1
  495. package/lib/util/smartGrouping.js +10 -10
  496. package/lib/util/source.js +1 -1
  497. package/lib/validateSchema.js +6 -2
  498. package/lib/wasm/EnableWasmLoadingPlugin.js +9 -4
  499. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +70 -30
  500. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +9 -1
  501. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +34 -16
  502. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +32 -12
  503. package/lib/wasm-async/AsyncWebAssemblyParser.js +17 -4
  504. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +72 -31
  505. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +17 -6
  506. package/lib/wasm-sync/WebAssemblyGenerator.js +72 -52
  507. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +5 -4
  508. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +53 -43
  509. package/lib/wasm-sync/WebAssemblyParser.js +23 -9
  510. package/lib/wasm-sync/WebAssemblyUtils.js +5 -4
  511. package/lib/web/FetchCompileAsyncWasmPlugin.js +11 -1
  512. package/lib/web/FetchCompileWasmPlugin.js +59 -42
  513. package/lib/web/JsonpChunkLoadingPlugin.js +9 -0
  514. package/lib/web/JsonpChunkLoadingRuntimeModule.js +71 -41
  515. package/lib/webpack.js +43 -12
  516. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +15 -12
  517. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +55 -40
  518. package/module.d.ts +233 -0
  519. package/package.json +85 -139
  520. package/schemas/WebpackOptions.check.js +1 -1
  521. package/schemas/WebpackOptions.json +679 -47
  522. package/schemas/plugins/BannerPlugin.check.js +1 -1
  523. package/schemas/plugins/BannerPlugin.json +9 -1
  524. package/schemas/plugins/DllReferencePlugin.check.js +1 -1
  525. package/schemas/plugins/HashedModuleIdsPlugin.check.js +1 -1
  526. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  527. package/schemas/plugins/SourceMapDevToolPlugin.check.js +1 -1
  528. package/schemas/plugins/SourceMapDevToolPlugin.json +4 -0
  529. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  530. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -1
  531. package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
  532. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  533. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  534. package/schemas/plugins/container/ContainerPlugin.json +10 -1
  535. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  536. package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
  537. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  538. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  539. package/schemas/plugins/container/ModuleFederationPlugin.json +12 -1
  540. package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +7 -0
  541. package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +6 -0
  542. package/schemas/plugins/css/CssAutoGeneratorOptions.json +3 -0
  543. package/schemas/plugins/css/CssAutoParserOptions.check.d.ts +7 -0
  544. package/schemas/plugins/css/CssAutoParserOptions.check.js +6 -0
  545. package/schemas/plugins/css/CssAutoParserOptions.json +3 -0
  546. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +7 -0
  547. package/schemas/plugins/css/CssGeneratorOptions.check.js +6 -0
  548. package/schemas/plugins/css/CssGeneratorOptions.json +3 -0
  549. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.d.ts +7 -0
  550. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +6 -0
  551. package/schemas/plugins/css/CssGlobalGeneratorOptions.json +3 -0
  552. package/schemas/plugins/css/CssGlobalParserOptions.check.d.ts +7 -0
  553. package/schemas/plugins/css/CssGlobalParserOptions.check.js +6 -0
  554. package/schemas/plugins/css/CssGlobalParserOptions.json +3 -0
  555. package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +7 -0
  556. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +6 -0
  557. package/schemas/plugins/css/CssModuleGeneratorOptions.json +3 -0
  558. package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +7 -0
  559. package/schemas/plugins/css/CssModuleParserOptions.check.js +6 -0
  560. package/schemas/plugins/css/CssModuleParserOptions.json +3 -0
  561. package/schemas/plugins/css/CssParserOptions.check.d.ts +7 -0
  562. package/schemas/plugins/css/CssParserOptions.check.js +6 -0
  563. package/schemas/plugins/css/CssParserOptions.json +3 -0
  564. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
  565. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
  566. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
  567. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  568. package/schemas/plugins/schemes/HttpUriPlugin.json +4 -0
  569. package/schemas/plugins/sharing/SharePlugin.check.js +1 -1
  570. package/types.d.ts +5026 -1756
@@ -8,23 +8,41 @@
8
8
  const mimeTypes = require("mime-types");
9
9
  const path = require("path");
10
10
  const { RawSource } = require("webpack-sources");
11
+ const ConcatenationScope = require("../ConcatenationScope");
11
12
  const Generator = require("../Generator");
13
+ const { ASSET_MODULE_TYPE } = require("../ModuleTypeConstants");
12
14
  const RuntimeGlobals = require("../RuntimeGlobals");
15
+ const CssUrlDependency = require("../dependencies/CssUrlDependency");
13
16
  const createHash = require("../util/createHash");
14
17
  const { makePathsRelative } = require("../util/identifier");
18
+ const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
15
19
 
16
20
  /** @typedef {import("webpack-sources").Source} Source */
21
+ /** @typedef {import("../../declarations/WebpackOptions").AssetGeneratorDataUrlOptions} AssetGeneratorDataUrlOptions */
17
22
  /** @typedef {import("../../declarations/WebpackOptions").AssetGeneratorOptions} AssetGeneratorOptions */
23
+ /** @typedef {import("../../declarations/WebpackOptions").AssetModuleFilename} AssetModuleFilename */
24
+ /** @typedef {import("../../declarations/WebpackOptions").AssetModuleOutputPath} AssetModuleOutputPath */
18
25
  /** @typedef {import("../../declarations/WebpackOptions").RawPublicPath} RawPublicPath */
19
26
  /** @typedef {import("../Compilation")} Compilation */
20
27
  /** @typedef {import("../Compiler")} Compiler */
21
28
  /** @typedef {import("../Generator").GenerateContext} GenerateContext */
22
29
  /** @typedef {import("../Generator").UpdateHashContext} UpdateHashContext */
23
30
  /** @typedef {import("../Module")} Module */
31
+ /** @typedef {import("../Module").BuildInfo} BuildInfo */
32
+ /** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
24
33
  /** @typedef {import("../NormalModule")} NormalModule */
25
34
  /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
35
+ /** @typedef {import("../TemplatedPathPlugin").TemplatePath} TemplatePath */
26
36
  /** @typedef {import("../util/Hash")} Hash */
37
+ /** @typedef {import("../util/createHash").Algorithm} Algorithm */
27
38
 
39
+ /**
40
+ * @template T
41
+ * @template U
42
+ * @param {Array<T> | Set<T>} a a
43
+ * @param {Array<U> | Set<U>} b b
44
+ * @returns {Array<T> & Array<U>} array
45
+ */
28
46
  const mergeMaybeArrays = (a, b) => {
29
47
  const set = new Set();
30
48
  if (Array.isArray(a)) for (const item of a) set.add(item);
@@ -34,6 +52,13 @@ const mergeMaybeArrays = (a, b) => {
34
52
  return Array.from(set);
35
53
  };
36
54
 
55
+ /**
56
+ * @template {object} T
57
+ * @template {object} U
58
+ * @param {TODO} a a
59
+ * @param {TODO} b b
60
+ * @returns {T & U} object
61
+ */
37
62
  const mergeAssetInfo = (a, b) => {
38
63
  const result = { ...a, ...b };
39
64
  for (const key of Object.keys(a)) {
@@ -49,7 +74,7 @@ const mergeAssetInfo = (a, b) => {
49
74
  case "immutable":
50
75
  case "development":
51
76
  case "hotModuleReplacement":
52
- case "javascriptModule ":
77
+ case "javascriptModule":
53
78
  result[key] = a[key] || b[key];
54
79
  break;
55
80
  case "related":
@@ -63,6 +88,13 @@ const mergeAssetInfo = (a, b) => {
63
88
  return result;
64
89
  };
65
90
 
91
+ /**
92
+ * @template {object} T
93
+ * @template {object} U
94
+ * @param {TODO} a a
95
+ * @param {TODO} b b
96
+ * @returns {T & U} object
97
+ */
66
98
  const mergeRelatedInfo = (a, b) => {
67
99
  const result = { ...a, ...b };
68
100
  for (const key of Object.keys(a)) {
@@ -74,24 +106,159 @@ const mergeRelatedInfo = (a, b) => {
74
106
  return result;
75
107
  };
76
108
 
109
+ /**
110
+ * @param {"base64" | false} encoding encoding
111
+ * @param {Source} source source
112
+ * @returns {string} encoded data
113
+ */
114
+ const encodeDataUri = (encoding, source) => {
115
+ /** @type {string | undefined} */
116
+ let encodedContent;
117
+
118
+ switch (encoding) {
119
+ case "base64": {
120
+ encodedContent = source.buffer().toString("base64");
121
+ break;
122
+ }
123
+ case false: {
124
+ const content = source.source();
125
+
126
+ if (typeof content !== "string") {
127
+ encodedContent = content.toString("utf-8");
128
+ }
129
+
130
+ encodedContent = encodeURIComponent(
131
+ /** @type {string} */
132
+ (encodedContent)
133
+ ).replace(
134
+ /[!'()*]/g,
135
+ character =>
136
+ `%${/** @type {number} */ (character.codePointAt(0)).toString(16)}`
137
+ );
138
+ break;
139
+ }
140
+ default:
141
+ throw new Error(`Unsupported encoding '${encoding}'`);
142
+ }
143
+
144
+ return encodedContent;
145
+ };
146
+
147
+ /**
148
+ * @param {string} encoding encoding
149
+ * @param {string} content content
150
+ * @returns {Buffer} decoded content
151
+ */
152
+ const decodeDataUriContent = (encoding, content) => {
153
+ const isBase64 = encoding === "base64";
154
+
155
+ if (isBase64) {
156
+ return Buffer.from(content, "base64");
157
+ }
158
+
159
+ // If we can't decode return the original body
160
+ try {
161
+ return Buffer.from(decodeURIComponent(content), "ascii");
162
+ } catch (_) {
163
+ return Buffer.from(content, "ascii");
164
+ }
165
+ };
166
+
77
167
  const JS_TYPES = new Set(["javascript"]);
78
- const JS_AND_ASSET_TYPES = new Set(["javascript", "asset"]);
168
+ const JS_AND_ASSET_TYPES = new Set(["javascript", ASSET_MODULE_TYPE]);
169
+ const DEFAULT_ENCODING = "base64";
79
170
 
80
171
  class AssetGenerator extends Generator {
81
172
  /**
82
173
  * @param {AssetGeneratorOptions["dataUrl"]=} dataUrlOptions the options for the data url
83
- * @param {string=} filename override for output.assetModuleFilename
174
+ * @param {AssetModuleFilename=} filename override for output.assetModuleFilename
84
175
  * @param {RawPublicPath=} publicPath override for output.assetModulePublicPath
176
+ * @param {AssetModuleOutputPath=} outputPath the output path for the emitted file which is not included in the runtime import
85
177
  * @param {boolean=} emit generate output asset
86
178
  */
87
- constructor(dataUrlOptions, filename, publicPath, emit) {
179
+ constructor(dataUrlOptions, filename, publicPath, outputPath, emit) {
88
180
  super();
89
181
  this.dataUrlOptions = dataUrlOptions;
90
182
  this.filename = filename;
91
183
  this.publicPath = publicPath;
184
+ this.outputPath = outputPath;
92
185
  this.emit = emit;
93
186
  }
94
187
 
188
+ /**
189
+ * @param {NormalModule} module module
190
+ * @param {RuntimeTemplate} runtimeTemplate runtime template
191
+ * @returns {string} source file name
192
+ */
193
+ getSourceFileName(module, runtimeTemplate) {
194
+ return makePathsRelative(
195
+ runtimeTemplate.compilation.compiler.context,
196
+ module.matchResource || module.resource,
197
+ runtimeTemplate.compilation.compiler.root
198
+ ).replace(/^\.\//, "");
199
+ }
200
+
201
+ /**
202
+ * @param {NormalModule} module module for which the bailout reason should be determined
203
+ * @param {ConcatenationBailoutReasonContext} context context
204
+ * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated
205
+ */
206
+ getConcatenationBailoutReason(module, context) {
207
+ return undefined;
208
+ }
209
+
210
+ /**
211
+ * @param {NormalModule} module module
212
+ * @returns {string} mime type
213
+ */
214
+ getMimeType(module) {
215
+ if (typeof this.dataUrlOptions === "function") {
216
+ throw new Error(
217
+ "This method must not be called when dataUrlOptions is a function"
218
+ );
219
+ }
220
+
221
+ /** @type {string | boolean | undefined} */
222
+ let mimeType =
223
+ /** @type {AssetGeneratorDataUrlOptions} */
224
+ (this.dataUrlOptions).mimetype;
225
+ if (mimeType === undefined) {
226
+ const ext = path.extname(
227
+ /** @type {string} */
228
+ (module.nameForCondition())
229
+ );
230
+ if (
231
+ module.resourceResolveData &&
232
+ module.resourceResolveData.mimetype !== undefined
233
+ ) {
234
+ mimeType =
235
+ module.resourceResolveData.mimetype +
236
+ module.resourceResolveData.parameters;
237
+ } else if (ext) {
238
+ mimeType = mimeTypes.lookup(ext);
239
+
240
+ if (typeof mimeType !== "string") {
241
+ throw new Error(
242
+ "DataUrl can't be generated automatically, " +
243
+ `because there is no mimetype for "${ext}" in mimetype database. ` +
244
+ 'Either pass a mimetype via "generator.mimetype" or ' +
245
+ 'use type: "asset/resource" to create a resource file instead of a DataUrl'
246
+ );
247
+ }
248
+ }
249
+ }
250
+
251
+ if (typeof mimeType !== "string") {
252
+ throw new Error(
253
+ "DataUrl can't be generated automatically. " +
254
+ 'Either pass a mimetype via "generator.mimetype" or ' +
255
+ 'use type: "asset/resource" to create a resource file instead of a DataUrl'
256
+ );
257
+ }
258
+
259
+ return /** @type {string} */ (mimeType);
260
+ }
261
+
95
262
  /**
96
263
  * @param {NormalModule} module module for which the code should be generated
97
264
  * @param {GenerateContext} generateContext context for generate
@@ -99,16 +266,26 @@ class AssetGenerator extends Generator {
99
266
  */
100
267
  generate(
101
268
  module,
102
- { runtime, chunkGraph, runtimeTemplate, runtimeRequirements, type, getData }
269
+ {
270
+ runtime,
271
+ concatenationScope,
272
+ chunkGraph,
273
+ runtimeTemplate,
274
+ runtimeRequirements,
275
+ type,
276
+ getData
277
+ }
103
278
  ) {
104
279
  switch (type) {
105
- case "asset":
106
- return module.originalSource();
280
+ case ASSET_MODULE_TYPE:
281
+ return /** @type {Source} */ (module.originalSource());
107
282
  default: {
108
- runtimeRequirements.add(RuntimeGlobals.module);
109
-
110
- const originalSource = module.originalSource();
111
- if (module.buildInfo.dataUrl) {
283
+ let content;
284
+ const originalSource = /** @type {Source} */ (module.originalSource());
285
+ if (
286
+ /** @type {BuildInfo} */
287
+ (module.buildInfo).dataUrl
288
+ ) {
112
289
  let encodedSource;
113
290
  if (typeof this.dataUrlOptions === "function") {
114
291
  encodedSource = this.dataUrlOptions.call(
@@ -120,86 +297,55 @@ class AssetGenerator extends Generator {
120
297
  }
121
298
  );
122
299
  } else {
123
- /** @type {string | false | undefined} */
124
- let encoding = this.dataUrlOptions.encoding;
125
- if (encoding === undefined) {
126
- if (
127
- module.resourceResolveData &&
128
- module.resourceResolveData.encoding !== undefined
129
- ) {
130
- encoding = module.resourceResolveData.encoding;
131
- }
300
+ /** @type {"base64" | false | undefined} */
301
+ let encoding =
302
+ /** @type {AssetGeneratorDataUrlOptions} */
303
+ (this.dataUrlOptions).encoding;
304
+ if (
305
+ encoding === undefined &&
306
+ module.resourceResolveData &&
307
+ module.resourceResolveData.encoding !== undefined
308
+ ) {
309
+ encoding = module.resourceResolveData.encoding;
132
310
  }
133
311
  if (encoding === undefined) {
134
- encoding = "base64";
135
- }
136
- let ext;
137
- let mimeType = this.dataUrlOptions.mimetype;
138
- if (mimeType === undefined) {
139
- ext = path.extname(module.nameForCondition());
140
- if (
141
- module.resourceResolveData &&
142
- module.resourceResolveData.mimetype !== undefined
143
- ) {
144
- mimeType =
145
- module.resourceResolveData.mimetype +
146
- module.resourceResolveData.parameters;
147
- } else if (ext) {
148
- mimeType = mimeTypes.lookup(ext);
149
- }
150
- }
151
- if (typeof mimeType !== "string") {
152
- throw new Error(
153
- "DataUrl can't be generated automatically, " +
154
- `because there is no mimetype for "${ext}" in mimetype database. ` +
155
- 'Either pass a mimetype via "generator.mimetype" or ' +
156
- 'use type: "asset/resource" to create a resource file instead of a DataUrl'
157
- );
312
+ encoding = DEFAULT_ENCODING;
158
313
  }
314
+ const mimeType = this.getMimeType(module);
159
315
 
160
316
  let encodedContent;
317
+
161
318
  if (
162
319
  module.resourceResolveData &&
163
- module.resourceResolveData.encoding === encoding
320
+ module.resourceResolveData.encoding === encoding &&
321
+ decodeDataUriContent(
322
+ module.resourceResolveData.encoding,
323
+ module.resourceResolveData.encodedContent
324
+ ).equals(originalSource.buffer())
164
325
  ) {
165
326
  encodedContent = module.resourceResolveData.encodedContent;
166
327
  } else {
167
- switch (encoding) {
168
- case "base64": {
169
- encodedContent = originalSource.buffer().toString("base64");
170
- break;
171
- }
172
- case false: {
173
- const content = originalSource.source();
174
-
175
- if (typeof content !== "string") {
176
- encodedContent = content.toString("utf-8");
177
- }
178
-
179
- encodedContent = encodeURIComponent(encodedContent).replace(
180
- /[!'()*]/g,
181
- character => "%" + character.codePointAt(0).toString(16)
182
- );
183
- break;
184
- }
185
- default:
186
- throw new Error(`Unsupported encoding '${encoding}'`);
187
- }
328
+ encodedContent = encodeDataUri(encoding, originalSource);
188
329
  }
189
330
 
190
331
  encodedSource = `data:${mimeType}${
191
332
  encoding ? `;${encoding}` : ""
192
333
  },${encodedContent}`;
193
334
  }
194
- return new RawSource(
195
- `${RuntimeGlobals.module}.exports = ${JSON.stringify(
196
- encodedSource
197
- )};`
198
- );
335
+ const data =
336
+ /** @type {NonNullable<GenerateContext["getData"]>} */
337
+ (getData)();
338
+ data.set("url", Buffer.from(encodedSource));
339
+ content = JSON.stringify(encodedSource);
199
340
  } else {
200
341
  const assetModuleFilename =
201
- this.filename || runtimeTemplate.outputOptions.assetModuleFilename;
202
- const hash = createHash(runtimeTemplate.outputOptions.hashFunction);
342
+ this.filename ||
343
+ /** @type {AssetModuleFilename} */
344
+ (runtimeTemplate.outputOptions.assetModuleFilename);
345
+ const hash = createHash(
346
+ /** @type {Algorithm} */
347
+ (runtimeTemplate.outputOptions.hashFunction)
348
+ );
203
349
  if (runtimeTemplate.outputOptions.hashSalt) {
204
350
  hash.update(runtimeTemplate.outputOptions.hashSalt);
205
351
  }
@@ -207,16 +353,17 @@ class AssetGenerator extends Generator {
207
353
  const fullHash = /** @type {string} */ (
208
354
  hash.digest(runtimeTemplate.outputOptions.hashDigest)
209
355
  );
210
- const contentHash = fullHash.slice(
211
- 0,
212
- runtimeTemplate.outputOptions.hashDigestLength
356
+ const contentHash = nonNumericOnlyHash(
357
+ fullHash,
358
+ /** @type {number} */
359
+ (runtimeTemplate.outputOptions.hashDigestLength)
360
+ );
361
+ /** @type {BuildInfo} */
362
+ (module.buildInfo).fullContentHash = fullHash;
363
+ const sourceFilename = this.getSourceFileName(
364
+ module,
365
+ runtimeTemplate
213
366
  );
214
- module.buildInfo.fullContentHash = fullHash;
215
- const sourceFilename = makePathsRelative(
216
- runtimeTemplate.compilation.compiler.context,
217
- module.matchResource || module.resource,
218
- runtimeTemplate.compilation.compiler.root
219
- ).replace(/^\.\//, "");
220
367
  let { path: filename, info: assetInfo } =
221
368
  runtimeTemplate.compilation.getAssetPathWithInfo(
222
369
  assetModuleFilename,
@@ -228,7 +375,8 @@ class AssetGenerator extends Generator {
228
375
  contentHash
229
376
  }
230
377
  );
231
- let publicPath;
378
+ let assetPath;
379
+ let assetPathForCss;
232
380
  if (this.publicPath !== undefined) {
233
381
  const { path, info } =
234
382
  runtimeTemplate.compilation.getAssetPathWithInfo(
@@ -241,18 +389,51 @@ class AssetGenerator extends Generator {
241
389
  contentHash
242
390
  }
243
391
  );
244
- publicPath = JSON.stringify(path);
245
392
  assetInfo = mergeAssetInfo(assetInfo, info);
393
+ assetPath = JSON.stringify(path + filename);
394
+ assetPathForCss = path + filename;
246
395
  } else {
247
- publicPath = RuntimeGlobals.publicPath;
248
396
  runtimeRequirements.add(RuntimeGlobals.publicPath); // add __webpack_require__.p
397
+ assetPath = runtimeTemplate.concatenation(
398
+ { expr: RuntimeGlobals.publicPath },
399
+ filename
400
+ );
401
+ const compilation = runtimeTemplate.compilation;
402
+ const path =
403
+ compilation.outputOptions.publicPath === "auto"
404
+ ? CssUrlDependency.PUBLIC_PATH_AUTO
405
+ : compilation.getAssetPath(
406
+ /** @type {TemplatePath} */
407
+ (compilation.outputOptions.publicPath),
408
+ {
409
+ hash: compilation.hash
410
+ }
411
+ );
412
+ assetPathForCss = path + filename;
249
413
  }
250
414
  assetInfo = {
251
415
  sourceFilename,
252
416
  ...assetInfo
253
417
  };
254
- module.buildInfo.filename = filename;
255
- module.buildInfo.assetInfo = assetInfo;
418
+ if (this.outputPath) {
419
+ const { path: outputPath, info } =
420
+ runtimeTemplate.compilation.getAssetPathWithInfo(
421
+ this.outputPath,
422
+ {
423
+ module,
424
+ runtime,
425
+ filename: sourceFilename,
426
+ chunkGraph,
427
+ contentHash
428
+ }
429
+ );
430
+ assetInfo = mergeAssetInfo(assetInfo, info);
431
+ filename = path.posix.join(outputPath, filename);
432
+ }
433
+ /** @type {BuildInfo} */
434
+ (module.buildInfo).filename = filename;
435
+ /** @type {BuildInfo} */
436
+ (module.buildInfo).assetInfo = assetInfo;
256
437
  if (getData) {
257
438
  // Due to code generation caching module.buildInfo.XXX can't used to store such information
258
439
  // It need to be stored in the code generation results instead, where it's cached too
@@ -261,14 +442,23 @@ class AssetGenerator extends Generator {
261
442
  data.set("fullContentHash", fullHash);
262
443
  data.set("filename", filename);
263
444
  data.set("assetInfo", assetInfo);
445
+ data.set("assetPathForCss", assetPathForCss);
264
446
  }
447
+ content = assetPath;
448
+ }
265
449
 
450
+ if (concatenationScope) {
451
+ concatenationScope.registerNamespaceExport(
452
+ ConcatenationScope.NAMESPACE_OBJECT_EXPORT
453
+ );
266
454
  return new RawSource(
267
- `${
268
- RuntimeGlobals.module
269
- }.exports = ${publicPath} + ${JSON.stringify(filename)};`
455
+ `${runtimeTemplate.supportsConst() ? "const" : "var"} ${
456
+ ConcatenationScope.NAMESPACE_OBJECT_EXPORT
457
+ } = ${content};`
270
458
  );
271
459
  }
460
+ runtimeRequirements.add(RuntimeGlobals.module);
461
+ return new RawSource(`${RuntimeGlobals.module}.exports = ${content};`);
272
462
  }
273
463
  }
274
464
  }
@@ -280,9 +470,8 @@ class AssetGenerator extends Generator {
280
470
  getTypes(module) {
281
471
  if ((module.buildInfo && module.buildInfo.dataUrl) || this.emit === false) {
282
472
  return JS_TYPES;
283
- } else {
284
- return JS_AND_ASSET_TYPES;
285
473
  }
474
+ return JS_AND_ASSET_TYPES;
286
475
  }
287
476
 
288
477
  /**
@@ -292,7 +481,7 @@ class AssetGenerator extends Generator {
292
481
  */
293
482
  getSize(module, type) {
294
483
  switch (type) {
295
- case "asset": {
484
+ case ASSET_MODULE_TYPE: {
296
485
  const originalSource = module.originalSource();
297
486
 
298
487
  if (!originalSource) {
@@ -314,11 +503,10 @@ class AssetGenerator extends Generator {
314
503
  // 4/3 = base64 encoding
315
504
  // 34 = ~ data url header + footer + rounding
316
505
  return originalSource.size() * 1.34 + 36;
317
- } else {
318
- // it's only estimated so this number is probably fine
319
- // Example: m.exports=r.p+"0123456789012345678901.ext"
320
- return 42;
321
506
  }
507
+ // it's only estimated so this number is probably fine
508
+ // Example: m.exports=r.p+"0123456789012345678901.ext"
509
+ return 42;
322
510
  }
323
511
  }
324
512
 
@@ -326,8 +514,72 @@ class AssetGenerator extends Generator {
326
514
  * @param {Hash} hash hash that will be modified
327
515
  * @param {UpdateHashContext} updateHashContext context for updating hash
328
516
  */
329
- updateHash(hash, { module }) {
330
- hash.update(module.buildInfo.dataUrl ? "data-url" : "resource");
517
+ updateHash(hash, updateHashContext) {
518
+ const { module } = updateHashContext;
519
+ if (
520
+ /** @type {BuildInfo} */
521
+ (module.buildInfo).dataUrl
522
+ ) {
523
+ hash.update("data-url");
524
+ // this.dataUrlOptions as function should be pure and only depend on input source and filename
525
+ // therefore it doesn't need to be hashed
526
+ if (typeof this.dataUrlOptions === "function") {
527
+ const ident = /** @type {{ ident?: string }} */ (this.dataUrlOptions)
528
+ .ident;
529
+ if (ident) hash.update(ident);
530
+ } else {
531
+ const dataUrlOptions =
532
+ /** @type {AssetGeneratorDataUrlOptions} */
533
+ (this.dataUrlOptions);
534
+ if (
535
+ dataUrlOptions.encoding &&
536
+ dataUrlOptions.encoding !== DEFAULT_ENCODING
537
+ ) {
538
+ hash.update(dataUrlOptions.encoding);
539
+ }
540
+ if (dataUrlOptions.mimetype) hash.update(dataUrlOptions.mimetype);
541
+ // computed mimetype depends only on module filename which is already part of the hash
542
+ }
543
+ } else {
544
+ hash.update("resource");
545
+
546
+ const { module, chunkGraph, runtime } = updateHashContext;
547
+ const runtimeTemplate =
548
+ /** @type {NonNullable<UpdateHashContext["runtimeTemplate"]>} */
549
+ (updateHashContext.runtimeTemplate);
550
+
551
+ const pathData = {
552
+ module,
553
+ runtime,
554
+ filename: this.getSourceFileName(module, runtimeTemplate),
555
+ chunkGraph,
556
+ contentHash: runtimeTemplate.contentHashReplacement
557
+ };
558
+
559
+ if (typeof this.publicPath === "function") {
560
+ hash.update("path");
561
+ const assetInfo = {};
562
+ hash.update(this.publicPath(pathData, assetInfo));
563
+ hash.update(JSON.stringify(assetInfo));
564
+ } else if (this.publicPath) {
565
+ hash.update("path");
566
+ hash.update(this.publicPath);
567
+ } else {
568
+ hash.update("no-path");
569
+ }
570
+
571
+ const assetModuleFilename =
572
+ this.filename ||
573
+ /** @type {AssetModuleFilename} */
574
+ (runtimeTemplate.outputOptions.assetModuleFilename);
575
+ const { path: filename, info } =
576
+ runtimeTemplate.compilation.getAssetPathWithInfo(
577
+ assetModuleFilename,
578
+ pathData
579
+ );
580
+ hash.update(filename);
581
+ hash.update(JSON.stringify(info));
582
+ }
331
583
  }
332
584
  }
333
585