@babel/traverse 7.17.9 → 7.23.4

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.
Files changed (67) hide show
  1. package/README.md +1 -1
  2. package/lib/cache.js +27 -9
  3. package/lib/cache.js.map +1 -0
  4. package/lib/context.js +9 -31
  5. package/lib/context.js.map +1 -0
  6. package/lib/hub.js +2 -6
  7. package/lib/hub.js.map +1 -0
  8. package/lib/index.js +18 -35
  9. package/lib/index.js.map +1 -0
  10. package/lib/path/ancestry.js +3 -42
  11. package/lib/path/ancestry.js.map +1 -0
  12. package/lib/path/comments.js +23 -11
  13. package/lib/path/comments.js.map +1 -0
  14. package/lib/path/context.js +24 -65
  15. package/lib/path/context.js.map +1 -0
  16. package/lib/path/conversion.js +37 -100
  17. package/lib/path/conversion.js.map +1 -0
  18. package/lib/path/evaluation.js +69 -123
  19. package/lib/path/evaluation.js.map +1 -0
  20. package/lib/path/family.js +5 -76
  21. package/lib/path/family.js.map +1 -0
  22. package/lib/path/index.js +28 -96
  23. package/lib/path/index.js.map +1 -0
  24. package/lib/path/inference/index.js +26 -33
  25. package/lib/path/inference/index.js.map +1 -0
  26. package/lib/path/inference/inferer-reference.js +6 -61
  27. package/lib/path/inference/inferer-reference.js.map +1 -0
  28. package/lib/path/inference/inferers.js +32 -86
  29. package/lib/path/inference/inferers.js.map +1 -0
  30. package/lib/path/inference/util.js +30 -0
  31. package/lib/path/inference/util.js.map +1 -0
  32. package/lib/path/introspection.js +55 -107
  33. package/lib/path/introspection.js.map +1 -0
  34. package/lib/path/lib/hoister.js +2 -37
  35. package/lib/path/lib/hoister.js.map +1 -0
  36. package/lib/path/lib/removal-hooks.js +4 -5
  37. package/lib/path/lib/removal-hooks.js.map +1 -0
  38. package/lib/path/lib/virtual-types-validator.js +161 -0
  39. package/lib/path/lib/virtual-types-validator.js.map +1 -0
  40. package/lib/path/lib/virtual-types.js +20 -224
  41. package/lib/path/lib/virtual-types.js.map +1 -0
  42. package/lib/path/modification.js +17 -61
  43. package/lib/path/modification.js.map +1 -0
  44. package/lib/path/removal.js +9 -22
  45. package/lib/path/removal.js.map +1 -0
  46. package/lib/path/replacement.js +80 -76
  47. package/lib/path/replacement.js.map +1 -0
  48. package/lib/scope/binding.js +20 -12
  49. package/lib/scope/binding.js.map +1 -0
  50. package/lib/scope/index.js +117 -247
  51. package/lib/scope/index.js.map +1 -0
  52. package/lib/scope/lib/renamer.js +41 -74
  53. package/lib/scope/lib/renamer.js.map +1 -0
  54. package/lib/traverse-node.js +10 -11
  55. package/lib/traverse-node.js.map +1 -0
  56. package/lib/types.js +1 -3
  57. package/lib/types.js.map +1 -0
  58. package/lib/visitors.js +62 -83
  59. package/lib/visitors.js.map +1 -0
  60. package/package.json +13 -11
  61. package/lib/path/generated/asserts.js +0 -5
  62. package/lib/path/generated/validators.js +0 -5
  63. package/lib/path/generated/virtual-types.js +0 -3
  64. package/scripts/generators/asserts.js +0 -25
  65. package/scripts/generators/validators.js +0 -42
  66. package/scripts/generators/virtual-types.js +0 -24
  67. package/scripts/package.json +0 -1
@@ -5,20 +5,28 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.evaluate = evaluate;
7
7
  exports.evaluateTruthy = evaluateTruthy;
8
- const VALID_CALLEES = ["String", "Number", "Math"];
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 (type === "number" || type === "string") {
116
- return value[property.node.name];
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
- if (binding && binding.constantViolations.length > 0) {
125
- return deopt(binding.path, state);
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 (binding && path.node.start < binding.path.node.end) {
129
- return deopt(binding.path, state);
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 (binding != null && binding.hasValue) {
133
- return binding.value;
136
+ const resolved = path.resolve();
137
+ if (resolved === path) {
138
+ deopt(path, state);
139
+ return;
134
140
  } else {
135
- if (path.node.name === "undefined") {
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
- return deopt(elemValue.deopt, state);
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
- return deopt(prop, state);
188
+ deopt(prop, state);
189
+ return;
211
190
  }
212
-
213
191
  const keyPath = prop.get("key");
214
- let key = keyPath;
215
-
192
+ let key;
216
193
  if (prop.node.computed) {
217
- key = key.evaluate();
218
-
194
+ key = keyPath.evaluate();
219
195
  if (!key.confident) {
220
- return deopt(key.deopt, state);
196
+ deopt(key.deopt, state);
197
+ return;
221
198
  }
222
-
223
199
  key = key.value;
224
- } else if (key.isIdentifier()) {
225
- key = key.node.name;
200
+ } else if (keyPath.isIdentifier()) {
201
+ key = keyPath.node.name;
226
202
  } else {
227
- key = key.node.value;
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
- return deopt(value.deopt, state);
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
- func = context[property.node.name];
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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"}