webpack 5.59.0 → 5.76.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.

Potentially problematic release.


This version of webpack might be problematic. Click here for more details.

Files changed (236) hide show
  1. package/README.md +22 -24
  2. package/bin/webpack.js +0 -0
  3. package/hot/dev-server.js +17 -4
  4. package/hot/lazy-compilation-node.js +3 -1
  5. package/hot/poll.js +1 -1
  6. package/hot/signal.js +1 -1
  7. package/lib/APIPlugin.js +33 -0
  8. package/lib/BannerPlugin.js +13 -5
  9. package/lib/Cache.js +1 -1
  10. package/lib/CacheFacade.js +4 -11
  11. package/lib/Chunk.js +6 -3
  12. package/lib/ChunkGraph.js +94 -8
  13. package/lib/ChunkGroup.js +1 -1
  14. package/lib/CleanPlugin.js +81 -20
  15. package/lib/Compilation.js +188 -93
  16. package/lib/Compiler.js +87 -18
  17. package/lib/ConstPlugin.js +2 -2
  18. package/lib/ContextModule.js +142 -51
  19. package/lib/ContextModuleFactory.js +65 -25
  20. package/lib/DelegatedModule.js +1 -1
  21. package/lib/DelegatedModuleFactoryPlugin.js +1 -1
  22. package/lib/Dependency.js +17 -0
  23. package/lib/DependencyTemplate.js +9 -0
  24. package/lib/DependencyTemplates.js +1 -1
  25. package/lib/DllModule.js +1 -1
  26. package/lib/DllReferencePlugin.js +1 -1
  27. package/lib/EntryOptionPlugin.js +2 -0
  28. package/lib/ErrorHelpers.js +2 -2
  29. package/lib/EvalDevToolModulePlugin.js +16 -1
  30. package/lib/EvalSourceMapDevToolPlugin.js +25 -4
  31. package/lib/ExportsInfo.js +5 -5
  32. package/lib/ExternalModule.js +94 -54
  33. package/lib/ExternalModuleFactoryPlugin.js +5 -5
  34. package/lib/FileSystemInfo.js +124 -58
  35. package/lib/Generator.js +3 -0
  36. package/lib/HookWebpackError.js +1 -1
  37. package/lib/HotModuleReplacementPlugin.js +3 -1
  38. package/lib/LoaderOptionsPlugin.js +1 -1
  39. package/lib/Module.js +28 -4
  40. package/lib/ModuleFilenameHelpers.js +8 -4
  41. package/lib/ModuleHashingError.js +29 -0
  42. package/lib/MultiCompiler.js +1 -1
  43. package/lib/MultiWatching.js +1 -1
  44. package/lib/NodeStuffPlugin.js +13 -3
  45. package/lib/NormalModule.js +51 -33
  46. package/lib/NormalModuleFactory.js +42 -37
  47. package/lib/ProgressPlugin.js +4 -5
  48. package/lib/RawModule.js +1 -1
  49. package/lib/RuntimeGlobals.js +29 -1
  50. package/lib/RuntimeModule.js +1 -1
  51. package/lib/RuntimePlugin.js +84 -1
  52. package/lib/RuntimeTemplate.js +114 -2
  53. package/lib/Template.js +3 -2
  54. package/lib/TemplatedPathPlugin.js +48 -23
  55. package/lib/WatchIgnorePlugin.js +19 -7
  56. package/lib/Watching.js +33 -19
  57. package/lib/WebpackOptionsApply.js +79 -11
  58. package/lib/asset/AssetGenerator.js +228 -71
  59. package/lib/asset/AssetModulesPlugin.js +3 -0
  60. package/lib/asset/AssetParser.js +1 -0
  61. package/lib/asset/AssetSourceGenerator.js +31 -6
  62. package/lib/asset/AssetSourceParser.js +1 -0
  63. package/lib/asset/RawDataUrlModule.js +148 -0
  64. package/lib/async-modules/AwaitDependenciesInitFragment.js +4 -4
  65. package/lib/buildChunkGraph.js +38 -7
  66. package/lib/cache/PackFileCacheStrategy.js +15 -8
  67. package/lib/cache/ResolverCachePlugin.js +90 -29
  68. package/lib/cli.js +44 -3
  69. package/lib/config/browserslistTargetHandler.js +41 -6
  70. package/lib/config/defaults.js +123 -19
  71. package/lib/config/normalization.js +10 -2
  72. package/lib/config/target.js +10 -0
  73. package/lib/container/ContainerEntryModule.js +8 -5
  74. package/lib/container/FallbackModule.js +4 -4
  75. package/lib/container/ModuleFederationPlugin.js +2 -0
  76. package/lib/container/RemoteModule.js +4 -2
  77. package/lib/container/RemoteRuntimeModule.js +8 -7
  78. package/lib/css/CssExportsGenerator.js +139 -0
  79. package/lib/css/CssGenerator.js +109 -0
  80. package/lib/css/CssLoadingRuntimeModule.js +442 -0
  81. package/lib/css/CssModulesPlugin.js +462 -0
  82. package/lib/css/CssParser.js +618 -0
  83. package/lib/css/walkCssTokens.js +659 -0
  84. package/lib/debug/ProfilingPlugin.js +24 -21
  85. package/lib/dependencies/AMDRequireDependency.js +6 -6
  86. package/lib/dependencies/CommonJsExportsParserPlugin.js +1 -2
  87. package/lib/dependencies/CommonJsFullRequireDependency.js +5 -1
  88. package/lib/dependencies/CommonJsImportsParserPlugin.js +344 -61
  89. package/lib/dependencies/CommonJsRequireContextDependency.js +6 -2
  90. package/lib/dependencies/CommonJsRequireDependency.js +2 -1
  91. package/lib/dependencies/ContextDependency.js +16 -2
  92. package/lib/dependencies/ContextDependencyHelpers.js +21 -8
  93. package/lib/dependencies/ContextDependencyTemplateAsRequireCall.js +4 -1
  94. package/lib/dependencies/ContextElementDependency.js +25 -3
  95. package/lib/dependencies/CreateScriptUrlDependency.js +12 -0
  96. package/lib/dependencies/CssExportDependency.js +85 -0
  97. package/lib/dependencies/CssImportDependency.js +75 -0
  98. package/lib/dependencies/CssLocalIdentifierDependency.js +119 -0
  99. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +101 -0
  100. package/lib/dependencies/CssUrlDependency.js +132 -0
  101. package/lib/dependencies/ExportsInfoDependency.js +6 -0
  102. package/lib/dependencies/HarmonyAcceptImportDependency.js +5 -3
  103. package/lib/dependencies/HarmonyCompatibilityDependency.js +5 -5
  104. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +127 -0
  105. package/lib/dependencies/HarmonyExportDependencyParserPlugin.js +12 -3
  106. package/lib/dependencies/HarmonyExportImportedSpecifierDependency.js +25 -17
  107. package/lib/dependencies/HarmonyExportInitFragment.js +4 -1
  108. package/lib/dependencies/HarmonyImportDependency.js +23 -0
  109. package/lib/dependencies/HarmonyImportDependencyParserPlugin.js +142 -45
  110. package/lib/dependencies/HarmonyImportSpecifierDependency.js +46 -22
  111. package/lib/dependencies/HarmonyModulesPlugin.js +10 -0
  112. package/lib/dependencies/ImportContextDependency.js +0 -2
  113. package/lib/dependencies/ImportMetaContextDependency.js +35 -0
  114. package/lib/dependencies/ImportMetaContextDependencyParserPlugin.js +252 -0
  115. package/lib/dependencies/ImportMetaContextPlugin.js +59 -0
  116. package/lib/dependencies/ImportMetaPlugin.js +22 -3
  117. package/lib/dependencies/ImportParserPlugin.js +35 -29
  118. package/lib/dependencies/JsonExportsDependency.js +17 -21
  119. package/lib/dependencies/LoaderDependency.js +13 -0
  120. package/lib/dependencies/LoaderImportDependency.js +13 -0
  121. package/lib/dependencies/LoaderPlugin.js +4 -2
  122. package/lib/dependencies/ModuleDependency.js +11 -1
  123. package/lib/dependencies/ProvidedDependency.js +31 -8
  124. package/lib/dependencies/RequireContextDependency.js +0 -16
  125. package/lib/dependencies/RequireEnsureDependency.js +2 -2
  126. package/lib/dependencies/RequireResolveContextDependency.js +2 -2
  127. package/lib/dependencies/RequireResolveDependency.js +2 -1
  128. package/lib/dependencies/URLDependency.js +3 -8
  129. package/lib/dependencies/URLPlugin.js +22 -1
  130. package/lib/dependencies/WorkerPlugin.js +2 -0
  131. package/lib/esm/ModuleChunkFormatPlugin.js +74 -49
  132. package/lib/esm/ModuleChunkLoadingPlugin.js +3 -1
  133. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +25 -9
  134. package/lib/hmr/HotModuleReplacement.runtime.js +29 -14
  135. package/lib/hmr/JavascriptHotModuleReplacement.runtime.js +4 -3
  136. package/lib/hmr/LazyCompilationPlugin.js +54 -26
  137. package/lib/hmr/lazyCompilationBackend.js +51 -12
  138. package/lib/ids/DeterministicModuleIdsPlugin.js +55 -35
  139. package/lib/ids/HashedModuleIdsPlugin.js +11 -14
  140. package/lib/ids/IdHelpers.js +26 -12
  141. package/lib/ids/NamedModuleIdsPlugin.js +6 -9
  142. package/lib/ids/NaturalModuleIdsPlugin.js +10 -13
  143. package/lib/ids/OccurrenceModuleIdsPlugin.js +13 -10
  144. package/lib/ids/SyncModuleIdsPlugin.js +140 -0
  145. package/lib/index.js +20 -0
  146. package/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js +2 -2
  147. package/lib/javascript/BasicEvaluatedExpression.js +5 -2
  148. package/lib/javascript/ChunkHelpers.js +33 -0
  149. package/lib/javascript/JavascriptGenerator.js +1 -0
  150. package/lib/javascript/JavascriptModulesPlugin.js +27 -2
  151. package/lib/javascript/JavascriptParser.js +143 -73
  152. package/lib/javascript/StartupHelpers.js +7 -30
  153. package/lib/json/JsonData.js +8 -0
  154. package/lib/json/JsonParser.js +4 -6
  155. package/lib/library/AssignLibraryPlugin.js +39 -15
  156. package/lib/library/EnableLibraryPlugin.js +11 -0
  157. package/lib/library/UmdLibraryPlugin.js +5 -3
  158. package/lib/node/NodeTargetPlugin.js +3 -0
  159. package/lib/node/NodeWatchFileSystem.js +85 -31
  160. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +23 -8
  161. package/lib/node/RequireChunkLoadingRuntimeModule.js +24 -9
  162. package/lib/optimize/ConcatenatedModule.js +62 -26
  163. package/lib/optimize/ModuleConcatenationPlugin.js +26 -4
  164. package/lib/optimize/RealContentHashPlugin.js +45 -15
  165. package/lib/optimize/SplitChunksPlugin.js +8 -1
  166. package/lib/runtime/AsyncModuleRuntimeModule.js +50 -66
  167. package/lib/runtime/BaseUriRuntimeModule.js +31 -0
  168. package/lib/runtime/CreateScriptRuntimeModule.js +36 -0
  169. package/lib/runtime/CreateScriptUrlRuntimeModule.js +9 -34
  170. package/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js +76 -0
  171. package/lib/runtime/LoadScriptRuntimeModule.js +11 -9
  172. package/lib/runtime/NonceRuntimeModule.js +24 -0
  173. package/lib/schemes/HttpUriPlugin.js +77 -14
  174. package/lib/serialization/FileMiddleware.js +44 -9
  175. package/lib/sharing/ConsumeSharedModule.js +8 -2
  176. package/lib/sharing/ConsumeSharedRuntimeModule.js +26 -5
  177. package/lib/sharing/ProvideSharedModule.js +4 -2
  178. package/lib/sharing/ProvideSharedPlugin.js +1 -2
  179. package/lib/sharing/ShareRuntimeModule.js +1 -1
  180. package/lib/sharing/utils.js +1 -1
  181. package/lib/stats/DefaultStatsFactoryPlugin.js +113 -68
  182. package/lib/stats/DefaultStatsPrinterPlugin.js +90 -25
  183. package/lib/util/ArrayHelpers.js +30 -0
  184. package/lib/util/AsyncQueue.js +1 -1
  185. package/lib/util/compileBooleanMatcher.js +1 -1
  186. package/lib/util/create-schema-validation.js +9 -2
  187. package/lib/util/createHash.js +12 -0
  188. package/lib/util/deprecation.js +10 -2
  189. package/lib/util/deterministicGrouping.js +1 -1
  190. package/lib/util/extractUrlAndGlobal.js +3 -0
  191. package/lib/util/fs.js +11 -0
  192. package/lib/util/hash/BatchedHash.js +7 -4
  193. package/lib/util/hash/md4.js +20 -0
  194. package/lib/util/hash/wasm-hash.js +163 -0
  195. package/lib/util/hash/xxhash64.js +5 -139
  196. package/lib/util/identifier.js +65 -44
  197. package/lib/util/internalSerializables.js +15 -0
  198. package/lib/util/nonNumericOnlyHash.js +22 -0
  199. package/lib/util/semver.js +17 -10
  200. package/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js +9 -3
  201. package/lib/wasm-sync/WebAssemblyParser.js +1 -1
  202. package/lib/web/JsonpChunkLoadingRuntimeModule.js +31 -18
  203. package/lib/webpack.js +10 -3
  204. package/lib/webworker/ImportScriptsChunkLoadingPlugin.js +3 -11
  205. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +33 -22
  206. package/module.d.ts +215 -0
  207. package/package.json +28 -32
  208. package/schemas/WebpackOptions.check.js +1 -1
  209. package/schemas/WebpackOptions.json +321 -30
  210. package/schemas/plugins/BannerPlugin.check.js +1 -1
  211. package/schemas/plugins/BannerPlugin.json +4 -0
  212. package/schemas/plugins/DllReferencePlugin.check.js +1 -1
  213. package/schemas/plugins/HashedModuleIdsPlugin.check.js +1 -1
  214. package/schemas/plugins/ProgressPlugin.check.js +1 -1
  215. package/schemas/plugins/asset/AssetGeneratorOptions.check.js +1 -1
  216. package/schemas/plugins/asset/AssetParserOptions.check.js +1 -1
  217. package/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js +1 -1
  218. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  219. package/schemas/plugins/container/ContainerPlugin.json +2 -1
  220. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  221. package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
  222. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  223. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  224. package/schemas/plugins/container/ModuleFederationPlugin.json +3 -1
  225. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +7 -0
  226. package/schemas/plugins/css/CssGeneratorOptions.check.js +6 -0
  227. package/schemas/plugins/css/CssGeneratorOptions.json +3 -0
  228. package/schemas/plugins/css/CssParserOptions.check.d.ts +7 -0
  229. package/schemas/plugins/css/CssParserOptions.check.js +6 -0
  230. package/schemas/plugins/css/CssParserOptions.json +3 -0
  231. package/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js +1 -1
  232. package/schemas/plugins/optimize/LimitChunkCountPlugin.check.js +1 -1
  233. package/schemas/plugins/optimize/MinChunkSizePlugin.check.js +1 -1
  234. package/schemas/plugins/schemes/HttpUriPlugin.check.js +1 -1
  235. package/schemas/plugins/schemes/HttpUriPlugin.json +4 -0
  236. package/types.d.ts +869 -296
