webpack 5.72.0 → 5.74.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 (42) hide show
  1. package/README.md +16 -9
  2. package/lib/Compilation.js +5 -1
  3. package/lib/Compiler.js +1 -1
  4. package/lib/DllReferencePlugin.js +1 -1
  5. package/lib/FileSystemInfo.js +35 -14
  6. package/lib/NodeStuffPlugin.js +3 -3
  7. package/lib/NormalModule.js +1 -1
  8. package/lib/RuntimePlugin.js +7 -0
  9. package/lib/config/defaults.js +12 -4
  10. package/lib/container/ModuleFederationPlugin.js +2 -0
  11. package/lib/css/CssLoadingRuntimeModule.js +9 -7
  12. package/lib/dependencies/CommonJsImportsParserPlugin.js +342 -61
  13. package/lib/dependencies/CommonJsRequireContextDependency.js +2 -2
  14. package/lib/dependencies/CommonJsRequireDependency.js +2 -1
  15. package/lib/dependencies/ContextDependency.js +15 -2
  16. package/lib/dependencies/ContextDependencyHelpers.js +18 -5
  17. package/lib/dependencies/ContextElementDependency.js +0 -16
  18. package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +35 -3
  19. package/lib/dependencies/ImportParserPlugin.js +31 -25
  20. package/lib/dependencies/JsonExportsDependency.js +17 -21
  21. package/lib/dependencies/LoaderDependency.js +13 -0
  22. package/lib/dependencies/LoaderImportDependency.js +13 -0
  23. package/lib/dependencies/ModuleDependency.js +11 -1
  24. package/lib/dependencies/ProvidedDependency.js +31 -8
  25. package/lib/dependencies/RequireResolveContextDependency.js +2 -2
  26. package/lib/dependencies/RequireResolveDependency.js +2 -1
  27. package/lib/dependencies/URLPlugin.js +21 -0
  28. package/lib/index.js +4 -0
  29. package/lib/javascript/JavascriptParser.js +47 -21
  30. package/lib/json/JsonData.js +8 -0
  31. package/lib/json/JsonParser.js +4 -6
  32. package/lib/optimize/ConcatenatedModule.js +40 -17
  33. package/lib/optimize/ModuleConcatenationPlugin.js +1 -1
  34. package/lib/runtime/AsyncModuleRuntimeModule.js +32 -58
  35. package/lib/runtime/LoadScriptRuntimeModule.js +9 -7
  36. package/lib/runtime/NonceRuntimeModule.js +24 -0
  37. package/lib/sharing/ProvideSharedPlugin.js +1 -2
  38. package/lib/web/JsonpChunkLoadingRuntimeModule.js +11 -9
  39. package/package.json +6 -5
  40. package/schemas/WebpackOptions.check.js +1 -1
  41. package/schemas/WebpackOptions.json +60 -0
  42. package/types.d.ts +94 -4
@@ -5,9 +5,12 @@
5
5
 
6
6
  "use strict";
7
7
 
8
+ const { fileURLToPath } = require("url");
8
9
  const CommentCompilationWarning = require("../CommentCompilationWarning");
9
10
  const RuntimeGlobals = require("../RuntimeGlobals");
10
11
  const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
