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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (669) hide show
  1. package/README.md +9 -11
  2. package/bin/webpack.js +12 -0
  3. package/changes.json +16 -24
  4. package/hot/dev-server.js +2 -0
  5. package/lib/APIPlugin.js +60 -35
  6. package/lib/AsyncDependenciesBlock.js +3 -0
  7. package/lib/AutomaticPrefetchPlugin.js +6 -1
  8. package/lib/BannerPlugin.js +13 -5
  9. package/lib/Cache.js +27 -5
  10. package/lib/CacheFacade.js +41 -0
  11. package/lib/Chunk.js +71 -25
  12. package/lib/ChunkGraph.js +153 -19
  13. package/lib/ChunkGroup.js +115 -28
  14. package/lib/ChunkTemplate.js +9 -0
  15. package/lib/CircularModulesPlugin.js +190 -0
  16. package/lib/CleanPlugin.js +27 -28
  17. package/lib/CodeGenerationResults.js +19 -0
  18. package/lib/CompatibilityPlugin.js +85 -37
  19. package/lib/Compilation.js +656 -112
  20. package/lib/Compiler.js +109 -35
  21. package/lib/ConcatenationScope.js +34 -4
  22. package/lib/ConditionalInitFragment.js +6 -0
  23. package/lib/ConstPlugin.js +15 -12
  24. package/lib/ContextExclusionPlugin.js +3 -1
  25. package/lib/ContextModule.js +345 -55
  26. package/lib/ContextModuleFactory.js +193 -51
  27. package/lib/ContextReplacementPlugin.js +8 -1
  28. package/lib/DefinePlugin.js +537 -139
  29. package/lib/DependenciesBlock.js +6 -1
  30. package/lib/Dependency.js +159 -11
  31. package/lib/DependencyTemplate.js +7 -1
  32. package/lib/DependencyTemplates.js +4 -0
  33. package/lib/DotenvPlugin.js +3 -0
  34. package/lib/DynamicEntryPlugin.js +3 -1
  35. package/lib/EntryOptionPlugin.js +42 -2
  36. package/lib/EntryPlugin.js +4 -1
  37. package/lib/Entrypoint.js +5 -1
  38. package/lib/EnvironmentPlugin.js +3 -2
  39. package/lib/ErrorHelpers.js +7 -0
  40. package/lib/EvalDevToolModulePlugin.js +3 -1
  41. package/lib/EvalSourceMapDevToolPlugin.js +11 -11
  42. package/lib/ExportsInfo.js +421 -113
  43. package/lib/ExportsInfoApiPlugin.js +4 -3
  44. package/lib/ExternalModule.js +381 -80
  45. package/lib/ExternalModuleFactoryPlugin.js +75 -3
  46. package/lib/ExternalsPlugin.js +3 -1
  47. package/lib/FileSystemInfo.js +701 -175
  48. package/lib/FlagAllModulesAsUsedPlugin.js +3 -6
  49. package/lib/FlagDependencyExportsPlugin.js +82 -9
  50. package/lib/FlagDependencyUsagePlugin.js +115 -8
  51. package/lib/FlagEntryExportAsUsedPlugin.js +4 -1
  52. package/lib/Generator.js +24 -3
  53. package/lib/HotModuleReplacementPlugin.js +110 -44
  54. package/lib/IgnorePlugin.js +5 -2
  55. package/lib/IgnoreWarningsPlugin.js +2 -1
  56. package/lib/InitFragment.js +33 -30
  57. package/lib/JavascriptMetaInfoPlugin.js +9 -6
  58. package/lib/LazyBarrel.js +389 -0
  59. package/lib/LibraryTemplatePlugin.js +2 -1
  60. package/lib/LoaderOptionsPlugin.js +3 -1
  61. package/lib/LoaderTargetPlugin.js +3 -1
  62. package/lib/MainTemplate.js +15 -0
  63. package/lib/ManifestPlugin.js +9 -2
  64. package/lib/Module.js +121 -57
  65. package/lib/ModuleFactory.js +6 -1
  66. package/lib/ModuleFilenameHelpers.js +18 -4
  67. package/lib/ModuleGraph.js +69 -2
  68. package/lib/ModuleGraphConnection.js +9 -0
  69. package/lib/ModuleInfoHeaderPlugin.js +5 -0
  70. package/lib/ModuleNotFoundError.js +3 -83
  71. package/lib/ModuleProfile.js +27 -1
  72. package/lib/ModuleSourceTypeConstants.js +52 -19
  73. package/lib/ModuleTemplate.js +10 -0
  74. package/lib/ModuleTypeConstants.js +20 -4
  75. package/lib/MultiCompiler.js +59 -4
  76. package/lib/MultiStats.js +9 -0
  77. package/lib/MultiWatching.js +6 -0
  78. package/lib/NoEmitOnErrorsPlugin.js +1 -1
  79. package/lib/NodeStuffPlugin.js +78 -46
  80. package/lib/NormalModule.js +519 -206
  81. package/lib/NormalModuleFactory.js +156 -31
  82. package/lib/NormalModuleReplacementPlugin.js +3 -1
  83. package/lib/NullFactory.js +1 -0
  84. package/lib/OptionsApply.js +1 -0
  85. package/lib/Parser.js +3 -1
  86. package/lib/PlatformPlugin.js +2 -1
  87. package/lib/PrefetchPlugin.js +4 -1
  88. package/lib/ProgressPlugin.js +351 -161
  89. package/lib/ProvidePlugin.js +6 -3
  90. package/lib/RawModule.js +32 -16
  91. package/lib/RecordIdsPlugin.js +9 -0
  92. package/lib/RequestShortener.js +8 -0
  93. package/lib/ResolverFactory.js +5 -0
  94. package/lib/RuntimeGlobals.js +58 -5
  95. package/lib/RuntimeModule.js +22 -7
  96. package/lib/RuntimePlugin.js +123 -118
  97. package/lib/RuntimeTemplate.js +616 -37
  98. package/lib/SelfModuleFactory.js +3 -0
  99. package/lib/SourceMapDevToolModuleOptionsPlugin.js +2 -0
  100. package/lib/SourceMapDevToolPlugin.js +341 -63
  101. package/lib/Stats.js +6 -0
  102. package/lib/Template.js +52 -6
  103. package/lib/TemplatedPathPlugin.js +505 -138
  104. package/lib/UseStrictPlugin.js +3 -2
  105. package/lib/WarnCaseSensitiveModulesPlugin.js +72 -3
  106. package/lib/WarnDeprecatedOptionPlugin.js +6 -2
  107. package/lib/WarnNoModeSetPlugin.js +18 -2
  108. package/lib/WatchIgnorePlugin.js +5 -1
  109. package/lib/Watching.js +25 -3
  110. package/lib/WebpackError.js +3 -74
  111. package/lib/WebpackIsIncludedPlugin.js +4 -2
  112. package/lib/WebpackOptionsApply.js +88 -25
  113. package/lib/WebpackOptionsDefaulter.js +1 -0
  114. package/lib/asset/AssetBytesGenerator.js +28 -10
  115. package/lib/asset/AssetBytesParser.js +1 -0
  116. package/lib/asset/AssetGenerator.js +199 -60
  117. package/lib/asset/AssetModule.js +47 -0
  118. package/lib/asset/AssetModulesPlugin.js +115 -24
  119. package/lib/asset/AssetParser.js +4 -2
  120. package/lib/asset/AssetSourceGenerator.js +26 -8
  121. package/lib/asset/AssetSourceParser.js +1 -0
  122. package/lib/asset/RawDataUrlModule.js +23 -13
  123. package/lib/asset/WebManifestGenerator.js +164 -0
  124. package/lib/asset/WebManifestParser.js +130 -0
  125. package/lib/async-modules/AsyncModuleHelpers.js +1 -0
  126. package/lib/async-modules/AwaitDependenciesInitFragment.js +18 -4
  127. package/lib/async-modules/InferAsyncModulesPlugin.js +1 -1
  128. package/lib/async-modules/isGeneratorLowered.js +26 -0
  129. package/lib/buildChunkGraph.js +107 -15
  130. package/lib/bun/BunTargetPlugin.js +42 -0
  131. package/lib/cache/AddBuildDependenciesPlugin.js +3 -1
  132. package/lib/cache/AddManagedPathsPlugin.js +5 -1
  133. package/lib/cache/IdleFileCachePlugin.js +6 -1
  134. package/lib/cache/MemoryCachePlugin.js +1 -1
  135. package/lib/cache/MemoryWithGcCachePlugin.js +4 -1
  136. package/lib/cache/PackFileCacheStrategy.js +302 -12
  137. package/lib/cache/ResolverCachePlugin.js +12 -1
  138. package/lib/cache/getLazyHashedEtag.js +13 -2
  139. package/lib/cache/mergeEtags.js +4 -0
  140. package/lib/cli.js +142 -20
  141. package/lib/config/browserslistTargetHandler.js +141 -0
  142. package/lib/config/defaults.js +612 -43
  143. package/lib/config/defineConfig.js +31 -0
  144. package/lib/config/normalization.js +46 -1
  145. package/lib/config/target.js +200 -2
  146. package/lib/container/ContainerEntryDependency.js +2 -0
  147. package/lib/container/ContainerEntryModule.js +27 -14
  148. package/lib/container/ContainerEntryModuleFactory.js +1 -0
  149. package/lib/container/ContainerExposedDependency.js +6 -2
  150. package/lib/container/ContainerPlugin.js +2 -1
  151. package/lib/container/ContainerReferencePlugin.js +3 -2
  152. package/lib/container/FallbackDependency.js +9 -7
  153. package/lib/container/FallbackItemDependency.js +1 -0
  154. package/lib/container/FallbackModule.js +22 -9
  155. package/lib/container/FallbackModuleFactory.js +1 -0
  156. package/lib/container/HoistContainerReferencesPlugin.js +47 -55
  157. package/lib/container/ModuleFederationPlugin.js +21 -29
  158. package/lib/container/RemoteModule.js +33 -10
  159. package/lib/container/RemoteRuntimeModule.js +15 -12
  160. package/lib/container/RemoteToExternalDependency.js +1 -0
  161. package/lib/container/options.js +7 -0
  162. package/lib/css/CssGenerator.js +540 -272
  163. package/lib/css/CssInjectStyleRuntimeModule.js +86 -70
  164. package/lib/css/CssLoadingRuntimeModule.js +173 -81
  165. package/lib/{CssModule.js → css/CssModule.js} +72 -37
  166. package/lib/css/CssModulesPlugin.js +371 -208
  167. package/lib/css/CssParser.js +3538 -1963
  168. package/lib/css/syntax.js +4155 -0
  169. package/lib/debug/ProfilingPlugin.js +33 -2
  170. package/lib/deno/DenoTargetPlugin.js +41 -0
  171. package/lib/dependencies/AMDDefineDependency.js +29 -17
  172. package/lib/dependencies/AMDDefineDependencyParserPlugin.js +19 -6
  173. package/lib/dependencies/AMDPlugin.js +6 -3
  174. package/lib/dependencies/AMDRequireArrayDependency.js +13 -11
  175. package/lib/dependencies/AMDRequireContextDependency.js +10 -11
  176. package/lib/dependencies/AMDRequireDependenciesBlock.js +1 -0
  177. package/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +28 -14
  178. package/lib/dependencies/AMDRequireDependency.js +28 -20
  179. package/lib/dependencies/AMDRequireItemDependency.js +1 -0
  180. package/lib/dependencies/AMDRuntimeModules.js +3 -0
  181. package/lib/dependencies/CachedConstDependency.js +9 -1
  182. package/lib/dependencies/CommonJsDependencyHelpers.js +104 -0
  183. package/lib/dependencies/CommonJsExportRequireDependency.js +157 -38
  184. package/lib/dependencies/CommonJsExportsDependency.js +74 -20
  185. package/lib/dependencies/CommonJsExportsParserPlugin.js +246 -15
  186. package/lib/dependencies/CommonJsFullRequireDependency.js +91 -27
  187. package/lib/dependencies/CommonJsImportsParserPlugin.js +189 -24
  188. package/lib/dependencies/CommonJsPlugin.js +7 -4
  189. package/lib/dependencies/CommonJsRequireContextDependency.js +13 -13
  190. package/lib/dependencies/CommonJsRequireDependency.js +135 -13
  191. package/lib/dependencies/CommonJsSelfReferenceDependency.js +60 -16
  192. package/lib/dependencies/ConstDependency.js +22 -12
  193. package/lib/dependencies/ContextDependency.js +13 -2
  194. package/lib/dependencies/ContextDependencyHelpers.js +7 -4
  195. package/lib/dependencies/ContextDependencyTemplateAsId.js +2 -1
  196. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +1 -0
  197. package/lib/dependencies/ContextElementDependency.js +27 -14
  198. package/lib/dependencies/CreateRequireParserPlugin.js +14 -7
  199. package/lib/dependencies/CreateScriptUrlDependency.js +9 -7
  200. package/lib/dependencies/CriticalDependencyWarning.js +3 -1
  201. package/lib/dependencies/CssIcssExportDependency.js +681 -367
  202. package/lib/dependencies/CssIcssImportDependency.js +62 -17
  203. package/lib/dependencies/CssIcssSymbolDependency.js +36 -17
  204. package/lib/dependencies/CssImportDependency.js +37 -1
  205. package/lib/dependencies/CssUrlDependency.js +87 -14
  206. package/lib/dependencies/DelegatedSourceDependency.js +1 -0
  207. package/lib/dependencies/DllEntryDependency.js +12 -13
  208. package/lib/dependencies/DynamicExports.js +5 -0
  209. package/lib/dependencies/EntryDependency.js +1 -0
  210. package/lib/dependencies/ExportBindingInitFragment.js +164 -0
  211. package/lib/dependencies/ExportsInfoDependency.js +18 -12
  212. package/lib/dependencies/ExternalModuleDependency.js +13 -5
  213. package/lib/dependencies/ExternalModuleInitFragment.js +10 -5
  214. package/lib/dependencies/ExternalModuleInitFragmentDependency.js +19 -12
  215. package/lib/dependencies/HarmonyAcceptDependency.js +24 -26
  216. package/lib/dependencies/HarmonyAcceptImportDependency.js +2 -0
  217. package/lib/dependencies/HarmonyCompatibilityDependency.js +33 -14
  218. package/lib/dependencies/HarmonyDetectionParserPlugin.js +108 -30
  219. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +34 -3
  220. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +70 -33
  221. package/lib/dependencies/HarmonyExportExpressionDependency.js +133 -43
  222. package/lib/dependencies/HarmonyExportHeaderDependency.js +11 -9
  223. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +268 -44
  224. package/lib/dependencies/HarmonyExportInitFragment.js +28 -20
  225. package/lib/dependencies/HarmonyExportSpecifierDependency.js +88 -18
  226. package/lib/dependencies/HarmonyExports.js +6 -1
  227. package/lib/dependencies/HarmonyImportDependency.js +60 -4
  228. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +139 -146
  229. package/lib/dependencies/HarmonyImportGuard.js +427 -0
  230. package/lib/dependencies/HarmonyImportSideEffectDependency.js +22 -1
  231. package/lib/dependencies/HarmonyImportSpecifierDependency.js +146 -24
  232. package/lib/{HarmonyLinkingError.js → dependencies/HarmonyLinkingError.js} +6 -3
  233. package/lib/dependencies/HarmonyModulesPlugin.js +11 -1
  234. package/lib/dependencies/HarmonyTopLevelThisParserPlugin.js +2 -1
  235. package/lib/dependencies/HtmlEntryDependency.js +1295 -0
  236. package/lib/dependencies/HtmlInlineHtmlDependency.js +107 -0
  237. package/lib/dependencies/HtmlInlineScriptDependency.js +126 -0
  238. package/lib/dependencies/HtmlInlineStyleDependency.js +152 -0
  239. package/lib/dependencies/HtmlSourceDependency.js +172 -0
  240. package/lib/dependencies/ImportContextDependency.js +9 -9
  241. package/lib/dependencies/ImportDependency.js +92 -3
  242. package/lib/dependencies/ImportEagerDependency.js +2 -0
  243. package/lib/dependencies/ImportMetaContextDependency.js +1 -0
  244. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +35 -19
  245. package/lib/dependencies/ImportMetaContextPlugin.js +40 -8
  246. package/lib/dependencies/ImportMetaGlobDependency.js +81 -0
  247. package/lib/dependencies/ImportMetaGlobDependencyParserPlugin.js +78 -0
  248. package/lib/dependencies/ImportMetaGlobHelpers.js +660 -0
  249. package/lib/dependencies/ImportMetaHotAcceptDependency.js +2 -0
  250. package/lib/dependencies/ImportMetaHotDeclineDependency.js +2 -0
  251. package/lib/dependencies/ImportMetaPlugin.js +595 -209
  252. package/lib/dependencies/ImportMetaResolveDependency.js +90 -0
  253. package/lib/dependencies/ImportParserPlugin.js +114 -27
  254. package/lib/dependencies/ImportPhase.js +17 -11
  255. package/lib/dependencies/ImportPlugin.js +2 -1
  256. package/lib/dependencies/ImportWeakDependency.js +3 -0
  257. package/lib/dependencies/JsonExportsDependency.js +15 -10
  258. package/lib/dependencies/LoaderDependency.js +2 -0
  259. package/lib/dependencies/LoaderImportDependency.js +3 -0
  260. package/lib/dependencies/LoaderPlugin.js +9 -2
  261. package/lib/dependencies/LocalModule.js +15 -12
  262. package/lib/dependencies/LocalModuleDependency.js +15 -13
  263. package/lib/dependencies/LocalModulesHelpers.js +3 -0
  264. package/lib/dependencies/ModuleDecoratorDependency.js +16 -10
  265. package/lib/dependencies/ModuleDependency.js +14 -0
  266. package/lib/dependencies/ModuleDependencyTemplateAsId.js +1 -0
  267. package/lib/dependencies/ModuleDependencyTemplateAsRequireId.js +1 -0
  268. package/lib/dependencies/ModuleHotAcceptDependency.js +2 -0
  269. package/lib/dependencies/ModuleHotDeclineDependency.js +2 -0
  270. package/lib/dependencies/ModuleInitFragmentDependency.js +19 -11
  271. package/lib/dependencies/NullDependency.js +2 -0
  272. package/lib/dependencies/PrefetchDependency.js +1 -0
  273. package/lib/dependencies/ProvidedDependency.js +36 -27
  274. package/lib/dependencies/PureExpressionDependency.js +14 -10
  275. package/lib/dependencies/RequireContextDependency.js +1 -0
  276. package/lib/dependencies/RequireContextDependencyParserPlugin.js +2 -1
  277. package/lib/dependencies/RequireContextPlugin.js +2 -1
  278. package/lib/dependencies/RequireEnsureDependenciesBlock.js +1 -0
  279. package/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js +4 -6
  280. package/lib/dependencies/RequireEnsureDependency.js +16 -13
  281. package/lib/dependencies/RequireEnsureItemDependency.js +1 -0
  282. package/lib/dependencies/RequireEnsurePlugin.js +2 -1
  283. package/lib/dependencies/RequireHeaderDependency.js +7 -4
  284. package/lib/dependencies/RequireIncludeDependency.js +2 -0
  285. package/lib/dependencies/RequireIncludeDependencyParserPlugin.js +11 -12
  286. package/lib/dependencies/RequireIncludePlugin.js +2 -1
  287. package/lib/{RequireJsStuffPlugin.js → dependencies/RequireJsStuffPlugin.js} +9 -8
  288. package/lib/dependencies/RequireResolveContextDependency.js +10 -11
  289. package/lib/dependencies/RequireResolveDependency.js +2 -0
  290. package/lib/dependencies/RequireResolveHeaderDependency.js +8 -5
  291. package/lib/dependencies/RuntimeRequirementsDependency.js +11 -8
  292. package/lib/dependencies/StaticExportsDependency.js +13 -10
  293. package/lib/dependencies/SystemPlugin.js +9 -6
  294. package/lib/dependencies/SystemRuntimeModule.js +1 -0
  295. package/lib/dependencies/TopLevelAwaitDependency.js +93 -0
  296. package/lib/dependencies/URLContextDependency.js +8 -7
  297. package/lib/dependencies/URLDependency.js +157 -33
  298. package/lib/dependencies/URLPlugin.js +2 -0
  299. package/lib/dependencies/UnsupportedDependency.js +12 -13
  300. package/lib/dependencies/WebAssemblyExportImportedDependency.js +15 -16
  301. package/lib/dependencies/WebAssemblyImportDependency.js +19 -18
  302. package/lib/dependencies/WebpackIsIncludedDependency.js +3 -0
  303. package/lib/dependencies/{WorkerPlugin.js → WorkerAndWorkletPlugin.js} +364 -114
  304. package/lib/dependencies/WorkerDependency.js +111 -27
  305. package/lib/dependencies/WorkletDependency.js +278 -0
  306. package/lib/dependencies/getFunctionExpression.js +1 -0
  307. package/lib/dependencies/processExportInfo.js +14 -11
  308. package/lib/{DelegatedModule.js → dll/DelegatedModule.js} +71 -44
  309. package/lib/{DelegatedModuleFactoryPlugin.js → dll/DelegatedModuleFactoryPlugin.js} +27 -4
  310. package/lib/{DelegatedPlugin.js → dll/DelegatedPlugin.js} +5 -3
  311. package/lib/{DllEntryPlugin.js → dll/DllEntryPlugin.js} +9 -5
  312. package/lib/{DllModule.js → dll/DllModule.js} +36 -24
  313. package/lib/{DllModuleFactory.js → dll/DllModuleFactory.js} +5 -4
  314. package/lib/{DllPlugin.js → dll/DllPlugin.js} +24 -6
  315. package/lib/{DllReferencePlugin.js → dll/DllReferencePlugin.js} +26 -18
  316. package/lib/{LibManifestPlugin.js → dll/LibManifestPlugin.js} +14 -10
  317. package/lib/electron/ElectronTargetPlugin.js +24 -5
  318. package/lib/{AbstractMethodError.js → errors/AbstractMethodError.js} +10 -1
  319. package/lib/{AsyncDependencyToInitialChunkError.js → errors/AsyncDependencyToInitialChunkError.js} +8 -3
  320. package/lib/errors/BuildCycleError.js +1 -1
  321. package/lib/{ChunkRenderError.js → errors/ChunkRenderError.js} +1 -1
  322. package/lib/{CodeGenerationError.js → errors/CodeGenerationError.js} +1 -1
  323. package/lib/{CommentCompilationWarning.js → errors/CommentCompilationWarning.js} +9 -3
  324. package/lib/{ConcurrentCompilationError.js → errors/ConcurrentCompilationError.js} +5 -2
  325. package/lib/{EnvironmentNotSupportAsyncWarning.js → errors/EnvironmentNotSupportAsyncWarning.js} +5 -5
  326. package/lib/{HookWebpackError.js → errors/HookWebpackError.js} +20 -16
  327. package/lib/{IgnoreErrorModuleFactory.js → errors/IgnoreErrorModuleFactory.js} +7 -4
  328. package/lib/{InvalidDependenciesModuleWarning.js → errors/InvalidDependenciesModuleWarning.js} +6 -3
  329. package/lib/errors/JSONParseError.js +115 -0
  330. package/lib/errors/LoaderLoadingError.js +20 -0
  331. package/lib/{ModuleBuildError.js → errors/ModuleBuildError.js} +22 -16
  332. package/lib/{ModuleDependencyError.js → errors/ModuleDependencyError.js} +10 -3
  333. package/lib/{ModuleDependencyWarning.js → errors/ModuleDependencyWarning.js} +13 -5
  334. package/lib/{ModuleError.js → errors/ModuleError.js} +10 -14
  335. package/lib/{ModuleHashingError.js → errors/ModuleHashingError.js} +5 -1
  336. package/lib/errors/ModuleNotFoundError.js +94 -0
  337. package/lib/errors/ModuleParseError.js +141 -0
  338. package/lib/{ModuleRestoreError.js → errors/ModuleRestoreError.js} +4 -1
  339. package/lib/{ModuleStoreError.js → errors/ModuleStoreError.js} +5 -1
  340. package/lib/{ModuleWarning.js → errors/ModuleWarning.js} +13 -14
  341. package/lib/{NodeStuffInWebError.js → errors/NodeStuffInWebError.js} +7 -5
  342. package/lib/errors/NonErrorEmittedError.js +30 -0
  343. package/lib/{UnhandledSchemeError.js → errors/UnhandledSchemeError.js} +9 -2
  344. package/lib/{UnsupportedFeatureWarning.js → errors/UnsupportedFeatureWarning.js} +4 -3
  345. package/lib/errors/WebpackError.js +84 -0
  346. package/lib/esm/ExportWebpackRequireRuntimeModule.js +2 -0
  347. package/lib/esm/ModuleChunkFormatPlugin.js +52 -15
  348. package/lib/esm/ModuleChunkLoadingPlugin.js +11 -3
  349. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +80 -52
  350. package/lib/hmr/HotModuleReplacement.runtime.js +175 -30
  351. package/lib/hmr/HotModuleReplacementRuntimeModule.js +8 -0
  352. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +173 -26
  353. package/lib/hmr/JavascriptHotModuleReplacementHelper.js +1 -0
  354. package/lib/hmr/LazyCompilationPlugin.js +154 -7
  355. package/lib/hmr/lazyCompilationBackend.js +53 -12
  356. package/lib/html/HtmlGenerator.js +1490 -0
  357. package/lib/html/HtmlModule.js +41 -0
  358. package/lib/html/HtmlModulesPlugin.js +1129 -0
  359. package/lib/html/HtmlParser.js +1970 -0
  360. package/lib/html/favicon.svg +1 -0
  361. package/lib/html/syntax.js +9106 -0
  362. package/lib/ids/ChunkModuleIdRangePlugin.js +3 -1
  363. package/lib/ids/DeterministicChunkIdsPlugin.js +3 -1
  364. package/lib/ids/DeterministicModuleIdsPlugin.js +3 -1
  365. package/lib/ids/HashedModuleIdsPlugin.js +2 -1
  366. package/lib/ids/IdHelpers.js +49 -12
  367. package/lib/ids/NamedChunkIdsPlugin.js +3 -1
  368. package/lib/ids/NamedModuleIdsPlugin.js +3 -1
  369. package/lib/ids/NaturalChunkIdsPlugin.js +1 -1
  370. package/lib/ids/NaturalModuleIdsPlugin.js +1 -1
  371. package/lib/ids/OccurrenceChunkIdsPlugin.js +2 -1
  372. package/lib/ids/OccurrenceModuleIdsPlugin.js +4 -1
  373. package/lib/ids/SyncModuleIdsPlugin.js +3 -1
  374. package/lib/index.js +66 -15
  375. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +5 -6
  376. package/lib/javascript/BasicEvaluatedExpression.js +370 -49
  377. package/lib/javascript/ChunkFormatHelpers.js +2 -1
  378. package/lib/javascript/ChunkHelpers.js +1 -0
  379. package/lib/javascript/CommonJsChunkFormatPlugin.js +1 -1
  380. package/lib/javascript/EnableChunkLoadingPlugin.js +6 -1
  381. package/lib/javascript/JavascriptGenerator.js +213 -51
  382. package/lib/javascript/JavascriptModule.js +54 -0
  383. package/lib/javascript/JavascriptModulesPlugin.js +628 -198
  384. package/lib/javascript/JavascriptParser.js +1334 -471
  385. package/lib/javascript/JavascriptParserHelpers.js +10 -7
  386. package/lib/javascript/StartupHelpers.js +5 -0
  387. package/lib/javascript/syntax.js +5037 -0
  388. package/lib/json/JsonData.js +5 -0
  389. package/lib/json/JsonGenerator.js +21 -0
  390. package/lib/json/JsonModule.js +40 -0
  391. package/lib/json/JsonModulesPlugin.js +8 -1
  392. package/lib/json/JsonParser.js +18 -27
  393. package/lib/library/AbstractLibraryPlugin.js +17 -2
  394. package/lib/library/AmdLibraryPlugin.js +8 -0
  395. package/lib/library/AssignLibraryPlugin.js +21 -3
  396. package/lib/library/EnableLibraryPlugin.js +8 -2
  397. package/lib/library/ExportPropertyLibraryPlugin.js +10 -0
  398. package/lib/{FalseIIFEUmdWarning.js → library/FalseIIFEUmdWarning.js} +2 -1
  399. package/lib/library/JsonpLibraryPlugin.js +8 -0
  400. package/lib/library/ModuleLibraryPlugin.js +154 -7
  401. package/lib/library/SystemLibraryPlugin.js +11 -3
  402. package/lib/library/UmdLibraryPlugin.js +16 -0
  403. package/lib/loaders/LoaderRunner.js +714 -0
  404. package/lib/loaders/loadLoader.js +100 -0
  405. package/lib/logging/Logger.js +17 -0
  406. package/lib/logging/createConsoleLogger.js +7 -0
  407. package/lib/logging/runtime.js +2 -0
  408. package/lib/logging/truncateArgs.js +2 -0
  409. package/lib/node/CommonJsChunkLoadingPlugin.js +5 -1
  410. package/lib/node/NodeEnvironmentPlugin.js +7 -3
  411. package/lib/node/NodeSourcePlugin.js +1 -1
  412. package/lib/node/NodeTargetPlugin.js +4 -63
  413. package/lib/node/NodeTemplatePlugin.js +3 -1
  414. package/lib/node/NodeWatchFileSystem.js +40 -22
  415. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +13 -9
  416. package/lib/node/ReadFileCompileAsyncWasmPlugin.js +33 -3
  417. package/lib/node/ReadFileCompileWasmPlugin.js +28 -3
  418. package/lib/node/RequireChunkLoadingRuntimeModule.js +21 -16
  419. package/lib/node/nodeBuiltins.js +80 -0
  420. package/lib/node/nodeConsole.js +116 -64
  421. package/lib/optimize/AggressiveMergingPlugin.js +22 -16
  422. package/lib/optimize/AggressiveSplittingPlugin.js +6 -1
  423. package/lib/optimize/ConcatenatedModule.js +603 -130
  424. package/lib/optimize/ConstExportsPlugin.js +211 -0
  425. package/lib/optimize/EnsureChunkConditionsPlugin.js +2 -1
  426. package/lib/optimize/FlagIncludedChunksPlugin.js +15 -4
  427. package/lib/optimize/InlineExports.js +178 -0
  428. package/lib/optimize/InnerGraph.js +374 -262
  429. package/lib/optimize/InnerGraphPlugin.js +246 -117
  430. package/lib/optimize/LimitChunkCountPlugin.js +9 -0
  431. package/lib/optimize/MangleExportsPlugin.js +5 -1
  432. package/lib/optimize/MergeDuplicateChunksPlugin.js +2 -0
  433. package/lib/optimize/MinChunkSizePlugin.js +2 -1
  434. package/lib/optimize/MinMaxSizeWarning.js +5 -4
  435. package/lib/optimize/ModuleConcatenationPlugin.js +229 -55
  436. package/lib/optimize/RealContentHashPlugin.js +130 -52
  437. package/lib/optimize/RemoveEmptyChunksPlugin.js +2 -1
  438. package/lib/optimize/RemoveParentModulesPlugin.js +3 -1
  439. package/lib/optimize/RuntimeChunkPlugin.js +2 -1
  440. package/lib/optimize/SideEffectsFlagPlugin.js +381 -55
  441. package/lib/optimize/SplitChunksPlugin.js +200 -50
  442. package/lib/performance/AssetsOverSizeLimitWarning.js +3 -2
  443. package/lib/performance/EntrypointsOverSizeLimitWarning.js +3 -2
  444. package/lib/performance/NoAsyncChunksWarning.js +5 -3
  445. package/lib/performance/SizeLimitsPlugin.js +8 -2
  446. package/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js +1 -0
  447. package/lib/prefetch/ChunkPrefetchPreloadPlugin.js +21 -0
  448. package/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js +1 -0
  449. package/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js +5 -1
  450. package/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js +25 -13
  451. package/lib/prefetch/ResourceHintPlugin.js +687 -0
  452. package/lib/prefetch/ResourceHintRuntimeModule.js +149 -0
  453. package/lib/prefetch/StartupAssetHintRuntimeModule.js +210 -0
  454. package/lib/prefetch/parseResourceHintOptions.js +103 -0
  455. package/lib/rules/BasicEffectRulePlugin.js +3 -0
  456. package/lib/rules/BasicMatcherRulePlugin.js +3 -0
  457. package/lib/rules/ObjectMatcherRulePlugin.js +3 -0
  458. package/lib/rules/RuleSetCompiler.js +132 -0
  459. package/lib/rules/UseEffectRulePlugin.js +10 -3
  460. package/lib/runtime/AsyncModuleGeneratorRuntimeModule.js +56 -0
  461. package/lib/runtime/AsyncModuleRuntimeModule.js +52 -33
  462. package/lib/runtime/AutoPublicPathRuntimeModule.js +22 -9
  463. package/lib/runtime/BaseUriRuntimeModule.js +1 -0
  464. package/lib/runtime/ChunkNameRuntimeModule.js +1 -0
  465. package/lib/runtime/CommonJsWrapRuntimeModule.js +37 -0
  466. package/lib/runtime/CompatGetDefaultExportRuntimeModule.js +2 -1
  467. package/lib/runtime/CompatRuntimeModule.js +2 -0
  468. package/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js +7 -4
  469. package/lib/runtime/CreateScriptRuntimeModule.js +1 -0
  470. package/lib/runtime/CreateScriptUrlRuntimeModule.js +1 -0
  471. package/lib/runtime/DefinePropertyGettersRuntimeModule.js +34 -4
  472. package/lib/runtime/EnsureChunkRuntimeModule.js +1 -0
  473. package/lib/runtime/GetChunkFilenameRuntimeModule.js +88 -8
  474. package/lib/runtime/GetFullHashRuntimeModule.js +1 -0
  475. package/lib/runtime/GetMainFilenameRuntimeModule.js +1 -0
  476. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +2 -1
  477. package/lib/runtime/GetWorkletBootstrapRuntimeModule.js +59 -0
  478. package/lib/runtime/GlobalRuntimeModule.js +1 -0
  479. package/lib/runtime/HasOwnPropertyRuntimeModule.js +2 -1
  480. package/lib/runtime/HelperRuntimeModule.js +5 -0
  481. package/lib/runtime/LoadScriptRuntimeModule.js +28 -37
  482. package/lib/runtime/MakeDeferredNamespaceObjectRuntime.js +354 -37
  483. package/lib/runtime/MakeNamespaceObjectRuntimeModule.js +2 -1
  484. package/lib/runtime/NonceRuntimeModule.js +1 -0
  485. package/lib/runtime/OnChunksLoadedRuntimeModule.js +5 -4
  486. package/lib/runtime/PublicPathRuntimeModule.js +1 -0
  487. package/lib/runtime/RelativeUrlRuntimeModule.js +4 -2
  488. package/lib/runtime/RuntimeIdRuntimeModule.js +1 -0
  489. package/lib/runtime/SetAnonymousDefaultNameRuntimeModule.js +38 -0
  490. package/lib/runtime/StartupChunkDependenciesPlugin.js +13 -1
  491. package/lib/runtime/StartupChunkDependenciesRuntimeModule.js +2 -1
  492. package/lib/runtime/StartupEntrypointRuntimeModule.js +5 -3
  493. package/lib/runtime/SystemContextRuntimeModule.js +1 -0
  494. package/lib/runtime/ToBinaryRuntimeModule.js +1 -0
  495. package/lib/runtime/WorkerRuntimeModule.js +33 -0
  496. package/lib/schemes/DataUriPlugin.js +14 -2
  497. package/lib/schemes/FileUriPlugin.js +1 -1
  498. package/lib/schemes/HttpUriPlugin.js +86 -4
  499. package/lib/schemes/VirtualUrlPlugin.js +8 -4
  500. package/lib/serialization/AggregateErrorSerializer.js +9 -6
  501. package/lib/serialization/ArraySerializer.js +6 -8
  502. package/lib/serialization/BinaryMiddleware.js +427 -1006
  503. package/lib/serialization/DateObjectSerializer.js +4 -2
  504. package/lib/serialization/ErrorObjectSerializer.js +10 -6
  505. package/lib/serialization/FileMiddleware.js +345 -59
  506. package/lib/serialization/MapObjectSerializer.js +7 -9
  507. package/lib/serialization/NullPrototypeObjectSerializer.js +9 -9
  508. package/lib/serialization/ObjectMiddleware.js +73 -13
  509. package/lib/serialization/PlainObjectSerializer.js +16 -8
  510. package/lib/serialization/RegExpObjectSerializer.js +4 -2
  511. package/lib/serialization/Serializer.js +6 -0
  512. package/lib/serialization/SerializerMiddleware.js +14 -2
  513. package/lib/serialization/SetObjectSerializer.js +6 -8
  514. package/lib/serialization/SingleItemMiddleware.js +3 -0
  515. package/lib/sharing/ConsumeSharedFallbackDependency.js +1 -0
  516. package/lib/sharing/ConsumeSharedModule.js +21 -7
  517. package/lib/sharing/ConsumeSharedPlugin.js +11 -11
  518. package/lib/sharing/ConsumeSharedRuntimeModule.js +55 -45
  519. package/lib/sharing/ProvideForSharedDependency.js +1 -0
  520. package/lib/sharing/ProvideSharedDependency.js +34 -15
  521. package/lib/sharing/ProvideSharedModule.js +42 -12
  522. package/lib/sharing/ProvideSharedModuleFactory.js +1 -0
  523. package/lib/sharing/ProvideSharedPlugin.js +13 -8
  524. package/lib/sharing/SharePlugin.js +5 -1
  525. package/lib/sharing/ShareRuntimeModule.js +19 -16
  526. package/lib/sharing/resolveMatchedConfigs.js +6 -2
  527. package/lib/sharing/utils.js +9 -1
  528. package/lib/stats/DefaultStatsFactoryPlugin.js +289 -201
  529. package/lib/stats/DefaultStatsPresetPlugin.js +14 -2
  530. package/lib/stats/DefaultStatsPrinterPlugin.js +74 -170
  531. package/lib/stats/StatsFactory.js +70 -27
  532. package/lib/stats/StatsPrinter.js +16 -2
  533. package/lib/typescript/TypeScriptPlugin.js +210 -0
  534. package/lib/url/URLParserPlugin.js +111 -23
  535. package/lib/util/ArrayHelpers.js +1 -0
  536. package/lib/util/ArrayQueue.js +10 -5
  537. package/lib/util/AsyncQueue.js +154 -74
  538. package/lib/util/Hash.js +2 -2
  539. package/lib/util/IterableHelpers.js +3 -0
  540. package/lib/util/LazyBucketSortedSet.js +26 -0
  541. package/lib/util/LazySet.js +45 -4
  542. package/lib/util/LocConverter.js +64 -0
  543. package/lib/util/ParallelismFactorCalculator.js +1 -0
  544. package/lib/util/Queue.js +6 -3
  545. package/lib/util/Semaphore.js +15 -1
  546. package/lib/util/SetHelpers.js +4 -1
  547. package/lib/util/SortableSet.js +7 -1
  548. package/lib/util/SourceProcessor.js +119 -0
  549. package/lib/util/StackedCacheMap.js +20 -3
  550. package/lib/util/StackedMap.js +162 -43
  551. package/lib/util/StringXor.js +1 -1
  552. package/lib/util/TupleQueue.js +7 -3
  553. package/lib/util/TupleSet.js +14 -0
  554. package/lib/util/URLAbsoluteSpecifier.js +1 -0
  555. package/lib/util/WeakTupleMap.js +60 -1
  556. package/lib/util/binarySearchBounds.js +3 -2
  557. package/lib/util/chainedImports.js +3 -3
  558. package/lib/util/cleverMerge.js +19 -2
  559. package/lib/util/comparators.js +35 -4
  560. package/lib/util/compileBooleanMatcher.js +9 -0
  561. package/lib/util/concatenate.js +80 -24
  562. package/lib/util/conventions.js +46 -1
  563. package/lib/util/createHash.js +0 -1
  564. package/lib/util/createHooksRegistry.js +43 -0
  565. package/lib/util/createMappings.js +118 -0
  566. package/lib/util/dataURL.js +3 -2
  567. package/lib/util/deprecation.js +19 -0
  568. package/lib/util/deterministicGrouping.js +46 -17
  569. package/lib/util/extractSourceMap.js +2 -1
  570. package/lib/util/extractUrlAndGlobal.js +1 -0
  571. package/lib/util/findGraphRoots.js +7 -0
  572. package/lib/{formatLocation.js → util/formatLocation.js} +4 -2
  573. package/lib/{SizeFormatHelpers.js → util/formatSize.js} +10 -3
  574. package/lib/util/fs.js +87 -14
  575. package/lib/util/generateDebugId.js +1 -0
  576. package/lib/util/globUtils.js +710 -0
  577. package/lib/util/hash/BatchedHash.js +1 -0
  578. package/lib/util/hash/BulkUpdateHash.js +1 -0
  579. package/lib/util/hash/DebugHash.js +1 -0
  580. package/lib/util/hash/hash-digest.js +32 -15
  581. package/lib/util/hash/md4.js +1 -1
  582. package/lib/util/hash/wasm-hash.js +5 -0
  583. package/lib/util/hash/xxhash64.js +1 -1
  584. package/lib/util/identifier.js +118 -7
  585. package/lib/util/implicitTypeLoaderFallback.js +62 -0
  586. package/lib/util/internalSerializables.js +102 -60
  587. package/lib/util/magicComment.js +149 -7
  588. package/lib/util/makeSerializable.js +7 -0
  589. package/lib/util/memoize.js +2 -0
  590. package/lib/util/mimeTypes.js +176 -0
  591. package/lib/util/nonNumericOnlyHash.js +31 -1
  592. package/lib/util/numberHash.js +2 -2
  593. package/lib/util/parseJson.js +41 -0
  594. package/lib/util/processAsyncTree.js +8 -0
  595. package/lib/util/property.js +9 -2
  596. package/lib/util/publicPathPlaceholder.js +64 -0
  597. package/lib/util/registerExternalSerializer.js +24 -4
  598. package/lib/util/removeBOM.js +1 -0
  599. package/lib/util/runtime.js +32 -0
  600. package/lib/util/semver.js +15 -0
  601. package/lib/util/serialization.js +2 -0
  602. package/lib/util/smartGrouping.js +8 -0
  603. package/lib/util/source.js +23 -0
  604. package/lib/util/topologicalSort.js +69 -0
  605. package/lib/validateSchema.js +1 -0
  606. package/lib/wasm/EnableWasmLoadingPlugin.js +15 -1
  607. package/lib/wasm-async/AsyncWasmCompileRuntimeModule.js +25 -18
  608. package/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js +34 -22
  609. package/lib/wasm-async/AsyncWasmModule.js +77 -0
  610. package/lib/wasm-async/AsyncWebAssemblyGenerator.js +6 -0
  611. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +6 -1
  612. package/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js +22 -126
  613. package/lib/wasm-async/AsyncWebAssemblyParser.js +3 -2
  614. package/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js +13 -2
  615. package/lib/wasm-sync/SyncWasmModule.js +39 -0
  616. package/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js +7 -3
  617. package/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js +86 -19
  618. package/lib/wasm-sync/WasmFinalizeExportsPlugin.js +4 -3
  619. package/lib/wasm-sync/WebAssemblyGenerator.js +27 -1
  620. package/lib/wasm-sync/WebAssemblyInInitialChunkError.js +9 -3
  621. package/lib/wasm-sync/WebAssemblyJavascriptGenerator.js +4 -0
  622. package/lib/wasm-sync/WebAssemblyModulesPlugin.js +20 -1
  623. package/lib/wasm-sync/WebAssemblyParser.js +9 -3
  624. package/lib/wasm-sync/WebAssemblyUtils.js +2 -0
  625. package/lib/web/FetchCompileAsyncWasmPlugin.js +29 -1
  626. package/lib/web/FetchCompileWasmPlugin.js +27 -1
  627. package/lib/web/JsonpChunkLoadingPlugin.js +11 -1
  628. package/lib/web/JsonpChunkLoadingRuntimeModule.js +58 -64
  629. package/lib/web/JsonpTemplatePlugin.js +2 -1
  630. package/lib/webpack.js +78 -1
  631. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +10 -1
  632. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +15 -10
  633. package/lib/webworker/WebWorkerTemplatePlugin.js +1 -1
  634. package/module.d.ts +21 -0
  635. package/package.json +79 -77
  636. package/schemas/WebpackOptions.check.js +1 -1
  637. package/schemas/WebpackOptions.json +1173 -80
  638. package/schemas/plugins/{DllPlugin.check.d.ts → HtmlGeneratorOptions.check.d.ts} +1 -1
  639. package/schemas/plugins/HtmlGeneratorOptions.check.js +6 -0
  640. package/schemas/plugins/HtmlGeneratorOptions.json +3 -0
  641. package/schemas/plugins/{DllReferencePlugin.check.d.ts → HtmlParserOptions.check.d.ts} +1 -1
  642. package/schemas/plugins/HtmlParserOptions.check.js +6 -0
  643. package/schemas/plugins/HtmlParserOptions.json +3 -0
  644. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  645. package/schemas/plugins/ProgressPlugin.json +38 -0
  646. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  647. package/schemas/plugins/container/ContainerReferencePlugin.json +2 -0
  648. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  649. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  650. package/schemas/plugins/container/ModuleFederationPlugin.json +2 -0
  651. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.d.ts +7 -0
  652. package/schemas/plugins/css/CssAutoOrModuleParserOptions.check.js +6 -0
  653. package/schemas/plugins/css/CssAutoOrModuleParserOptions.json +3 -0
  654. package/schemas/plugins/css/CssModuleParserOptions.check.js +1 -1
  655. package/schemas/plugins/css/CssParserOptions.check.js +1 -1
  656. package/schemas/plugins/dll/DllPlugin.check.d.ts +7 -0
  657. package/schemas/plugins/dll/DllReferencePlugin.check.d.ts +7 -0
  658. package/types.d.ts +11053 -3019
  659. package/lib/CaseSensitiveModulesWarning.js +0 -72
  660. package/lib/GraphHelpers.js +0 -46
  661. package/lib/ModuleParseError.js +0 -125
  662. package/lib/NoModeWarning.js +0 -23
  663. package/lib/css/CssMergeStyleSheetsRuntimeModule.js +0 -56
  664. package/lib/css/walkCssTokens.js +0 -1843
  665. package/lib/util/AppendOnlyStackedSet.js +0 -78
  666. /package/schemas/plugins/{DllPlugin.check.js → dll/DllPlugin.check.js} +0 -0
  667. /package/schemas/plugins/{DllPlugin.json → dll/DllPlugin.json} +0 -0
  668. /package/schemas/plugins/{DllReferencePlugin.check.js → dll/DllReferencePlugin.check.js} +0 -0
  669. /package/schemas/plugins/{DllReferencePlugin.json → dll/DllReferencePlugin.json} +0 -0
