webpack 5.97.1 → 5.104.1

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 (610) hide show
  1. package/README.md +368 -434
  2. package/bin/webpack.js +15 -9
  3. package/hot/dev-server.js +18 -3
  4. package/hot/emitter-event-target.js +7 -0
  5. package/hot/lazy-compilation-node.js +45 -29
  6. package/hot/lazy-compilation-universal.js +18 -0
  7. package/hot/lazy-compilation-web.js +15 -5
  8. package/hot/load-http.js +7 -0
  9. package/hot/log.js +15 -15
  10. package/hot/only-dev-server.js +19 -4
  11. package/hot/poll.js +1 -0
  12. package/lib/APIPlugin.js +48 -50
  13. package/lib/AbstractMethodError.js +1 -0
  14. package/lib/AsyncDependenciesBlock.js +4 -5
  15. package/lib/AutomaticPrefetchPlugin.js +22 -22
  16. package/lib/BannerPlugin.js +35 -40
  17. package/lib/Cache.js +12 -9
  18. package/lib/CacheFacade.js +13 -13
  19. package/lib/CaseSensitiveModulesWarning.js +6 -6
  20. package/lib/Chunk.js +68 -47
  21. package/lib/ChunkGraph.js +174 -95
  22. package/lib/ChunkGroup.js +32 -24
  23. package/lib/ChunkTemplate.js +8 -8
  24. package/lib/CleanPlugin.js +90 -42
  25. package/lib/CodeGenerationResults.js +12 -9
  26. package/lib/CompatibilityPlugin.js +70 -21
  27. package/lib/Compilation.js +827 -550
  28. package/lib/Compiler.js +137 -109
  29. package/lib/ConcatenationScope.js +45 -8
  30. package/lib/ConditionalInitFragment.js +1 -1
  31. package/lib/ConstPlugin.js +89 -59
  32. package/lib/ContextExclusionPlugin.js +5 -4
  33. package/lib/ContextModule.js +66 -51
  34. package/lib/ContextModuleFactory.js +51 -30
  35. package/lib/ContextReplacementPlugin.js +89 -34
  36. package/lib/CssModule.js +8 -4
  37. package/lib/DefinePlugin.js +209 -57
  38. package/lib/DelegatedModule.js +34 -23
  39. package/lib/DelegatedModuleFactoryPlugin.js +27 -24
  40. package/lib/DelegatedPlugin.js +4 -2
  41. package/lib/DependenciesBlock.js +0 -2
  42. package/lib/Dependency.js +37 -19
  43. package/lib/DependencyTemplate.js +2 -0
  44. package/lib/DependencyTemplates.js +5 -6
  45. package/lib/DllEntryPlugin.js +8 -4
  46. package/lib/DllModule.js +11 -12
  47. package/lib/DllModuleFactory.js +2 -2
  48. package/lib/DllPlugin.js +9 -6
  49. package/lib/DllReferencePlugin.js +60 -65
  50. package/lib/DotenvPlugin.js +462 -0
  51. package/lib/DynamicEntryPlugin.js +8 -8
  52. package/lib/EntryOptionPlugin.js +8 -6
  53. package/lib/EntryPlugin.js +5 -3
  54. package/lib/Entrypoint.js +19 -0
  55. package/lib/EnvironmentNotSupportAsyncWarning.js +0 -3
  56. package/lib/EnvironmentPlugin.js +26 -19
  57. package/lib/ErrorHelpers.js +6 -6
  58. package/lib/EvalDevToolModulePlugin.js +17 -14
  59. package/lib/EvalSourceMapDevToolPlugin.js +156 -142
  60. package/lib/ExportsInfo.js +180 -115
  61. package/lib/ExportsInfoApiPlugin.js +2 -2
  62. package/lib/ExternalModule.js +256 -102
  63. package/lib/ExternalModuleFactoryPlugin.js +66 -29
  64. package/lib/ExternalsPlugin.js +57 -2
  65. package/lib/FileSystemInfo.js +313 -247
  66. package/lib/FlagAllModulesAsUsedPlugin.js +2 -2
  67. package/lib/FlagDependencyExportsPlugin.js +29 -19
  68. package/lib/FlagDependencyUsagePlugin.js +9 -10
  69. package/lib/FlagEntryExportAsUsedPlugin.js +1 -1
  70. package/lib/Generator.js +43 -10
  71. package/lib/GraphHelpers.js +11 -3
  72. package/lib/HookWebpackError.js +35 -7
  73. package/lib/HotModuleReplacementPlugin.js +149 -108
  74. package/lib/HotUpdateChunk.js +0 -3
  75. package/lib/IgnoreErrorModuleFactory.js +2 -2
  76. package/lib/IgnorePlugin.js +16 -13
  77. package/lib/IgnoreWarningsPlugin.js +6 -4
  78. package/lib/InitFragment.js +41 -23
  79. package/lib/InvalidDependenciesModuleWarning.js +2 -3
  80. package/lib/JavascriptMetaInfoPlugin.js +2 -4
  81. package/lib/LibManifestPlugin.js +12 -13
  82. package/lib/LoaderOptionsPlugin.js +12 -14
  83. package/lib/LoaderTargetPlugin.js +5 -3
  84. package/lib/MainTemplate.js +18 -29
  85. package/lib/ManifestPlugin.js +235 -0
  86. package/lib/Module.js +138 -60
  87. package/lib/ModuleBuildError.js +4 -2
  88. package/lib/ModuleDependencyError.js +4 -3
  89. package/lib/ModuleDependencyWarning.js +4 -3
  90. package/lib/ModuleError.js +1 -1
  91. package/lib/ModuleFactory.js +10 -3
  92. package/lib/ModuleFilenameHelpers.js +63 -60
  93. package/lib/ModuleGraph.js +195 -70
  94. package/lib/ModuleGraphConnection.js +14 -20
  95. package/lib/ModuleInfoHeaderPlugin.js +15 -16
  96. package/lib/ModuleNotFoundError.js +1 -1
  97. package/lib/ModuleParseError.js +8 -4
  98. package/lib/ModuleSourceTypeConstants.js +189 -0
  99. package/lib/ModuleTemplate.js +7 -8
  100. package/lib/ModuleTypeConstants.js +37 -15
  101. package/lib/ModuleWarning.js +1 -1
  102. package/lib/MultiCompiler.js +64 -49
  103. package/lib/MultiStats.js +19 -14
  104. package/lib/MultiWatching.js +7 -11
  105. package/lib/NoEmitOnErrorsPlugin.js +5 -3
  106. package/lib/NodeStuffPlugin.js +438 -126
  107. package/lib/NormalModule.js +322 -201
  108. package/lib/NormalModuleFactory.js +230 -117
  109. package/lib/NormalModuleReplacementPlugin.js +37 -39
  110. package/lib/NullFactory.js +3 -2
  111. package/lib/OptimizationStages.js +1 -1
  112. package/lib/OptionsApply.js +1 -1
  113. package/lib/Parser.js +5 -3
  114. package/lib/PlatformPlugin.js +3 -1
  115. package/lib/PrefetchPlugin.js +6 -4
  116. package/lib/ProgressPlugin.js +48 -49
  117. package/lib/ProvidePlugin.js +7 -5
  118. package/lib/RawModule.js +26 -12
  119. package/lib/RecordIdsPlugin.js +88 -110
  120. package/lib/RequestShortener.js +3 -1
  121. package/lib/ResolverFactory.js +15 -14
  122. package/lib/RuntimeGlobals.js +216 -153
  123. package/lib/RuntimeModule.js +7 -6
  124. package/lib/RuntimePlugin.js +115 -62
  125. package/lib/RuntimeTemplate.js +248 -76
  126. package/lib/SelfModuleFactory.js +2 -2
  127. package/lib/SizeFormatHelpers.js +2 -2
  128. package/lib/SourceMapDevToolModuleOptionsPlugin.js +17 -27
  129. package/lib/SourceMapDevToolPlugin.js +72 -59
  130. package/lib/Stats.js +2 -3
  131. package/lib/Template.js +31 -24
  132. package/lib/TemplatedPathPlugin.js +24 -21
  133. package/lib/UseStrictPlugin.js +1 -1
  134. package/lib/WarnCaseSensitiveModulesPlugin.js +36 -37
  135. package/lib/WarnDeprecatedOptionPlugin.js +7 -8
  136. package/lib/WarnNoModeSetPlugin.js +3 -1
  137. package/lib/WatchIgnorePlugin.js +11 -9
  138. package/lib/Watching.js +27 -29
  139. package/lib/WebpackError.js +10 -3
  140. package/lib/WebpackIsIncludedPlugin.js +4 -5
  141. package/lib/WebpackOptionsApply.js +263 -135
  142. package/lib/asset/AssetBytesGenerator.js +171 -0
  143. package/lib/asset/AssetBytesParser.js +37 -0
  144. package/lib/asset/AssetGenerator.js +285 -223
  145. package/lib/asset/AssetModulesPlugin.js +103 -41
  146. package/lib/asset/AssetParser.js +7 -3
  147. package/lib/asset/AssetSourceGenerator.js +41 -17
  148. package/lib/asset/RawDataUrlModule.js +17 -9
  149. package/lib/async-modules/AsyncModuleHelpers.js +52 -0
  150. package/lib/async-modules/AwaitDependenciesInitFragment.js +39 -24
  151. package/lib/async-modules/InferAsyncModulesPlugin.js +25 -26
  152. package/lib/buildChunkGraph.js +36 -17
  153. package/lib/cache/AddBuildDependenciesPlugin.js +5 -6
  154. package/lib/cache/IdleFileCachePlugin.js +22 -20
  155. package/lib/cache/MemoryCachePlugin.js +3 -3
  156. package/lib/cache/MemoryWithGcCachePlugin.js +17 -11
  157. package/lib/cache/PackFileCacheStrategy.js +198 -170
  158. package/lib/cache/ResolverCachePlugin.js +58 -48
  159. package/lib/cache/getLazyHashedEtag.js +5 -4
  160. package/lib/cli.js +197 -39
  161. package/lib/config/browserslistTargetHandler.js +110 -85
  162. package/lib/config/defaults.js +514 -113
  163. package/lib/config/normalization.js +91 -64
  164. package/lib/config/target.js +30 -18
  165. package/lib/container/ContainerEntryDependency.js +0 -1
  166. package/lib/container/ContainerEntryModule.js +16 -15
  167. package/lib/container/ContainerEntryModuleFactory.js +2 -2
  168. package/lib/container/ContainerPlugin.js +5 -6
  169. package/lib/container/ContainerReferencePlugin.js +27 -30
  170. package/lib/container/FallbackDependency.js +2 -1
  171. package/lib/container/FallbackModule.js +19 -14
  172. package/lib/container/FallbackModuleFactory.js +2 -2
  173. package/lib/container/HoistContainerReferencesPlugin.js +7 -7
  174. package/lib/container/ModuleFederationPlugin.js +4 -4
  175. package/lib/container/RemoteModule.js +14 -14
  176. package/lib/container/RemoteRuntimeModule.js +2 -2
  177. package/lib/container/options.js +9 -9
  178. package/lib/css/CssGenerator.js +366 -74
  179. package/lib/css/CssLoadingRuntimeModule.js +26 -16
  180. package/lib/css/CssMergeStyleSheetsRuntimeModule.js +56 -0
  181. package/lib/css/CssModulesPlugin.js +191 -142
  182. package/lib/css/CssParser.js +1756 -740
  183. package/lib/css/walkCssTokens.js +180 -67
  184. package/lib/debug/ProfilingPlugin.js +135 -51
  185. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +29 -28
  186. package/lib/dependencies/AMDPlugin.js +18 -11
  187. package/lib/dependencies/AMDRequireArrayDependency.js +5 -4
  188. package/lib/dependencies/AMDRequireContextDependency.js +2 -1
  189. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +35 -26
  190. package/lib/dependencies/AMDRuntimeModules.js +3 -1
  191. package/lib/dependencies/CachedConstDependency.js +24 -18
  192. package/lib/dependencies/CommonJsExportRequireDependency.js +31 -24
  193. package/lib/dependencies/CommonJsExportsDependency.js +2 -1
  194. package/lib/dependencies/CommonJsExportsParserPlugin.js +50 -36
  195. package/lib/dependencies/CommonJsFullRequireDependency.js +7 -13
  196. package/lib/dependencies/CommonJsImportsParserPlugin.js +146 -127
  197. package/lib/dependencies/CommonJsPlugin.js +29 -18
  198. package/lib/dependencies/CommonJsRequireContextDependency.js +4 -3
  199. package/lib/dependencies/CommonJsSelfReferenceDependency.js +4 -4
  200. package/lib/dependencies/ConstDependency.js +2 -2
  201. package/lib/dependencies/ContextDependency.js +10 -5
  202. package/lib/dependencies/ContextDependencyHelpers.js +21 -13
  203. package/lib/dependencies/ContextDependencyTemplateAsId.js +10 -9
  204. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +13 -10
  205. package/lib/dependencies/ContextElementDependency.js +23 -12
  206. package/lib/dependencies/CssIcssExportDependency.js +402 -22
  207. package/lib/dependencies/CssIcssImportDependency.js +116 -51
  208. package/lib/dependencies/CssIcssSymbolDependency.js +33 -35
  209. package/lib/dependencies/CssImportDependency.js +17 -14
  210. package/lib/dependencies/CssUrlDependency.js +8 -13
  211. package/lib/dependencies/DynamicExports.js +19 -19
  212. package/lib/dependencies/ExportsInfoDependency.js +13 -10
  213. package/lib/dependencies/ExternalModuleDependency.js +7 -7
  214. package/lib/dependencies/ExternalModuleInitFragment.js +3 -2
  215. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +96 -0
  216. package/lib/dependencies/HarmonyAcceptDependency.js +96 -5
  217. package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -5
  218. package/lib/dependencies/HarmonyCompatibilityDependency.js +0 -1
  219. package/lib/dependencies/HarmonyDetectionParserPlugin.js +10 -30
  220. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +19 -8
  221. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +136 -99
  222. package/lib/dependencies/HarmonyExportExpressionDependency.js +1 -1
  223. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +152 -61
  224. package/lib/dependencies/HarmonyExportInitFragment.js +2 -2
  225. package/lib/dependencies/HarmonyExportSpecifierDependency.js +2 -2
  226. package/lib/dependencies/HarmonyExports.js +5 -5
  227. package/lib/dependencies/HarmonyImportDependency.js +92 -45
  228. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +201 -163
  229. package/lib/dependencies/HarmonyImportSideEffectDependency.js +5 -6
  230. package/lib/dependencies/HarmonyImportSpecifierDependency.js +69 -42
  231. package/lib/dependencies/HarmonyModulesPlugin.js +16 -11
  232. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +15 -15
  233. package/lib/dependencies/ImportContextDependency.js +15 -1
  234. package/lib/dependencies/ImportDependency.js +25 -7
  235. package/lib/dependencies/ImportEagerDependency.js +7 -5
  236. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +23 -13
  237. package/lib/dependencies/ImportMetaContextPlugin.js +2 -2
  238. package/lib/dependencies/ImportMetaPlugin.js +172 -20
  239. package/lib/dependencies/ImportParserPlugin.js +327 -49
  240. package/lib/dependencies/ImportPhase.js +121 -0
  241. package/lib/dependencies/ImportPlugin.js +3 -1
  242. package/lib/dependencies/ImportWeakDependency.js +7 -5
  243. package/lib/dependencies/JsonExportsDependency.js +54 -28
  244. package/lib/dependencies/LoaderDependency.js +0 -3
  245. package/lib/dependencies/LoaderImportDependency.js +0 -3
  246. package/lib/dependencies/LoaderPlugin.js +24 -25
  247. package/lib/dependencies/LocalModulesHelpers.js +4 -4
  248. package/lib/dependencies/ModuleDecoratorDependency.js +2 -4
  249. package/lib/dependencies/ModuleDependency.js +14 -13
  250. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +1 -0
  251. package/lib/dependencies/ModuleHotAcceptDependency.js +1 -1
  252. package/lib/dependencies/NullDependency.js +2 -0
  253. package/lib/dependencies/ProvidedDependency.js +8 -10
  254. package/lib/dependencies/PureExpressionDependency.js +1 -2
  255. package/lib/dependencies/RequireContextDependency.js +2 -1
  256. package/lib/dependencies/RequireContextDependencyParserPlugin.js +47 -44
  257. package/lib/dependencies/RequireContextPlugin.js +5 -2
  258. package/lib/dependencies/RequireEnsureDependenciesBlock.js +3 -3
  259. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +101 -99
  260. package/lib/dependencies/RequireEnsurePlugin.js +6 -6
  261. package/lib/dependencies/RequireIncludeDependency.js +2 -2
  262. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +33 -34
  263. package/lib/dependencies/RequireIncludePlugin.js +1 -0
  264. package/lib/dependencies/RequireResolveContextDependency.js +1 -1
  265. package/lib/dependencies/RequireResolveDependency.js +3 -3
  266. package/lib/dependencies/RuntimeRequirementsDependency.js +3 -4
  267. package/lib/dependencies/StaticExportsDependency.js +3 -5
  268. package/lib/dependencies/SystemPlugin.js +4 -4
  269. package/lib/dependencies/URLContextDependency.js +65 -0
  270. package/lib/dependencies/URLDependency.js +3 -8
  271. package/lib/dependencies/URLPlugin.js +18 -159
  272. package/lib/dependencies/WebAssemblyExportImportedDependency.js +3 -3
  273. package/lib/dependencies/WebAssemblyImportDependency.js +2 -2
  274. package/lib/dependencies/WebpackIsIncludedDependency.js +2 -3
  275. package/lib/dependencies/WorkerDependency.js +8 -6
  276. package/lib/dependencies/WorkerPlugin.js +131 -67
  277. package/lib/dependencies/getFunctionExpression.js +2 -2
  278. package/lib/dependencies/processExportInfo.js +4 -4
  279. package/lib/esm/ExportWebpackRequireRuntimeModule.js +1 -1
  280. package/lib/esm/ModuleChunkFormatPlugin.js +232 -179
  281. package/lib/esm/ModuleChunkLoadingPlugin.js +112 -57
  282. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +102 -28
  283. package/lib/formatLocation.js +2 -2
  284. package/lib/hmr/HotModuleReplacement.runtime.js +41 -29
  285. package/lib/hmr/HotModuleReplacementRuntimeModule.js +1 -1
  286. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +43 -33
  287. package/lib/hmr/JavascriptHotModuleReplacementHelper.js +37 -0
  288. package/lib/hmr/LazyCompilationPlugin.js +67 -54
  289. package/lib/hmr/lazyCompilationBackend.js +23 -18
  290. package/lib/ids/ChunkModuleIdRangePlugin.js +14 -11
  291. package/lib/ids/DeterministicChunkIdsPlugin.js +32 -37
  292. package/lib/ids/DeterministicModuleIdsPlugin.js +52 -52
  293. package/lib/ids/HashedModuleIdsPlugin.js +15 -13
  294. package/lib/ids/IdHelpers.js +66 -49
  295. package/lib/ids/NamedChunkIdsPlugin.js +14 -17
  296. package/lib/ids/NamedModuleIdsPlugin.js +12 -14
  297. package/lib/ids/NaturalChunkIdsPlugin.js +6 -4
  298. package/lib/ids/NaturalModuleIdsPlugin.js +4 -3
  299. package/lib/ids/OccurrenceChunkIdsPlugin.js +7 -5
  300. package/lib/ids/OccurrenceModuleIdsPlugin.js +8 -7
  301. package/lib/ids/SyncModuleIdsPlugin.js +18 -13
  302. package/lib/index.js +54 -14
  303. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +116 -119
  304. package/lib/javascript/BasicEvaluatedExpression.js +26 -18
  305. package/lib/javascript/ChunkFormatHelpers.js +70 -0
  306. package/lib/javascript/ChunkHelpers.js +17 -5
  307. package/lib/javascript/CommonJsChunkFormatPlugin.js +114 -141
  308. package/lib/javascript/EnableChunkLoadingPlugin.js +7 -4
  309. package/lib/javascript/JavascriptGenerator.js +122 -100
  310. package/lib/javascript/JavascriptModulesPlugin.js +332 -152
  311. package/lib/javascript/JavascriptParser.js +1488 -1052
  312. package/lib/javascript/JavascriptParserHelpers.js +48 -47
  313. package/lib/javascript/StartupHelpers.js +23 -22
  314. package/lib/json/JsonData.js +4 -4
  315. package/lib/json/JsonGenerator.js +66 -32
  316. package/lib/json/JsonModulesPlugin.js +16 -6
  317. package/lib/json/JsonParser.js +23 -8
  318. package/lib/library/AbstractLibraryPlugin.js +45 -10
  319. package/lib/library/AmdLibraryPlugin.js +7 -5
  320. package/lib/library/AssignLibraryPlugin.js +71 -17
  321. package/lib/library/EnableLibraryPlugin.js +51 -25
  322. package/lib/library/ExportPropertyLibraryPlugin.js +12 -18
  323. package/lib/library/JsonpLibraryPlugin.js +5 -2
  324. package/lib/library/ModuleLibraryPlugin.js +230 -18
  325. package/lib/library/SystemLibraryPlugin.js +29 -11
  326. package/lib/library/UmdLibraryPlugin.js +35 -32
  327. package/lib/logging/Logger.js +18 -15
  328. package/lib/logging/createConsoleLogger.js +27 -27
  329. package/lib/logging/runtime.js +11 -11
  330. package/lib/logging/truncateArgs.js +5 -5
  331. package/lib/node/CommonJsChunkLoadingPlugin.js +72 -75
  332. package/lib/node/NodeEnvironmentPlugin.js +9 -3
  333. package/lib/node/NodeTargetPlugin.js +9 -1
  334. package/lib/node/NodeTemplatePlugin.js +2 -2
  335. package/lib/node/NodeWatchFileSystem.js +4 -4
  336. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +22 -38
  337. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +10 -11
  338. package/lib/node/ReadFileCompileWasmPlugin.js +11 -14
  339. package/lib/node/RequireChunkLoadingRuntimeModule.js +22 -30
  340. package/lib/node/nodeConsole.js +12 -7
  341. package/lib/optimize/AggressiveMergingPlugin.js +46 -47
  342. package/lib/optimize/AggressiveSplittingPlugin.js +233 -238
  343. package/lib/optimize/ConcatenatedModule.js +620 -251
  344. package/lib/optimize/EnsureChunkConditionsPlugin.js +58 -58
  345. package/lib/optimize/FlagIncludedChunksPlugin.js +93 -96
  346. package/lib/optimize/InnerGraph.js +139 -124
  347. package/lib/optimize/InnerGraphPlugin.js +29 -24
  348. package/lib/optimize/LimitChunkCountPlugin.js +32 -8
  349. package/lib/optimize/MangleExportsPlugin.js +22 -22
  350. package/lib/optimize/MergeDuplicateChunksPlugin.js +80 -81
  351. package/lib/optimize/MinChunkSizePlugin.js +12 -7
  352. package/lib/optimize/ModuleConcatenationPlugin.js +92 -71
  353. package/lib/optimize/RealContentHashPlugin.js +58 -44
  354. package/lib/optimize/RemoveEmptyChunksPlugin.js +8 -5
  355. package/lib/optimize/RemoveParentModulesPlugin.js +7 -4
  356. package/lib/optimize/RuntimeChunkPlugin.js +22 -25
  357. package/lib/optimize/SideEffectsFlagPlugin.js +44 -26
  358. package/lib/optimize/SplitChunksPlugin.js +209 -158
  359. package/lib/performance/AssetsOverSizeLimitWarning.js +1 -1
  360. package/lib/performance/EntrypointsOverSizeLimitWarning.js +2 -2
  361. package/lib/performance/SizeLimitsPlugin.js +8 -5
  362. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +5 -7
  363. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +61 -64
  364. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +3 -4
  365. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +2 -2
  366. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +2 -2
  367. package/lib/rules/BasicEffectRulePlugin.js +14 -5
  368. package/lib/rules/BasicMatcherRulePlugin.js +18 -7
  369. package/lib/rules/ObjectMatcherRulePlugin.js +17 -6
  370. package/lib/rules/RuleSetCompiler.js +73 -32
  371. package/lib/rules/UseEffectRulePlugin.js +61 -25
  372. package/lib/runtime/AsyncModuleRuntimeModule.js +74 -9
  373. package/lib/runtime/AutoPublicPathRuntimeModule.js +9 -4
  374. package/lib/runtime/BaseUriRuntimeModule.js +2 -2
  375. package/lib/runtime/CompatRuntimeModule.js +0 -1
  376. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +1 -1
  377. package/lib/runtime/GetChunkFilenameRuntimeModule.js +34 -35
  378. package/lib/runtime/GetMainFilenameRuntimeModule.js +1 -1
  379. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +1 -1
  380. package/lib/runtime/LoadScriptRuntimeModule.js +0 -2
  381. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +248 -0
  382. package/lib/runtime/PublicPathRuntimeModule.js +2 -2
  383. package/lib/runtime/RuntimeIdRuntimeModule.js +2 -1
  384. package/lib/runtime/StartupChunkDependenciesPlugin.js +39 -42
  385. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +10 -9
  386. package/lib/runtime/StartupEntrypointRuntimeModule.js +0 -1
  387. package/lib/runtime/SystemContextRuntimeModule.js +0 -2
  388. package/lib/runtime/ToBinaryRuntimeModule.js +64 -0
  389. package/lib/schemes/DataUriPlugin.js +9 -31
  390. package/lib/schemes/FileUriPlugin.js +11 -6
  391. package/lib/schemes/HttpUriPlugin.js +381 -261
  392. package/lib/schemes/VirtualUrlPlugin.js +222 -0
  393. package/lib/serialization/AggregateErrorSerializer.js +41 -0
  394. package/lib/serialization/BinaryMiddleware.js +51 -33
  395. package/lib/serialization/ErrorObjectSerializer.js +7 -2
  396. package/lib/serialization/FileMiddleware.js +101 -71
  397. package/lib/serialization/NullPrototypeObjectSerializer.js +5 -3
  398. package/lib/serialization/ObjectMiddleware.js +130 -54
  399. package/lib/serialization/PlainObjectSerializer.js +1 -1
  400. package/lib/serialization/Serializer.js +38 -20
  401. package/lib/serialization/SerializerMiddleware.js +121 -49
  402. package/lib/serialization/SingleItemMiddleware.js +9 -7
  403. package/lib/serialization/types.js +1 -1
  404. package/lib/sharing/ConsumeSharedModule.js +9 -9
  405. package/lib/sharing/ConsumeSharedPlugin.js +14 -14
  406. package/lib/sharing/ConsumeSharedRuntimeModule.js +11 -8
  407. package/lib/sharing/ProvideSharedModule.js +9 -11
  408. package/lib/sharing/ProvideSharedModuleFactory.js +5 -3
  409. package/lib/sharing/ProvideSharedPlugin.js +15 -10
  410. package/lib/sharing/SharePlugin.js +3 -4
  411. package/lib/sharing/ShareRuntimeModule.js +7 -6
  412. package/lib/sharing/resolveMatchedConfigs.js +27 -13
  413. package/lib/sharing/utils.js +37 -43
  414. package/lib/stats/DefaultStatsFactoryPlugin.js +455 -286
  415. package/lib/stats/DefaultStatsPresetPlugin.js +77 -46
  416. package/lib/stats/DefaultStatsPrinterPlugin.js +583 -419
  417. package/lib/stats/StatsFactory.js +75 -32
  418. package/lib/stats/StatsPrinter.js +71 -51
  419. package/lib/url/URLParserPlugin.js +264 -0
  420. package/lib/util/ArrayHelpers.js +6 -8
  421. package/lib/util/ArrayQueue.js +1 -1
  422. package/lib/util/AsyncQueue.js +11 -10
  423. package/lib/util/Hash.js +37 -5
  424. package/lib/util/IterableHelpers.js +4 -4
  425. package/lib/util/LazyBucketSortedSet.js +46 -27
  426. package/lib/util/LazySet.js +16 -10
  427. package/lib/util/MapHelpers.js +1 -1
  428. package/lib/util/ParallelismFactorCalculator.js +2 -2
  429. package/lib/util/Semaphore.js +3 -3
  430. package/lib/util/SetHelpers.js +6 -6
  431. package/lib/util/SortableSet.js +11 -9
  432. package/lib/util/StackedCacheMap.js +2 -2
  433. package/lib/util/StackedMap.js +3 -3
  434. package/lib/util/StringXor.js +2 -1
  435. package/lib/util/TupleQueue.js +11 -8
  436. package/lib/util/TupleSet.js +44 -19
  437. package/lib/util/URLAbsoluteSpecifier.js +3 -4
  438. package/lib/util/WeakTupleMap.js +56 -42
  439. package/lib/util/binarySearchBounds.js +4 -3
  440. package/lib/util/chainedImports.js +3 -1
  441. package/lib/util/cleverMerge.js +171 -107
  442. package/lib/util/comparators.js +265 -162
  443. package/lib/util/compileBooleanMatcher.js +120 -41
  444. package/lib/util/concatenate.js +20 -16
  445. package/lib/util/conventions.js +73 -74
  446. package/lib/util/create-schema-validation.js +8 -8
  447. package/lib/util/createHash.js +32 -135
  448. package/lib/util/dataURL.js +39 -0
  449. package/lib/util/deprecation.js +119 -116
  450. package/lib/util/deterministicGrouping.js +56 -47
  451. package/lib/util/extractSourceMap.js +319 -0
  452. package/lib/util/extractUrlAndGlobal.js +1 -1
  453. package/lib/util/findGraphRoots.js +19 -9
  454. package/lib/util/fs.js +169 -141
  455. package/lib/util/hash/BatchedHash.js +50 -10
  456. package/lib/util/hash/BulkUpdateHash.js +138 -0
  457. package/lib/util/hash/DebugHash.js +75 -0
  458. package/lib/util/hash/hash-digest.js +216 -0
  459. package/lib/util/hash/md4.js +2 -2
  460. package/lib/util/hash/wasm-hash.js +59 -17
  461. package/lib/util/identifier.js +124 -61
  462. package/lib/util/internalSerializables.js +4 -6
  463. package/lib/util/magicComment.js +9 -5
  464. package/lib/util/makeSerializable.js +2 -2
  465. package/lib/util/memoize.js +5 -2
  466. package/lib/util/objectToMap.js +3 -2
  467. package/lib/util/processAsyncTree.js +5 -5
  468. package/lib/util/propertyAccess.js +1 -1
  469. package/lib/util/propertyName.js +2 -3
  470. package/lib/util/registerExternalSerializer.js +16 -20
  471. package/lib/util/removeBOM.js +25 -0
  472. package/lib/util/runtime.js +72 -56
  473. package/lib/util/semver.js +44 -33
  474. package/lib/util/serialization.js +56 -56
  475. package/lib/util/smartGrouping.js +42 -27
  476. package/lib/util/source.js +5 -4
  477. package/lib/util/traverseDestructuringAssignmentProperties.js +45 -0
  478. package/lib/validateSchema.js +7 -9
  479. package/lib/wasm/EnableWasmLoadingPlugin.js +22 -12
  480. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +9 -5
  481. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +15 -3
  482. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +28 -22
  483. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +47 -57
  484. package/lib/wasm-async/AsyncWebAssemblyParser.js +2 -10
  485. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +8 -4
  486. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +23 -17
  487. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +55 -57
  488. package/lib/wasm-sync/WebAssemblyGenerator.js +56 -41
  489. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +6 -3
  490. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +25 -10
  491. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +11 -12
  492. package/lib/wasm-sync/WebAssemblyParser.js +10 -17
  493. package/lib/wasm-sync/WebAssemblyUtils.js +1 -1
  494. package/lib/web/FetchCompileAsyncWasmPlugin.js +4 -4
  495. package/lib/web/FetchCompileWasmPlugin.js +6 -8
  496. package/lib/web/JsonpChunkLoadingPlugin.js +74 -74
  497. package/lib/web/JsonpChunkLoadingRuntimeModule.js +10 -26
  498. package/lib/web/JsonpTemplatePlugin.js +0 -1
  499. package/lib/webpack.js +107 -87
  500. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +79 -75
  501. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +38 -51
  502. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -0
  503. package/module.d.ts +5 -0
  504. package/package.json +149 -129
  505. package/schemas/WebpackOptions.check.d.ts +1 -1
  506. package/schemas/WebpackOptions.check.js +2 -2
  507. package/schemas/WebpackOptions.json +543 -190
  508. package/schemas/plugins/BannerPlugin.check.d.ts +1 -1
  509. package/schemas/plugins/BannerPlugin.check.js +2 -2
  510. package/schemas/plugins/BannerPlugin.json +4 -0
  511. package/schemas/plugins/DllPlugin.check.d.ts +1 -1
  512. package/schemas/plugins/DllPlugin.check.js +1 -1
  513. package/schemas/plugins/DllReferencePlugin.check.d.ts +1 -1
  514. package/schemas/plugins/DllReferencePlugin.check.js +1 -1
  515. package/schemas/plugins/IgnorePlugin.check.d.ts +1 -1
  516. package/schemas/plugins/IgnorePlugin.check.js +1 -1
  517. package/schemas/plugins/IgnorePlugin.json +1 -1
  518. package/schemas/plugins/LoaderOptionsPlugin.check.d.ts +1 -1
  519. package/schemas/plugins/LoaderOptionsPlugin.check.js +1 -1
  520. package/schemas/plugins/{HashedModuleIdsPlugin.check.d.ts → ManifestPlugin.check.d.ts} +2 -2
  521. package/schemas/plugins/ManifestPlugin.check.js +6 -0
  522. package/schemas/plugins/ManifestPlugin.json +98 -0
  523. package/schemas/plugins/ProgressPlugin.check.d.ts +1 -1
  524. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  525. package/schemas/plugins/ProgressPlugin.json +1 -1
  526. package/schemas/plugins/SourceMapDevToolPlugin.check.d.ts +1 -1
  527. package/schemas/plugins/SourceMapDevToolPlugin.check.js +2 -2
  528. package/schemas/plugins/SourceMapDevToolPlugin.json +23 -6
  529. package/schemas/plugins/WatchIgnorePlugin.check.d.ts +1 -1
  530. package/schemas/plugins/WatchIgnorePlugin.check.js +1 -1
  531. package/schemas/plugins/asset/AssetGeneratorOptions.check.d.ts +1 -1
  532. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  533. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.d.ts +1 -1
  534. package/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js +1 -1
  535. package/schemas/plugins/asset/AssetParserOptions.check.d.ts +1 -1
  536. package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
  537. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.d.ts +1 -1
  538. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  539. package/schemas/plugins/container/ContainerPlugin.check.d.ts +1 -1
  540. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  541. package/schemas/plugins/container/ContainerReferencePlugin.check.d.ts +1 -1
  542. package/schemas/plugins/container/ContainerReferencePlugin.check.js +2 -2
  543. package/schemas/plugins/container/ContainerReferencePlugin.json +4 -1
  544. package/schemas/plugins/container/ExternalsType.check.d.ts +1 -1
  545. package/schemas/plugins/container/ExternalsType.check.js +2 -2
  546. package/schemas/plugins/container/ModuleFederationPlugin.check.d.ts +1 -1
  547. package/schemas/plugins/container/ModuleFederationPlugin.check.js +2 -2
  548. package/schemas/plugins/container/ModuleFederationPlugin.json +4 -1
  549. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +1 -1
  550. package/schemas/plugins/css/CssGeneratorOptions.check.js +1 -1
  551. package/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts +1 -1
  552. package/schemas/plugins/css/CssModuleGeneratorOptions.check.js +2 -2
  553. package/schemas/plugins/css/CssModuleParserOptions.check.d.ts +1 -1
  554. package/schemas/plugins/css/CssModuleParserOptions.check.js +2 -2
  555. package/schemas/plugins/css/CssParserOptions.check.d.ts +1 -1
  556. package/schemas/plugins/css/CssParserOptions.check.js +2 -2
  557. package/schemas/plugins/debug/ProfilingPlugin.check.d.ts +1 -1
  558. package/schemas/plugins/debug/ProfilingPlugin.check.js +1 -1
  559. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.d.ts +7 -0
  560. package/schemas/plugins/ids/HashedModuleIdsPlugin.check.js +6 -0
  561. package/schemas/plugins/{HashedModuleIdsPlugin.json → ids/HashedModuleIdsPlugin.json} +15 -2
  562. package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.d.ts +1 -1
  563. package/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js +1 -1
  564. package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.d.ts +1 -1
  565. package/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.js +1 -1
  566. package/schemas/plugins/{css/CssGlobalParserOptions.check.d.ts → json/JsonModulesPluginGenerator.check.d.ts} +1 -1
  567. package/schemas/plugins/json/JsonModulesPluginGenerator.check.js +6 -0
  568. package/schemas/plugins/json/JsonModulesPluginGenerator.json +3 -0
  569. package/schemas/plugins/{css/CssGlobalGeneratorOptions.check.d.ts → json/JsonModulesPluginParser.check.d.ts} +1 -1
  570. package/schemas/plugins/json/JsonModulesPluginParser.check.js +6 -0
  571. package/schemas/plugins/json/JsonModulesPluginParser.json +3 -0
  572. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.d.ts +1 -1
  573. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
  574. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.d.ts +1 -1
  575. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
  576. package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.d.ts +1 -1
  577. package/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.js +1 -1
  578. package/schemas/plugins/optimize/MinChunkSizePlugin.check.d.ts +1 -1
  579. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
  580. package/schemas/plugins/schemes/HttpUriPlugin.check.d.ts +1 -1
  581. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  582. package/schemas/plugins/schemes/VirtualUrlPlugin.check.d.ts +7 -0
  583. package/schemas/plugins/schemes/VirtualUrlPlugin.check.js +6 -0
  584. package/schemas/plugins/schemes/VirtualUrlPlugin.json +77 -0
  585. package/schemas/plugins/sharing/ConsumeSharedPlugin.check.d.ts +1 -1
  586. package/schemas/plugins/sharing/ConsumeSharedPlugin.check.js +1 -1
  587. package/schemas/plugins/sharing/ProvideSharedPlugin.check.d.ts +1 -1
  588. package/schemas/plugins/sharing/ProvideSharedPlugin.check.js +1 -1
  589. package/schemas/plugins/sharing/SharePlugin.check.d.ts +1 -1
  590. package/schemas/plugins/sharing/SharePlugin.check.js +1 -1
  591. package/types.d.ts +5115 -1863
  592. package/SECURITY.md +0 -9
  593. package/lib/ModuleSourceTypesConstants.js +0 -112
  594. package/lib/dependencies/CssLocalIdentifierDependency.js +0 -250
  595. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +0 -111
  596. package/lib/library/ModernModuleLibraryPlugin.js +0 -144
  597. package/schemas/plugins/HashedModuleIdsPlugin.check.js +0 -6
  598. package/schemas/plugins/JsonModulesPluginParser.check.d.ts +0 -7
  599. package/schemas/plugins/JsonModulesPluginParser.check.js +0 -6
  600. package/schemas/plugins/JsonModulesPluginParser.json +0 -12
  601. package/schemas/plugins/css/CssAutoGeneratorOptions.check.d.ts +0 -7
  602. package/schemas/plugins/css/CssAutoGeneratorOptions.check.js +0 -6
  603. package/schemas/plugins/css/CssAutoGeneratorOptions.json +0 -3
  604. package/schemas/plugins/css/CssAutoParserOptions.check.d.ts +0 -7
  605. package/schemas/plugins/css/CssAutoParserOptions.check.js +0 -6
  606. package/schemas/plugins/css/CssAutoParserOptions.json +0 -3
  607. package/schemas/plugins/css/CssGlobalGeneratorOptions.check.js +0 -6
  608. package/schemas/plugins/css/CssGlobalGeneratorOptions.json +0 -3
  609. package/schemas/plugins/css/CssGlobalParserOptions.check.js +0 -6
  610. package/schemas/plugins/css/CssGlobalParserOptions.json +0 -3
