webpack 5.65.0 → 5.66.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 (60) hide show
  1. package/lib/CacheFacade.js +2 -9
  2. package/lib/Chunk.js +2 -0
  3. package/lib/Compilation.js +79 -38
  4. package/lib/Dependency.js +10 -0
  5. package/lib/DependencyTemplate.js +9 -0
  6. package/lib/ExternalModule.js +92 -52
  7. package/lib/Generator.js +2 -0
  8. package/lib/Module.js +24 -1
  9. package/lib/ModuleFilenameHelpers.js +5 -1
  10. package/lib/NormalModule.js +3 -1
  11. package/lib/RuntimeGlobals.js +11 -1
  12. package/lib/RuntimePlugin.js +25 -0
  13. package/lib/RuntimeTemplate.js +21 -0
  14. package/lib/Template.js +2 -1
  15. package/lib/Watching.js +1 -1
  16. package/lib/WebpackOptionsApply.js +43 -2
  17. package/lib/asset/AssetGenerator.js +3 -1
  18. package/lib/asset/RawDataUrlModule.js +145 -0
  19. package/lib/config/defaults.js +59 -3
  20. package/lib/css/CssGenerator.js +106 -0
  21. package/lib/css/CssLoadingRuntimeModule.js +393 -0
  22. package/lib/css/CssModulesPlugin.js +444 -0
  23. package/lib/css/CssParser.js +618 -0
  24. package/lib/css/walkCssTokens.js +659 -0
  25. package/lib/dependencies/CssExportDependency.js +85 -0
  26. package/lib/dependencies/CssImportDependency.js +75 -0
  27. package/lib/dependencies/CssLocalIdentifierDependency.js +119 -0
  28. package/lib/dependencies/CssSelfLocalIdentifierDependency.js +101 -0
  29. package/lib/dependencies/CssUrlDependency.js +132 -0
  30. package/lib/dependencies/URLDependency.js +3 -8
  31. package/lib/esm/ModuleChunkLoadingRuntimeModule.js +1 -1
  32. package/lib/hmr/lazyCompilationBackend.js +3 -1
  33. package/lib/javascript/JavascriptGenerator.js +1 -0
  34. package/lib/javascript/StartupHelpers.js +3 -3
  35. package/lib/library/AssignLibraryPlugin.js +26 -3
  36. package/lib/library/EnableLibraryPlugin.js +11 -0
  37. package/lib/node/ReadFileChunkLoadingRuntimeModule.js +1 -1
  38. package/lib/node/RequireChunkLoadingRuntimeModule.js +1 -1
  39. package/lib/optimize/ConcatenatedModule.js +10 -4
  40. package/lib/util/hash/xxhash64.js +2 -2
  41. package/lib/util/internalSerializables.js +11 -0
  42. package/lib/web/JsonpChunkLoadingRuntimeModule.js +2 -2
  43. package/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js +1 -1
  44. package/package.json +2 -2
  45. package/schemas/WebpackOptions.check.js +1 -1
  46. package/schemas/WebpackOptions.json +55 -1
  47. package/schemas/plugins/container/ContainerPlugin.check.js +1 -1
  48. package/schemas/plugins/container/ContainerPlugin.json +2 -1
  49. package/schemas/plugins/container/ContainerReferencePlugin.check.js +1 -1
  50. package/schemas/plugins/container/ContainerReferencePlugin.json +1 -0
  51. package/schemas/plugins/container/ExternalsType.check.js +1 -1
  52. package/schemas/plugins/container/ModuleFederationPlugin.check.js +1 -1
  53. package/schemas/plugins/container/ModuleFederationPlugin.json +3 -1
  54. package/schemas/plugins/css/CssGeneratorOptions.check.d.ts +7 -0
  55. package/schemas/plugins/css/CssGeneratorOptions.check.js +6 -0
  56. package/schemas/plugins/css/CssGeneratorOptions.json +3 -0
  57. package/schemas/plugins/css/CssParserOptions.check.d.ts +7 -0
  58. package/schemas/plugins/css/CssParserOptions.check.js +6 -0
  59. package/schemas/plugins/css/CssParserOptions.json +3 -0
  60. package/types.d.ts +86 -2
