@babel/traverse 7.20.0 → 7.20.5
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 @babel/traverse might be problematic. Click here for more details.
- package/lib/cache.js +0 -3
- package/lib/cache.js.map +1 -1
- package/lib/context.js +7 -21
- package/lib/context.js.map +1 -1
- package/lib/hub.js +0 -6
- package/lib/hub.js.map +1 -1
- package/lib/index.js +3 -21
- package/lib/index.js.map +1 -1
- package/lib/path/ancestry.js +3 -23
- package/lib/path/ancestry.js.map +1 -1
- package/lib/path/comments.js +0 -4
- package/lib/path/comments.js.map +1 -1
- package/lib/path/context.js +14 -54
- package/lib/path/context.js.map +1 -1
- package/lib/path/conversion.js +23 -78
- package/lib/path/conversion.js.map +1 -1
- package/lib/path/evaluation.js +9 -85
- package/lib/path/evaluation.js.map +1 -1
- package/lib/path/family.js +6 -73
- package/lib/path/family.js.map +1 -1
- package/lib/path/index.js +2 -61
- package/lib/path/index.js.map +1 -1
- package/lib/path/inference/index.js +2 -27
- package/lib/path/inference/index.js.map +1 -1
- package/lib/path/inference/inferer-reference.js +10 -31
- package/lib/path/inference/inferer-reference.js.map +1 -1
- package/lib/path/inference/inferers.js +4 -44
- package/lib/path/inference/inferers.js.map +1 -1
- package/lib/path/inference/util.js +0 -4
- package/lib/path/inference/util.js.map +1 -1
- package/lib/path/introspection.js +17 -59
- package/lib/path/introspection.js.map +1 -1
- package/lib/path/lib/hoister.js +7 -23
- package/lib/path/lib/hoister.js.map +1 -1
- package/lib/path/lib/removal-hooks.js +7 -3
- package/lib/path/lib/removal-hooks.js.map +1 -1
- package/lib/path/lib/virtual-types-validator.js +0 -23
- package/lib/path/lib/virtual-types-validator.js.map +1 -1
- package/lib/path/lib/virtual-types.js +1 -0
- package/lib/path/lib/virtual-types.js.map +1 -1
- package/lib/path/modification.js +12 -47
- package/lib/path/modification.js.map +1 -1
- package/lib/path/removal.js +0 -16
- package/lib/path/removal.js.map +1 -1
- package/lib/path/replacement.js +8 -50
- package/lib/path/replacement.js.map +1 -1
- package/lib/scope/binding.js +2 -14
- package/lib/scope/binding.js.map +1 -1
- package/lib/scope/index.js +19 -184
- package/lib/scope/index.js.map +1 -1
- package/lib/scope/lib/renamer.js +2 -25
- package/lib/scope/lib/renamer.js.map +1 -1
- package/lib/traverse-node.js +0 -7
- package/lib/traverse-node.js.map +1 -1
- package/lib/visitors.js +13 -44
- package/lib/visitors.js.map +1 -1
- package/package.json +4 -4
package/lib/path/evaluation.js
CHANGED
@@ -5,22 +5,22 @@ Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
});
|
6
6
|
exports.evaluate = evaluate;
|
7
7
|
exports.evaluateTruthy = evaluateTruthy;
|
8
|
+
|
8
9
|
const VALID_CALLEES = ["String", "Number", "Math"];
|
9
10
|
const INVALID_METHODS = ["random"];
|
10
|
-
|
11
11
|
function isValidCallee(val) {
|
12
|
-
return VALID_CALLEES.includes(
|
12
|
+
return VALID_CALLEES.includes(
|
13
|
+
val);
|
13
14
|
}
|
14
|
-
|
15
15
|
function isInvalidMethod(val) {
|
16
|
-
return INVALID_METHODS.includes(
|
16
|
+
return INVALID_METHODS.includes(
|
17
|
+
val);
|
17
18
|
}
|
18
19
|
|
19
20
|
function evaluateTruthy() {
|
20
21
|
const res = this.evaluate();
|
21
22
|
if (res.confident) return !!res.value;
|
22
23
|
}
|
23
|
-
|
24
24
|
function deopt(path, state) {
|
25
25
|
if (!state.confident) return;
|
26
26
|
state.deoptPath = path;
|
@@ -34,10 +34,8 @@ function evaluateCached(path, state) {
|
|
34
34
|
const {
|
35
35
|
seen
|
36
36
|
} = state;
|
37
|
-
|
38
37
|
if (seen.has(node)) {
|
39
38
|
const existing = seen.get(node);
|
40
|
-
|
41
39
|
if (existing.resolved) {
|
42
40
|
return existing.value;
|
43
41
|
} else {
|
@@ -49,38 +47,29 @@ function evaluateCached(path, state) {
|
|
49
47
|
resolved: false
|
50
48
|
};
|
51
49
|
seen.set(node, item);
|
52
|
-
|
53
50
|
const val = _evaluate(path, state);
|
54
|
-
|
55
51
|
if (state.confident) {
|
56
52
|
item.resolved = true;
|
57
53
|
item.value = val;
|
58
54
|
}
|
59
|
-
|
60
55
|
return val;
|
61
56
|
}
|
62
57
|
}
|
63
|
-
|
64
58
|
function _evaluate(path, state) {
|
65
59
|
if (!state.confident) return;
|
66
|
-
|
67
60
|
if (path.isSequenceExpression()) {
|
68
61
|
const exprs = path.get("expressions");
|
69
62
|
return evaluateCached(exprs[exprs.length - 1], state);
|
70
63
|
}
|
71
|
-
|
72
64
|
if (path.isStringLiteral() || path.isNumericLiteral() || path.isBooleanLiteral()) {
|
73
65
|
return path.node.value;
|
74
66
|
}
|
75
|
-
|
76
67
|
if (path.isNullLiteral()) {
|
77
68
|
return null;
|
78
69
|
}
|
79
|
-
|
80
70
|
if (path.isTemplateLiteral()) {
|
81
71
|
return evaluateQuasis(path, path.node.quasis, state);
|
82
72
|
}
|
83
|
-
|
84
73
|
if (path.isTaggedTemplateExpression() && path.get("tag").isMemberExpression()) {
|
85
74
|
const object = path.get("tag.object");
|
86
75
|
const {
|
@@ -89,23 +78,20 @@ function _evaluate(path, state) {
|
|
89
78
|
}
|
90
79
|
} = object;
|
91
80
|
const property = path.get("tag.property");
|
92
|
-
|
93
|
-
|
81
|
+
if (object.isIdentifier() && name === "String" &&
|
82
|
+
!path.scope.getBinding(name) && property.isIdentifier() && property.node.name === "raw") {
|
94
83
|
return evaluateQuasis(path, path.node.quasi.quasis, state, true);
|
95
84
|
}
|
96
85
|
}
|
97
|
-
|
98
86
|
if (path.isConditionalExpression()) {
|
99
87
|
const testResult = evaluateCached(path.get("test"), state);
|
100
88
|
if (!state.confident) return;
|
101
|
-
|
102
89
|
if (testResult) {
|
103
90
|
return evaluateCached(path.get("consequent"), state);
|
104
91
|
} else {
|
105
92
|
return evaluateCached(path.get("alternate"), state);
|
106
93
|
}
|
107
94
|
}
|
108
|
-
|
109
95
|
if (path.isExpressionWrapper()) {
|
110
96
|
return evaluateCached(path.get("expression"), state);
|
111
97
|
}
|
@@ -115,28 +101,22 @@ function _evaluate(path, state) {
|
|
115
101
|
})) {
|
116
102
|
const property = path.get("property");
|
117
103
|
const object = path.get("object");
|
118
|
-
|
119
104
|
if (object.isLiteral() && property.isIdentifier()) {
|
120
105
|
const value = object.node.value;
|
121
106
|
const type = typeof value;
|
122
|
-
|
123
107
|
if (type === "number" || type === "string") {
|
124
108
|
return value[property.node.name];
|
125
109
|
}
|
126
110
|
}
|
127
111
|
}
|
128
|
-
|
129
112
|
if (path.isReferencedIdentifier()) {
|
130
113
|
const binding = path.scope.getBinding(path.node.name);
|
131
|
-
|
132
114
|
if (binding && binding.constantViolations.length > 0) {
|
133
115
|
return deopt(binding.path, state);
|
134
116
|
}
|
135
|
-
|
136
117
|
if (binding && path.node.start < binding.path.node.end) {
|
137
118
|
return deopt(binding.path, state);
|
138
119
|
}
|
139
|
-
|
140
120
|
if (binding != null && binding.hasValue) {
|
141
121
|
return binding.value;
|
142
122
|
} else {
|
@@ -147,9 +127,7 @@ function _evaluate(path, state) {
|
|
147
127
|
} else if (path.node.name === "NaN") {
|
148
128
|
return binding ? deopt(binding.path, state) : NaN;
|
149
129
|
}
|
150
|
-
|
151
130
|
const resolved = path.resolve();
|
152
|
-
|
153
131
|
if (resolved === path) {
|
154
132
|
return deopt(path, state);
|
155
133
|
} else {
|
@@ -157,98 +135,74 @@ function _evaluate(path, state) {
|
|
157
135
|
}
|
158
136
|
}
|
159
137
|
}
|
160
|
-
|
161
138
|
if (path.isUnaryExpression({
|
162
139
|
prefix: true
|
163
140
|
})) {
|
164
141
|
if (path.node.operator === "void") {
|
165
142
|
return undefined;
|
166
143
|
}
|
167
|
-
|
168
144
|
const argument = path.get("argument");
|
169
|
-
|
170
145
|
if (path.node.operator === "typeof" && (argument.isFunction() || argument.isClass())) {
|
171
146
|
return "function";
|
172
147
|
}
|
173
|
-
|
174
148
|
const arg = evaluateCached(argument, state);
|
175
149
|
if (!state.confident) return;
|
176
|
-
|
177
150
|
switch (path.node.operator) {
|
178
151
|
case "!":
|
179
152
|
return !arg;
|
180
|
-
|
181
153
|
case "+":
|
182
154
|
return +arg;
|
183
|
-
|
184
155
|
case "-":
|
185
156
|
return -arg;
|
186
|
-
|
187
157
|
case "~":
|
188
158
|
return ~arg;
|
189
|
-
|
190
159
|
case "typeof":
|
191
160
|
return typeof arg;
|
192
161
|
}
|
193
162
|
}
|
194
|
-
|
195
163
|
if (path.isArrayExpression()) {
|
196
164
|
const arr = [];
|
197
165
|
const elems = path.get("elements");
|
198
|
-
|
199
166
|
for (const elem of elems) {
|
200
167
|
const elemValue = elem.evaluate();
|
201
|
-
|
202
168
|
if (elemValue.confident) {
|
203
169
|
arr.push(elemValue.value);
|
204
170
|
} else {
|
205
171
|
return deopt(elemValue.deopt, state);
|
206
172
|
}
|
207
173
|
}
|
208
|
-
|
209
174
|
return arr;
|
210
175
|
}
|
211
|
-
|
212
176
|
if (path.isObjectExpression()) {
|
213
177
|
const obj = {};
|
214
178
|
const props = path.get("properties");
|
215
|
-
|
216
179
|
for (const prop of props) {
|
217
180
|
if (prop.isObjectMethod() || prop.isSpreadElement()) {
|
218
181
|
return deopt(prop, state);
|
219
182
|
}
|
220
|
-
|
221
183
|
const keyPath = prop.get("key");
|
222
184
|
let key;
|
223
|
-
|
224
185
|
if (prop.node.computed) {
|
225
186
|
key = keyPath.evaluate();
|
226
|
-
|
227
187
|
if (!key.confident) {
|
228
188
|
return deopt(key.deopt, state);
|
229
189
|
}
|
230
|
-
|
231
190
|
key = key.value;
|
232
191
|
} else if (keyPath.isIdentifier()) {
|
233
192
|
key = keyPath.node.name;
|
234
193
|
} else {
|
235
194
|
key = keyPath.node.value;
|
236
195
|
}
|
237
|
-
|
238
196
|
const valuePath = prop.get("value");
|
239
197
|
let value = valuePath.evaluate();
|
240
|
-
|
241
198
|
if (!value.confident) {
|
242
199
|
return deopt(value.deopt, state);
|
243
200
|
}
|
244
|
-
|
245
201
|
value = value.value;
|
246
202
|
obj[key] = value;
|
247
203
|
}
|
248
|
-
|
249
204
|
return obj;
|
250
205
|
}
|
251
|
-
|
252
206
|
if (path.isLogicalExpression()) {
|
253
207
|
const wasConfident = state.confident;
|
254
208
|
const left = evaluateCached(path.get("left"), state);
|
@@ -256,94 +210,69 @@ function _evaluate(path, state) {
|
|
256
210
|
state.confident = wasConfident;
|
257
211
|
const right = evaluateCached(path.get("right"), state);
|
258
212
|
const rightConfident = state.confident;
|
259
|
-
|
260
213
|
switch (path.node.operator) {
|
261
214
|
case "||":
|
262
215
|
state.confident = leftConfident && (!!left || rightConfident);
|
263
216
|
if (!state.confident) return;
|
264
217
|
return left || right;
|
265
|
-
|
266
218
|
case "&&":
|
267
219
|
state.confident = leftConfident && (!left || rightConfident);
|
268
220
|
if (!state.confident) return;
|
269
221
|
return left && right;
|
270
|
-
|
271
222
|
case "??":
|
272
223
|
state.confident = leftConfident && (left != null || rightConfident);
|
273
224
|
if (!state.confident) return;
|
274
225
|
return left != null ? left : right;
|
275
226
|
}
|
276
227
|
}
|
277
|
-
|
278
228
|
if (path.isBinaryExpression()) {
|
279
229
|
const left = evaluateCached(path.get("left"), state);
|
280
230
|
if (!state.confident) return;
|
281
231
|
const right = evaluateCached(path.get("right"), state);
|
282
232
|
if (!state.confident) return;
|
283
|
-
|
284
233
|
switch (path.node.operator) {
|
285
234
|
case "-":
|
286
235
|
return left - right;
|
287
|
-
|
288
236
|
case "+":
|
289
237
|
return left + right;
|
290
|
-
|
291
238
|
case "/":
|
292
239
|
return left / right;
|
293
|
-
|
294
240
|
case "*":
|
295
241
|
return left * right;
|
296
|
-
|
297
242
|
case "%":
|
298
243
|
return left % right;
|
299
|
-
|
300
244
|
case "**":
|
301
245
|
return Math.pow(left, right);
|
302
|
-
|
303
246
|
case "<":
|
304
247
|
return left < right;
|
305
|
-
|
306
248
|
case ">":
|
307
249
|
return left > right;
|
308
|
-
|
309
250
|
case "<=":
|
310
251
|
return left <= right;
|
311
|
-
|
312
252
|
case ">=":
|
313
253
|
return left >= right;
|
314
|
-
|
315
254
|
case "==":
|
316
255
|
return left == right;
|
317
|
-
|
318
256
|
case "!=":
|
319
257
|
return left != right;
|
320
|
-
|
321
258
|
case "===":
|
322
259
|
return left === right;
|
323
|
-
|
324
260
|
case "!==":
|
325
261
|
return left !== right;
|
326
|
-
|
327
262
|
case "|":
|
328
263
|
return left | right;
|
329
|
-
|
330
264
|
case "&":
|
331
265
|
return left & right;
|
332
|
-
|
333
266
|
case "^":
|
334
267
|
return left ^ right;
|
335
|
-
|
336
268
|
case "<<":
|
337
269
|
return left << right;
|
338
|
-
|
339
270
|
case ">>":
|
340
271
|
return left >> right;
|
341
|
-
|
342
272
|
case ">>>":
|
343
273
|
return left >>> right;
|
344
274
|
}
|
345
275
|
}
|
346
|
-
|
347
276
|
if (path.isCallExpression()) {
|
348
277
|
const callee = path.get("callee");
|
349
278
|
let context;
|
@@ -352,7 +281,6 @@ function _evaluate(path, state) {
|
|
352
281
|
if (callee.isIdentifier() && !path.scope.getBinding(callee.node.name) && isValidCallee(callee.node.name)) {
|
353
282
|
func = global[callee.node.name];
|
354
283
|
}
|
355
|
-
|
356
284
|
if (callee.isMemberExpression()) {
|
357
285
|
const object = callee.get("object");
|
358
286
|
const property = callee.get("property");
|
@@ -364,36 +292,32 @@ function _evaluate(path, state) {
|
|
364
292
|
|
365
293
|
if (object.isLiteral() && property.isIdentifier()) {
|
366
294
|
const type = typeof object.node.value;
|
367
|
-
|
368
295
|
if (type === "string" || type === "number") {
|
369
296
|
context = object.node.value;
|
370
297
|
func = context[property.node.name];
|
371
298
|
}
|
372
299
|
}
|
373
300
|
}
|
374
|
-
|
375
301
|
if (func) {
|
376
302
|
const args = path.get("arguments").map(arg => evaluateCached(arg, state));
|
377
303
|
if (!state.confident) return;
|
378
304
|
return func.apply(context, args);
|
379
305
|
}
|
380
306
|
}
|
381
|
-
|
382
307
|
deopt(path, state);
|
383
308
|
}
|
384
|
-
|
385
309
|
function evaluateQuasis(path, quasis, state, raw = false) {
|
386
310
|
let str = "";
|
387
311
|
let i = 0;
|
388
312
|
const exprs = path.get("expressions");
|
389
|
-
|
390
313
|
for (const elem of quasis) {
|
391
314
|
if (!state.confident) break;
|
315
|
+
|
392
316
|
str += raw ? elem.value.raw : elem.value.cooked;
|
317
|
+
|
393
318
|
const expr = exprs[i++];
|
394
319
|
if (expr) str += String(evaluateCached(expr, state));
|
395
320
|
}
|
396
|
-
|
397
321
|
if (!state.confident) return;
|
398
322
|
return str;
|
399
323
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["VALID_CALLEES","INVALID_METHODS","isValidCallee","val","includes","isInvalidMethod","evaluateTruthy","res","evaluate","confident","value","deopt","path","state","deoptPath","evaluateCached","node","seen","has","existing","get","resolved","item","set","_evaluate","isSequenceExpression","exprs","length","isStringLiteral","isNumericLiteral","isBooleanLiteral","isNullLiteral","isTemplateLiteral","evaluateQuasis","quasis","isTaggedTemplateExpression","isMemberExpression","object","name","property","isIdentifier","scope","getBinding","quasi","isConditionalExpression","testResult","isExpressionWrapper","parentPath","isCallExpression","callee","isLiteral","type","isReferencedIdentifier","binding","constantViolations","start","end","hasValue","undefined","Infinity","NaN","resolve","isUnaryExpression","prefix","operator","argument","isFunction","isClass","arg","isArrayExpression","arr","elems","elem","elemValue","push","isObjectExpression","obj","props","prop","isObjectMethod","isSpreadElement","keyPath","key","computed","valuePath","isLogicalExpression","wasConfident","left","leftConfident","right","rightConfident","isBinaryExpression","context","func","global","args","map","apply","raw","str","i","cooked","expr","String","Map"],"sources":["../../src/path/evaluation.ts"],"sourcesContent":["import type NodePath from \"./index\";\nimport type * as t from \"@babel/types\";\n\n// This file contains Babels metainterpreter that can evaluate static code.\n\nconst VALID_CALLEES = [\"String\", \"Number\", \"Math\"] as const;\nconst INVALID_METHODS = [\"random\"] as const;\n\nfunction isValidCallee(val: string): val is typeof VALID_CALLEES[number] {\n return VALID_CALLEES.includes(\n // @ts-expect-error val is a string\n val,\n );\n}\n\nfunction isInvalidMethod(val: string): val is typeof INVALID_METHODS[number] {\n return INVALID_METHODS.includes(\n // @ts-expect-error val is a string\n val,\n );\n}\n\n/**\n * Walk the input `node` and statically evaluate if it's truthy.\n *\n * Returning `true` when we're sure that the expression will evaluate to a\n * truthy value, `false` if we're sure that it will evaluate to a falsy\n * value and `undefined` if we aren't sure. Because of this please do not\n * rely on coercion when using this method and check with === if it's false.\n *\n * For example do:\n *\n * if (t.evaluateTruthy(node) === false) falsyLogic();\n *\n * **AND NOT**\n *\n * if (!t.evaluateTruthy(node)) falsyLogic();\n *\n */\n\nexport function evaluateTruthy(this: NodePath): boolean {\n const res = this.evaluate();\n if (res.confident) return !!res.value;\n}\n\ntype State = {\n confident: boolean;\n deoptPath: NodePath | null;\n seen: Map<t.Node, Result>;\n};\n\ntype Result = {\n resolved: boolean;\n value?: any;\n};\n/**\n * Deopts the evaluation\n */\nfunction deopt(path: NodePath, state: State) {\n if (!state.confident) return;\n state.deoptPath = path;\n state.confident = false;\n}\n\n/**\n * We wrap the _evaluate method so we can track `seen` nodes, we push an item\n * to the map before we actually evaluate it so we can deopt on self recursive\n * nodes such as:\n *\n * var g = a ? 1 : 2,\n * a = g * this.foo\n */\nfunction evaluateCached(path: NodePath, state: State): any {\n const { node } = path;\n const { seen } = state;\n\n if (seen.has(node)) {\n const existing = seen.get(node);\n if (existing.resolved) {\n return existing.value;\n } else {\n deopt(path, state);\n return;\n }\n } else {\n const item: Result = { resolved: false };\n seen.set(node, item);\n\n const val = _evaluate(path, state);\n if (state.confident) {\n item.resolved = true;\n item.value = val;\n }\n return val;\n }\n}\n\nfunction _evaluate(path: NodePath, state: State): any {\n if (!state.confident) return;\n\n if (path.isSequenceExpression()) {\n const exprs = path.get(\"expressions\");\n return evaluateCached(exprs[exprs.length - 1], state);\n }\n\n if (\n path.isStringLiteral() ||\n path.isNumericLiteral() ||\n path.isBooleanLiteral()\n ) {\n return path.node.value;\n }\n\n if (path.isNullLiteral()) {\n return null;\n }\n\n if (path.isTemplateLiteral()) {\n return evaluateQuasis(path, path.node.quasis, state);\n }\n\n if (\n path.isTaggedTemplateExpression() &&\n path.get(\"tag\").isMemberExpression()\n ) {\n const object = path.get(\"tag.object\") as NodePath;\n const {\n // @ts-expect-error todo(flow->ts): possible bug, object is can be any expression and so name might be undefined\n node: { name },\n } = object;\n const property = path.get(\"tag.property\") as NodePath;\n\n if (\n object.isIdentifier() &&\n name === \"String\" &&\n // todo(flow->ts): was changed from getBinding(name, true)\n // should this be hasBinding(name, true) as the binding is never used later?\n !path.scope.getBinding(name) &&\n property.isIdentifier() &&\n property.node.name === \"raw\"\n ) {\n return evaluateQuasis(path, path.node.quasi.quasis, state, true);\n }\n }\n\n if (path.isConditionalExpression()) {\n const testResult = evaluateCached(path.get(\"test\"), state);\n if (!state.confident) return;\n if (testResult) {\n return evaluateCached(path.get(\"consequent\"), state);\n } else {\n return evaluateCached(path.get(\"alternate\"), state);\n }\n }\n\n if (path.isExpressionWrapper()) {\n // TypeCastExpression, ExpressionStatement etc\n return evaluateCached(path.get(\"expression\"), state);\n }\n\n // \"foo\".length\n if (\n path.isMemberExpression() &&\n !path.parentPath.isCallExpression({ callee: path.node })\n ) {\n const property = path.get(\"property\");\n const object = path.get(\"object\");\n\n if (object.isLiteral() && property.isIdentifier()) {\n // @ts-expect-error todo(flow->ts): instead of typeof - would it be better to check type of ast node?\n const value = object.node.value;\n const type = typeof value;\n if (type === \"number\" || type === \"string\") {\n return value[property.node.name];\n }\n }\n }\n\n if (path.isReferencedIdentifier()) {\n const binding = path.scope.getBinding(path.node.name);\n\n if (binding && binding.constantViolations.length > 0) {\n return deopt(binding.path, state);\n }\n\n if (binding && path.node.start < binding.path.node.end) {\n return deopt(binding.path, state);\n }\n\n if (binding?.hasValue) {\n return binding.value;\n } else {\n if (path.node.name === \"undefined\") {\n return binding ? deopt(binding.path, state) : undefined;\n } else if (path.node.name === \"Infinity\") {\n return binding ? deopt(binding.path, state) : Infinity;\n } else if (path.node.name === \"NaN\") {\n return binding ? deopt(binding.path, state) : NaN;\n }\n\n const resolved = path.resolve();\n if (resolved === path) {\n return deopt(path, state);\n } else {\n return evaluateCached(resolved, state);\n }\n }\n }\n\n if (path.isUnaryExpression({ prefix: true })) {\n if (path.node.operator === \"void\") {\n // we don't need to evaluate the argument to know what this will return\n return undefined;\n }\n\n const argument = path.get(\"argument\");\n if (\n path.node.operator === \"typeof\" &&\n (argument.isFunction() || argument.isClass())\n ) {\n return \"function\";\n }\n\n const arg = evaluateCached(argument, state);\n if (!state.confident) return;\n switch (path.node.operator) {\n case \"!\":\n return !arg;\n case \"+\":\n return +arg;\n case \"-\":\n return -arg;\n case \"~\":\n return ~arg;\n case \"typeof\":\n return typeof arg;\n }\n }\n\n if (path.isArrayExpression()) {\n const arr = [];\n const elems: Array<NodePath> = path.get(\"elements\");\n for (const elem of elems) {\n const elemValue = elem.evaluate();\n\n if (elemValue.confident) {\n arr.push(elemValue.value);\n } else {\n return deopt(elemValue.deopt, state);\n }\n }\n return arr;\n }\n\n if (path.isObjectExpression()) {\n const obj = {};\n const props = path.get(\"properties\");\n for (const prop of props) {\n if (prop.isObjectMethod() || prop.isSpreadElement()) {\n return deopt(prop, state);\n }\n const keyPath = (prop as NodePath<t.ObjectProperty>).get(\"key\");\n let key;\n // @ts-expect-error todo(flow->ts): type refinement issues ObjectMethod and SpreadElement somehow not excluded\n if (prop.node.computed) {\n key = keyPath.evaluate();\n if (!key.confident) {\n return deopt(key.deopt, state);\n }\n key = key.value;\n } else if (keyPath.isIdentifier()) {\n key = keyPath.node.name;\n } else {\n key = (\n keyPath.node as t.StringLiteral | t.NumericLiteral | t.BigIntLiteral\n ).value;\n }\n const valuePath = (prop as NodePath<t.ObjectProperty>).get(\"value\");\n let value = valuePath.evaluate();\n if (!value.confident) {\n return deopt(value.deopt, state);\n }\n value = value.value;\n // @ts-expect-error key is any type\n obj[key] = value;\n }\n return obj;\n }\n\n if (path.isLogicalExpression()) {\n // If we are confident that the left side of an && is false, or the left\n // side of an || is true, we can be confident about the entire expression\n const wasConfident = state.confident;\n const left = evaluateCached(path.get(\"left\"), state);\n const leftConfident = state.confident;\n state.confident = wasConfident;\n const right = evaluateCached(path.get(\"right\"), state);\n const rightConfident = state.confident;\n\n switch (path.node.operator) {\n case \"||\":\n // TODO consider having a \"truthy type\" that doesn't bail on\n // left uncertainty but can still evaluate to truthy.\n state.confident = leftConfident && (!!left || rightConfident);\n if (!state.confident) return;\n\n return left || right;\n case \"&&\":\n state.confident = leftConfident && (!left || rightConfident);\n if (!state.confident) return;\n\n return left && right;\n case \"??\":\n state.confident = leftConfident && (left != null || rightConfident);\n if (!state.confident) return;\n\n return left ?? right;\n }\n }\n\n if (path.isBinaryExpression()) {\n const left = evaluateCached(path.get(\"left\"), state);\n if (!state.confident) return;\n const right = evaluateCached(path.get(\"right\"), state);\n if (!state.confident) return;\n\n switch (path.node.operator) {\n case \"-\":\n return left - right;\n case \"+\":\n return left + right;\n case \"/\":\n return left / right;\n case \"*\":\n return left * right;\n case \"%\":\n return left % right;\n case \"**\":\n return left ** right;\n case \"<\":\n return left < right;\n case \">\":\n return left > right;\n case \"<=\":\n return left <= right;\n case \">=\":\n return left >= right;\n case \"==\":\n return left == right; // eslint-disable-line eqeqeq\n case \"!=\":\n return left != right;\n case \"===\":\n return left === right;\n case \"!==\":\n return left !== right;\n case \"|\":\n return left | right;\n case \"&\":\n return left & right;\n case \"^\":\n return left ^ right;\n case \"<<\":\n return left << right;\n case \">>\":\n return left >> right;\n case \">>>\":\n return left >>> right;\n }\n }\n\n if (path.isCallExpression()) {\n const callee = path.get(\"callee\");\n let context;\n let func;\n\n // Number(1);\n if (\n callee.isIdentifier() &&\n !path.scope.getBinding(callee.node.name) &&\n isValidCallee(callee.node.name)\n ) {\n func = global[callee.node.name];\n }\n\n if (callee.isMemberExpression()) {\n const object = callee.get(\"object\");\n const property = callee.get(\"property\");\n\n // Math.min(1, 2)\n if (\n object.isIdentifier() &&\n property.isIdentifier() &&\n isValidCallee(object.node.name) &&\n !isInvalidMethod(property.node.name)\n ) {\n context = global[object.node.name];\n // @ts-expect-error property may not exist in context object\n func = context[property.node.name];\n }\n\n // \"abc\".charCodeAt(4)\n if (object.isLiteral() && property.isIdentifier()) {\n // @ts-expect-error todo(flow->ts): consider checking ast node type instead of value type (StringLiteral and NumberLiteral)\n const type = typeof object.node.value;\n if (type === \"string\" || type === \"number\") {\n // @ts-expect-error todo(flow->ts): consider checking ast node type instead of value type\n context = object.node.value;\n func = context[property.node.name];\n }\n }\n }\n\n if (func) {\n const args = path.get(\"arguments\").map(arg => evaluateCached(arg, state));\n if (!state.confident) return;\n\n return func.apply(context, args);\n }\n }\n\n deopt(path, state);\n}\n\nfunction evaluateQuasis(\n path: NodePath<t.TaggedTemplateExpression | t.TemplateLiteral>,\n quasis: Array<any>,\n state: State,\n raw = false,\n) {\n let str = \"\";\n\n let i = 0;\n const exprs = path.get(\"expressions\");\n\n for (const elem of quasis) {\n // not confident, evaluated an expression we don't like\n if (!state.confident) break;\n\n // add on element\n str += raw ? elem.value.raw : elem.value.cooked;\n\n // add on interpolated expression if it's present\n const expr = exprs[i++];\n if (expr) str += String(evaluateCached(expr, state));\n }\n\n if (!state.confident) return;\n return str;\n}\n\n/**\n * Walk the input `node` and statically evaluate it.\n *\n * Returns an object in the form `{ confident, value, deopt }`. `confident`\n * indicates whether or not we had to drop out of evaluating the expression\n * because of hitting an unknown node that we couldn't confidently find the\n * value of, in which case `deopt` is the path of said node.\n *\n * Example:\n *\n * t.evaluate(parse(\"5 + 5\")) // { confident: true, value: 10 }\n * t.evaluate(parse(\"!true\")) // { confident: true, value: false }\n * t.evaluate(parse(\"foo + foo\")) // { confident: false, value: undefined, deopt: NodePath }\n *\n */\n\nexport function evaluate(this: NodePath): {\n confident: boolean;\n value: any;\n deopt?: NodePath;\n} {\n const state: State = {\n confident: true,\n deoptPath: null,\n seen: new Map(),\n };\n let value = evaluateCached(this, state);\n if (!state.confident) value = undefined;\n\n return {\n confident: state.confident,\n deopt: state.deoptPath,\n value: value,\n };\n}\n"],"mappings":"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"}
|
1
|
+
{"version":3,"names":["VALID_CALLEES","INVALID_METHODS","isValidCallee","val","includes","isInvalidMethod","evaluateTruthy","res","evaluate","confident","value","deopt","path","state","deoptPath","evaluateCached","node","seen","has","existing","get","resolved","item","set","_evaluate","isSequenceExpression","exprs","length","isStringLiteral","isNumericLiteral","isBooleanLiteral","isNullLiteral","isTemplateLiteral","evaluateQuasis","quasis","isTaggedTemplateExpression","isMemberExpression","object","name","property","isIdentifier","scope","getBinding","quasi","isConditionalExpression","testResult","isExpressionWrapper","parentPath","isCallExpression","callee","isLiteral","type","isReferencedIdentifier","binding","constantViolations","start","end","hasValue","undefined","Infinity","NaN","resolve","isUnaryExpression","prefix","operator","argument","isFunction","isClass","arg","isArrayExpression","arr","elems","elem","elemValue","push","isObjectExpression","obj","props","prop","isObjectMethod","isSpreadElement","keyPath","key","computed","valuePath","isLogicalExpression","wasConfident","left","leftConfident","right","rightConfident","isBinaryExpression","context","func","global","args","map","apply","raw","str","i","cooked","expr","String","Map"],"sources":["../../src/path/evaluation.ts"],"sourcesContent":["import type NodePath from \"./index\";\nimport type * as t from \"@babel/types\";\n\n// This file contains Babels metainterpreter that can evaluate static code.\n\nconst VALID_CALLEES = [\"String\", \"Number\", \"Math\"] as const;\nconst INVALID_METHODS = [\"random\"] as const;\n\nfunction isValidCallee(val: string): val is typeof VALID_CALLEES[number] {\n return VALID_CALLEES.includes(\n // @ts-expect-error val is a string\n val,\n );\n}\n\nfunction isInvalidMethod(val: string): val is typeof INVALID_METHODS[number] {\n return INVALID_METHODS.includes(\n // @ts-expect-error val is a string\n val,\n );\n}\n\n/**\n * Walk the input `node` and statically evaluate if it's truthy.\n *\n * Returning `true` when we're sure that the expression will evaluate to a\n * truthy value, `false` if we're sure that it will evaluate to a falsy\n * value and `undefined` if we aren't sure. Because of this please do not\n * rely on coercion when using this method and check with === if it's false.\n *\n * For example do:\n *\n * if (t.evaluateTruthy(node) === false) falsyLogic();\n *\n * **AND NOT**\n *\n * if (!t.evaluateTruthy(node)) falsyLogic();\n *\n */\n\nexport function evaluateTruthy(this: NodePath): boolean {\n const res = this.evaluate();\n if (res.confident) return !!res.value;\n}\n\ntype State = {\n confident: boolean;\n deoptPath: NodePath | null;\n seen: Map<t.Node, Result>;\n};\n\ntype Result = {\n resolved: boolean;\n value?: any;\n};\n/**\n * Deopts the evaluation\n */\nfunction deopt(path: NodePath, state: State) {\n if (!state.confident) return;\n state.deoptPath = path;\n state.confident = false;\n}\n\n/**\n * We wrap the _evaluate method so we can track `seen` nodes, we push an item\n * to the map before we actually evaluate it so we can deopt on self recursive\n * nodes such as:\n *\n * var g = a ? 1 : 2,\n * a = g * this.foo\n */\nfunction evaluateCached(path: NodePath, state: State): any {\n const { node } = path;\n const { seen } = state;\n\n if (seen.has(node)) {\n const existing = seen.get(node);\n if (existing.resolved) {\n return existing.value;\n } else {\n deopt(path, state);\n return;\n }\n } else {\n const item: Result = { resolved: false };\n seen.set(node, item);\n\n const val = _evaluate(path, state);\n if (state.confident) {\n item.resolved = true;\n item.value = val;\n }\n return val;\n }\n}\n\nfunction _evaluate(path: NodePath, state: State): any {\n if (!state.confident) return;\n\n if (path.isSequenceExpression()) {\n const exprs = path.get(\"expressions\");\n return evaluateCached(exprs[exprs.length - 1], state);\n }\n\n if (\n path.isStringLiteral() ||\n path.isNumericLiteral() ||\n path.isBooleanLiteral()\n ) {\n return path.node.value;\n }\n\n if (path.isNullLiteral()) {\n return null;\n }\n\n if (path.isTemplateLiteral()) {\n return evaluateQuasis(path, path.node.quasis, state);\n }\n\n if (\n path.isTaggedTemplateExpression() &&\n path.get(\"tag\").isMemberExpression()\n ) {\n const object = path.get(\"tag.object\") as NodePath;\n const {\n // @ts-expect-error todo(flow->ts): possible bug, object is can be any expression and so name might be undefined\n node: { name },\n } = object;\n const property = path.get(\"tag.property\") as NodePath;\n\n if (\n object.isIdentifier() &&\n name === \"String\" &&\n // todo(flow->ts): was changed from getBinding(name, true)\n // should this be hasBinding(name, true) as the binding is never used later?\n !path.scope.getBinding(name) &&\n property.isIdentifier() &&\n property.node.name === \"raw\"\n ) {\n return evaluateQuasis(path, path.node.quasi.quasis, state, true);\n }\n }\n\n if (path.isConditionalExpression()) {\n const testResult = evaluateCached(path.get(\"test\"), state);\n if (!state.confident) return;\n if (testResult) {\n return evaluateCached(path.get(\"consequent\"), state);\n } else {\n return evaluateCached(path.get(\"alternate\"), state);\n }\n }\n\n if (path.isExpressionWrapper()) {\n // TypeCastExpression, ExpressionStatement etc\n return evaluateCached(path.get(\"expression\"), state);\n }\n\n // \"foo\".length\n if (\n path.isMemberExpression() &&\n !path.parentPath.isCallExpression({ callee: path.node })\n ) {\n const property = path.get(\"property\");\n const object = path.get(\"object\");\n\n if (object.isLiteral() && property.isIdentifier()) {\n // @ts-expect-error todo(flow->ts): instead of typeof - would it be better to check type of ast node?\n const value = object.node.value;\n const type = typeof value;\n if (type === \"number\" || type === \"string\") {\n return value[property.node.name];\n }\n }\n }\n\n if (path.isReferencedIdentifier()) {\n const binding = path.scope.getBinding(path.node.name);\n\n if (binding && binding.constantViolations.length > 0) {\n return deopt(binding.path, state);\n }\n\n if (binding && path.node.start < binding.path.node.end) {\n return deopt(binding.path, state);\n }\n\n if (binding?.hasValue) {\n return binding.value;\n } else {\n if (path.node.name === \"undefined\") {\n return binding ? deopt(binding.path, state) : undefined;\n } else if (path.node.name === \"Infinity\") {\n return binding ? deopt(binding.path, state) : Infinity;\n } else if (path.node.name === \"NaN\") {\n return binding ? deopt(binding.path, state) : NaN;\n }\n\n const resolved = path.resolve();\n if (resolved === path) {\n return deopt(path, state);\n } else {\n return evaluateCached(resolved, state);\n }\n }\n }\n\n if (path.isUnaryExpression({ prefix: true })) {\n if (path.node.operator === \"void\") {\n // we don't need to evaluate the argument to know what this will return\n return undefined;\n }\n\n const argument = path.get(\"argument\");\n if (\n path.node.operator === \"typeof\" &&\n (argument.isFunction() || argument.isClass())\n ) {\n return \"function\";\n }\n\n const arg = evaluateCached(argument, state);\n if (!state.confident) return;\n switch (path.node.operator) {\n case \"!\":\n return !arg;\n case \"+\":\n return +arg;\n case \"-\":\n return -arg;\n case \"~\":\n return ~arg;\n case \"typeof\":\n return typeof arg;\n }\n }\n\n if (path.isArrayExpression()) {\n const arr = [];\n const elems: Array<NodePath> = path.get(\"elements\");\n for (const elem of elems) {\n const elemValue = elem.evaluate();\n\n if (elemValue.confident) {\n arr.push(elemValue.value);\n } else {\n return deopt(elemValue.deopt, state);\n }\n }\n return arr;\n }\n\n if (path.isObjectExpression()) {\n const obj = {};\n const props = path.get(\"properties\");\n for (const prop of props) {\n if (prop.isObjectMethod() || prop.isSpreadElement()) {\n return deopt(prop, state);\n }\n const keyPath = (prop as NodePath<t.ObjectProperty>).get(\"key\");\n let key;\n // @ts-expect-error todo(flow->ts): type refinement issues ObjectMethod and SpreadElement somehow not excluded\n if (prop.node.computed) {\n key = keyPath.evaluate();\n if (!key.confident) {\n return deopt(key.deopt, state);\n }\n key = key.value;\n } else if (keyPath.isIdentifier()) {\n key = keyPath.node.name;\n } else {\n key = (\n keyPath.node as t.StringLiteral | t.NumericLiteral | t.BigIntLiteral\n ).value;\n }\n const valuePath = (prop as NodePath<t.ObjectProperty>).get(\"value\");\n let value = valuePath.evaluate();\n if (!value.confident) {\n return deopt(value.deopt, state);\n }\n value = value.value;\n // @ts-expect-error key is any type\n obj[key] = value;\n }\n return obj;\n }\n\n if (path.isLogicalExpression()) {\n // If we are confident that the left side of an && is false, or the left\n // side of an || is true, we can be confident about the entire expression\n const wasConfident = state.confident;\n const left = evaluateCached(path.get(\"left\"), state);\n const leftConfident = state.confident;\n state.confident = wasConfident;\n const right = evaluateCached(path.get(\"right\"), state);\n const rightConfident = state.confident;\n\n switch (path.node.operator) {\n case \"||\":\n // TODO consider having a \"truthy type\" that doesn't bail on\n // left uncertainty but can still evaluate to truthy.\n state.confident = leftConfident && (!!left || rightConfident);\n if (!state.confident) return;\n\n return left || right;\n case \"&&\":\n state.confident = leftConfident && (!left || rightConfident);\n if (!state.confident) return;\n\n return left && right;\n case \"??\":\n state.confident = leftConfident && (left != null || rightConfident);\n if (!state.confident) return;\n\n return left ?? right;\n }\n }\n\n if (path.isBinaryExpression()) {\n const left = evaluateCached(path.get(\"left\"), state);\n if (!state.confident) return;\n const right = evaluateCached(path.get(\"right\"), state);\n if (!state.confident) return;\n\n switch (path.node.operator) {\n case \"-\":\n return left - right;\n case \"+\":\n return left + right;\n case \"/\":\n return left / right;\n case \"*\":\n return left * right;\n case \"%\":\n return left % right;\n case \"**\":\n return left ** right;\n case \"<\":\n return left < right;\n case \">\":\n return left > right;\n case \"<=\":\n return left <= right;\n case \">=\":\n return left >= right;\n case \"==\":\n return left == right; // eslint-disable-line eqeqeq\n case \"!=\":\n return left != right;\n case \"===\":\n return left === right;\n case \"!==\":\n return left !== right;\n case \"|\":\n return left | right;\n case \"&\":\n return left & right;\n case \"^\":\n return left ^ right;\n case \"<<\":\n return left << right;\n case \">>\":\n return left >> right;\n case \">>>\":\n return left >>> right;\n }\n }\n\n if (path.isCallExpression()) {\n const callee = path.get(\"callee\");\n let context;\n let func;\n\n // Number(1);\n if (\n callee.isIdentifier() &&\n !path.scope.getBinding(callee.node.name) &&\n isValidCallee(callee.node.name)\n ) {\n func = global[callee.node.name];\n }\n\n if (callee.isMemberExpression()) {\n const object = callee.get(\"object\");\n const property = callee.get(\"property\");\n\n // Math.min(1, 2)\n if (\n object.isIdentifier() &&\n property.isIdentifier() &&\n isValidCallee(object.node.name) &&\n !isInvalidMethod(property.node.name)\n ) {\n context = global[object.node.name];\n // @ts-expect-error property may not exist in context object\n func = context[property.node.name];\n }\n\n // \"abc\".charCodeAt(4)\n if (object.isLiteral() && property.isIdentifier()) {\n // @ts-expect-error todo(flow->ts): consider checking ast node type instead of value type (StringLiteral and NumberLiteral)\n const type = typeof object.node.value;\n if (type === \"string\" || type === \"number\") {\n // @ts-expect-error todo(flow->ts): consider checking ast node type instead of value type\n context = object.node.value;\n func = context[property.node.name];\n }\n }\n }\n\n if (func) {\n const args = path.get(\"arguments\").map(arg => evaluateCached(arg, state));\n if (!state.confident) return;\n\n return func.apply(context, args);\n }\n }\n\n deopt(path, state);\n}\n\nfunction evaluateQuasis(\n path: NodePath<t.TaggedTemplateExpression | t.TemplateLiteral>,\n quasis: Array<any>,\n state: State,\n raw = false,\n) {\n let str = \"\";\n\n let i = 0;\n const exprs = path.get(\"expressions\");\n\n for (const elem of quasis) {\n // not confident, evaluated an expression we don't like\n if (!state.confident) break;\n\n // add on element\n str += raw ? elem.value.raw : elem.value.cooked;\n\n // add on interpolated expression if it's present\n const expr = exprs[i++];\n if (expr) str += String(evaluateCached(expr, state));\n }\n\n if (!state.confident) return;\n return str;\n}\n\n/**\n * Walk the input `node` and statically evaluate it.\n *\n * Returns an object in the form `{ confident, value, deopt }`. `confident`\n * indicates whether or not we had to drop out of evaluating the expression\n * because of hitting an unknown node that we couldn't confidently find the\n * value of, in which case `deopt` is the path of said node.\n *\n * Example:\n *\n * t.evaluate(parse(\"5 + 5\")) // { confident: true, value: 10 }\n * t.evaluate(parse(\"!true\")) // { confident: true, value: false }\n * t.evaluate(parse(\"foo + foo\")) // { confident: false, value: undefined, deopt: NodePath }\n *\n */\n\nexport function evaluate(this: NodePath): {\n confident: boolean;\n value: any;\n deopt?: NodePath;\n} {\n const state: State = {\n confident: true,\n deoptPath: null,\n seen: new Map(),\n };\n let value = evaluateCached(this, state);\n if (!state.confident) value = undefined;\n\n return {\n confident: state.confident,\n deopt: state.deoptPath,\n value: value,\n };\n}\n"],"mappings":"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"}
|