@@ -5,43 +5,93 @@
5
5
 
6
6
  "use strict";
7
7
 
8
- const { CSS_TYPE, JAVASCRIPT_TYPE } = require("../ModuleSourceTypeConstants");
8
+ const { JAVASCRIPT_TYPE } = require("../ModuleSourceTypeConstants");
9
9
  const { interpolate } = require("../TemplatedPathPlugin");
10
- const WebpackError = require("../WebpackError");
10
+ const WebpackError = require("../errors/WebpackError");
11
11
  const { cssExportConvention } = require("../util/conventions");
12
12
  const createHash = require("../util/createHash");
13
13
  const { makePathsRelative } = require("../util/identifier");
14
14
  const makeSerializable = require("../util/makeSerializable");
15
15
  const memoize = require("../util/memoize");
16
- const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
16
+ const { digestNonNumericOnly } = require("../util/nonNumericOnlyHash");
17
+ const { updateHashFromSource } = require("../util/source");
17
18
  const CssIcssImportDependency = require("./CssIcssImportDependency");
18
19
  const NullDependency = require("./NullDependency");
19
20
 
20
- const getCssParser = memoize(() => require("../css/CssParser"));
21
+ const getCssTokens = memoize(() => require("../css/syntax"));
21
22
 
22
23
  /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
