webpack 5.72.1 → 5.73.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.

@@ -4241,7 +4241,11 @@ This prevents using hashes of each other and should be avoided.`);
4241
4241
  if (!isSourceEqual(this.assets[file], source)) {
4242
4242
  this.errors.push(
4243
4243
  new WebpackError(
4244
- `Conflict: Multiple assets emit different content to the same filename ${file}`
4244
+ `Conflict: Multiple assets emit different content to the same filename ${file}${
4245
+ assetInfo.sourceFilename
4246
+ ? `. Original source ${assetInfo.sourceFilename}`
4247
+ : ""
4248
+ }`
4245
4249
  )
4246
4250
  );
4247
4251
  this.assets[file] = source;
@@ -64,7 +64,7 @@ class NodeStuffPlugin {
64
64
  new NodeStuffInWebError(
65
65
  dep.loc,
66
66
  "global",
67
- "The global namespace object is Node.js feature and doesn't present in browser."
67
+ "The global namespace object is a Node.js feature and isn't available in browsers."
68
68
  )
69
69
  );
70
70
  }
@@ -190,7 +190,8 @@ const applyWebpackOptionsDefaults = options => {
190
190
  syncWebAssembly: options.experiments.syncWebAssembly,
191
191
  asyncWebAssembly: options.experiments.asyncWebAssembly,
192
192
  css: options.experiments.css,
193
- futureDefaults
193
+ futureDefaults,
194
+ isNode: targetProperties && targetProperties.node === true
194
195
  });
195
196
 
196
197
  applyOutputDefaults(options.output, {
@@ -451,11 +452,12 @@ const applySnapshotDefaults = (snapshot, { production, futureDefaults }) => {
451
452
  * @param {JavascriptParserOptions} parserOptions parser options
452
453
  * @param {Object} options options
453
454
  * @param {boolean} options.futureDefaults is future defaults enabled
455
+ * @param {boolean} options.isNode is node target platform
454
456
  * @returns {void}
455
457
  */
456
458
  const applyJavascriptParserOptionsDefaults = (
457
459
  parserOptions,
458
- { futureDefaults }
460
+ { futureDefaults, isNode }
459
461
  ) => {
460
462
  D(parserOptions, "unknownContextRequest", ".");
461
463
  D(parserOptions, "unknownContextRegExp", false);
@@ -470,6 +472,10 @@ const applyJavascriptParserOptionsDefaults = (
470
472
  D(parserOptions, "wrappedContextCritical", false);
471
473
  D(parserOptions, "strictThisContextOnImports", false);
472
474
  D(parserOptions, "importMeta", true);
475
+ D(parserOptions, "dynamicImportMode", "lazy");
476
+ D(parserOptions, "dynamicImportPrefetch", false);
477
+ D(parserOptions, "dynamicImportPreload", false);
478
+ D(parserOptions, "createRequire", isNode);
473
479
  if (futureDefaults) D(parserOptions, "exportsPresence", "error");
474
480
  };
475
481
 
@@ -481,11 +487,12 @@ const applyJavascriptParserOptionsDefaults = (
481
487
  * @param {boolean} options.asyncWebAssembly is asyncWebAssembly enabled
482
488
  * @param {CssExperimentOptions} options.css is css enabled
483
489
  * @param {boolean} options.futureDefaults is future defaults enabled
490
+ * @param {boolean} options.isNode is node target platform
484
491
  * @returns {void}
485
492
  */
486
493
  const applyModuleDefaults = (
487
494
  module,
488
- { cache, syncWebAssembly, asyncWebAssembly, css, futureDefaults }
495
+ { cache, syncWebAssembly, asyncWebAssembly, css, futureDefaults, isNode }
489
496
  ) => {
490
497
  if (cache) {
491
498
  D(module, "unsafeCache", module => {
@@ -504,7 +511,8 @@ const applyModuleDefaults = (
504
511
 
505
512
  F(module.parser, "javascript", () => ({}));
506
513
  applyJavascriptParserOptionsDefaults(module.parser.javascript, {
507
- futureDefaults
514
+ futureDefaults,
515
+ isNode
508
516
  });
509
517
 
510
518
  A(module, "defaultRules", () => {
@@ -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();