@@ -0,0 +1,444 @@
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 CssGenerator = require("./CssGenerator");
23
+ const CssParser = require("./CssParser");
24
+
25
+ /** @typedef {import("webpack-sources").Source} Source */
26
+ /** @typedef {import("../Chunk")} Chunk */
27
+ /** @typedef {import("../Compiler")} Compiler */
28
+ /** @typedef {import("../Module")} Module */
29
+
30
+ const getCssLoadingRuntimeModule = memoize(() =>
31
+ require("./CssLoadingRuntimeModule")
32
+ );
33
+
34
+ const getSchema = name => {
35
+ const { definitions } = require("../../schemas/WebpackOptions.json");
36
+ return {
37
+ definitions,
38
+ oneOf: [{ $ref: `#/definitions/${name}` }]
39
+ };
40
+ };
41
+
42
+ const validateGeneratorOptions = createSchemaValidation(
43
+ require("../../schemas/plugins/css/CssGeneratorOptions.check.js"),
44
+ () => getSchema("CssGeneratorOptions"),
45
+ {
46
+ name: "Css Modules Plugin",
47
+ baseDataPath: "parser"
48
+ }
49
+ );
50
+ const validateParserOptions = createSchemaValidation(
51
+ require("../../schemas/plugins/css/CssParserOptions.check.js"),
52
+ () => getSchema("CssParserOptions"),
53
+ {
54
+ name: "Css Modules Plugin",
55
+ baseDataPath: "parser"
56
+ }
57
+ );
58
+
59
+ const escapeCss = (str, omitOptionalUnderscore) => {
60
+ const escaped = `${str}`.replace(
61
+ // cspell:word uffff
62
+ /[^a-zA-Z0-9_\u0081-\uffff-]/g,
63
+ s => `\\${s}`
64
+ );
65
+ return !omitOptionalUnderscore && /^(?!--)[0-9_-]/.test(escaped)
66
+ ? `_${escaped}`
67
+ : escaped;
68
+ };
69
+
70
+ const plugin = "CssModulesPlugin";
71
+
72
+ class CssModulesPlugin {
73
+ /**
74
+ * Apply the plugin
75
+ * @param {Compiler} compiler the compiler instance
76
+ * @returns {void}
77
+ */
78
+ apply(compiler) {
79
+ compiler.hooks.compilation.tap(
80
+ plugin,
81
+ (compilation, { normalModuleFactory }) => {
82
+ const selfFactory = new SelfModuleFactory(compilation.moduleGraph);
83
+ compilation.dependencyFactories.set(
84
+ CssUrlDependency,
85
+ normalModuleFactory
86
+ );
87
+ compilation.dependencyTemplates.set(
88
+ CssUrlDependency,
89
+ new CssUrlDependency.Template()
90
+ );
91
+ compilation.dependencyTemplates.set(
92
+ CssLocalIdentifierDependency,
93
+ new CssLocalIdentifierDependency.Template()
94
+ );
95
+ compilation.dependencyFactories.set(
96
+ CssSelfLocalIdentifierDependency,
97
+ selfFactory
98
+ );
99
+ compilation.dependencyTemplates.set(
100
+ CssSelfLocalIdentifierDependency,
101
+ new CssSelfLocalIdentifierDependency.Template()
102
+ );
103
+ compilation.dependencyTemplates.set(
104
+ CssExportDependency,
105
+ new CssExportDependency.Template()
106
+ );
107
+ compilation.dependencyFactories.set(
108
+ CssImportDependency,
109
+ normalModuleFactory
110
+ );
111
+ compilation.dependencyTemplates.set(
112
+ CssImportDependency,
113
+ new CssImportDependency.Template()
114
+ );
115
+ compilation.dependencyTemplates.set(
116
+ StaticExportsDependency,
117
+ new StaticExportsDependency.Template()
118
+ );
119
+ normalModuleFactory.hooks.createParser
120
+ .for("css")
121
+ .tap(plugin, parserOptions => {
122
+ validateParserOptions(parserOptions);
123
+ return new CssParser();
124
+ });
125
+ normalModuleFactory.hooks.createParser
126
+ .for("css/global")
127
+ .tap(plugin, parserOptions => {
128
+ validateParserOptions(parserOptions);
129
+ return new CssParser({
130
+ allowPseudoBlocks: false,
131
+ allowModeSwitch: false
132
+ });
133
+ });
134
+ normalModuleFactory.hooks.createParser
135
+ .for("css/module")
136
+ .tap(plugin, parserOptions => {
137
+ validateParserOptions(parserOptions);
138
+ return new CssParser({
139
+ defaultMode: "local"
140
+ });
141
+ });
142
+ normalModuleFactory.hooks.createGenerator
143
+ .for("css")
144
+ .tap(plugin, generatorOptions => {
145
+ validateGeneratorOptions(generatorOptions);
146
+ return new CssGenerator();
147
+ });
148
+ normalModuleFactory.hooks.createGenerator
149
+ .for("css/global")
150
+ .tap(plugin, generatorOptions => {
151
+ validateGeneratorOptions(generatorOptions);
152
+ return new CssGenerator();
153
+ });
154
+ normalModuleFactory.hooks.createGenerator
155
+ .for("css/module")
156
+ .tap(plugin, generatorOptions => {
157
+ validateGeneratorOptions(generatorOptions);
158
+ return new CssGenerator();
159
+ });
160
+ const orderedCssModulesPerChunk = new WeakMap();
161
+ compilation.hooks.afterCodeGeneration.tap("CssModulesPlugin", () => {
162
+ const { chunkGraph } = compilation;
163
+ for (const chunk of compilation.chunks) {
164
+ if (CssModulesPlugin.chunkHasCss(chunk, chunkGraph)) {
165
+ orderedCssModulesPerChunk.set(
166
+ chunk,
167
+ this.getOrderedChunkCssModules(chunk, chunkGraph, compilation)
168
+ );
169
+ }
170
+ }
171
+ });
172
+ compilation.hooks.contentHash.tap("CssModulesPlugin", chunk => {
173
+ const {
174
+ chunkGraph,
175
+ outputOptions: {
176
+ hashSalt,
177
+ hashDigest,
178
+ hashDigestLength,
179
+ hashFunction
180
+ }
181
+ } = compilation;
182
+ const modules = orderedCssModulesPerChunk.get(chunk);
183
+ if (modules === undefined) return;
184
+ const hash = createHash(hashFunction);
185
+ if (hashSalt) hash.update(hashSalt);
186
+ for (const module of modules) {
187
+ hash.update(chunkGraph.getModuleHash(module, chunk.runtime));
188
+ }
189
+ const digest = /** @type {string} */ (hash.digest(hashDigest));
190
+ chunk.contentHash.css = digest.substr(0, hashDigestLength);
191
+ });
192
+ compilation.hooks.renderManifest.tap(plugin, (result, options) => {
193
+ const { chunkGraph } = compilation;
194
+ const { hash, chunk, codeGenerationResults } = options;
195
+
196
+ if (chunk instanceof HotUpdateChunk) return result;
197
+
198
+ const modules = orderedCssModulesPerChunk.get(chunk);
199
+ if (modules !== undefined) {
200
+ result.push({
201
+ render: () =>
202
+ this.renderChunk({
203
+ chunk,
204
+ chunkGraph,
205
+ codeGenerationResults,
206
+ uniqueName: compilation.outputOptions.uniqueName,
207
+ modules
208
+ }),
209
+ filenameTemplate: CssModulesPlugin.getChunkFilenameTemplate(
210
+ chunk,
211
+ compilation.outputOptions
212
+ ),
213
+ pathOptions: {
214
+ hash,
215
+ runtime: chunk.runtime,
216
+ chunk,
217
+ contentHashType: "css"
218
+ },
219
+ identifier: `css${chunk.id}`,
220
+ hash: chunk.contentHash.css
221
+ });
222
+ }
223
+ return result;
224
+ });
225
+ const enabledChunks = new WeakSet();
226
+ const handler = (chunk, set) => {
227
+ if (enabledChunks.has(chunk)) {
228
+ return;
229
+ }
230
+ enabledChunks.add(chunk);
231
+
232
+ set.add(RuntimeGlobals.publicPath);
233
+ set.add(RuntimeGlobals.getChunkCssFilename);
234
+ set.add(RuntimeGlobals.hasOwnProperty);
235
+ set.add(RuntimeGlobals.moduleFactoriesAddOnly);
236
+ set.add(RuntimeGlobals.makeNamespaceObject);
237
+
238
+ const CssLoadingRuntimeModule = getCssLoadingRuntimeModule();
239
+ compilation.addRuntimeModule(chunk, new CssLoadingRuntimeModule(set));
240
+ };
241
+ compilation.hooks.runtimeRequirementInTree
242
+ .for(RuntimeGlobals.ensureChunkHandlers)
243
+ .tap(plugin, handler);
244
+ compilation.hooks.runtimeRequirementInTree
245
+ .for(RuntimeGlobals.hmrDownloadUpdateHandlers)
246
+ .tap(plugin, handler);
247
+ }
248
+ );
249
+ }
250
+
251
+ getModulesInOrder(chunk, modules, compilation) {
252
+ if (!modules) return [];
253
+
254
+ const modulesList = [...modules];
255
+
256
+ // Get ordered list of modules per chunk group
257
+ // Lists are in reverse order to allow to use Array.pop()
258
+ const modulesByChunkGroup = Array.from(chunk.groupsIterable, chunkGroup => {
259
+ const sortedModules = modulesList
260
+ .map(module => {
261
+ return {
262
+ module,
263
+ index: chunkGroup.getModulePostOrderIndex(module)
264
+ };
265
+ })
266
+ .filter(item => item.index !== undefined)
267
+ .sort((a, b) => b.index - a.index)
268
+ .map(item => item.module);
269
+
270
+ return { list: sortedModules, set: new Set(sortedModules) };
271
+ });
272
+
273
+ if (modulesByChunkGroup.length === 1)
274
+ return modulesByChunkGroup[0].list.reverse();
275
+
276
+ const compareModuleLists = ({ list: a }, { list: b }) => {
277
+ if (a.length === 0) {
278
+ return b.length === 0 ? 0 : 1;
279
+ } else {
280
+ if (b.length === 0) return -1;
281
+ return compareModulesByIdentifier(a[a.length - 1], b[b.length - 1]);
282
+ }
283
+ };
284
+
285
+ modulesByChunkGroup.sort(compareModuleLists);
286
+
287
+ const finalModules = [];
288
+
289
+ for (;;) {
290
+ const failedModules = new Set();
291
+ const list = modulesByChunkGroup[0].list;
292
+ if (list.length === 0) {
293
+ // done, everything empty
294
+ break;
295
+ }
296
+ let selectedModule = list[list.length - 1];
297
+ let hasFailed = undefined;
298
+ outer: for (;;) {
299
+ for (const { list, set } of modulesByChunkGroup) {
300
+ if (list.length === 0) continue;
301
+ const lastModule = list[list.length - 1];
302
+ if (lastModule === selectedModule) continue;
303
+ if (!set.has(selectedModule)) continue;
304
+ failedModules.add(selectedModule);
305
+ if (failedModules.has(lastModule)) {
306
+ // There is a conflict, try other alternatives
307
+ hasFailed = lastModule;
308
+ continue;
309
+ }
310
+ selectedModule = lastModule;
311
+ hasFailed = false;
312
+ continue outer; // restart
313
+ }
314
+ break;
315
+ }
316
+ if (hasFailed) {
317
+ // There is a not resolve-able conflict with the selectedModule
318
+ if (compilation) {
319
+ // TODO print better warning
320
+ compilation.warnings.push(
321
+ new Error(
322
+ `chunk ${
323
+ chunk.name || chunk.id
324
+ }\nConflicting order between ${hasFailed.readableIdentifier(
325
+ compilation.requestShortener
326
+ )} and ${selectedModule.readableIdentifier(
327
+ compilation.requestShortener
328
+ )}`
329
+ )
330
+ );
331
+ }
332
+ selectedModule = hasFailed;
333
+ }
334
+ // Insert the selected module into the final modules list
335
+ finalModules.push(selectedModule);
336
+ // Remove the selected module from all lists
337
+ for (const { list, set } of modulesByChunkGroup) {
338
+ const lastModule = list[list.length - 1];
339
+ if (lastModule === selectedModule) list.pop();
340
+ else if (hasFailed && set.has(selectedModule)) {
341
+ const idx = list.indexOf(selectedModule);
342
+ if (idx >= 0) list.splice(idx, 1);
343
+ }
344
+ }
345
+ modulesByChunkGroup.sort(compareModuleLists);
346
+ }
347
+ return finalModules;
348
+ }
349
+
350
+ getOrderedChunkCssModules(chunk, chunkGraph, compilation) {
351
+ return [
352
+ ...this.getModulesInOrder(
353
+ chunk,
354
+ chunkGraph.getOrderedChunkModulesIterableBySourceType(
355
+ chunk,
356
+ "css-import",
357
+ compareModulesByIdentifier
358
+ ),
359
+ compilation
360
+ ),
361
+ ...this.getModulesInOrder(
362
+ chunk,
363
+ chunkGraph.getOrderedChunkModulesIterableBySourceType(
364
+ chunk,
365
+ "css",
366
+ compareModulesByIdentifier
367
+ ),
368
+ compilation
369
+ )
370
+ ];
371
+ }
372
+
373
+ renderChunk({
374
+ uniqueName,
375
+ chunk,
376
+ chunkGraph,
377
+ codeGenerationResults,
378
+ modules
379
+ }) {
380
+ const source = new ConcatSource();
381
+ const metaData = [];
382
+ for (const module of modules) {
383
+ try {
384
+ const codeGenResult = codeGenerationResults.get(module, chunk.runtime);
385
+
386
+ const s =
387
+ codeGenResult.sources.get("css") ||
388
+ codeGenResult.sources.get("css-import");
389
+ if (s) {
390
+ source.add(s);
391
+ source.add("\n");
392
+ }
393
+ const exports =
394
+ codeGenResult.data && codeGenResult.data.get("css-exports");
395
+ const moduleId = chunkGraph.getModuleId(module) + "";
396
+ metaData.push(
397
+ `${
398
+ exports
399
+ ? Array.from(exports, ([n, v]) => {
400
+ const shortcutValue = `${
401
+ uniqueName ? uniqueName + "-" : ""
402
+ }${moduleId}-${n}`;
403
+ return v === shortcutValue
404
+ ? `${escapeCss(n)}/`
405
+ : v === "--" + shortcutValue
406
+ ? `${escapeCss(n)}%`
407
+ : `${escapeCss(n)}(${escapeCss(v)})`;
408
+ }).join("")
409
+ : ""
410
+ }${escapeCss(moduleId)}`
411
+ );
412
+ } catch (e) {
413
+ e.message += `\nduring rendering of css ${module.identifier()}`;
414
+ throw e;
415
+ }
416
+ }
417
+ source.add(
418
+ `head{--webpack-${escapeCss(
419
+ (uniqueName ? uniqueName + "-" : "") + chunk.id,
420
+ true
421
+ )}:${metaData.join(",")};}`
422
+ );
423
+ return source;
424
+ }
425
+
426
+ static getChunkFilenameTemplate(chunk, outputOptions) {
427
+ if (chunk.cssFilenameTemplate) {
428
+ return chunk.cssFilenameTemplate;
429
+ } else if (chunk.canBeInitial()) {
430
+ return outputOptions.cssFilename;
431
+ } else {
432
+ return outputOptions.cssChunkFilename;
433
+ }
434
+ }
435
+
436
+ static chunkHasCss(chunk, chunkGraph) {
437
+ return (
438
+ !!chunkGraph.getChunkModulesIterableBySourceType(chunk, "css") ||
439
+ !!chunkGraph.getChunkModulesIterableBySourceType(chunk, "css-import")
440
+ );
441
+ }
442
+ }
443
+
444
+ module.exports = CssModulesPlugin;