23
- /** @typedef {import("../../declarations/WebpackOptions").HashFunction} HashFunction */
24
24
  /** @typedef {import("../../declarations/WebpackOptions").CssGeneratorExportsConvention} CssGeneratorExportsConvention */
25
25
  /** @typedef {import("../../declarations/WebpackOptions").CssGeneratorLocalIdentName} CssGeneratorLocalIdentName */
26
- /** @typedef {import("../CssModule")} CssModule */
27
- /** @typedef {import("../Dependency")} Dependency */
28
- /** @typedef {import("../Dependency").ReferencedExports} ReferencedExports */
26
+ /** @typedef {import("../../declarations/WebpackOptions").HashFunction} HashFunction */
27
+ /** @typedef {import("../css/CssGenerator")} CssGenerator */
28
+ /** @typedef {import("../css/CssModule")} CssModule */
29
+ /** @typedef {import("../ChunkGraph")} ChunkGraph */
29
30
  /** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
31
+ /** @typedef {import("../Dependency").ReferencedExports} ReferencedExports */
30
32
  /** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
33
+ /** @typedef {import("../Dependency")} Dependency */
31
34
  /** @typedef {import("../DependencyTemplate").CssDependencyTemplateContext} DependencyTemplateContext */
32
35
  /** @typedef {import("../ModuleGraph")} ModuleGraph */