@@ -5,42 +5,62 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const { ReplaceSource, RawSource, ConcatSource } = require("webpack-sources");
8
+ const { ConcatSource, RawSource, ReplaceSource } = require("webpack-sources");
9
9
  const { UsageState } = require("../ExportsInfo");
10
10
  const Generator = require("../Generator");
11
11
  const InitFragment = require("../InitFragment");
12
12
  const {
13
- JS_AND_CSS_EXPORT_TYPES,
14
- JS_AND_CSS_TYPES
15
- } = require("../ModuleSourceTypesConstants");
13
+ CSS_TYPE,
14
+ CSS_TYPES,
15
+ JAVASCRIPT_AND_CSS_TYPES,
16
+ JAVASCRIPT_TYPE,
17
+ JAVASCRIPT_TYPES
18
+ } = require("../ModuleSourceTypeConstants");
16
19
  const RuntimeGlobals = require("../RuntimeGlobals");
17
20
  const Template = require("../Template");
21
+ const CssImportDependency = require("../dependencies/CssImportDependency");
22
+ const { getUndoPath } = require("../util/identifier");
23
+ const memoize = require("../util/memoize");
18
24
 
19
25
  /** @typedef {import("webpack-sources").Source} Source */
20
- /** @typedef {import("../../declarations/WebpackOptions").CssAutoGeneratorOptions} CssAutoGeneratorOptions */
21
- /** @typedef {import("../../declarations/WebpackOptions").CssGlobalGeneratorOptions} CssGlobalGeneratorOptions */
22
26
  /** @typedef {import("../../declarations/WebpackOptions").CssModuleGeneratorOptions} CssModuleGeneratorOptions */
