webpack 5.71.0 → 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.
- package/lib/BannerPlugin.js +3 -1
- package/lib/ChunkGraph.js +93 -6
- package/lib/Compilation.js +5 -1
- package/lib/Compiler.js +1 -1
- package/lib/DllReferencePlugin.js +1 -1
- package/lib/ExportsInfo.js +1 -1
- package/lib/Module.js +1 -0
- package/lib/NodeStuffPlugin.js +1 -1
- package/lib/NormalModule.js +4 -3
- package/lib/RuntimePlugin.js +7 -0
- package/lib/asset/AssetGenerator.js +36 -9
- package/lib/asset/AssetParser.js +1 -0
- package/lib/asset/AssetSourceGenerator.js +31 -6
- package/lib/asset/AssetSourceParser.js +1 -0
- package/lib/cache/PackFileCacheStrategy.js +8 -4
- package/lib/config/defaults.js +12 -4
- package/lib/container/RemoteRuntimeModule.js +8 -7
- package/lib/dependencies/CommonJsImportsParserPlugin.js +342 -61
- package/lib/dependencies/CommonJsRequireContextDependency.js +2 -2
- package/lib/dependencies/CommonJsRequireDependency.js +2 -1
- package/lib/dependencies/ContextDependency.js +15 -2
- package/lib/dependencies/ContextDependencyHelpers.js +18 -5
- package/lib/dependencies/ContextElementDependency.js +0 -16
- package/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js +35 -3
- package/lib/dependencies/ImportParserPlugin.js +31 -25
- package/lib/dependencies/JsonExportsDependency.js +17 -21
- package/lib/dependencies/LoaderDependency.js +13 -0
- package/lib/dependencies/LoaderImportDependency.js +13 -0
- package/lib/dependencies/ModuleDependency.js +11 -1
- package/lib/dependencies/RequireResolveContextDependency.js +2 -2
- package/lib/dependencies/RequireResolveDependency.js +2 -1
- package/lib/dependencies/URLPlugin.js +21 -0
- package/lib/index.js +1 -0
- package/lib/javascript/JavascriptParser.js +40 -19
- package/lib/json/JsonData.js +8 -0
- package/lib/json/JsonParser.js +4 -6
- package/lib/optimize/ConcatenatedModule.js +2 -1
- package/lib/optimize/ModuleConcatenationPlugin.js +21 -2
- package/lib/runtime/AsyncModuleRuntimeModule.js +34 -58
- package/lib/runtime/NonceRuntimeModule.js +24 -0
- package/lib/sharing/ProvideSharedPlugin.js +1 -2
- package/package.json +3 -3
- package/schemas/WebpackOptions.check.js +1 -1
- package/schemas/WebpackOptions.json +37 -0
- package/schemas/plugins/BannerPlugin.check.js +1 -1
- package/schemas/plugins/BannerPlugin.json +4 -0
- package/types.d.ts +51 -3
@@ -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
|
-
|
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
|
-
"
|
61
|
+
"CommonJsImportsParserPlugin",
|
48
62
|
toConstantDependency(parser, JSON.stringify("function"))
|
49
63
|
);
|
50
64
|
parser.hooks.evaluateTypeof
|
51
65
|
.for(expression)
|
52
|
-
.tap("
|
66
|
+
.tap("CommonJsImportsParserPlugin", evaluateToString("function"));
|
53
67
|
parser.hooks.evaluateIdentifier
|
54
68
|
.for(expression)
|
55
69
|
.tap(
|
56
|
-
"
|
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
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
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
|
-
|
101
|
+
//#region Unsupported
|
74
102
|
parser.hooks.expression
|
75
|
-
.for("require.main
|
103
|
+
.for("require.main")
|
76
104
|
.tap(
|
77
|
-
"
|
105
|
+
"CommonJsImportsParserPlugin",
|
78
106
|
expressionIsUnsupported(
|
79
107
|
parser,
|
80
|
-
"require.main
|
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
|
-
"
|
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
|
-
"
|
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
|
-
"
|
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
|
-
|
112
|
-
|
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
|
-
|
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
|
-
|
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",
|
137
|
-
|
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
|
-
|
199
|
+
//#region Require
|
158
200
|
const processRequireItem = (expr, param) => {
|
159
201
|
if (param.isString()) {
|
160
|
-
const dep = new CommonJsRequireDependency(
|
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
|
-
|
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
|
-
|
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(
|
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("
|
433
|
+
.tap("CommonJsImportsParserPlugin", expr => {
|
379
434
|
return processResolve(expr, false);
|
380
435
|
});
|
381
436
|
parser.hooks.call
|
382
437
|
.for("require.resolveWeak")
|
383
|
-
.tap("
|
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.
|
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 = (
|
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 =
|