33
- /** @typedef {import("../css/CssGenerator")} CssGenerator */
34
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
35
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
36
- /** @typedef {import("../util/Hash")} Hash */
37
- /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
38
- /** @typedef {import("../ChunkGraph")} ChunkGraph */
39
36
  /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
40
37
  /** @typedef {import("../css/CssParser").Range} Range */
38
+ /** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
39
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext<(number | string | Value | Range | boolean | ExportMode | ExportType | DependencyLocation | undefined)[]>} ObjectDeserializerContext */
40
+ /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext<(number | string | Value | Range | boolean | ExportMode | ExportType | DependencyLocation | undefined)[]>} ObjectSerializerContext */
41
+ /** @typedef {import("../util/Hash")} Hash */
42
+ /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
43
+ /** @typedef {import("../errors/WebpackError")} WebpackErrorType */
41
44
 
42
- /** @typedef {(name: string) => string} ExportsConventionFn */
45
+ /** @typedef {string | [string, string] | [string, string, string]} Value */
46
+ /** @typedef {(name: string) => string | string[]} ExportsConventionFn */
47
+ // 0 - none, 1 - replace, 2 - append, 3 - once, 4 - self-reference
48
+ /** @typedef {0 | 1 | 2 | 3 | 4} ExportMode */
49
+ // 0 - normal, 1 - custom css variable, 2 - grid custom ident, 3 - composes
50
+ /** @typedef {0 | 1 | 2 | 3} ExportType */
51
+
52
+ /** @type {Record<"NONE" | "REPLACE" | "APPEND" | "ONCE" | "SELF_REFERENCE", ExportMode>} */
53
+ const EXPORT_MODE = {
54
+ NONE: 0,
55
+ REPLACE: 1,
56
+ APPEND: 2,
57
+ ONCE: 3,
58
+ SELF_REFERENCE: 4
59
+ };
60
+
61
+ /** @type {Record<"NORMAL" | "CUSTOM_VARIABLE" | "GRID_CUSTOM_IDENTIFIER" | "COMPOSES", ExportType>} */
62
+ const EXPORT_TYPE = {
63
+ NORMAL: 0,
64
+ CUSTOM_VARIABLE: 1,
65
+ GRID_CUSTOM_IDENTIFIER: 2,
66
+ COMPOSES: 3
67
+ };
68
+
69
+ // Hoisted out of `getLocalIdent`'s `prepareId` so the patterns + the replacer
70
+ // aren't recompiled/reallocated per interpolated id.
71
+ const IDENT_LEADING_INVALID_REGEXP = /^([.-]|[^a-z0-9_-])+/i;
72
+ const IDENT_INVALID_CHARS_REGEXP = /[^a-z0-9@_-]+/gi;
73
+ const IDENT_LOCAL_PLACEHOLDER_REGEXP = /\[local\]/g;
74
+ const IDENT_LEADING_PROTECT_REGEXP = /^((-?\d)|--)/;
75
+
76
+ /**
77
+ * `interpolate` `prepareId` hook — sanitize an id segment into a valid CSS ident.
78
+ * Pure (captures nothing), so it's shared rather than allocated per call.
79
+ * @param {string | number} id id segment
80
+ * @returns {string | number} sanitized id segment
81
+ */
82
+ const prepareLocalIdentId = (id) => {
83
+ if (typeof id !== "string") return id;
84
+ return (
85
+ id
86
+ .replace(IDENT_LEADING_INVALID_REGEXP, "")
87
+ // We keep the `@` symbol because it can be used in the package name (e.g. `@company/package`), and if we replace it with `_`, a class conflict may occur.
88
+ // For example - `@import "@foo/package/style.module.css"` and `@import "foo/package/style.module.css"` (`foo` is a package, `package` is just a directory) will create a class conflict.
89
+ .replace(IDENT_INVALID_CHARS_REGEXP, "_")
90
+ );
91
+ };
43
92
 