27
+ /** @typedef {import("../Compilation").DependencyConstructor} DependencyConstructor */
23
28
  /** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */
24
29
  /** @typedef {import("../Dependency")} Dependency */
25
30
  /** @typedef {import("../DependencyTemplate").CssData} CssData */
26
31
  /** @typedef {import("../DependencyTemplate").CssDependencyTemplateContext} DependencyTemplateContext */
27
32
  /** @typedef {import("../Generator").GenerateContext} GenerateContext */
28
33
  /** @typedef {import("../Generator").UpdateHashContext} UpdateHashContext */
34
+ /** @typedef {import("../Module").BuildInfo} BuildInfo */
35
+ /** @typedef {import("../Module").BuildMeta} BuildMeta */
29
36
  /** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
37
+ /** @typedef {import("../Module").SourceType} SourceType */
30
38
  /** @typedef {import("../Module").SourceTypes} SourceTypes */
39
+ /** @typedef {import("../ModuleGraph")} ModuleGraph */
31
40
  /** @typedef {import("../NormalModule")} NormalModule */
32
41
  /** @typedef {import("../util/Hash")} Hash */
42
+ /** @typedef {import("./CssModulesPlugin").ModuleFactoryCacheEntry} ModuleFactoryCacheEntry */
43
+ /** @typedef {import("../CssModule")} CssModule */
44
+ /** @typedef {import("../Compilation")} Compilation */
45
+ /** @typedef {import("../Module").RuntimeRequirements} RuntimeRequirements */
46
+ /** @typedef {import("../../declarations/WebpackOptions").CssParserExportType} CssParserExportType */
47
+
48
+ const getPropertyName = memoize(() => require("../util/propertyName"));
49
+ const getCssModulesPlugin = memoize(() => require("./CssModulesPlugin"));
33
50
 
