@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.

Files changed (57) hide show
  1. package/lib/cache.js +0 -3
  2. package/lib/cache.js.map +1 -1
  3. package/lib/context.js +7 -21
  4. package/lib/context.js.map +1 -1
  5. package/lib/hub.js +0 -6
  6. package/lib/hub.js.map +1 -1
  7. package/lib/index.js +3 -21
  8. package/lib/index.js.map +1 -1
  9. package/lib/path/ancestry.js +3 -23
  10. package/lib/path/ancestry.js.map +1 -1
  11. package/lib/path/comments.js +0 -4
  12. package/lib/path/comments.js.map +1 -1
  13. package/lib/path/context.js +14 -54
  14. package/lib/path/context.js.map +1 -1
  15. package/lib/path/conversion.js +23 -78
  16. package/lib/path/conversion.js.map +1 -1
  17. package/lib/path/evaluation.js +9 -85
  18. package/lib/path/evaluation.js.map +1 -1
  19. package/lib/path/family.js +6 -73
  20. package/lib/path/family.js.map +1 -1
  21. package/lib/path/index.js +2 -61
  22. package/lib/path/index.js.map +1 -1
  23. package/lib/path/inference/index.js +2 -27
  24. package/lib/path/inference/index.js.map +1 -1
  25. package/lib/path/inference/inferer-reference.js +10 -31
  26. package/lib/path/inference/inferer-reference.js.map +1 -1
  27. package/lib/path/inference/inferers.js +4 -44
  28. package/lib/path/inference/inferers.js.map +1 -1
  29. package/lib/path/inference/util.js +0 -4
  30. package/lib/path/inference/util.js.map +1 -1
  31. package/lib/path/introspection.js +17 -59
  32. package/lib/path/introspection.js.map +1 -1
  33. package/lib/path/lib/hoister.js +7 -23
  34. package/lib/path/lib/hoister.js.map +1 -1
  35. package/lib/path/lib/removal-hooks.js +7 -3
  36. package/lib/path/lib/removal-hooks.js.map +1 -1
  37. package/lib/path/lib/virtual-types-validator.js +0 -23
  38. package/lib/path/lib/virtual-types-validator.js.map +1 -1
  39. package/lib/path/lib/virtual-types.js +1 -0
  40. package/lib/path/lib/virtual-types.js.map +1 -1
  41. package/lib/path/modification.js +12 -47
  42. package/lib/path/modification.js.map +1 -1
  43. package/lib/path/removal.js +0 -16
  44. package/lib/path/removal.js.map +1 -1
  45. package/lib/path/replacement.js +8 -50
  46. package/lib/path/replacement.js.map +1 -1
  47. package/lib/scope/binding.js +2 -14
  48. package/lib/scope/binding.js.map +1 -1
  49. package/lib/scope/index.js +19 -184
  50. package/lib/scope/index.js.map +1 -1
  51. package/lib/scope/lib/renamer.js +2 -25
  52. package/lib/scope/lib/renamer.js.map +1 -1
  53. package/lib/traverse-node.js +0 -7
  54. package/lib/traverse-node.js.map +1 -1
  55. package/lib/visitors.js +13 -44
  56. package/lib/visitors.js.map +1 -1
  57. package/package.json +4 -4
@@ -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(val);
12
+ return VALID_CALLEES.includes(
13
+ val);
13
14
  }
14
-
15
15
  function isInvalidMethod(val) {
16
- return INVALID_METHODS.includes(val);
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
- if (object.isIdentifier() && name === "String" && !path.scope.getBinding(name) && property.isIdentifier() && property.node.name === "raw") {
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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"}