44
93
  /**
94
+ * Returns local ident.
45
95
  * @param {string} local css local
46
96
  * @param {CssModule} module module
47
97
  * @param {ChunkGraph} chunkGraph chunk graph
@@ -63,11 +113,9 @@ const getLocalIdent = (local, module, chunkGraph, runtimeTemplate) => {
63
113
  const { uniqueName } = runtimeTemplate.outputOptions;
64
114
 
65
115
  let localIdentHash = "";
116
+ let localIdentHashFull = "";
66
117
 
67
- if (
68
- typeof localIdentName === "function" ||
69
- /\[(?:fullhash|hash)\]/.test(localIdentName)
70
- ) {
118
+ if (generator._localIdentNeedsHash) {
71
119
  const hashSalt = generator.options.localIdentHashSalt;
72
120
  const hashDigest =
73
121
  /** @type {string} */
@@ -90,108 +138,182 @@ const getLocalIdent = (local, module, chunkGraph, runtimeTemplate) => {
90
138
  hash.update(relativeResourcePath);
91
139
  hash.update(local);
92
140
 
93
- localIdentHash = hash.digest(hashDigest).slice(0, hashDigestLength);
141
+ // Keep the untruncated digest so an inline `[fullhash:<digest>]` re-encodes
142
+ // with full entropy (see the `fullHash`/`fullHashDigest` passed below).
143
+ localIdentHashFull = hash.digest(hashDigest);
144
+ localIdentHash = localIdentHashFull.slice(0, hashDigestLength);
94
145
  }
95
146
 
96
147
  let contentHash = "";
97
148
 