34
51
  class CssGenerator extends Generator {
35
52
  /**
36
- * @param {CssAutoGeneratorOptions | CssGlobalGeneratorOptions | CssModuleGeneratorOptions} options options
53
+ * @param {CssModuleGeneratorOptions} options options
54
+ * @param {ModuleGraph} moduleGraph the module graph
37
55
  */
38
- constructor(options) {
56
+ constructor(options, moduleGraph) {
39
57
  super();
40
- this.convention = options.exportsConvention;
41
- this.localIdentName = options.localIdentName;
42
- this.exportsOnly = options.exportsOnly;
43
- this.esModule = options.esModule;
58
+ this.options = options;
59
+ this._exportsOnly = options.exportsOnly;
60
+ this._esModule = options.esModule;
61
+ this._moduleGraph = moduleGraph;
62
+ /** @type {WeakMap<Source, ModuleFactoryCacheEntry>} */
63
+ this._moduleFactoryCache = new WeakMap();
44
64
  }
45
65
 
46
66
  /**
@@ -49,7 +69,7 @@ class CssGenerator extends Generator {
49
69
  * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated
50
70
  */
51
71
  getConcatenationBailoutReason(module, context) {
52
- if (!this.esModule) {
72
+ if (!this._esModule) {
53
73
  return "Module is not an ECMAScript module";
54
74
  }
55
75
 
@@ -57,24 +77,117 @@ class CssGenerator extends Generator {
57
77
  }
58
78
 
59
79
  /**
60
- * @param {NormalModule} module module for which the code should be generated
61
- * @param {GenerateContext} generateContext context for generate
62
- * @returns {Source | null} generated code
80
+ * Generate JavaScript code that requires and concatenates all CSS imports
81
+ * @param {NormalModule} module the module to generate CSS text for
82
+ * @param {GenerateContext} generateContext the generate context
83
+ * @returns {{ expr: string, type: CssParserExportType }[]} JavaScript code that concatenates all imported CSS
63
84
  */
64
- generate(module, generateContext) {
65
- const source =
66
- generateContext.type === "javascript"
67
- ? new ReplaceSource(new RawSource(""))
68
- : new ReplaceSource(/** @type {Source} */ (module.originalSource()));
85
+ _generateImportCode(module, generateContext) {
86
+ const moduleGraph = generateContext.moduleGraph;
87
+ /** @type {{ expr: string, type: CssParserExportType }[]} */
88
+ const parts = [];
69
89
 
70
- /** @type {InitFragment<GenerateContext>[]} */
71
- const initFragments = [];
72
- /** @type {CssData} */
73
- const cssData = {
74
- esModule: this.esModule,
75
- exports: new Map()
76
- };
90
+ // Iterate through module.dependencies to maintain source order
91
+ for (const dep of module.dependencies) {
92
+ if (dep instanceof CssImportDependency) {
93
+ /** @type {CssModule} */
94
+ const depModule = /** @type {CssModule} */ (moduleGraph.getModule(dep));
95
+ const importVar = generateContext.runtimeTemplate.moduleExports({
96
+ module: depModule,
97
+ chunkGraph: generateContext.chunkGraph,
98
+ request: /** @type {CssModule} */ (depModule).userRequest,
99
+ weak: false,
100
+ runtimeRequirements: generateContext.runtimeRequirements
101
+ });
102
+
103
+ generateContext.runtimeRequirements.add(
104
+ RuntimeGlobals.compatGetDefaultExport
105
+ );
106
+ parts.push({
107
+ expr: `(${RuntimeGlobals.compatGetDefaultExport}(${importVar})() || "")`,
108
+ type: /** @type {CssParserExportType} */ (
109
+ /** @type {BuildMeta} */ (depModule.buildMeta).exportType
110
+ )
111
+ });
112
+ }
113
+ }
114
+
115
+ return parts;
116
+ }
117
+
118
+ /**
119
+ * Generate CSS code for the current module
120
+ * @param {NormalModule} module the module to generate CSS code for
121
+ * @param {GenerateContext} generateContext the generate context
122
+ * @returns {string} the CSS code as string
123
+ */
124
+ _generateModuleCode(module, generateContext) {
125
+ const moduleSourceContent = /** @type {Source} */ (
126
+ this.generate(module, {
127
+ ...generateContext,
128
+ type: CSS_TYPE
129
+ })
130
+ );
131
+
132
+ if (!moduleSourceContent) {
133
+ return "";
134
+ }
135
+
136
+ const compilation = generateContext.runtimeTemplate.compilation;
137
+ const { path: filename } = compilation.getPathWithInfo(
138
+ compilation.outputOptions.cssChunkFilename,
139
+ {
140
+ runtime: generateContext.runtime,
141
+ contentHashType: "css"
142
+ }
143
+ );
144
+ const undoPath = getUndoPath(
145
+ filename,
146
+ compilation.outputOptions.path,
147
+ false
148
+ );
149
+
150
+ const CssModulesPlugin = getCssModulesPlugin();
151
+ const hooks = CssModulesPlugin.getCompilationHooks(compilation);
152
+ const renderedSource = CssModulesPlugin.renderModule(
153
+ /** @type {CssModule} */ (module),
154
+ {
155
+ undoPath,
156
+ moduleSourceContent,
157
+ moduleFactoryCache: this._moduleFactoryCache,
158
+ runtimeTemplate: generateContext.runtimeTemplate
159
+ },
160
+ hooks
161
+ );
162
+
163
+ if (!renderedSource) {
164
+ return "";
165
+ }
166
+
167
+ const content = renderedSource.source();
168
+ return typeof content === "string" ? content : content.toString("utf8");
169
+ }
77
170
 
171
+ /**
172
+ * @param {NormalModule} module the current module
173
+ * @param {Dependency} dependency the dependency to generate
174
+ * @param {InitFragment<GenerateContext>[]} initFragments mutable list of init fragments
175
+ * @param {ReplaceSource} source the current replace source which can be modified
176
+ * @param {GenerateContext & { cssData: CssData }} generateContext the render context
177
+ * @returns {void}
178
+ */
179
+ sourceDependency(module, dependency, initFragments, source, generateContext) {
180
+ const constructor =
181
+ /** @type {DependencyConstructor} */
182
+ (dependency.constructor);
183
+ const template = generateContext.dependencyTemplates.get(constructor);
184
+ if (!template) {
185
+ throw new Error(
186
+ `No template for dependency: ${dependency.constructor.name}`
187
+ );
188
+ }
189
+
190
+ /** @type {DependencyTemplateContext} */
78
191
  /** @type {InitFragment<GenerateContext>[] | undefined} */
79
192
  let chunkInitFragments;
80
193
  /** @type {DependencyTemplateContext} */
@@ -91,7 +204,8 @@ class CssGenerator extends Generator {
91
204
  /** @type {CodeGenerationResults} */
92
205
  (generateContext.codeGenerationResults),
93
206
  initFragments,
94
- cssData,
207
+ cssData: generateContext.cssData,
208
+ type: generateContext.type,
95
209
  get chunkInitFragments() {
96
210
  if (!chunkInitFragments) {
97
211
  const data =
@@ -108,36 +222,149 @@ class CssGenerator extends Generator {
108
222
  }
109
223
  };
110
224
 
111
- /**
112
- * @param {Dependency} dependency dependency
113
- */
114
- const handleDependency = dependency => {
115
- const constructor =
116
- /** @type {new (...args: EXPECTED_ANY[]) => Dependency} */
117
- (dependency.constructor);
118
- const template = generateContext.dependencyTemplates.get(constructor);
119
- if (!template) {
120
- throw new Error(
121
- `No template for dependency: ${dependency.constructor.name}`
225
+ template.apply(dependency, source, templateContext);
226
+ }
227
+
228
+ /**
229
+ * @param {NormalModule} module the module to generate
230
+ * @param {InitFragment<GenerateContext>[]} initFragments mutable list of init fragments
231
+ * @param {ReplaceSource} source the current replace source which can be modified
232
+ * @param {GenerateContext & { cssData: CssData }} generateContext the generateContext
233
+ * @returns {void}
234
+ */
235
+ sourceModule(module, initFragments, source, generateContext) {
236
+ for (const dependency of module.dependencies) {
237
+ this.sourceDependency(
238
+ module,
239
+ dependency,
240
+ initFragments,
241
+ source,
242
+ generateContext
243
+ );
244
+ }
245
+
246
+ if (module.presentationalDependencies !== undefined) {
247
+ for (const dependency of module.presentationalDependencies) {
248
+ this.sourceDependency(
249
+ module,
250
+ dependency,
251
+ initFragments,
252
+ source,
253
+ generateContext
122
254
  );
123
255
  }
256
+ }
257
+ }
124
258
 
125
- template.apply(dependency, source, templateContext);
259
+ /**
260
+ * @param {NormalModule} module module for which the code should be generated
261
+ * @param {GenerateContext} generateContext context for generate
262
+ * @returns {Source | null} generated code
263
+ */
264
+ generate(module, generateContext) {
265
+ const exportType = /** @type {BuildMeta} */ (module.buildMeta).exportType;
266
+ const source =
267
+ generateContext.type === JAVASCRIPT_TYPE
268
+ ? exportType === "link"
269
+ ? new ReplaceSource(new RawSource(""))
270
+ : new ReplaceSource(/** @type {Source} */ (module.originalSource()))
271
+ : new ReplaceSource(/** @type {Source} */ (module.originalSource()));
272
+ /** @type {InitFragment<GenerateContext>[]} */
273
+ const initFragments = [];
274
+ /** @type {CssData} */
275
+ const cssData = {
276
+ esModule: /** @type {boolean} */ (this._esModule),
277
+ exports: new Map()
126
278
  };
127
279
 
128
- for (const dependency of module.dependencies) {
129
- handleDependency(dependency);
130
- }
280
+ this.sourceModule(module, initFragments, source, {
281
+ ...generateContext,
282
+ cssData
283
+ });
284
+
285
+ const generateCssText = () => {
286
+ const importCode = this._generateImportCode(module, generateContext);
287
+ const moduleCode = this._generateModuleCode(module, generateContext);
288
+
289
+ if (importCode.length > 0) {
290
+ if (
291
+ exportType === "css-style-sheet" ||
292
+ importCode.some((part) => part.type !== exportType)
293
+ ) {
294
+ generateContext.runtimeRequirements.add(
295
+ RuntimeGlobals.cssMergeStyleSheets
296
+ );
297
+
298
+ return `${RuntimeGlobals.cssMergeStyleSheets}([${[...importCode.map((part) => part.expr), JSON.stringify(moduleCode)].join(", ")}])`;
299
+ }
300
+ return generateContext.runtimeTemplate.concatenation(
301
+ ...importCode,
302
+ moduleCode
303
+ );
304
+ }
305
+ return JSON.stringify(moduleCode);
306
+ };
307
+
308
+ /**
309
+ * @returns {string | null} the default export
310
+ */
311
+ const generateJSDefaultExport = () => {
312
+ switch (exportType) {
313
+ case "text": {
314
+ return generateCssText();
315
+ }
316
+ case "css-style-sheet": {
317
+ const constOrVar = generateContext.runtimeTemplate.renderConst();
318
+ return `(${generateContext.runtimeTemplate.basicFunction("", [
319
+ `${constOrVar} cssText = ${generateCssText()};`,
320
+ `${constOrVar} sheet = new CSSStyleSheet();`,
321
+ "sheet.replaceSync(cssText);",
322
+ "return sheet;"
323
+ ])})()`;
324
+ }
325
+ default:
326
+ return null;
327
+ }
328
+ };
131
329
 
132
330
  switch (generateContext.type) {
133
- case "javascript": {
134
- module.buildInfo.cssData = cssData;
331
+ case JAVASCRIPT_TYPE: {
332
+ const isCSSModule = /** @type {BuildMeta} */ (module.buildMeta)
333
+ .isCSSModule;
334
+ const defaultExport = generateJSDefaultExport();
335
+ /**
336
+ * @param {string} name the export name
337
+ * @param {string} value the export value
338
+ * @returns {string} the value to be used in the export
339
+ */
340
+ const stringifyExportValue = (name, value) => {
341
+ if (defaultExport) {
342
+ return name === "default" ? value : JSON.stringify(value);
343
+ }
344
+ return JSON.stringify(value);
345
+ };
135
346
 
136
- generateContext.runtimeRequirements.add(RuntimeGlobals.module);
347
+ /** @type {BuildInfo} */
348
+ (module.buildInfo).cssData = cssData;
349
+
350
+ // Required for HMR
351
+ if (module.hot) {
352
+ generateContext.runtimeRequirements.add(RuntimeGlobals.module);
353
+ }
354
+
355
+ if (defaultExport) {
356
+ cssData.exports.set("default", /** @type {string} */ (defaultExport));
357
+ }
358
+
359
+ if (cssData.exports.size === 0 && !isCSSModule) {
360
+ return new RawSource("");
361
+ }
137
362
 
138
363
  if (generateContext.concatenationScope) {
139
364
  const source = new ConcatSource();
140
365
  const usedIdentifiers = new Set();
366
+ const { RESERVED_IDENTIFIER } = getPropertyName();
367
+
141
368
  for (const [name, v] of cssData.exports) {
142
369
  const usedName = generateContext.moduleGraph
143
370
  .getExportInfo(module, name)
@@ -145,30 +372,27 @@ class CssGenerator extends Generator {
145
372
  if (!usedName) {
146
373
  continue;
147
374
  }
375
+
148
376
  let identifier = Template.toIdentifier(usedName);
149
- const { RESERVED_IDENTIFIER } = require("../util/propertyName");
150
377
  if (RESERVED_IDENTIFIER.has(identifier)) {
151
378
  identifier = `_${identifier}`;
152
379
  }
153
- const i = 0;
380
+ let i = 0;
154
381
  while (usedIdentifiers.has(identifier)) {
155
382
  identifier = Template.toIdentifier(name + i);
383
+ i += 1;
156
384
  }
157
385
  usedIdentifiers.add(identifier);
158
386
  generateContext.concatenationScope.registerExport(name, identifier);
159
387
  source.add(
160
- `${
161
- generateContext.runtimeTemplate.supportsConst()
162
- ? "const"
163
- : "var"
164
- } ${identifier} = ${JSON.stringify(v)};\n`
388
+ `${generateContext.runtimeTemplate.renderConst()} ${identifier} = ${stringifyExportValue(name, v)};\n`
165
389
  );
166
390
  }
167
391
  return source;
168
392
  }
169
393
 
170
394
  const needNsObj =
171
- this.esModule &&
395
+ this._esModule &&
172
396
  generateContext.moduleGraph
173
397
  .getExportsInfo(module)
174
398
  .otherExportsInfo.getUsed(generateContext.runtime) !==
@@ -180,10 +404,21 @@ class CssGenerator extends Generator {
180
404
  );
181
405
  }
182
406
 
407
+ // Should be after `concatenationScope` to allow module inlining
408
+ generateContext.runtimeRequirements.add(RuntimeGlobals.module);
409
+
410
+ if (!isCSSModule && !needNsObj) {
411
+ return new RawSource(
412
+ `${module.moduleArgument}.exports = ${defaultExport}`
413
+ );
414
+ }
415
+
183
416
  const exports = [];
184
417
 
185
418
  for (const [name, v] of cssData.exports) {
186
- exports.push(`\t${JSON.stringify(name)}: ${JSON.stringify(v)}`);
419
+ exports.push(
420
+ `\t${JSON.stringify(name)}: ${stringifyExportValue(name, v)}`
421
+ );
187
422
  }
188
423
 
189
424
  return new RawSource(
@@ -192,17 +427,36 @@ class CssGenerator extends Generator {
192
427
  }.exports = {\n${exports.join(",\n")}\n}${needNsObj ? ")" : ""};`
193
428
  );
194
429
  }
195
- case "css": {
196
- if (module.presentationalDependencies !== undefined) {
197
- for (const dependency of module.presentationalDependencies) {
198
- handleDependency(dependency);
199
- }
430
+ case CSS_TYPE: {
431
+ if (!this._generatesJsOnly(module)) {
432
+ generateContext.runtimeRequirements.add(RuntimeGlobals.hasCssModules);
200
433
  }
201
434
 
202
- generateContext.runtimeRequirements.add(RuntimeGlobals.hasCssModules);
203
-
204
435
  return InitFragment.addToSource(source, initFragments, generateContext);
205
436
  }
437
+ default:
438
+ return null;
439
+ }
440
+ }
441
+
442
+ /**
443
+ * @param {Error} error the error
444
+ * @param {NormalModule} module module for which the code should be generated
445
+ * @param {GenerateContext} generateContext context for generate
446
+ * @returns {Source | null} generated code
447
+ */
448
+ generateError(error, module, generateContext) {
449
+ switch (generateContext.type) {
450
+ case JAVASCRIPT_TYPE: {
451
+ return new RawSource(
452
+ `throw new Error(${JSON.stringify(error.message)});`
453
+ );
454
+ }
455
+ case CSS_TYPE: {
456
+ return new RawSource(`/**\n ${error.message} \n**/`);
457
+ }
458
+ default:
459
+ return null;
206
460
  }
207
461
  }
208
462
 
@@ -211,33 +465,57 @@ class CssGenerator extends Generator {
211
465
  * @returns {SourceTypes} available types (do not mutate)
212
466
  */
213
467
  getTypes(module) {
214
- // TODO, find a better way to prevent the original module from being removed after concatenation, maybe it is a bug
215
- return this.exportsOnly ? JS_AND_CSS_EXPORT_TYPES : JS_AND_CSS_TYPES;
468
+ if (this._generatesJsOnly(module)) {
469
+ return JAVASCRIPT_TYPES;
470
+ }
471
+ const sourceTypes = new Set();
472
+ const connections = this._moduleGraph.getIncomingConnections(module);
473
+ for (const connection of connections) {
474
+ if (connection.dependency instanceof CssImportDependency) {
475
+ continue;
476
+ }
477
+ if (!connection.originModule) {
478
+ continue;
479
+ }
480
+ if (connection.originModule.type.split("/")[0] !== CSS_TYPE) {
481
+ sourceTypes.add(JAVASCRIPT_TYPE);
482
+ }
483
+ }
484
+ if (sourceTypes.has(JAVASCRIPT_TYPE)) {
485
+ return JAVASCRIPT_AND_CSS_TYPES;
486
+ }
487
+ return CSS_TYPES;
216
488
  }
217
489
 
218
490
  /**
219
491
  * @param {NormalModule} module the module
220
- * @param {string=} type source type
492
+ * @param {SourceType=} type source type
221
493
  * @returns {number} estimate size of the module
222
494
  */
223
495
  getSize(module, type) {
224
496
  switch (type) {
225
- case "javascript": {
226
- if (!module.buildInfo.cssData) {
497
+ case JAVASCRIPT_TYPE: {
498
+ const cssData = /** @type {BuildInfo} */ (module.buildInfo).cssData;
499
+ if (!cssData) {
227
500
  return 42;
228
501
  }
229
-
230
- const exports = module.buildInfo.cssData.exports;
502
+ if (cssData.exports.size === 0) {
503
+ if (/** @type {BuildMeta} */ (module.buildMeta).isCSSModule) {
504
+ return 42;
505
+ }
506
+ return 0;
507
+ }
508
+ const exports = cssData.exports;
231
509
  const stringifiedExports = JSON.stringify(
232
- Array.from(exports).reduce((obj, [key, value]) => {
510
+ [...exports].reduce((obj, [key, value]) => {
233
511
  obj[key] = value;
234
512
  return obj;
235
- }, {})
513
+ }, /** @type {Record<string, string>} */ ({}))
236
514
  );
237
515
 
238
516
  return stringifiedExports.length + 42;
239
517
  }
240
- case "css": {
518
+ case CSS_TYPE: {
241
519
  const originalSource = module.originalSource();
242
520
 
243
521
  if (!originalSource) {
@@ -246,6 +524,8 @@ class CssGenerator extends Generator {
246
524
 
247
525
  return originalSource.size();
248
526
  }
527
+ default:
528
+ return 0;
249
529
  }
250
530
  }
251
531
 
@@ -254,7 +534,19 @@ class CssGenerator extends Generator {
254
534
  * @param {UpdateHashContext} updateHashContext context for updating hash
255
535
  */
256
536
  updateHash(hash, { module }) {
257
- hash.update(this.esModule.toString());
537
+ hash.update(/** @type {boolean} */ (this._esModule).toString());
538
+ }
539
+
540
+ /**
541
+ * @param {NormalModule} module module
542
+ * @returns {boolean} true if the module only outputs JavaScript
543
+ */
544
+ _generatesJsOnly(module) {
545
+ const exportType = /** @type {BuildMeta} */ (module.buildMeta).exportType;
546
+ return (
547
+ this._exportsOnly ||
548
+ /** @type {boolean} */ (exportType && exportType !== "link")
549
+ );
258
550
  }
259
551
  }
260
552