@@ -0,0 +1,462 @@
1
+ /*
2
+ MIT License http://www.opensource.org/licenses/mit-license.php
3
+ Author Tobias Koppers @sokra
4
+ */
5
+
6
+ "use strict";
7
+
8
+ const { ConcatSource } = require("webpack-sources");
9
+ const HotUpdateChunk = require("../HotUpdateChunk");
10
+ const RuntimeGlobals = require("../RuntimeGlobals");
11
+ const SelfModuleFactory = require("../SelfModuleFactory");
12
+ const CssExportDependency = require("../dependencies/CssExportDependency");
13
+ const CssImportDependency = require("../dependencies/CssImportDependency");
14
+ const CssLocalIdentifierDependency = require("../dependencies/CssLocalIdentifierDependency");
15
+ const CssSelfLocalIdentifierDependency = require("../dependencies/CssSelfLocalIdentifierDependency");
16
+ const CssUrlDependency = require("../dependencies/CssUrlDependency");
17
+ const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
18
+ const { compareModulesByIdentifier } = require("../util/comparators");
19
+ const createSchemaValidation = require("../util/create-schema-validation");
20
+ const createHash = require("../util/createHash");
21
+ const memoize = require("../util/memoize");
22
+ const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
23
+ const CssExportsGenerator = require("./CssExportsGenerator");
24
+ const CssGenerator = require("./CssGenerator");
25
+ const CssParser = require("./CssParser");
26
+
27
+ /** @typedef {import("webpack-sources").Source} Source */
28
+ /** @typedef {import("../../declarations/WebpackOptions").CssExperimentOptions} CssExperimentOptions */
29
+ /** @typedef {import("../Chunk")} Chunk */
30
+ /** @typedef {import("../Compiler")} Compiler */
31
+ /** @typedef {import("../Module")} Module */
32
+
33
+ const getCssLoadingRuntimeModule = memoize(() =>
34
+ require("./CssLoadingRuntimeModule")
35
+ );
36
+
37
+ const getSchema = name => {
38
+ const { definitions } = require("../../schemas/WebpackOptions.json");
39
+ return {
40
+ definitions,
41
+ oneOf: [{ $ref: `#/definitions/${name}` }]
42
+ };
43
+ };
44
+
45
+ const validateGeneratorOptions = createSchemaValidation(
46
+ require("../../schemas/plugins/css/CssGeneratorOptions.check.js"),
47
+ () => getSchema("CssGeneratorOptions"),
48
+ {
49
+ name: "Css Modules Plugin",
50
+ baseDataPath: "parser"
51
+ }
52
+ );
53
+ const validateParserOptions = createSchemaValidation(
54
+ require("../../schemas/plugins/css/CssParserOptions.check.js"),
55
+ () => getSchema("CssParserOptions"),
56
+ {
57
+ name: "Css Modules Plugin",
58
+ baseDataPath: "parser"
59
+ }
60
+ );
61
+
62
+ const escapeCss = (str, omitOptionalUnderscore) => {
63
+ const escaped = `${str}`.replace(
64
+ // cspell:word uffff
65
+ /[^a-zA-Z0-9_\u0081-\uffff-]/g,
66
+ s => `\\${s}`
67
+ );
68
+ return !omitOptionalUnderscore && /^(?!--)[0-9_-]/.test(escaped)
69
+ ? `_${escaped}`
70
+ : escaped;
71
+ };
72
+
73
+ const plugin = "CssModulesPlugin";
74
+
75
+ class CssModulesPlugin {
76
+ /**
77
+ * @param {CssExperimentOptions} options options
78
+ */
79
+ constructor({ exportsOnly = false }) {
80
+ this._exportsOnly = exportsOnly;
81
+ }
82
+ /**
83
+ * Apply the plugin
84
+ * @param {Compiler} compiler the compiler instance
85
+ * @returns {void}
86
+ */
87
+ apply(compiler) {
88
+ compiler.hooks.compilation.tap(
89
+ plugin,
90
+ (compilation, { normalModuleFactory }) => {
91
+ const selfFactory = new SelfModuleFactory(compilation.moduleGraph);
92
+ compilation.dependencyFactories.set(
93
+ CssUrlDependency,
94
+ normalModuleFactory
95
+ );
96
+ compilation.dependencyTemplates.set(
97
+ CssUrlDependency,
98
+ new CssUrlDependency.Template()
99
+ );
100
+ compilation.dependencyTemplates.set(
101
+ CssLocalIdentifierDependency,
102
+ new CssLocalIdentifierDependency.Template()
103
+ );
104
+ compilation.dependencyFactories.set(
105
+ CssSelfLocalIdentifierDependency,
106
+ selfFactory
107
+ );
108
+ compilation.dependencyTemplates.set(
109
+ CssSelfLocalIdentifierDependency,
110
+ new CssSelfLocalIdentifierDependency.Template()
111
+ );
112
+ compilation.dependencyTemplates.set(
113
+ CssExportDependency,
114
+ new CssExportDependency.Template()
115
+ );
116
+ compilation.dependencyFactories.set(
117
+ CssImportDependency,
118
+ normalModuleFactory
119
+ );
120
+ compilation.dependencyTemplates.set(
121
+ CssImportDependency,
122
+ new CssImportDependency.Template()
123
+ );
124
+ compilation.dependencyTemplates.set(
125
+ StaticExportsDependency,
126
+ new StaticExportsDependency.Template()
127
+ );
128
+ normalModuleFactory.hooks.createParser
129
+ .for("css")
130
+ .tap(plugin, parserOptions => {
131
+ validateParserOptions(parserOptions);
132
+ return new CssParser();
133
+ });
134
+ normalModuleFactory.hooks.createParser
135
+ .for("css/global")
136
+ .tap(plugin, parserOptions => {
137
+ validateParserOptions(parserOptions);
138
+ return new CssParser({
139
+ allowPseudoBlocks: false,
140
+ allowModeSwitch: false
141
+ });
142
+ });
143
+ normalModuleFactory.hooks.createParser
144
+ .for("css/module")
145
+ .tap(plugin, parserOptions => {
146
+ validateParserOptions(parserOptions);
147
+ return new CssParser({
148
+ defaultMode: "local"
149
+ });
150
+ });
151
+ normalModuleFactory.hooks.createGenerator
152
+ .for("css")
153
+ .tap(plugin, generatorOptions => {
154
+ validateGeneratorOptions(generatorOptions);
155
+ return this._exportsOnly
156
+ ? new CssExportsGenerator()
157
+ : new CssGenerator();
158
+ });
159
+ normalModuleFactory.hooks.createGenerator
160
+ .for("css/global")
161
+ .tap(plugin, generatorOptions => {
162
+ validateGeneratorOptions(generatorOptions);
163
+ return this._exportsOnly
164
+ ? new CssExportsGenerator()
165
+ : new CssGenerator();
166
+ });
167
+ normalModuleFactory.hooks.createGenerator
168
+ .for("css/module")
169
+ .tap(plugin, generatorOptions => {
170
+ validateGeneratorOptions(generatorOptions);
171
+ return this._exportsOnly
172
+ ? new CssExportsGenerator()
173
+ : new CssGenerator();
174
+ });
175
+ const orderedCssModulesPerChunk = new WeakMap();
176
+ compilation.hooks.afterCodeGeneration.tap("CssModulesPlugin", () => {
177
+ const { chunkGraph } = compilation;
178
+ for (const chunk of compilation.chunks) {
179
+ if (CssModulesPlugin.chunkHasCss(chunk, chunkGraph)) {
180
+ orderedCssModulesPerChunk.set(
181
+ chunk,
182
+ this.getOrderedChunkCssModules(chunk, chunkGraph, compilation)
183
+ );
184
+ }
185
+ }
186
+ });
187
+ compilation.hooks.contentHash.tap("CssModulesPlugin", chunk => {
188
+ const {
189
+ chunkGraph,
190
+ outputOptions: {
191
+ hashSalt,
192
+ hashDigest,
193
+ hashDigestLength,
194
+ hashFunction
195
+ }
196
+ } = compilation;
197
+ const modules = orderedCssModulesPerChunk.get(chunk);
198
+ if (modules === undefined) return;
199
+ const hash = createHash(hashFunction);
200
+ if (hashSalt) hash.update(hashSalt);
201
+ for (const module of modules) {
202
+ hash.update(chunkGraph.getModuleHash(module, chunk.runtime));
203
+ }
204
+ const digest = /** @type {string} */ (hash.digest(hashDigest));
205
+ chunk.contentHash.css = nonNumericOnlyHash(digest, hashDigestLength);
206
+ });
207
+ compilation.hooks.renderManifest.tap(plugin, (result, options) => {
208
+ const { chunkGraph } = compilation;
209
+ const { hash, chunk, codeGenerationResults } = options;
210
+
211
+ if (chunk instanceof HotUpdateChunk) return result;
212
+
213
+ const modules = orderedCssModulesPerChunk.get(chunk);
214
+ if (modules !== undefined) {
215
+ result.push({
216
+ render: () =>
217
+ this.renderChunk({
218
+ chunk,
219
+ chunkGraph,
220
+ codeGenerationResults,
221
+ uniqueName: compilation.outputOptions.uniqueName,
222
+ modules
223
+ }),
224
+ filenameTemplate: CssModulesPlugin.getChunkFilenameTemplate(
225
+ chunk,
226
+ compilation.outputOptions
227
+ ),
228
+ pathOptions: {
229
+ hash,
230
+ runtime: chunk.runtime,
231
+ chunk,
232
+ contentHashType: "css"
233
+ },
234
+ identifier: `css${chunk.id}`,
235
+ hash: chunk.contentHash.css
236
+ });
237
+ }
238
+ return result;
239
+ });
240
+ const enabledChunks = new WeakSet();
241
+ const handler = (chunk, set) => {
242
+ if (enabledChunks.has(chunk)) {
243
+ return;
244
+ }
245
+ enabledChunks.add(chunk);
246
+
247
+ set.add(RuntimeGlobals.publicPath);
248
+ set.add(RuntimeGlobals.getChunkCssFilename);
249
+ set.add(RuntimeGlobals.hasOwnProperty);
250
+ set.add(RuntimeGlobals.moduleFactoriesAddOnly);
251
+ set.add(RuntimeGlobals.makeNamespaceObject);
252
+
253
+ const CssLoadingRuntimeModule = getCssLoadingRuntimeModule();
254
+ compilation.addRuntimeModule(chunk, new CssLoadingRuntimeModule(set));
255
+ };
256
+ compilation.hooks.runtimeRequirementInTree
257
+ .for(RuntimeGlobals.hasCssModules)
258
+ .tap(plugin, handler);
259
+ compilation.hooks.runtimeRequirementInTree
260
+ .for(RuntimeGlobals.ensureChunkHandlers)
261
+ .tap(plugin, handler);
262
+ compilation.hooks.runtimeRequirementInTree
263
+ .for(RuntimeGlobals.hmrDownloadUpdateHandlers)
264
+ .tap(plugin, handler);
265
+ }
266
+ );
267
+ }
268
+
269
+ getModulesInOrder(chunk, modules, compilation) {
270
+ if (!modules) return [];
271
+
272
+ const modulesList = [...modules];
273
+
274
+ // Get ordered list of modules per chunk group
275
+ // Lists are in reverse order to allow to use Array.pop()
276
+ const modulesByChunkGroup = Array.from(chunk.groupsIterable, chunkGroup => {
277
+ const sortedModules = modulesList
278
+ .map(module => {
279
+ return {
280
+ module,
281
+ index: chunkGroup.getModulePostOrderIndex(module)
282
+ };
283
+ })
284
+ .filter(item => item.index !== undefined)
285
+ .sort((a, b) => b.index - a.index)
286
+ .map(item => item.module);
287
+
288
+ return { list: sortedModules, set: new Set(sortedModules) };
289
+ });
290
+
291
+ if (modulesByChunkGroup.length === 1)
292
+ return modulesByChunkGroup[0].list.reverse();
293
+
294
+ const compareModuleLists = ({ list: a }, { list: b }) => {
295
+ if (a.length === 0) {
296
+ return b.length === 0 ? 0 : 1;
297
+ } else {
298
+ if (b.length === 0) return -1;
299
+ return compareModulesByIdentifier(a[a.length - 1], b[b.length - 1]);
300
+ }
301
+ };
302
+
303
+ modulesByChunkGroup.sort(compareModuleLists);
304
+
305
+ const finalModules = [];
306
+
307
+ for (;;) {
308
+ const failedModules = new Set();
309
+ const list = modulesByChunkGroup[0].list;
310
+ if (list.length === 0) {
311
+ // done, everything empty
312
+ break;
313
+ }
314
+ let selectedModule = list[list.length - 1];
315
+ let hasFailed = undefined;
316
+ outer: for (;;) {
317
+ for (const { list, set } of modulesByChunkGroup) {
318
+ if (list.length === 0) continue;
319
+ const lastModule = list[list.length - 1];
320
+ if (lastModule === selectedModule) continue;
321
+ if (!set.has(selectedModule)) continue;
322
+ failedModules.add(selectedModule);
323
+ if (failedModules.has(lastModule)) {
324
+ // There is a conflict, try other alternatives
325
+ hasFailed = lastModule;
326
+ continue;
327
+ }
328
+ selectedModule = lastModule;
329
+ hasFailed = false;
330
+ continue outer; // restart
331
+ }
332
+ break;
333
+ }
334
+ if (hasFailed) {
335
+ // There is a not resolve-able conflict with the selectedModule
336
+ if (compilation) {
337
+ // TODO print better warning
338
+ compilation.warnings.push(
339
+ new Error(
340
+ `chunk ${
341
+ chunk.name || chunk.id
342
+ }\nConflicting order between ${hasFailed.readableIdentifier(
343
+ compilation.requestShortener
344
+ )} and ${selectedModule.readableIdentifier(
345
+ compilation.requestShortener
346
+ )}`
347
+ )
348
+ );
349
+ }
350
+ selectedModule = hasFailed;
351
+ }
352
+ // Insert the selected module into the final modules list
353
+ finalModules.push(selectedModule);
354
+ // Remove the selected module from all lists
355
+ for (const { list, set } of modulesByChunkGroup) {
356
+ const lastModule = list[list.length - 1];
357
+ if (lastModule === selectedModule) list.pop();
358
+ else if (hasFailed && set.has(selectedModule)) {
359
+ const idx = list.indexOf(selectedModule);
360
+ if (idx >= 0) list.splice(idx, 1);
361
+ }
362
+ }
363
+ modulesByChunkGroup.sort(compareModuleLists);
364
+ }
365
+ return finalModules;
366
+ }
367
+
368
+ getOrderedChunkCssModules(chunk, chunkGraph, compilation) {
369
+ return [
370
+ ...this.getModulesInOrder(
371
+ chunk,
372
+ chunkGraph.getOrderedChunkModulesIterableBySourceType(
373
+ chunk,
374
+ "css-import",
375
+ compareModulesByIdentifier
376
+ ),
377
+ compilation
378
+ ),
379
+ ...this.getModulesInOrder(
380
+ chunk,
381
+ chunkGraph.getOrderedChunkModulesIterableBySourceType(
382
+ chunk,
383
+ "css",
384
+ compareModulesByIdentifier
385
+ ),
386
+ compilation
387
+ )
388
+ ];
389
+ }
390
+
391
+ renderChunk({
392
+ uniqueName,
393
+ chunk,
394
+ chunkGraph,
395
+ codeGenerationResults,
396
+ modules
397
+ }) {
398
+ const source = new ConcatSource();
399
+ const metaData = [];
400
+ for (const module of modules) {
401
+ try {
402
+ const codeGenResult = codeGenerationResults.get(module, chunk.runtime);
403
+
404
+ const s =
405
+ codeGenResult.sources.get("css") ||
406
+ codeGenResult.sources.get("css-import");
407
+ if (s) {
408
+ source.add(s);
409
+ source.add("\n");
410
+ }
411
+ const exports =
412
+ codeGenResult.data && codeGenResult.data.get("css-exports");
413
+ const moduleId = chunkGraph.getModuleId(module) + "";
414
+ metaData.push(
415
+ `${
416
+ exports
417
+ ? Array.from(exports, ([n, v]) => {
418
+ const shortcutValue = `${
419
+ uniqueName ? uniqueName + "-" : ""
420
+ }${moduleId}-${n}`;
421
+ return v === shortcutValue
422
+ ? `${escapeCss(n)}/`
423
+ : v === "--" + shortcutValue
424
+ ? `${escapeCss(n)}%`
425
+ : `${escapeCss(n)}(${escapeCss(v)})`;
426
+ }).join("")
427
+ : ""
428
+ }${escapeCss(moduleId)}`
429
+ );
430
+ } catch (e) {
431
+ e.message += `\nduring rendering of css ${module.identifier()}`;
432
+ throw e;
433
+ }
434
+ }
435
+ source.add(
436
+ `head{--webpack-${escapeCss(
437
+ (uniqueName ? uniqueName + "-" : "") + chunk.id,
438
+ true
439
+ )}:${metaData.join(",")};}`
440
+ );
441
+ return source;
442
+ }
443
+
444
+ static getChunkFilenameTemplate(chunk, outputOptions) {
445
+ if (chunk.cssFilenameTemplate) {
446
+ return chunk.cssFilenameTemplate;
447
+ } else if (chunk.canBeInitial()) {
448
+ return outputOptions.cssFilename;
449
+ } else {
450
+ return outputOptions.cssChunkFilename;
451
+ }
452
+ }
453
+
454
+ static chunkHasCss(chunk, chunkGraph) {
455
+ return (
456
+ !!chunkGraph.getChunkModulesIterableBySourceType(chunk, "css") ||
457
+ !!chunkGraph.getChunkModulesIterableBySourceType(chunk, "css-import")
458
+ );
459
+ }
460
+ }
461
+
462
+ module.exports = CssModulesPlugin;