98
- if (
99
- typeof localIdentName === "function" ||
100
- /\[contenthash\]/.test(localIdentName)
101
- ) {
149
+ if (generator._localIdentNeedsContentHash) {
102
150
  const hash = createHash(runtimeTemplate.outputOptions.hashFunction);
103
151
  const source = module.originalSource();
104
152
 
105
153
  if (source) {
106
- hash.update(source.buffer());
154
+ updateHashFromSource(hash, source);
107
155
  }
108
156
 
109
157
  if (module.error) {
110
158
  hash.update(module.error.toString());
111
159
  }
112
160
 
113
- const fullContentHash = hash.digest(
114
- runtimeTemplate.outputOptions.hashDigest
115
- );
116
-
117
- contentHash = nonNumericOnlyHash(
118
- fullContentHash,
119
- runtimeTemplate.outputOptions.hashDigestLength
161
+ contentHash = digestNonNumericOnly(
162
+ hash,
163
+ /** @type {string} */ (runtimeTemplate.outputOptions.hashDigest),
164
+ /** @type {number} */ (runtimeTemplate.outputOptions.hashDigestLength)
120
165
  );
121
166
  }
122
167
 
123
168
  let localIdent = interpolate(localIdentName, {
124
- prepareId: (id) => {
125
- if (typeof id !== "string") return id;
126
-
127
- return (
128
- id
129
- .replace(/^([.-]|[^a-z0-9_-])+/i, "")
130
- // We keep the `@` symbol because it can be used in the package name (e.g. `@company/package`), and if we replace it with `_`, a class conflict may occur.
131
- // For example - `@import "@foo/package/style.module.css"` and `@import "foo/package/style.module.css"` (`foo` is a package, `package` is just a directory) will create a class conflict.
132
- .replace(/[^a-z0-9@_-]+/gi, "_")
133
- );
134
- },
169
+ prepareId: prepareLocalIdentId,
135
170
  filename: relativeResourcePath,
136
171
  hash: localIdentHash,
172
+ // css-loader semantics: `[hash]` is the local ident hash, not the module
173
+ // hash (use `[modulehash]` for that).
174
+ hashAsFullHash: true,
175
+ // `[hash]`/`[contenthash]` are encoded with the output digest, but the
176
+ // `[fullhash]` local ident hash uses `localIdentHashDigest`, so re-encode it
177
+ // from its own (full) digest.
178
+ hashDigest: runtimeTemplate.outputOptions.hashDigest,
179
+ fullHash: localIdentHashFull,
180
+ fullHashDigest:
181
+ /** @type {string} */
182
+ (generator.options.localIdentHashDigest),
137
183
  local,
184
+ uniqueName,
138
185
  contentHash,
139
186
  chunkGraph,
140
187
  module
141
188
  });
142
189
 
143
- // TODO move these things into interpolate
144
- if (/\[local\]/.test(localIdent)) {
145
- localIdent = localIdent.replace(/\[local\]/g, local);
146
- }
147
-
148
- if (/\[uniqueName\]/.test(localIdent)) {
149
- localIdent = localIdent.replace(
150
- /\[uniqueName\]/g,
151
- /** @type {string} */ (uniqueName)
152
- );
153
- }
190
+ // TODO move this into interpolate
191
+ // `replace` on a non-matching global regexp returns the string unchanged, so
192
+ // the `.test` guard is redundant — one scan instead of two.
193
+ localIdent = localIdent.replace(IDENT_LOCAL_PLACEHOLDER_REGEXP, local);
154
194
 
155
195
  // Protect the first character from unsupported values
156
- return localIdent.replace(/^((-?\d)|--)/, "_$1");
196
+ return localIdent.replace(IDENT_LEADING_PROTECT_REGEXP, "_$1");
157
197
  };
158
198
 
159
- /** @typedef {string | [string, string]} Value */
199
+ /**
200
+ * Computes the interpolated identifier for `(module, value, exportType)`.
201
+ * Module-level reference so `moduleGraph.cached` can use it as a stable
202
+ * computer key — repeated lookups during a build skip `cssExportConvention`,
203
+ * `getLocalIdent` (with its content / path hashing) and `escapeIdentifier`.
204
+ * @param {ModuleGraph} _moduleGraph module graph (unused, kept for `cached` signature)
205
+ * @param {CssModule} module css module the value resolves in
206
+ * @param {string} value raw value to interpolate
207
+ * @param {ExportType} exportType export type discriminator
208
+ * @param {ChunkGraph} chunkGraph chunk graph
209
+ * @param {RuntimeTemplate} runtimeTemplate runtime template
210
+ * @returns {string} interpolated identifier
211
+ */
212
+ const computeInterpolatedIdentifier = (
213
+ _moduleGraph,
214
+ module,
215
+ value,
216
+ exportType,
217
+ chunkGraph,
218
+ runtimeTemplate
219
+ ) => {
220
+ const generator = /** @type {CssGenerator} */ (module.generator);
221
+ const local = cssExportConvention(
222
+ value,
223
+ /** @type {CssGeneratorExportsConvention} */
224
+ (generator.options.exportsConvention)
225
+ )[0];
226
+ const prefix = exportType === EXPORT_TYPE.CUSTOM_VARIABLE ? "--" : "";
227
+ return (
228
+ prefix +
229
+ getCssTokens().escapeIdentifier(
230
+ getLocalIdent(local, module, chunkGraph, runtimeTemplate),
231
+ runtimeTemplate.compilation.compiler.root
232
+ )
233
+ );
234
+ };
160
235
 
161
- // 0 - replace, 1 - replace, 2 - append, 2 - once
162
- /** @typedef {0 | 1 | 2 | 3 | 4} ExportMode */
163
- // 0 - normal, 1 - custom css variable, 2 - grid custom ident, 3 - composes
164
- /** @typedef {0 | 1 | 2 | 3} ExportType */
236
+ /**
237
+ * One `:export { name: value }` style entry — a plain object so a module holds
238
+ * a single `Dependency` plus a flat array instead of thousands of `Dependency`
239
+ * instances. `_conventionNames`/`_valueConventionNames` memoize the convention
240
+ * expansion per entry.
241
+ * @typedef {object} CssExportEntry
242
+ * @property {string} name export name
243
+ * @property {Value} value value or [localName, importName, request?]
244
+ * @property {Range=} range source range to replace, when present
245
+ * @property {boolean} interpolate whether the value needs interpolation
246
+ * @property {ExportMode} exportMode export mode
247
+ * @property {ExportType} exportType export type
248
+ * @property {number} locStartLine per-export source start line (1-based; flat numbers instead of a nested `DependencyLocation` — entries are per-export hot allocations)
249
+ * @property {number} locStartColumn per-export source start column
250
+ * @property {number} locEndLine per-export source end line
251
+ * @property {number} locEndColumn per-export source end column
252
+ * @property {string[]=} _conventionNames memoized convention names for `name`
253
+ * @property {string[]=} _valueConventionNames memoized convention names for `value`
254
+ */
255
+
256
+ /**
257
+ * Memoized `cssExportConvention(entry.name, convention)`.
258
+ * @param {CssExportEntry} entry entry
259
+ * @param {CssGeneratorExportsConvention} convention convention
260
+ * @returns {string[]} convention names
261
+ */
262
+ const entryConventionNames = (entry, convention) => {
263
+ if (entry._conventionNames) return entry._conventionNames;
264
+ entry._conventionNames = cssExportConvention(entry.name, convention);
265
+ return entry._conventionNames;
266
+ };
267
+
268
+ /**
269
+ * Memoized `cssExportConvention(entry.value, convention)`. Caller guarantees
270
+ * `typeof entry.value === "string"`.
271
+ * @param {CssExportEntry} entry entry
272
+ * @param {CssGeneratorExportsConvention} convention convention
273
+ * @returns {string[]} convention names
274
+ */
275
+ const entryValueConventionNames = (entry, convention) => {
276
+ if (entry._valueConventionNames) return entry._valueConventionNames;
277
+ entry._valueConventionNames = cssExportConvention(
278
+ /** @type {string} */ (entry.value),
279
+ convention
280
+ );
281
+ return entry._valueConventionNames;
282
+ };
165
283
 
166
284
  class CssIcssExportDependency extends NullDependency {
167
285
  /**
168
- * Example of dependency:
169
- *
170
- * :export { LOCAL_NAME: EXPORT_NAME }
171
- * @param {string} name export name
172
- * @param {Value} value value or local name and import name
173
- * @param {Range=} range range
174
- * @param {boolean=} interpolate true when value need to be interpolated, otherwise false
175
- * @param {ExportMode=} exportMode export mode
176
- * @param {ExportType=} exportType export type
286
+ * One consolidated `:export` dependency for a whole CSS module.
287
+ * @param {CssExportEntry[]} entries export entries in source order
177
288
  */
178
- constructor(
179
- name,
180
- value,
181
- range,
182
- interpolate = false,
183
- exportMode = CssIcssExportDependency.EXPORT_MODE.REPLACE,
184
- exportType = CssIcssExportDependency.EXPORT_TYPE.NORMAL
185
- ) {
289
+ constructor(entries) {
186
290
  super();
187
- this.name = name;
188
- this.value = value;
189
- this.range = range;
190
- this.interpolate = interpolate;
191
- this.exportMode = exportMode;
192
- this.exportType = exportType;
291
+ /** @type {CssExportEntry[]} */
292
+ this.entries = entries;
193
293
  /** @type {undefined | string} */
194
294
  this._hashUpdate = undefined;
295
+ /** @type {undefined | Map<string, CssExportEntry[]>} lazily-built `name -> entries` index, reused across every importer's codegen */
296
+ this._entriesByName = undefined;
297
+ }
298
+
299
+ /**
300
+ * The `entries` grouped by export name, built once and reused. `entries` is
301
+ * immutable after construction/deserialization, so this stays valid for the
302
+ * dependency's lifetime (the composes/`@value` target of many importers).
303
+ * @returns {Map<string, CssExportEntry[]>} entries grouped by export name
304
+ */
305
+ getEntriesByName() {
306
+ if (this._entriesByName === undefined) {
307
+ /** @type {Map<string, CssExportEntry[]>} */
308
+ const map = new Map();
309
+ for (const e of this.entries) {
310
+ const list = map.get(e.name);
311
+ if (list) list.push(e);
312
+ else map.set(e.name, [e]);
313
+ }
314
+ this._entriesByName = map;
315
+ }
316
+ return this._entriesByName;
195
317
  }
196
318
 
197
319
  get type() {
@@ -199,16 +321,33 @@ class CssIcssExportDependency extends NullDependency {
199
321
  }
200
322
 
201
323
  /**
202
- * @param {string} name export name
203
- * @param {CssGeneratorExportsConvention} convention convention of the export name
204
- * @returns {string[]} convention results
324
+ * Returns the exported names
325
+ * @param {ModuleGraph} moduleGraph module graph
326
+ * @returns {ExportsSpec | undefined} export names
205
327
  */
206
- getExportsConventionNames(name, convention) {
207
- if (this._conventionNames) {
208
- return this._conventionNames;
328
+ getExports(moduleGraph) {
329
+ const module = /** @type {CssModule} */ (moduleGraph.getParentModule(this));
330
+ const generator = /** @type {CssGenerator} */ (module.generator);
331
+ const convention =
332
+ /** @type {CssGeneratorExportsConvention} */
333
+ (generator.options.exportsConvention);
334
+
335
+ /** @type {{ name: string, canMangle: boolean }[]} */
336
+ const exports = [];
337
+ for (const entry of this.entries) {
338
+ if (
339
+ entry.exportMode === EXPORT_MODE.NONE ||
340
+ entry.exportMode === EXPORT_MODE.SELF_REFERENCE
341
+ ) {
342
+ continue;
343
+ }
344
+ for (const name of entryConventionNames(entry, convention)) {
345
+ exports.push({ name, canMangle: true });
346
+ }
209
347
  }
210
- this._conventionNames = cssExportConvention(name, convention);
211
- return this._conventionNames;
348
+
349
+ if (exports.length === 0) return undefined;
350
+ return { exports, dependencies: undefined };
212
351
  }
213
352
 
214
353
  /**
@@ -218,80 +357,103 @@ class CssIcssExportDependency extends NullDependency {
218
357
  * @returns {ReferencedExports} referenced exports
219
358
  */
220
359
  getReferencedExports(moduleGraph, runtime) {
221
- if (
222
- this.exportMode === CssIcssExportDependency.EXPORT_MODE.SELF_REFERENCE
223
- ) {
224
- return [
225
- {
226
- name: [this.name],
227
- canMangle: true
360
+ // `composes: foo;` (SELF_REFERENCE) references the composed class
361
+ // (`entry.value`), not the composing class. Every other entry mode
362
+ // keeps the whole exports object referenced (legacy behaviour), so the
363
+ // presence of any such entry subsumes the self-reference names.
364
+ let hasNonSelfReference = false;
365
+ /** @type {ReferencedExports} */
366
+ const referenced = [];
367
+ let generator;
368
+ for (const entry of this.entries) {
369
+ if (
370
+ entry.exportMode === EXPORT_MODE.SELF_REFERENCE &&
371
+ typeof entry.value === "string"
372
+ ) {
373
+ const module =
374
+ /** @type {CssModule} */
375
+ (moduleGraph.getParentModule(this));
376
+ generator = generator || /** @type {CssGenerator} */ (module.generator);
377
+ const names = entryValueConventionNames(
378
+ entry,
379
+ /** @type {CssGeneratorExportsConvention} */
380
+ (generator.options.exportsConvention)
381
+ );
382
+ for (const name of names) {
383
+ referenced.push({ name: [name], canMangle: true });
228
384
  }
229
- ];
385
+ } else {
386
+ hasNonSelfReference = true;
387
+ }
230
388
  }
231
389
 
232
- return super.getReferencedExports(moduleGraph, runtime);
233
- }
234
-
235
- /**
236
- * Returns the exported names
237
- * @param {ModuleGraph} moduleGraph module graph
238
- * @returns {ExportsSpec | undefined} export names
239
- */
240
- getExports(moduleGraph) {
241
- if (
242
- this.exportMode === CssIcssExportDependency.EXPORT_MODE.NONE ||
243
- this.exportMode === CssIcssExportDependency.EXPORT_MODE.SELF_REFERENCE
244
- ) {
245
- return;
390
+ if (hasNonSelfReference) {
391
+ return super.getReferencedExports(moduleGraph, runtime);
246
392
  }
247
-
248
- const module = /** @type {CssModule} */ (moduleGraph.getParentModule(this));
249
- const generator = /** @type {CssGenerator} */ (module.generator);
250
- const names = this.getExportsConventionNames(
251
- this.name,
252
- /** @type {CssGeneratorExportsConvention} */
253
- (generator.options.exportsConvention)
254
- );
255
-
256
- return {
257
- exports: [...names].map((name) => ({
258
- name,
259
- canMangle: true
260
- })),
261
- dependencies: undefined
262
- };
393
+ if (referenced.length === 0) {
394
+ return super.getReferencedExports(moduleGraph, runtime);
395
+ }
396
+ return referenced;
263
397
  }
264
398
 
265
399
  /**
266
- * Returns warnings
400
+ * Returns warnings.
267
401
  * @param {ModuleGraph} moduleGraph module graph
268
402
  * @returns {WebpackError[] | null | undefined} warnings
269
403
  */
270
404
  getWarnings(moduleGraph) {
271
- if (
272
- this.exportMode === CssIcssExportDependency.EXPORT_MODE.SELF_REFERENCE &&
273
- !Array.isArray(this.value)
274
- ) {
275
- const module = moduleGraph.getParentModule(this);
276
-
405
+ /** @type {WebpackErrorType[] | null} */
406
+ let warnings = null;
407
+ let module;
408
+ let exportsInfo;
409
+ let convention;
410
+ for (const entry of this.entries) {
277
411
  if (
278
- module &&
279
- !moduleGraph.getExportsInfo(module).isExportProvided(this.value)
412
+ entry.exportMode !== EXPORT_MODE.SELF_REFERENCE ||
413
+ typeof entry.value !== "string"
280
414
  ) {
415
+ continue;
416
+ }
417
+ if (module === undefined) {
418
+ module =
419
+ /** @type {CssModule | undefined} */
420
+ (moduleGraph.getParentModule(this));
421
+ if (!module) return warnings;
422
+ const generator = /** @type {CssGenerator} */ (module.generator);
423
+ convention =
424
+ /** @type {CssGeneratorExportsConvention} */
425
+ (generator.options.exportsConvention);
426
+ exportsInfo = moduleGraph.getExportsInfo(module);
427
+ }
428
+ const names = entryValueConventionNames(
429
+ entry,
430
+ /** @type {CssGeneratorExportsConvention} */ (convention)
431
+ );
432
+ const ei = /** @type {NonNullable<typeof exportsInfo>} */ (exportsInfo);
433
+ const isProvided = names.some((name) => ei.isExportProvided(name));
434
+ if (!isProvided) {
281
435
  const error = new WebpackError(
282
- `Self-referencing name "${this.value}" not found`
436
+ `Self-referencing name "${entry.value}" not found`
283
437
  );
284
438
  error.module = module;
285
-
286
- return [error];
439
+ // Per-entry loc so Compilation attributes the warning precisely
440
+ // (it can't use the consolidated dependency's single loc). Built
441
+ // on demand — entries carry flat numbers, not location objects.
442
+ if (entry.locStartLine > 0) {
443
+ error.loc = {
444
+ start: { line: entry.locStartLine, column: entry.locStartColumn },
445
+ end: { line: entry.locEndLine, column: entry.locEndColumn }
446
+ };
447
+ }
448
+ if (warnings === null) warnings = [];
449
+ warnings.push(error);
287
450
  }
288
451
  }
289
-
290
- return null;
452
+ return warnings;
291
453
  }
292
454
 
293
455
  /**
294
- * Update the hash
456
+ * Updates the hash with the data contributed by this instance.
295
457
  * @param {Hash} hash hash to be updated
296
458
  * @param {UpdateHashContext} context context
297
459
  * @returns {void}
@@ -302,100 +464,252 @@ class CssIcssExportDependency extends NullDependency {
302
464
  /** @type {CssModule} */
303
465
  (chunkGraph.moduleGraph.getParentModule(this));
304
466
  const generator = /** @type {CssGenerator} */ (module.generator);
305
- const names = this.getExportsConventionNames(
306
- this.name,
467
+ const convention =
307
468
  /** @type {CssGeneratorExportsConvention} */
308
- (generator.options.exportsConvention)
309
- );
310
- this._hashUpdate = `exportsConvention|${JSON.stringify(names)}|localIdentName|${JSON.stringify(generator.options.localIdentName)}`;
469
+ (generator.options.exportsConvention);
470
+ const localIdentName = JSON.stringify(generator.options.localIdentName);
471
+ // Concatenate each entry's contribution with no separator so the byte
472
+ // stream matches the legacy per-export `updateHash` sequence exactly
473
+ // (keeps module hashes stable for import-free modules).
474
+ let update = "";
475
+ for (const entry of this.entries) {
476
+ const names = entryConventionNames(entry, convention);
477
+ update += `exportsConvention|${JSON.stringify(names)}|localIdentName|${localIdentName}|value|${JSON.stringify(entry.value)}|range|${JSON.stringify(entry.range)}|interpolate|${entry.interpolate}|exportMode|${entry.exportMode}|exportType|${entry.exportType}`;
478
+ }
479
+ this._hashUpdate = update;
311
480
  }
312
481
  hash.update(this._hashUpdate);
313
482
  }
314
483
 
315
484
  /**
485
+ * Serializes this instance into the provided serializer context.
316
486
  * @param {ObjectSerializerContext} context context
317
487
  */
318
488
  serialize(context) {
319
489
  const { write } = context;
320
- write(this.name);
321
- write(this.value);
322
- write(this.range);
323
- write(this.interpolate);
324
- write(this.exportMode);
325
- write(this.exportType);
490
+ write(this.entries.length);
491
+ for (const entry of this.entries) {
492
+ write(entry.name);
493
+ write(entry.value);
494
+ write(entry.range);
495
+ write(entry.interpolate);
496
+ write(entry.exportMode);
497
+ write(entry.exportType);
498
+ write(entry.locStartLine);
499
+ write(entry.locStartColumn);
500
+ write(entry.locEndLine);
501
+ write(entry.locEndColumn);
502
+ }
326
503
  super.serialize(context);
327
504
  }
328
505
 
329
506
  /**
507
+ * Restores this instance from the provided deserializer context.
330
508
  * @param {ObjectDeserializerContext} context context
331
509
  */
332
510
  deserialize(context) {
333
511
  const { read } = context;
334
- this.name = read();
335
- this.value = read();
336
- this.range = read();
337
- this.interpolate = read();
338
- this.exportMode = read();
339
- this.exportType = read();
512
+ const length = /** @type {number} */ (read());
513
+ /** @type {CssExportEntry[]} */
514
+ const entries = [];
515
+ for (let i = 0; i < length; i++) {
516
+ entries.push({
517
+ name: /** @type {string} */ (read()),
518
+ value: /** @type {Value} */ (read()),
519
+ range: /** @type {Range=} */ (read()),
520
+ interpolate: /** @type {boolean} */ (read()),
521
+ exportMode: /** @type {ExportMode} */ (read()),
522
+ exportType: /** @type {ExportType} */ (read()),
523
+ locStartLine: /** @type {number} */ (read()),
524
+ locStartColumn: /** @type {number} */ (read()),
525
+ locEndLine: /** @type {number} */ (read()),
526
+ locEndColumn: /** @type {number} */ (read())
527
+ });
528
+ }
529
+ this.entries = entries;
530
+ this._hashUpdate = undefined;
531
+ this._entriesByName = undefined;
340
532
  super.deserialize(context);
341
533
  }
342
534
  }
343
535
 
536
+ /**
537
+ * @typedef {object} ResolutionCache
538
+ * @property {Map<CssModule, Map<string, CssExportEntry[]>>} exports module -> (export name -> entries) across all its export deps
539
+ * @property {Map<CssIcssImportDependency, CssModule | null>} targets import dep -> resolved target module
540
+ */
541
+
542
+ /**
543
+ * Creates the transient per-`apply` cache shared by `resolve` and
544
+ * `resolveReferences`. It is GC'd when the codegen call returns and is never
545
+ * retained on the dependency.
546
+ * @returns {ResolutionCache} empty resolution cache
547
+ */
548
+ const createResolutionCache = () => ({
549
+ exports: new Map(),
550
+ targets: new Map()
551
+ });
552
+
553
+ /**
554
+ * Shared read-only index for modules that own no export dep.
555
+ * @type {Map<string, CssExportEntry[]>}
556
+ */
557
+ const EMPTY_INDEX = new Map();
558
+
559
+ /**
560
+ * Per-module `local name -> import deps` index, keyed by module and validated by
561
+ * `buildInfo` identity (a fresh object per build). `apply` runs once per source
562
+ * type (CSS and JS), so this survives both passes — the index is built once per
563
+ * build instead of once per `apply`. Weakly held, so it never keeps a module
564
+ * alive.
565
+ * @type {WeakMap<CssModule, { buildInfo: unknown, index: Map<string, CssIcssImportDependency[]> }>}
566
+ */
567
+ const moduleImportIndexes = new WeakMap();
568
+
569
+ /**
570
+ * Get (or lazily resolve) the target module of an `@value`/composes import dep.
571
+ * The same import dep is followed by many entries within one codegen, so the
572
+ * `moduleGraph.getModule` lookup is memoized per dep.
573
+ * @param {ResolutionCache} cache resolution cache
574
+ * @param {ModuleGraph} moduleGraph module graph
575
+ * @param {CssIcssImportDependency} importDep import dependency
576
+ * @returns {CssModule | null} resolved target module, or `null` if none
577
+ */
578
+ const getTargetModule = (cache, moduleGraph, importDep) => {
579
+ let module = cache.targets.get(importDep);
580
+ if (module === undefined) {
581
+ module = /** @type {CssModule | null} */ (moduleGraph.getModule(importDep));
582
+ cache.targets.set(importDep, module);
583
+ }
584
+ return module;
585
+ };
586
+
587
+ /**
588
+ * Get (or lazily build) the `name -> entries` index for `module`. There is one
589
+ * consolidated `CssIcssExportDependency` per module, and its own index is cached
590
+ * on the dep — so a module composed/imported by many others builds its index
591
+ * once per build rather than once per importer, and resolution does a single Map
592
+ * lookup instead of re-scanning `module.dependencies` per reference.
593
+ * @param {ResolutionCache} cache resolution cache
594
+ * @param {CssModule} module css module
595
+ * @returns {Map<string, CssExportEntry[]>} entries grouped by export name
596
+ */
597
+ const getExportIndex = (cache, module) => {
598
+ let map = cache.exports.get(module);
599
+ if (map === undefined) {
600
+ map = EMPTY_INDEX;
601
+ for (const dep of module.dependencies) {
602
+ if (dep instanceof CssIcssExportDependency) {
603
+ map = dep.getEntriesByName();
604
+ break;
605
+ }
606
+ }
607
+ cache.exports.set(module, map);
608
+ }
609
+ return map;
610
+ };
611
+
612
+ /**
613
+ * Get (or lazily build) the `local name -> import deps` index for `module`, so
614
+ * `findImportDep` is a Map lookup instead of a linear scan of every dependency.
615
+ * Cached per build on the module (validated by `buildInfo` identity) so both the
616
+ * CSS and JS codegen passes reuse one scan of `module.dependencies`.
617
+ * @param {CssModule} module css module
618
+ * @returns {Map<string, CssIcssImportDependency[]>} import deps grouped by local name
619
+ */
620
+ const getImportIndex = (module) => {
621
+ const buildInfo = module.buildInfo;
622
+ const cached = moduleImportIndexes.get(module);
623
+ if (cached !== undefined && cached.buildInfo === buildInfo) {
624
+ return cached.index;
625
+ }
626
+ /** @type {Map<string, CssIcssImportDependency[]>} */
627
+ const index = new Map();
628
+ for (const d of module.dependencies) {
629
+ if (!(d instanceof CssIcssImportDependency)) continue;
630
+ const list = index.get(d.localName);
631
+ if (list) list.push(d);
632
+ else index.set(d.localName, [d]);
633
+ }
634
+ moduleImportIndexes.set(module, { buildInfo, index });
635
+ return index;
636
+ };
637
+
638
+ /**
639
+ * Finds the active `CssIcssImportDependency` for a given local name. When a
640
+ * `request` is provided the lookup also requires the import dependency's
641
+ * `request` to match, so references between two `@value foo from "..."`
642
+ * declarations resolve through the import in scope at the reference site.
643
+ * @param {CssModule} module module owning the dependencies to search
644
+ * @param {string} localName local name
645
+ * @param {string=} request user request of the `@value` import to match
646
+ * @returns {CssIcssImportDependency | undefined} matching import dep, if any
647
+ */
648
+ const findImportDep = (module, localName, request) => {
649
+ const list = getImportIndex(module).get(localName);
650
+ if (list === undefined) return undefined;
651
+ // Import deps keep dependency order, so `list[0]` is the first match (the
652
+ // legacy `firstMatch` fallback when no request-specific match exists).
653
+ if (request === undefined) return list[0];
654
+ for (const d of list) if (d.request === request) return d;
655
+ return list[0];
656
+ };
657
+
344
658
  CssIcssExportDependency.Template = class CssIcssExportDependencyTemplate extends (
345
659
  NullDependency.Template
346
660
  ) {
347
- // TODO looking how to cache
348
661
  /**
662
+ * Resolves a `[localName, importName, request]` reference to its final
663
+ * value by following `@value` imports into other modules' consolidated
664
+ * export dependencies.
349
665
  * @param {string} localName local name
350
666
  * @param {string} importName import name
351
667
  * @param {DependencyTemplateContext} templateContext the context object
352
- * @param {Set<CssIcssExportDependency>} seen seen to prevent cyclical problems
668
+ * @param {string | undefined} request user request of the `@value` import
669
+ * @param {Set<CssExportEntry>=} seen cycle guard
670
+ * @param {ResolutionCache=} cache transient per-codegen index (shared with `resolveReferences` within one `apply`)
353
671
  * @returns {string | undefined} found reference
354
672
  */
355
- static resolve(localName, importName, templateContext, seen = new Set()) {
673
+ static resolve(
674
+ localName,
675
+ importName,
676
+ templateContext,
677
+ request,
678
+ seen = new Set(),
679
+ cache = createResolutionCache()
680
+ ) {
356
681
  const { moduleGraph } = templateContext;
357
- const importDep =
358
- /** @type {CssIcssImportDependency | undefined} */
359
- (
360
- templateContext.module.dependencies.find(
361
- (d) =>
362
- d instanceof CssIcssImportDependency && d.localName === localName
363
- )
364
- );
682
+ const importDep = findImportDep(
683
+ /** @type {CssModule} */ (templateContext.module),
684
+ localName,
685
+ request
686
+ );
365
687
  if (!importDep) return undefined;
366
688
 
367
- const module = /** @type {CssModule} */ (moduleGraph.getModule(importDep));
689
+ const module = getTargetModule(cache, moduleGraph, importDep);
368
690
  if (!module) return undefined;
369
691
 
370
- const exportDep =
371
- /** @type {CssIcssExportDependency} */
372
- (
373
- module.dependencies.find(
374
- (d) => d instanceof CssIcssExportDependency && d.name === importName
375
- )
376
- );
377
-
378
- if (!exportDep) return undefined;
692
+ const matches = getExportIndex(cache, module).get(importName);
693
+ const exportEntry = matches && matches[0];
694
+ if (!exportEntry) return undefined;
695
+ if (seen.has(exportEntry)) return undefined;
696
+ seen.add(exportEntry);
379
697
 
380
- if (seen.has(exportDep)) return undefined;
381
- seen.add(exportDep);
382
-
383
- const { value, interpolate } = exportDep;
698
+ const { value, interpolate } = exportEntry;
384
699
 
385
700
  if (Array.isArray(value)) {
386
- return this.resolve(
701
+ return CssIcssExportDependencyTemplate.resolve(
387
702
  value[0],
388
703
  value[1],
389
- {
390
- ...templateContext,
391
- module
392
- },
393
- seen
704
+ { ...templateContext, module },
705
+ value[2],
706
+ seen,
707
+ cache
394
708
  );
395
709
  }
396
710
 
397
711
  if (interpolate) {
398
- return CssIcssExportDependency.Template.getIdentifier(value, exportDep, {
712
+ return CssIcssExportDependencyTemplate.getIdentifier(value, exportEntry, {
399
713
  ...templateContext,
400
714
  module
401
715
  });
@@ -405,84 +719,86 @@ CssIcssExportDependency.Template = class CssIcssExportDependencyTemplate extends
405
719
  }
406
720
 
407
721
  /**
408
- * @param {CssIcssExportDependency} dep value
722
+ * Resolves all references of a `composes` entry, deduplicated.
723
+ * @param {CssExportEntry} entry composes entry
409
724
  * @param {DependencyTemplateContext} templateContext template context
410
- * @param {Set<CssIcssExportDependency>} seen to prevent cyclical problems
725
+ * @param {Set<CssExportEntry>} seen cycle guard
726
+ * @param {ResolutionCache} cache transient per-codegen index, discarded after the module's `apply` (so it isn't retained on the dependency)
411
727
  * @returns {string[]} final names
412
728
  */
413
- static resolveReferences(dep, templateContext, seen = new Set()) {
729
+ static resolveReferences(entry, templateContext, seen, cache) {
414
730
  /** @type {string[]} */
415
731
  const references = [];
416
732
 
417
- if (seen.has(dep)) return references;
418
- seen.add(dep);
419
-
420
- if (Array.isArray(dep.value)) {
421
- const importDep =
422
- /** @type {CssIcssImportDependency | undefined} */
423
- (
424
- templateContext.module.dependencies.find(
425
- (d) =>
426
- d instanceof CssIcssImportDependency &&
427
- d.localName === dep.value[0]
428
- )
429
- );
733
+ if (seen.has(entry)) return references;
734
+ seen.add(entry);
735
+
736
+ if (Array.isArray(entry.value)) {
737
+ const importDep = findImportDep(
738
+ /** @type {CssModule} */ (templateContext.module),
739
+ entry.value[0],
740
+ entry.value[2]
741
+ );
430
742
  if (!importDep) return references;
431
743
 
432
- const module =
433
- /** @type {CssModule} */
434
- (templateContext.moduleGraph.getModule(importDep));
744
+ const module = getTargetModule(
745
+ cache,
746
+ templateContext.moduleGraph,
747
+ importDep
748
+ );
435
749
  if (!module) return references;
436
750
 
437
- for (const d of module.dependencies) {
438
- if (d instanceof CssIcssExportDependency && d.name === dep.value[1]) {
751
+ // Same overridden context and target name for every matched entry — build once, not per entry.
752
+ const subContext = { ...templateContext, module };
753
+ const name = /** @type {string[]} */ (entry.value)[1];
754
+ const matches = getExportIndex(cache, module).get(name);
755
+ if (matches) {
756
+ for (const d of matches) {
439
757
  if (Array.isArray(d.value)) {
440
- const deepReferences =
441
- CssIcssExportDependencyTemplate.resolveReferences(
758
+ references.push(
759
+ ...CssIcssExportDependencyTemplate.resolveReferences(
442
760
  d,
443
- {
444
- ...templateContext,
445
- module
446
- },
447
- seen
448
- );
449
-
450
- references.push(...deepReferences);
761
+ subContext,
762
+ seen,
763
+ cache
764
+ )
765
+ );
451
766
  } else {
452
767
  references.push(
453
- CssIcssExportDependencyTemplate.getIdentifier(d.value, d, {
454
- ...templateContext,
455
- module
456
- })
768
+ CssIcssExportDependencyTemplate.getIdentifier(
769
+ d.value,
770
+ d,
771
+ subContext
772
+ )
457
773
  );
458
774
  }
459
775
  }
460
776
  }
461
777
  } else {
462
- // Adding basic class
463
778
  references.push(
464
779
  CssIcssExportDependencyTemplate.getIdentifier(
465
- dep.value,
466
- dep,
780
+ /** @type {string} */ (entry.value),
781
+ entry,
467
782
  templateContext
468
783
  )
469
784
  );
470
785
 
471
- for (const d of templateContext.module.dependencies) {
472
- if (
473
- d instanceof CssIcssExportDependency &&
474
- d.exportType === CssIcssExportDependency.EXPORT_TYPE.COMPOSES &&
475
- d.name === dep.value
476
- ) {
786
+ const matches = getExportIndex(
787
+ cache,
788
+ /** @type {CssModule} */ (templateContext.module)
789
+ ).get(/** @type {string} */ (entry.value));
790
+ if (matches) {
791
+ for (const d of matches) {
792
+ if (d.exportType !== EXPORT_TYPE.COMPOSES) continue;
477
793
  if (Array.isArray(d.value)) {
478
- const deepReferences =
479
- CssIcssExportDependencyTemplate.resolveReferences(
794
+ references.push(
795
+ ...CssIcssExportDependencyTemplate.resolveReferences(
480
796
  d,
481
797
  templateContext,
482
- seen
483
- );
484
-
485
- references.push(...deepReferences);
798
+ seen,
799
+ cache
800
+ )
801
+ );
486
802
  } else {
487
803
  references.push(
488
804
  CssIcssExportDependencyTemplate.getIdentifier(
@@ -496,50 +812,32 @@ CssIcssExportDependency.Template = class CssIcssExportDependencyTemplate extends
496
812
  }
497
813
  }
498
814
 
499
- return [...new Set(references)];
815
+ return references.length > 1 ? [...new Set(references)] : references;
500
816
  }
501
817
 
502
818
  /**
819
+ * Returns the interpolated identifier for an entry value.
503
820
  * @param {string} value value to identifier
504
- * @param {Dependency} dependency the dependency for which the template should be applied
821
+ * @param {CssExportEntry} entry the entry
505
822
  * @param {DependencyTemplateContext} templateContext the context object
506
823
  * @returns {string} identifier
507
824
  */
508
- static getIdentifier(value, dependency, templateContext) {
509
- const dep = /** @type {CssIcssExportDependency} */ (dependency);
510
-
511
- if (dep.interpolate) {
512
- const { module: m } = templateContext;
513
- const module = /** @type {CssModule} */ (m);
514
- const generator = /** @type {CssGenerator} */ (module.generator);
515
- const local = cssExportConvention(
516
- value,
517
- /** @type {CssGeneratorExportsConvention} */
518
- (generator.options.exportsConvention)
519
- )[0];
520
- const prefix =
521
- dep.exportType === CssIcssExportDependency.EXPORT_TYPE.CUSTOM_VARIABLE
522
- ? "--"
523
- : "";
524
-
525
- return (
526
- prefix +
527
- getCssParser().escapeIdentifier(
528
- getLocalIdent(
529
- local,
530
- /** @type {CssModule} */
531
- (m),
532
- templateContext.chunkGraph,
533
- templateContext.runtimeTemplate
534
- )
535
- )
536
- );
537
- }
538
-
539
- return value;
825
+ static getIdentifier(value, entry, templateContext) {
826
+ if (!entry.interpolate) return value;
827
+ const { moduleGraph, module, chunkGraph, runtimeTemplate } =
828
+ templateContext;
829
+ return moduleGraph.cached(
830
+ computeInterpolatedIdentifier,
831
+ /** @type {CssModule} */ (module),
832
+ value,
833
+ entry.exportType,
834
+ chunkGraph,
835
+ runtimeTemplate
836
+ );
540
837
  }
541
838
 
542
839
  /**
840
+ * Applies the plugin by registering its hooks on the compiler.
543
841
  * @param {Dependency} dependency the dependency for which the template should be applied
544
842
  * @param {ReplaceSource} source the current replace source which can be modified
545
843
  * @param {DependencyTemplateContext} templateContext the context object
@@ -547,112 +845,128 @@ CssIcssExportDependency.Template = class CssIcssExportDependencyTemplate extends
547
845
  */
548
846
  apply(dependency, source, templateContext) {
549
847
  const dep = /** @type {CssIcssExportDependency} */ (dependency);
550
- if (!dep.range && templateContext.type !== JAVASCRIPT_TYPE) return;
551
848
  const { module: m, moduleGraph, runtime, cssData } = templateContext;
552
849
  const module = /** @type {CssModule} */ (m);
553
850
  const generator = /** @type {CssGenerator} */ (module.generator);
554
- const isReference = Array.isArray(dep.value);
555
-
556
- /** @type {string} */
557
- let value;
558
-
559
- // The `composes` has more complex logic for collecting all the classes
560
- if (
561
- dep.exportType === CssIcssExportDependency.EXPORT_TYPE.COMPOSES &&
562
- templateContext.type === JAVASCRIPT_TYPE
563
- ) {
564
- value = CssIcssExportDependencyTemplate.resolveReferences(
565
- dep,
566
- templateContext
567
- ).join(" ");
568
- } else if (isReference) {
569
- const resolved = CssIcssExportDependencyTemplate.resolve(
570
- dep.value[0],
571
- dep.value[1],
572
- templateContext
573
- );
851
+ const isJs = templateContext.type === JAVASCRIPT_TYPE;
852
+ // All entries belong to this one module, so resolve its ExportsInfo once
853
+ // instead of re-resolving `module -> exportsInfo` per export name.
854
+ const exportsInfo = isJs ? moduleGraph.getExportsInfo(module) : undefined;
855
+ // Transient per-module indexes for composes resolution within this
856
+ // module's codegen; GC'd when apply returns (never retained on the dependency).
857
+ const cache = createResolutionCache();
858
+
859
+ for (const entry of dep.entries) {
860
+ if (!entry.range && !isJs) continue;
861
+ const isReference = Array.isArray(entry.value);
574
862
 
575
- // Fallback to the local name if not resolved
576
- value = resolved || dep.value[0];
577
- } else {
578
- value = CssIcssExportDependencyTemplate.getIdentifier(
579
- /** @type {string} */ (dep.value),
580
- dep,
581
- templateContext
582
- );
583
- }
863
+ /** @type {string} */
864
+ let value;
865
+ if (entry.exportType === EXPORT_TYPE.COMPOSES && isJs) {
866
+ value = CssIcssExportDependencyTemplate.resolveReferences(
867
+ entry,
868
+ templateContext,
869
+ new Set(),
870
+ cache
871
+ ).join(" ");
872
+ } else if (isReference) {
873
+ const resolved = CssIcssExportDependencyTemplate.resolve(
874
+ /** @type {string[]} */ (entry.value)[0],
875
+ /** @type {string[]} */ (entry.value)[1],
876
+ templateContext,
877
+ /** @type {string[]} */ (entry.value)[2],
878
+ new Set(),
879
+ cache
880
+ );
881
+ value = resolved || /** @type {string[]} */ (entry.value)[0];
882
+ } else {
883
+ value = CssIcssExportDependencyTemplate.getIdentifier(
884
+ /** @type {string} */ (entry.value),
885
+ entry,
886
+ templateContext
887
+ );
888
+ }
584
889
 
585
- if (
586
- dep.exportType ===
587
- CssIcssExportDependency.EXPORT_TYPE.GRID_CUSTOM_IDENTIFIER
588
- ) {
589
- value += `-${dep.name}`;
590
- }
890
+ if (entry.exportType === EXPORT_TYPE.GRID_CUSTOM_IDENTIFIER) {
891
+ value += `-${entry.name}`;
892
+ }
591
893
 
592
- if (
593
- templateContext.type === JAVASCRIPT_TYPE &&
594
- dep.exportMode !== CssIcssExportDependency.EXPORT_MODE.NONE
595
- ) {
596
- const names = dep.getExportsConventionNames(
597
- dep.name,
598
- /** @type {CssGeneratorExportsConvention} */
599
- (generator.options.exportsConvention)
600
- );
601
- const usedNames =
602
- /** @type {string[]} */
603
- (
604
- names
605
- .map((name) =>
606
- moduleGraph.getExportInfo(module, name).getUsedName(name, runtime)
607
- )
608
- .filter(Boolean)
894
+ if (isJs && entry.exportMode !== EXPORT_MODE.NONE) {
895
+ const names = entryConventionNames(
896
+ entry,
897
+ /** @type {CssGeneratorExportsConvention} */
898
+ (generator.options.exportsConvention)
609
899
  );
610
- const allNames = new Set([...usedNames, ...names]);
611
- const unescaped = getCssParser().unescapeIdentifier(value);
612
-
613
- for (const used of allNames) {
614
- if (dep.exportMode === CssIcssExportDependency.EXPORT_MODE.ONCE) {
615
- if (cssData.exports.has(used)) return;
616
- cssData.exports.set(used, unescaped);
617
- } else {
618
- const originalValue =
619
- dep.exportMode === CssIcssExportDependency.EXPORT_MODE.REPLACE
620
- ? undefined
621
- : cssData.exports.get(used);
622
-
623
- cssData.exports.set(
624
- used,
625
- `${originalValue ? `${originalValue}${unescaped ? " " : ""}` : ""}${unescaped}`
626
- );
900
+ /** @type {Set<string>} */
901
+ const allNames = new Set();
902
+ for (const name of names) {
903
+ if (
904
+ /** @type {NonNullable<typeof exportsInfo>} */ (exportsInfo)
905
+ .getExportInfo(name)
906
+ .getUsedName(name, runtime)
907
+ ) {
908
+ allNames.add(name);
909
+ }
910
+ }
911
+ const unescaped = getCssTokens().unescapeIdentifier(
912
+ value,
913
+ templateContext.runtimeTemplate.compilation.compiler.root
914
+ );
915
+
916
+ const depLocLine = entry.locStartLine;
917
+ const depLocColumn = entry.locStartColumn;
918
+ for (const used of allNames) {
919
+ if (entry.exportMode === EXPORT_MODE.ONCE) {
920
+ if (cssData.exports.has(used)) continue;
921
+ cssData.exports.set(used, unescaped);
922
+ if (
923
+ depLocLine > 0 &&
924
+ cssData.exportLocs &&
925
+ !cssData.exportLocs.has(used)
926
+ ) {
927
+ cssData.exportLocs.set(used, {
928
+ line: depLocLine,
929
+ column: depLocColumn
930
+ });
931
+ }
932
+ } else {
933
+ const originalValue =
934
+ entry.exportMode === EXPORT_MODE.REPLACE
935
+ ? undefined
936
+ : cssData.exports.get(used);
937
+ cssData.exports.set(
938
+ used,
939
+ `${originalValue ? `${originalValue}${unescaped ? " " : ""}` : ""}${unescaped}`
940
+ );
941
+ if (
942
+ depLocLine > 0 &&
943
+ cssData.exportLocs &&
944
+ !cssData.exportLocs.has(used)
945
+ ) {
946
+ cssData.exportLocs.set(used, {
947
+ line: depLocLine,
948
+ column: depLocColumn
949
+ });
950
+ }
951
+ }
627
952
  }
953
+ } else if (
954
+ entry.range &&
955
+ templateContext.type !== JAVASCRIPT_TYPE &&
956
+ entry.exportMode !== EXPORT_MODE.APPEND &&
957
+ entry.exportMode !== EXPORT_MODE.SELF_REFERENCE
958
+ ) {
959
+ source.replace(entry.range[0], entry.range[1] - 1, value);
628
960
  }
629
- } else if (
630
- dep.range &&
631
- templateContext.type === CSS_TYPE &&
632
- dep.exportMode !== CssIcssExportDependency.EXPORT_MODE.APPEND &&
633
- dep.exportMode !== CssIcssExportDependency.EXPORT_MODE.SELF_REFERENCE
634
- ) {
635
- source.replace(dep.range[0], dep.range[1] - 1, value);
636
961
  }
637
962
  }
638
963
  };
639
964
 
640
965
  /** @type {Record<"NONE" | "REPLACE" | "APPEND" | "ONCE" | "SELF_REFERENCE", ExportMode>} */
641
- CssIcssExportDependency.EXPORT_MODE = {
642
- NONE: 0,
643
- REPLACE: 1,
644
- APPEND: 2,
645
- ONCE: 3,
646
- SELF_REFERENCE: 4
647
- };
966
+ CssIcssExportDependency.EXPORT_MODE = EXPORT_MODE;
648
967
 
649
968
  /** @type {Record<"NORMAL" | "CUSTOM_VARIABLE" | "GRID_CUSTOM_IDENTIFIER" | "COMPOSES", ExportType>} */
650
- CssIcssExportDependency.EXPORT_TYPE = {
651
- NORMAL: 0,
652
- CUSTOM_VARIABLE: 1,
653
- GRID_CUSTOM_IDENTIFIER: 2,
654
- COMPOSES: 3
655
- };
969
+ CssIcssExportDependency.EXPORT_TYPE = EXPORT_TYPE;
656
970
 
657
971
  makeSerializable(
658
972
  CssIcssExportDependency,