@babel/traverse 7.17.9 → 7.23.2
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.
- package/README.md +1 -1
- package/lib/cache.js +27 -7
- package/lib/cache.js.map +1 -0
- package/lib/context.js +9 -31
- package/lib/context.js.map +1 -0
- package/lib/hub.js +2 -6
- package/lib/hub.js.map +1 -0
- package/lib/index.js +17 -33
- package/lib/index.js.map +1 -0
- package/lib/path/ancestry.js +3 -42
- package/lib/path/ancestry.js.map +1 -0
- package/lib/path/comments.js +23 -11
- package/lib/path/comments.js.map +1 -0
- package/lib/path/context.js +24 -65
- package/lib/path/context.js.map +1 -0
- package/lib/path/conversion.js +37 -100
- package/lib/path/conversion.js.map +1 -0
- package/lib/path/evaluation.js +69 -123
- package/lib/path/evaluation.js.map +1 -0
- package/lib/path/family.js +5 -76
- package/lib/path/family.js.map +1 -0
- package/lib/path/index.js +26 -90
- package/lib/path/index.js.map +1 -0
- package/lib/path/inference/index.js +26 -33
- package/lib/path/inference/index.js.map +1 -0
- package/lib/path/inference/inferer-reference.js +6 -61
- package/lib/path/inference/inferer-reference.js.map +1 -0
- package/lib/path/inference/inferers.js +32 -86
- package/lib/path/inference/inferers.js.map +1 -0
- package/lib/path/inference/util.js +30 -0
- package/lib/path/inference/util.js.map +1 -0
- package/lib/path/introspection.js +54 -105
- package/lib/path/introspection.js.map +1 -0
- package/lib/path/lib/hoister.js +2 -37
- package/lib/path/lib/hoister.js.map +1 -0
- package/lib/path/lib/removal-hooks.js +4 -4
- package/lib/path/lib/removal-hooks.js.map +1 -0
- package/lib/path/lib/virtual-types-validator.js +161 -0
- package/lib/path/lib/virtual-types-validator.js.map +1 -0
- package/lib/path/lib/virtual-types.js +20 -206
- package/lib/path/lib/virtual-types.js.map +1 -0
- package/lib/path/modification.js +17 -61
- package/lib/path/modification.js.map +1 -0
- package/lib/path/removal.js +9 -22
- package/lib/path/removal.js.map +1 -0
- package/lib/path/replacement.js +17 -72
- package/lib/path/replacement.js.map +1 -0
- package/lib/scope/binding.js +20 -12
- package/lib/scope/binding.js.map +1 -0
- package/lib/scope/index.js +115 -245
- package/lib/scope/index.js.map +1 -0
- package/lib/scope/lib/renamer.js +41 -74
- package/lib/scope/lib/renamer.js.map +1 -0
- package/lib/traverse-node.js +10 -11
- package/lib/traverse-node.js.map +1 -0
- package/lib/types.js +1 -3
- package/lib/types.js.map +1 -0
- package/lib/visitors.js +59 -83
- package/lib/visitors.js.map +1 -0
- package/package.json +13 -11
- package/lib/path/generated/asserts.js +0 -5
- package/lib/path/generated/validators.js +0 -5
- package/lib/path/generated/virtual-types.js +0 -3
- package/scripts/generators/asserts.js +0 -25
- package/scripts/generators/validators.js +0 -42
- package/scripts/generators/virtual-types.js +0 -24
- package/scripts/package.json +0 -1
package/lib/path/evaluation.js
CHANGED
@@ -5,20 +5,28 @@ Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
});
|
6
6
|
exports.evaluate = evaluate;
|
7
7
|
exports.evaluateTruthy = evaluateTruthy;
|
8
|
-
const
|
8
|
+
const VALID_OBJECT_CALLEES = ["Number", "String", "Math"];
|
9
|
+
const VALID_IDENTIFIER_CALLEES = ["isFinite", "isNaN", "parseFloat", "parseInt", "decodeURI", "decodeURIComponent", "encodeURI", "encodeURIComponent", null, null];
|
9
10
|
const INVALID_METHODS = ["random"];
|
10
|
-
|
11
|
+
function isValidObjectCallee(val) {
|
12
|
+
return VALID_OBJECT_CALLEES.includes(val);
|
13
|
+
}
|
14
|
+
function isValidIdentifierCallee(val) {
|
15
|
+
return VALID_IDENTIFIER_CALLEES.includes(val);
|
16
|
+
}
|
17
|
+
function isInvalidMethod(val) {
|
18
|
+
return INVALID_METHODS.includes(val);
|
19
|
+
}
|
11
20
|
function evaluateTruthy() {
|
12
21
|
const res = this.evaluate();
|
13
22
|
if (res.confident) return !!res.value;
|
14
23
|
}
|
15
|
-
|
16
24
|
function deopt(path, state) {
|
17
25
|
if (!state.confident) return;
|
18
26
|
state.deoptPath = path;
|
19
27
|
state.confident = false;
|
20
28
|
}
|
21
|
-
|
29
|
+
const Globals = new Map([["undefined", undefined], ["Infinity", Infinity], ["NaN", NaN]]);
|
22
30
|
function evaluateCached(path, state) {
|
23
31
|
const {
|
24
32
|
node
|
@@ -26,10 +34,8 @@ function evaluateCached(path, state) {
|
|
26
34
|
const {
|
27
35
|
seen
|
28
36
|
} = state;
|
29
|
-
|
30
37
|
if (seen.has(node)) {
|
31
38
|
const existing = seen.get(node);
|
32
|
-
|
33
39
|
if (existing.resolved) {
|
34
40
|
return existing.value;
|
35
41
|
} else {
|
@@ -41,38 +47,29 @@ function evaluateCached(path, state) {
|
|
41
47
|
resolved: false
|
42
48
|
};
|
43
49
|
seen.set(node, item);
|
44
|
-
|
45
50
|
const val = _evaluate(path, state);
|
46
|
-
|
47
51
|
if (state.confident) {
|
48
52
|
item.resolved = true;
|
49
53
|
item.value = val;
|
50
54
|
}
|
51
|
-
|
52
55
|
return val;
|
53
56
|
}
|
54
57
|
}
|
55
|
-
|
56
58
|
function _evaluate(path, state) {
|
57
59
|
if (!state.confident) return;
|
58
|
-
|
59
60
|
if (path.isSequenceExpression()) {
|
60
61
|
const exprs = path.get("expressions");
|
61
62
|
return evaluateCached(exprs[exprs.length - 1], state);
|
62
63
|
}
|
63
|
-
|
64
64
|
if (path.isStringLiteral() || path.isNumericLiteral() || path.isBooleanLiteral()) {
|
65
65
|
return path.node.value;
|
66
66
|
}
|
67
|
-
|
68
67
|
if (path.isNullLiteral()) {
|
69
68
|
return null;
|
70
69
|
}
|
71
|
-
|
72
70
|
if (path.isTemplateLiteral()) {
|
73
71
|
return evaluateQuasis(path, path.node.quasis, state);
|
74
72
|
}
|
75
|
-
|
76
73
|
if (path.isTaggedTemplateExpression() && path.get("tag").isMemberExpression()) {
|
77
74
|
const object = path.get("tag.object");
|
78
75
|
const {
|
@@ -81,166 +78,141 @@ function _evaluate(path, state) {
|
|
81
78
|
}
|
82
79
|
} = object;
|
83
80
|
const property = path.get("tag.property");
|
84
|
-
|
85
81
|
if (object.isIdentifier() && name === "String" && !path.scope.getBinding(name) && property.isIdentifier() && property.node.name === "raw") {
|
86
82
|
return evaluateQuasis(path, path.node.quasi.quasis, state, true);
|
87
83
|
}
|
88
84
|
}
|
89
|
-
|
90
85
|
if (path.isConditionalExpression()) {
|
91
86
|
const testResult = evaluateCached(path.get("test"), state);
|
92
87
|
if (!state.confident) return;
|
93
|
-
|
94
88
|
if (testResult) {
|
95
89
|
return evaluateCached(path.get("consequent"), state);
|
96
90
|
} else {
|
97
91
|
return evaluateCached(path.get("alternate"), state);
|
98
92
|
}
|
99
93
|
}
|
100
|
-
|
101
94
|
if (path.isExpressionWrapper()) {
|
102
95
|
return evaluateCached(path.get("expression"), state);
|
103
96
|
}
|
104
|
-
|
105
97
|
if (path.isMemberExpression() && !path.parentPath.isCallExpression({
|
106
98
|
callee: path.node
|
107
99
|
})) {
|
108
100
|
const property = path.get("property");
|
109
101
|
const object = path.get("object");
|
110
|
-
|
111
|
-
if (object.isLiteral() && property.isIdentifier()) {
|
102
|
+
if (object.isLiteral()) {
|
112
103
|
const value = object.node.value;
|
113
104
|
const type = typeof value;
|
114
|
-
|
115
|
-
if (
|
116
|
-
|
105
|
+
let key = null;
|
106
|
+
if (path.node.computed) {
|
107
|
+
key = evaluateCached(property, state);
|
108
|
+
if (!state.confident) return;
|
109
|
+
} else if (property.isIdentifier()) {
|
110
|
+
key = property.node.name;
|
111
|
+
}
|
112
|
+
if ((type === "number" || type === "string") && key != null && (typeof key === "number" || typeof key === "string")) {
|
113
|
+
return value[key];
|
117
114
|
}
|
118
115
|
}
|
119
116
|
}
|
120
|
-
|
121
117
|
if (path.isReferencedIdentifier()) {
|
122
118
|
const binding = path.scope.getBinding(path.node.name);
|
123
|
-
|
124
|
-
|
125
|
-
|
119
|
+
if (binding) {
|
120
|
+
if (binding.constantViolations.length > 0 || path.node.start < binding.path.node.end) {
|
121
|
+
deopt(binding.path, state);
|
122
|
+
return;
|
123
|
+
}
|
124
|
+
if (binding.hasValue) {
|
125
|
+
return binding.value;
|
126
|
+
}
|
126
127
|
}
|
127
|
-
|
128
|
-
if (
|
129
|
-
|
128
|
+
const name = path.node.name;
|
129
|
+
if (Globals.has(name)) {
|
130
|
+
if (!binding) {
|
131
|
+
return Globals.get(name);
|
132
|
+
}
|
133
|
+
deopt(binding.path, state);
|
134
|
+
return;
|
130
135
|
}
|
131
|
-
|
132
|
-
if (
|
133
|
-
|
136
|
+
const resolved = path.resolve();
|
137
|
+
if (resolved === path) {
|
138
|
+
deopt(path, state);
|
139
|
+
return;
|
134
140
|
} else {
|
135
|
-
|
136
|
-
return binding ? deopt(binding.path, state) : undefined;
|
137
|
-
} else if (path.node.name === "Infinity") {
|
138
|
-
return binding ? deopt(binding.path, state) : Infinity;
|
139
|
-
} else if (path.node.name === "NaN") {
|
140
|
-
return binding ? deopt(binding.path, state) : NaN;
|
141
|
-
}
|
142
|
-
|
143
|
-
const resolved = path.resolve();
|
144
|
-
|
145
|
-
if (resolved === path) {
|
146
|
-
return deopt(path, state);
|
147
|
-
} else {
|
148
|
-
return evaluateCached(resolved, state);
|
149
|
-
}
|
141
|
+
return evaluateCached(resolved, state);
|
150
142
|
}
|
151
143
|
}
|
152
|
-
|
153
144
|
if (path.isUnaryExpression({
|
154
145
|
prefix: true
|
155
146
|
})) {
|
156
147
|
if (path.node.operator === "void") {
|
157
148
|
return undefined;
|
158
149
|
}
|
159
|
-
|
160
150
|
const argument = path.get("argument");
|
161
|
-
|
162
151
|
if (path.node.operator === "typeof" && (argument.isFunction() || argument.isClass())) {
|
163
152
|
return "function";
|
164
153
|
}
|
165
|
-
|
166
154
|
const arg = evaluateCached(argument, state);
|
167
155
|
if (!state.confident) return;
|
168
|
-
|
169
156
|
switch (path.node.operator) {
|
170
157
|
case "!":
|
171
158
|
return !arg;
|
172
|
-
|
173
159
|
case "+":
|
174
160
|
return +arg;
|
175
|
-
|
176
161
|
case "-":
|
177
162
|
return -arg;
|
178
|
-
|
179
163
|
case "~":
|
180
164
|
return ~arg;
|
181
|
-
|
182
165
|
case "typeof":
|
183
166
|
return typeof arg;
|
184
167
|
}
|
185
168
|
}
|
186
|
-
|
187
169
|
if (path.isArrayExpression()) {
|
188
170
|
const arr = [];
|
189
171
|
const elems = path.get("elements");
|
190
|
-
|
191
172
|
for (const elem of elems) {
|
192
173
|
const elemValue = elem.evaluate();
|
193
|
-
|
194
174
|
if (elemValue.confident) {
|
195
175
|
arr.push(elemValue.value);
|
196
176
|
} else {
|
197
|
-
|
177
|
+
deopt(elemValue.deopt, state);
|
178
|
+
return;
|
198
179
|
}
|
199
180
|
}
|
200
|
-
|
201
181
|
return arr;
|
202
182
|
}
|
203
|
-
|
204
183
|
if (path.isObjectExpression()) {
|
205
184
|
const obj = {};
|
206
185
|
const props = path.get("properties");
|
207
|
-
|
208
186
|
for (const prop of props) {
|
209
187
|
if (prop.isObjectMethod() || prop.isSpreadElement()) {
|
210
|
-
|
188
|
+
deopt(prop, state);
|
189
|
+
return;
|
211
190
|
}
|
212
|
-
|
213
191
|
const keyPath = prop.get("key");
|
214
|
-
let key
|
215
|
-
|
192
|
+
let key;
|
216
193
|
if (prop.node.computed) {
|
217
|
-
key =
|
218
|
-
|
194
|
+
key = keyPath.evaluate();
|
219
195
|
if (!key.confident) {
|
220
|
-
|
196
|
+
deopt(key.deopt, state);
|
197
|
+
return;
|
221
198
|
}
|
222
|
-
|
223
199
|
key = key.value;
|
224
|
-
} else if (
|
225
|
-
key =
|
200
|
+
} else if (keyPath.isIdentifier()) {
|
201
|
+
key = keyPath.node.name;
|
226
202
|
} else {
|
227
|
-
key =
|
203
|
+
key = keyPath.node.value;
|
228
204
|
}
|
229
|
-
|
230
205
|
const valuePath = prop.get("value");
|
231
206
|
let value = valuePath.evaluate();
|
232
|
-
|
233
207
|
if (!value.confident) {
|
234
|
-
|
208
|
+
deopt(value.deopt, state);
|
209
|
+
return;
|
235
210
|
}
|
236
|
-
|
237
211
|
value = value.value;
|
238
212
|
obj[key] = value;
|
239
213
|
}
|
240
|
-
|
241
214
|
return obj;
|
242
215
|
}
|
243
|
-
|
244
216
|
if (path.isLogicalExpression()) {
|
245
217
|
const wasConfident = state.confident;
|
246
218
|
const left = evaluateCached(path.get("left"), state);
|
@@ -248,143 +220,115 @@ function _evaluate(path, state) {
|
|
248
220
|
state.confident = wasConfident;
|
249
221
|
const right = evaluateCached(path.get("right"), state);
|
250
222
|
const rightConfident = state.confident;
|
251
|
-
|
252
223
|
switch (path.node.operator) {
|
253
224
|
case "||":
|
254
225
|
state.confident = leftConfident && (!!left || rightConfident);
|
255
226
|
if (!state.confident) return;
|
256
227
|
return left || right;
|
257
|
-
|
258
228
|
case "&&":
|
259
229
|
state.confident = leftConfident && (!left || rightConfident);
|
260
230
|
if (!state.confident) return;
|
261
231
|
return left && right;
|
232
|
+
case "??":
|
233
|
+
state.confident = leftConfident && (left != null || rightConfident);
|
234
|
+
if (!state.confident) return;
|
235
|
+
return left != null ? left : right;
|
262
236
|
}
|
263
237
|
}
|
264
|
-
|
265
238
|
if (path.isBinaryExpression()) {
|
266
239
|
const left = evaluateCached(path.get("left"), state);
|
267
240
|
if (!state.confident) return;
|
268
241
|
const right = evaluateCached(path.get("right"), state);
|
269
242
|
if (!state.confident) return;
|
270
|
-
|
271
243
|
switch (path.node.operator) {
|
272
244
|
case "-":
|
273
245
|
return left - right;
|
274
|
-
|
275
246
|
case "+":
|
276
247
|
return left + right;
|
277
|
-
|
278
248
|
case "/":
|
279
249
|
return left / right;
|
280
|
-
|
281
250
|
case "*":
|
282
251
|
return left * right;
|
283
|
-
|
284
252
|
case "%":
|
285
253
|
return left % right;
|
286
|
-
|
287
254
|
case "**":
|
288
255
|
return Math.pow(left, right);
|
289
|
-
|
290
256
|
case "<":
|
291
257
|
return left < right;
|
292
|
-
|
293
258
|
case ">":
|
294
259
|
return left > right;
|
295
|
-
|
296
260
|
case "<=":
|
297
261
|
return left <= right;
|
298
|
-
|
299
262
|
case ">=":
|
300
263
|
return left >= right;
|
301
|
-
|
302
264
|
case "==":
|
303
265
|
return left == right;
|
304
|
-
|
305
266
|
case "!=":
|
306
267
|
return left != right;
|
307
|
-
|
308
268
|
case "===":
|
309
269
|
return left === right;
|
310
|
-
|
311
270
|
case "!==":
|
312
271
|
return left !== right;
|
313
|
-
|
314
272
|
case "|":
|
315
273
|
return left | right;
|
316
|
-
|
317
274
|
case "&":
|
318
275
|
return left & right;
|
319
|
-
|
320
276
|
case "^":
|
321
277
|
return left ^ right;
|
322
|
-
|
323
278
|
case "<<":
|
324
279
|
return left << right;
|
325
|
-
|
326
280
|
case ">>":
|
327
281
|
return left >> right;
|
328
|
-
|
329
282
|
case ">>>":
|
330
283
|
return left >>> right;
|
331
284
|
}
|
332
285
|
}
|
333
|
-
|
334
286
|
if (path.isCallExpression()) {
|
335
287
|
const callee = path.get("callee");
|
336
288
|
let context;
|
337
289
|
let func;
|
338
|
-
|
339
|
-
if (callee.isIdentifier() && !path.scope.getBinding(callee.node.name) && VALID_CALLEES.indexOf(callee.node.name) >= 0) {
|
290
|
+
if (callee.isIdentifier() && !path.scope.getBinding(callee.node.name) && (isValidObjectCallee(callee.node.name) || isValidIdentifierCallee(callee.node.name))) {
|
340
291
|
func = global[callee.node.name];
|
341
292
|
}
|
342
|
-
|
343
293
|
if (callee.isMemberExpression()) {
|
344
294
|
const object = callee.get("object");
|
345
295
|
const property = callee.get("property");
|
346
|
-
|
347
|
-
if (object.isIdentifier() && property.isIdentifier() && VALID_CALLEES.indexOf(object.node.name) >= 0 && INVALID_METHODS.indexOf(property.node.name) < 0) {
|
296
|
+
if (object.isIdentifier() && property.isIdentifier() && isValidObjectCallee(object.node.name) && !isInvalidMethod(property.node.name)) {
|
348
297
|
context = global[object.node.name];
|
349
|
-
|
298
|
+
const key = property.node.name;
|
299
|
+
if (Object.hasOwnProperty.call(context, key)) {
|
300
|
+
func = context[key];
|
301
|
+
}
|
350
302
|
}
|
351
|
-
|
352
303
|
if (object.isLiteral() && property.isIdentifier()) {
|
353
304
|
const type = typeof object.node.value;
|
354
|
-
|
355
305
|
if (type === "string" || type === "number") {
|
356
306
|
context = object.node.value;
|
357
307
|
func = context[property.node.name];
|
358
308
|
}
|
359
309
|
}
|
360
310
|
}
|
361
|
-
|
362
311
|
if (func) {
|
363
312
|
const args = path.get("arguments").map(arg => evaluateCached(arg, state));
|
364
313
|
if (!state.confident) return;
|
365
314
|
return func.apply(context, args);
|
366
315
|
}
|
367
316
|
}
|
368
|
-
|
369
317
|
deopt(path, state);
|
370
318
|
}
|
371
|
-
|
372
319
|
function evaluateQuasis(path, quasis, state, raw = false) {
|
373
320
|
let str = "";
|
374
321
|
let i = 0;
|
375
|
-
const exprs = path.get("expressions");
|
376
|
-
|
322
|
+
const exprs = path.isTemplateLiteral() ? path.get("expressions") : path.get("quasi.expressions");
|
377
323
|
for (const elem of quasis) {
|
378
324
|
if (!state.confident) break;
|
379
325
|
str += raw ? elem.value.raw : elem.value.cooked;
|
380
326
|
const expr = exprs[i++];
|
381
327
|
if (expr) str += String(evaluateCached(expr, state));
|
382
328
|
}
|
383
|
-
|
384
329
|
if (!state.confident) return;
|
385
330
|
return str;
|
386
331
|
}
|
387
|
-
|
388
332
|
function evaluate() {
|
389
333
|
const state = {
|
390
334
|
confident: true,
|
@@ -398,4 +342,6 @@ function evaluate() {
|
|
398
342
|
deopt: state.deoptPath,
|
399
343
|
value: value
|
400
344
|
};
|
401
|
-
}
|
345
|
+
}
|
346
|
+
|
347
|
+
//# sourceMappingURL=evaluation.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["VALID_OBJECT_CALLEES","VALID_IDENTIFIER_CALLEES","INVALID_METHODS","isValidObjectCallee","val","includes","isValidIdentifierCallee","isInvalidMethod","evaluateTruthy","res","evaluate","confident","value","deopt","path","state","deoptPath","Globals","Map","undefined","Infinity","NaN","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","key","computed","isReferencedIdentifier","binding","constantViolations","start","end","hasValue","resolve","isUnaryExpression","prefix","operator","argument","isFunction","isClass","arg","isArrayExpression","arr","elems","elem","elemValue","push","isObjectExpression","obj","props","prop","isObjectMethod","isSpreadElement","keyPath","valuePath","isLogicalExpression","wasConfident","left","leftConfident","right","rightConfident","isBinaryExpression","Math","pow","context","func","global","Object","hasOwnProperty","call","args","map","apply","raw","str","i","cooked","expr","String"],"sources":["../../src/path/evaluation.ts"],"sourcesContent":["import type NodePath from \"./index.ts\";\nimport type * as t from \"@babel/types\";\n\n// This file contains Babels metainterpreter that can evaluate static code.\n\nconst VALID_OBJECT_CALLEES = [\"Number\", \"String\", \"Math\"] as const;\nconst VALID_IDENTIFIER_CALLEES = [\n \"isFinite\",\n \"isNaN\",\n \"parseFloat\",\n \"parseInt\",\n \"decodeURI\",\n \"decodeURIComponent\",\n \"encodeURI\",\n \"encodeURIComponent\",\n process.env.BABEL_8_BREAKING ? \"btoa\" : null,\n process.env.BABEL_8_BREAKING ? \"atob\" : null,\n] as const;\n\nconst INVALID_METHODS = [\"random\"] as const;\n\nfunction isValidObjectCallee(\n val: string,\n): val is (typeof VALID_OBJECT_CALLEES)[number] {\n return VALID_OBJECT_CALLEES.includes(\n // @ts-expect-error val is a string\n val,\n );\n}\n\nfunction isValidIdentifierCallee(\n val: string,\n): val is (typeof VALID_IDENTIFIER_CALLEES)[number] {\n return VALID_IDENTIFIER_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\nconst Globals = new Map([\n [\"undefined\", undefined],\n [\"Infinity\", Infinity],\n [\"NaN\", NaN],\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, \"foo\"[0]\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()) {\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\n let key = null;\n if (path.node.computed) {\n key = evaluateCached(property, state);\n if (!state.confident) return;\n } else if (property.isIdentifier()) {\n key = property.node.name;\n }\n if (\n (type === \"number\" || type === \"string\") &&\n key != null &&\n (typeof key === \"number\" || typeof key === \"string\")\n ) {\n return value[key];\n }\n }\n }\n\n if (path.isReferencedIdentifier()) {\n const binding = path.scope.getBinding(path.node.name);\n\n if (binding) {\n if (\n binding.constantViolations.length > 0 ||\n path.node.start < binding.path.node.end\n ) {\n deopt(binding.path, state);\n return;\n }\n if (binding.hasValue) {\n return binding.value;\n }\n }\n\n const name = path.node.name;\n if (Globals.has(name)) {\n if (!binding) {\n return Globals.get(name);\n }\n deopt(binding.path, state);\n return;\n }\n\n const resolved = path.resolve();\n if (resolved === path) {\n deopt(path, state);\n return;\n } else {\n return evaluateCached(resolved, state);\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 deopt(elemValue.deopt, state);\n return;\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 deopt(prop, state);\n return;\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 deopt(key.deopt, state);\n return;\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 deopt(value.deopt, state);\n return;\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 (isValidObjectCallee(callee.node.name) ||\n isValidIdentifierCallee(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 isValidObjectCallee(object.node.name) &&\n !isInvalidMethod(property.node.name)\n ) {\n context = global[object.node.name];\n const key = property.node.name;\n // TODO(Babel 8): Use Object.hasOwn\n if (Object.hasOwnProperty.call(context, key)) {\n func = context[key as keyof typeof context];\n }\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: Array<NodePath<t.Node>> = path.isTemplateLiteral()\n ? path.get(\"expressions\")\n : path.get(\"quasi.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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"}
|