12
+ const WebpackError = require("../WebpackError");
13
+ const BasicEvaluatedExpression = require("../javascript/BasicEvaluatedExpression");
11
14
  const {
12
15
  evaluateToIdentifier,
13
16
  evaluateToString,
@@ -26,8 +29,12 @@ const RequireResolveContextDependency = require("./RequireResolveContextDependen
26
29
  const RequireResolveDependency = require("./RequireResolveDependency");
27
30
  const RequireResolveHeaderDependency = require("./RequireResolveHeaderDependency");
28
31
 
32
+ /** @typedef {import("estree").CallExpression} CallExpressionNode */
29
33
  /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
30
34
 
35
+ const createRequireSpecifierTag = Symbol("createRequire");
36
+ const createdRequireIdentifierTag = Symbol("createRequire()");
37
+
31
38
  class CommonJsImportsParserPlugin {
32
39
  /**
33
40
  * @param {JavascriptParserOptions} options parser options
@@ -39,51 +46,72 @@ class CommonJsImportsParserPlugin {
39
46
  apply(parser) {
40
47
  const options = this.options;
41
48
 
42
- // metadata //
49
+ const getContext = () => {
50
+ if (parser.currentTagData) {
51
+ const { context } = parser.currentTagData;
52
+ return context;
53
+ }
54
+ };
55
+
56
+ //#region metadata
43
57
  const tapRequireExpression = (expression, getMembers) => {
44
58
  parser.hooks.typeof
45
59
  .for(expression)
46
60
  .tap(
47
- "CommonJsPlugin",
61
+ "CommonJsImportsParserPlugin",
48
62
  toConstantDependency(parser, JSON.stringify("function"))
49
63
  );
50
64
  parser.hooks.evaluateTypeof
51
65
  .for(expression)
52
- .tap("CommonJsPlugin", evaluateToString("function"));
66
+ .tap("CommonJsImportsParserPlugin", evaluateToString("function"));
53
67
  parser.hooks.evaluateIdentifier
54
68
  .for(expression)
55
69
  .tap(
56
- "CommonJsPlugin",
70
+ "CommonJsImportsParserPlugin",
57
71
  evaluateToIdentifier(expression, "require", getMembers, true)
58
72
  );
59
73
  };
74
+ const tapRequireExpressionTag = tag => {
75
+ parser.hooks.typeof
76
+ .for(tag)
77
+ .tap(
78
+ "CommonJsImportsParserPlugin",
79
+ toConstantDependency(parser, JSON.stringify("function"))
80
+ );
81
+ parser.hooks.evaluateTypeof
82
+ .for(tag)
83
+ .tap("CommonJsImportsParserPlugin", evaluateToString("function"));
84
+ };
60
85
  tapRequireExpression("require", () => []);
61
86
  tapRequireExpression("require.resolve", () => ["resolve"]);
62
87
  tapRequireExpression("require.resolveWeak", () => ["resolveWeak"]);
88
+ //#endregion
63
89
 
64
90
  // Weird stuff //
65
- parser.hooks.assign.for("require").tap("CommonJsPlugin", expr => {
66
- // to not leak to global "require", we need to define a local require here.
67
- const dep = new ConstDependency("var require;", 0);
68
- dep.loc = expr.loc;
69
- parser.state.module.addPresentationalDependency(dep);
70
- return true;
71
- });
91
+ parser.hooks.assign
92
+ .for("require")
93
+ .tap("CommonJsImportsParserPlugin", expr => {
94
+ // to not leak to global "require", we need to define a local require here.
95
+ const dep = new ConstDependency("var require;", 0);
96
+ dep.loc = expr.loc;
97
+ parser.state.module.addPresentationalDependency(dep);
98
+ return true;
99
+ });
72
100
 
73
- // Unsupported //
101
+ //#region Unsupported
74
102
  parser.hooks.expression
75
- .for("require.main.require")
103
+ .for("require.main")
76
104
  .tap(
77
- "CommonJsPlugin",
105
+ "CommonJsImportsParserPlugin",
78
106
  expressionIsUnsupported(
79
107
  parser,
80
- "require.main.require is not supported by webpack."
108
+ "require.main is not supported by webpack."
81
109
  )
82
110
  );
83
111
  parser.hooks.call
84
112
  .for("require.main.require")
85
113
  .tap(
86
- "CommonJsPlugin",
114
+ "CommonJsImportsParserPlugin",
87
115
  expressionIsUnsupported(
88
116
  parser,
89
117
  "require.main.require is not supported by webpack."
@@ -92,7 +120,7 @@ class CommonJsImportsParserPlugin {
92
120
  parser.hooks.expression
93
121
  .for("module.parent.require")
94
122
  .tap(
95
- "CommonJsPlugin",
123
+ "CommonJsImportsParserPlugin",
96
124
  expressionIsUnsupported(
97
125
  parser,
98
126
  "module.parent.require is not supported by webpack."
@@ -101,63 +129,81 @@ class CommonJsImportsParserPlugin {
101
129
  parser.hooks.call
102
130
  .for("module.parent.require")
103
131
  .tap(
104
- "CommonJsPlugin",
132
+ "CommonJsImportsParserPlugin",
105
133
  expressionIsUnsupported(
106
134
  parser,
107
135
  "module.parent.require is not supported by webpack."
108
136
  )
109
137
  );
138
+ //#endregion
110
139
 
111
- // renaming //
112
- parser.hooks.canRename.for("require").tap("CommonJsPlugin", () => true);
113
- parser.hooks.rename.for("require").tap("CommonJsPlugin", expr => {
140
+ //#region Renaming
141
+ const defineUndefined = expr => {
114
142
  // To avoid "not defined" error, replace the value with undefined
115
143
  const dep = new ConstDependency("undefined", expr.range);
116
144
  dep.loc = expr.loc;
117
145
  parser.state.module.addPresentationalDependency(dep);
118
146
  return false;
119
- });
147
+ };
148
+ parser.hooks.canRename
149
+ .for("require")
150
+ .tap("CommonJsImportsParserPlugin", () => true);
151
+ parser.hooks.rename
152
+ .for("require")
153
+ .tap("CommonJsImportsParserPlugin", defineUndefined);
154
+ //#endregion
155
+
156
+ //#region Inspection
157
+ const requireCache = toConstantDependency(
158
+ parser,
159
+ RuntimeGlobals.moduleCache,
160
+ [
161
+ RuntimeGlobals.moduleCache,
162
+ RuntimeGlobals.moduleId,
163
+ RuntimeGlobals.moduleLoaded
164
+ ]
165
+ );
120
166
 
121
- // inspection //
122
167
  parser.hooks.expression
123
168
  .for("require.cache")
124
- .tap(
125
- "CommonJsImportsParserPlugin",
126
- toConstantDependency(parser, RuntimeGlobals.moduleCache, [
127
- RuntimeGlobals.moduleCache,
128
- RuntimeGlobals.moduleId,
129
- RuntimeGlobals.moduleLoaded
130
- ])
131
- );
169
+ .tap("CommonJsImportsParserPlugin", requireCache);
170
+ //#endregion
132
171
 
133
- // require as expression //
172
+ //#region Require as expression
173
+ const requireAsExpressionHandler = expr => {
174
+ const dep = new CommonJsRequireContextDependency(
175
+ {
176
+ request: options.unknownContextRequest,
177
+ recursive: options.unknownContextRecursive,
178
+ regExp: options.unknownContextRegExp,
179
+ mode: "sync"
180
+ },
181
+ expr.range,
182
+ undefined,
183
+ parser.scope.inShorthand,
184
+ getContext()
185
+ );
186
+ dep.critical =
187
+ options.unknownContextCritical &&
188
+ "require function is used in a way in which dependencies cannot be statically extracted";
189
+ dep.loc = expr.loc;
190
+ dep.optional = !!parser.scope.inTry;
191
+ parser.state.current.addDependency(dep);
192
+ return true;
193
+ };
134
194
  parser.hooks.expression
135
195
  .for("require")
136
- .tap("CommonJsImportsParserPlugin", expr => {
137
- const dep = new CommonJsRequireContextDependency(
138
- {
139
- request: options.unknownContextRequest,
140
- recursive: options.unknownContextRecursive,
141
- regExp: options.unknownContextRegExp,
142
- mode: "sync"
143
- },
144
- expr.range,
145
- undefined,
146
- parser.scope.inShorthand
147
- );
148
- dep.critical =
149
- options.unknownContextCritical &&
150
- "require function is used in a way in which dependencies cannot be statically extracted";
151
- dep.loc = expr.loc;
152
- dep.optional = !!parser.scope.inTry;
153
- parser.state.current.addDependency(dep);
154
- return true;
155
- });
196
+ .tap("CommonJsImportsParserPlugin", requireAsExpressionHandler);
197
+ //#endregion
156
198
 
157
- // require //
199
+ //#region Require
158
200
  const processRequireItem = (expr, param) => {
159
201
  if (param.isString()) {
160
- const dep = new CommonJsRequireDependency(param.string, param.range);
202
+ const dep = new CommonJsRequireDependency(
203
+ param.string,
204
+ param.range,
205
+ getContext()
206
+ );
161
207
  dep.loc = expr.loc;
162
208
  dep.optional = !!parser.scope.inTry;
163
209
  parser.state.current.addDependency(dep);
@@ -174,7 +220,9 @@ class CommonJsImportsParserPlugin {
174
220
  {
175
221
  category: "commonjs"
176
222
  },
177
- parser
223
+ parser,
224
+ undefined,
225
+ getContext()
178
226
  );
179
227
  if (!dep) return;
180
228
  dep.loc = expr.loc;
@@ -268,8 +316,9 @@ class CommonJsImportsParserPlugin {
268
316
  parser.hooks.new
269
317
  .for("module.require")
270
318
  .tap("CommonJsImportsParserPlugin", createRequireHandler(true));
319
+ //#endregion
271
320
 
272
- // require with property access //
321
+ //#region Require with property access
273
322
  const chainHandler = (expr, calleeMembers, callExpr, members) => {
274
323
  if (callExpr.arguments.length !== 1) return;
275
324
  const param = parser.evaluateExpression(callExpr.arguments[0]);
@@ -316,8 +365,9 @@ class CommonJsImportsParserPlugin {
316
365
  parser.hooks.callMemberChainOfCallMemberChain
317
366
  .for("module.require")
318
367
  .tap("CommonJsImportsParserPlugin", callChainHandler);
368
+ //#endregion
319
369
 
320
- // require.resolve //
370
+ //#region Require.resolve
321
371
  const processResolve = (expr, weak) => {
322
372
  if (expr.arguments.length !== 1) return;
323
373
  const param = parser.evaluateExpression(expr.arguments[0]);
@@ -345,7 +395,11 @@ class CommonJsImportsParserPlugin {
345
395
  };
346
396
  const processResolveItem = (expr, param, weak) => {
347
397
  if (param.isString()) {
348
- const dep = new RequireResolveDependency(param.string, param.range);
398
+ const dep = new RequireResolveDependency(
399
+ param.string,
400
+ param.range,
401
+ getContext()
402
+ );
349
403
  dep.loc = expr.loc;
350
404
  dep.optional = !!parser.scope.inTry;
351
405
  dep.weak = weak;
@@ -364,7 +418,8 @@ class CommonJsImportsParserPlugin {
364
418
  category: "commonjs",
365
419
  mode: weak ? "weak" : "sync"
366
420
  },
367
- parser
421
+ parser,
422
+ getContext()
368
423
  );
369
424
  if (!dep) return;
370
425
  dep.loc = expr.loc;
@@ -375,14 +430,240 @@ class CommonJsImportsParserPlugin {
375
430
 
376
431
  parser.hooks.call
377
432
  .for("require.resolve")
378
- .tap("RequireResolveDependencyParserPlugin", expr => {
433
+ .tap("CommonJsImportsParserPlugin", expr => {
379
434
  return processResolve(expr, false);
380
435
  });
381
436
  parser.hooks.call
382
437
  .for("require.resolveWeak")
383
- .tap("RequireResolveDependencyParserPlugin", expr => {
438
+ .tap("CommonJsImportsParserPlugin", expr => {
384
439
  return processResolve(expr, true);
385
440
  });
441
+ //#endregion
442
+
443
+ //#region Create require
444
+
445
+ if (!options.createRequire) return;
446
+
447
+ let moduleName;
448
+ let specifierName;
449
+
450
+ if (options.createRequire === true) {
451
+ moduleName = "module";
452
+ specifierName = "createRequire";
453
+ } else {
454
+ const match = /^(.*) from (.*)$/.exec(options.createRequire);
455
+ if (match) {
456
+ [, specifierName, moduleName] = match;
457
+ }
458
+ if (!specifierName || !moduleName) {
459
+ const err = new WebpackError(
460
+ `Parsing javascript parser option "createRequire" failed, got ${JSON.stringify(
461
+ options.createRequire
462
+ )}`
463
+ );
464
+ err.details =
465
+ 'Expected string in format "createRequire from module", where "createRequire" is specifier name and "module" name of the module';
466
+ throw err;
467
+ }
468
+ }
469
+
470
+ tapRequireExpressionTag(createdRequireIdentifierTag);
471
+ tapRequireExpressionTag(createRequireSpecifierTag);
472
+ parser.hooks.evaluateCallExpression
473
+ .for(createRequireSpecifierTag)
474
+ .tap("CommonJsImportsParserPlugin", expr => {
475
+ const context = parseCreateRequireArguments(expr);
476
+ if (context === undefined) return;
477
+ const ident = parser.evaluatedVariable({
478
+ tag: createdRequireIdentifierTag,
479
+ data: { context },
480
+ next: undefined
481
+ });
482
+ return new BasicEvaluatedExpression()
483
+ .setIdentifier(ident, ident, () => [])
484
+ .setSideEffects(false)
485
+ .setRange(expr.range);
486
+ });
487
+ parser.hooks.unhandledExpressionMemberChain
488
+ .for(createdRequireIdentifierTag)
489
+ .tap("CommonJsImportsParserPlugin", (expr, members) => {
490
+ return expressionIsUnsupported(
491
+ parser,
492
+ `createRequire().${members.join(".")} is not supported by webpack.`
493
+ )(expr);
494
+ });
495
+ parser.hooks.canRename
496
+ .for(createdRequireIdentifierTag)
497
+ .tap("CommonJsImportsParserPlugin", () => true);
498
+ parser.hooks.canRename
499
+ .for(createRequireSpecifierTag)
500
+ .tap("CommonJsImportsParserPlugin", () => true);
501
+ parser.hooks.rename
502
+ .for(createRequireSpecifierTag)
503
+ .tap("CommonJsImportsParserPlugin", defineUndefined);
504
+ parser.hooks.expression
505
+ .for(createdRequireIdentifierTag)
506
+ .tap("CommonJsImportsParserPlugin", requireAsExpressionHandler);
507
+ parser.hooks.call
508
+ .for(createdRequireIdentifierTag)
509
+ .tap("CommonJsImportsParserPlugin", createRequireHandler(false));
510
+ /**
511
+ * @param {CallExpressionNode} expr call expression
512
+ * @returns {string} context
513
+ */
514
+ const parseCreateRequireArguments = expr => {
515
+ const args = expr.arguments;
516
+ if (args.length !== 1) {
517
+ const err = new WebpackError(
518
+ "module.createRequire supports only one argument."
519
+ );
520
+ err.loc = expr.loc;
521
+ parser.state.module.addWarning(err);
522
+ return;
523
+ }
524
+ const arg = args[0];
525
+ const evaluated = parser.evaluateExpression(arg);
526
+ if (!evaluated.isString()) {
527
+ const err = new WebpackError(
528
+ "module.createRequire failed parsing argument."
529
+ );
530
+ err.loc = arg.loc;
531
+ parser.state.module.addWarning(err);
532
+ return;
533
+ }
534
+ const ctx = evaluated.string.startsWith("file://")
535
+ ? fileURLToPath(evaluated.string)
536
+ : evaluated.string;
537
+ // argument always should be a filename
538
+ return ctx.slice(0, ctx.lastIndexOf(ctx.startsWith("/") ? "/" : "\\"));
539
+ };
540
+
541
+ parser.hooks.import.tap(
542
+ {
543
+ name: "CommonJsImportsParserPlugin",
544
+ stage: -10
545
+ },
546
+ (statement, source) => {
547
+ if (
548
+ source !== moduleName ||
549
+ statement.specifiers.length !== 1 ||
550
+ statement.specifiers[0].type !== "ImportSpecifier" ||
551
+ statement.specifiers[0].imported.type !== "Identifier" ||
552
+ statement.specifiers[0].imported.name !== specifierName
553
+ )
554
+ return;
555
+ // clear for 'import { createRequire as x } from "module"'
556
+ // if any other specifier was used import module
557
+ const clearDep = new ConstDependency(
558
+ parser.isAsiPosition(statement.range[0]) ? ";" : "",
559
+ statement.range
560
+ );
561
+ clearDep.loc = statement.loc;
562
+ parser.state.module.addPresentationalDependency(clearDep);
563
+ parser.unsetAsiPosition(statement.range[1]);
564
+ return true;
565
+ }
566
+ );
567
+ parser.hooks.importSpecifier.tap(
568
+ {
569
+ name: "CommonJsImportsParserPlugin",
570
+ stage: -10
571
+ },
572
+ (statement, source, id, name) => {
573
+ if (source !== moduleName || id !== specifierName) return;
574
+ parser.tagVariable(name, createRequireSpecifierTag);
575
+ return true;
576
+ }
577
+ );
578
+ parser.hooks.preDeclarator.tap(
579
+ "CommonJsImportsParserPlugin",
580
+ declarator => {
581
+ if (
582
+ declarator.id.type !== "Identifier" ||
583
+ !declarator.init ||
584
+ declarator.init.type !== "CallExpression" ||
585
+ declarator.init.callee.type !== "Identifier"
586
+ )
587
+ return;
588
+ const variableInfo = parser.getVariableInfo(
589
+ declarator.init.callee.name
590
+ );
591
+ if (
592
+ variableInfo &&
593
+ variableInfo.tagInfo &&
594
+ variableInfo.tagInfo.tag === createRequireSpecifierTag
595
+ ) {
596
+ const context = parseCreateRequireArguments(declarator.init);
597
+ if (context === undefined) return;
598
+ parser.tagVariable(declarator.id.name, createdRequireIdentifierTag, {
599
+ name: declarator.id.name,
600
+ context
601
+ });
602
+ return true;
603
+ }
604
+ }
605
+ );
606
+
607
+ parser.hooks.memberChainOfCallMemberChain
608
+ .for(createRequireSpecifierTag)
609
+ .tap(
610
+ "CommonJsImportsParserPlugin",
611
+ (expr, calleeMembers, callExpr, members) => {
612
+ if (
613
+ calleeMembers.length !== 0 ||
614
+ members.length !== 1 ||
615
+ members[0] !== "cache"
616
+ )
617
+ return;
618
+ // createRequire().cache
619
+ const context = parseCreateRequireArguments(callExpr);
620
+ if (context === undefined) return;
621
+ return requireCache(expr);
622
+ }
623
+ );
624
+ parser.hooks.callMemberChainOfCallMemberChain
625
+ .for(createRequireSpecifierTag)
626
+ .tap(
627
+ "CommonJsImportsParserPlugin",
628
+ (expr, calleeMembers, innerCallExpression, members) => {
629
+ if (
630
+ calleeMembers.length !== 0 ||
631
+ members.length !== 1 ||
632
+ members[0] !== "resolve"
633
+ )
634
+ return;
635
+ // createRequire().resolve()
636
+ return processResolve(expr, false);
637
+ }
638
+ );
639
+ parser.hooks.expressionMemberChain
640
+ .for(createdRequireIdentifierTag)
641
+ .tap("CommonJsImportsParserPlugin", (expr, members) => {
642
+ // require.cache
643
+ if (members.length === 1 && members[0] === "cache") {
644
+ return requireCache(expr);
645
+ }
646
+ });
647
+ parser.hooks.callMemberChain
648
+ .for(createdRequireIdentifierTag)
649
+ .tap("CommonJsImportsParserPlugin", (expr, members) => {
650
+ // require.resolve()
651
+ if (members.length === 1 && members[0] === "resolve") {
652
+ return processResolve(expr, false);
653
+ }
654
+ });
655
+ parser.hooks.call
656
+ .for(createRequireSpecifierTag)
657
+ .tap("CommonJsImportsParserPlugin", expr => {
658
+ const clearDep = new ConstDependency(
659
+ "/* createRequire() */ undefined",
660
+ expr.range
661
+ );
662
+ clearDep.loc = expr.loc;
663
+ parser.state.module.addPresentationalDependency(clearDep);
664
+ return true;
665
+ });
666
+ //#endregion
386
667
  }
387
668
  }
388
669
  module.exports = CommonJsImportsParserPlugin;
@@ -10,8 +10,8 @@ const ContextDependency = require("./ContextDependency");
10
10
  const ContextDependencyTemplateAsRequireCall = require("./ContextDependencyTemplateAsRequireCall");
11
11
 
12
12
  class CommonJsRequireContextDependency extends ContextDependency {
13
- constructor(options, range, valueRange, inShorthand) {
14
- super(options);
13
+ constructor(options, range, valueRange, inShorthand, context) {
14
+ super(options, context);
15
15
 
16
16
  this.range = range;
17
17
  this.valueRange = valueRange;
@@ -10,9 +10,10 @@ const ModuleDependency = require("./ModuleDependency");
10
10
  const ModuleDependencyTemplateAsId = require("./ModuleDependencyTemplateAsId");
11
11
 
12
12
  class CommonJsRequireDependency extends ModuleDependency {
13
- constructor(request, range) {
13
+ constructor(request, range, context) {
14
14
  super(request);
15
15
  this.range = range;
16
+ this._context = context;
16
17
  }
17
18
 
18
19
  get type() {
@@ -26,8 +26,9 @@ const regExpToString = r => (r ? r + "" : "");
26
26
  class ContextDependency extends Dependency {
27
27
  /**
28
28
  * @param {ContextDependencyOptions} options options for the context module
29
+ * @param {string=} context request context
29
30
  */
30
- constructor(options) {
31
+ constructor(options, context) {
31
32
  super();
32
33
 
33
34
  this.options = options;
@@ -50,6 +51,14 @@ class ContextDependency extends Dependency {
50
51
  this.inShorthand = undefined;
51
52
  // TODO refactor this
52
53
  this.replaces = undefined;
54
+ this._requestContext = context;
55
+ }
56
+
57
+ /**
58
+ * @returns {string | undefined} a request context
59
+ */
60
+ getContext() {
61
+ return this._requestContext;
53
62
  }
54
63
 
55
64
  get category() {
@@ -68,7 +77,9 @@ class ContextDependency extends Dependency {
68
77
  */
69
78
  getResourceIdentifier() {
70
79
  return (
71
- `context${this.options.request} ${this.options.recursive} ` +
80
+ `context${this._requestContext || ""}|ctx request${
81
+ this.options.request
82
+ } ${this.options.recursive} ` +
72
83
  `${regExpToString(this.options.regExp)} ${regExpToString(
73
84
  this.options.include
74
85
  )} ${regExpToString(this.options.exclude)} ` +
@@ -112,6 +123,7 @@ class ContextDependency extends Dependency {
112
123
  write(this.critical);
113
124
  write(this.hadGlobalOrStickyRegExp);
114
125
  write(this.request);
126
+ write(this._requestContext);
115
127
  write(this.range);
116
128
  write(this.valueRange);
117
129
  write(this.prepend);
@@ -128,6 +140,7 @@ class ContextDependency extends Dependency {
128
140
  this.critical = read();
129
141
  this.hadGlobalOrStickyRegExp = read();
130
142
  this.request = read();
143
+ this._requestContext = read();
131
144
  this.range = read();
132
145
  this.valueRange = read();
133
146
  this.prepend = read();
@@ -39,7 +39,7 @@ const splitContextFromPrefix = prefix => {
39
39
 
40
40
  /** @typedef {Partial<Omit<ContextDependencyOptions, "resource">>} PartialContextDependencyOptions */
41
41
 
42
- /** @typedef {{ new(options: ContextDependencyOptions, range: [number, number], valueRange: [number, number]): ContextDependency }} ContextDependencyConstructor */
42
+ /** @typedef {{ new(options: ContextDependencyOptions, range: [number, number], valueRange: [number, number], ...args: any[]): ContextDependency }} ContextDependencyConstructor */
43
43
 
44
44
  /**
45
45
  * @param {ContextDependencyConstructor} Dep the Dependency class
@@ -49,9 +49,19 @@ const splitContextFromPrefix = prefix => {
49
49
  * @param {Pick<JavascriptParserOptions, `${"expr"|"wrapped"}Context${"Critical"|"Recursive"|"RegExp"}` | "exprContextRequest">} options options for context creation
50
50
  * @param {PartialContextDependencyOptions} contextOptions options for the ContextModule
51
51
  * @param {JavascriptParser} parser the parser
52
+ * @param {...any} depArgs depArgs
52
53
  * @returns {ContextDependency} the created Dependency
53
54
  */
54
- exports.create = (Dep, range, param, expr, options, contextOptions, parser) => {
55
+ exports.create = (
56
+ Dep,
57
+ range,
58
+ param,
59
+ expr,
60
+ options,
61
+ contextOptions,
62
+ parser,
63
+ ...depArgs
64
+ ) => {
55
65
  if (param.isTemplateString()) {
56
66
  let prefixRaw = param.quasis[0].string;
57
67
  let postfixRaw =
@@ -97,7 +107,8 @@ exports.create = (Dep, range, param, expr, options, contextOptions, parser) => {
97
107
  ...contextOptions
98
108
  },
99
109
  range,
100
- valueRange
110
+ valueRange,
111
+ ...depArgs
101
112
  );
102
113
  dep.loc = expr.loc;
103
114
  const replaces = [];
@@ -180,7 +191,8 @@ exports.create = (Dep, range, param, expr, options, contextOptions, parser) => {
180
191
  ...contextOptions
181
192
  },
182
193
  range,
183
- valueRange
194
+ valueRange,
195
+ ...depArgs
184
196
  );
185
197
  dep.loc = expr.loc;
186
198
  const replaces = [];
@@ -218,7 +230,8 @@ exports.create = (Dep, range, param, expr, options, contextOptions, parser) => {
218
230
  ...contextOptions
219
231
  },
220
232
  range,
221
- param.range
233
+ param.range,
234
+ ...depArgs
222
235
  );
223
236
  dep.loc = expr.loc;
224
237
  dep.critical =