@babel/traverse 7.1.0 → 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.
Files changed (61) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/lib/cache.js +27 -7
  4. package/lib/cache.js.map +1 -0
  5. package/lib/context.js +22 -59
  6. package/lib/context.js.map +1 -0
  7. package/lib/hub.js +2 -6
  8. package/lib/hub.js.map +1 -0
  9. package/lib/index.js +42 -77
  10. package/lib/index.js.map +1 -0
  11. package/lib/path/ancestry.js +15 -62
  12. package/lib/path/ancestry.js.map +1 -0
  13. package/lib/path/comments.js +31 -24
  14. package/lib/path/comments.js.map +1 -0
  15. package/lib/path/context.js +68 -91
  16. package/lib/path/context.js.map +1 -0
  17. package/lib/path/conversion.js +275 -273
  18. package/lib/path/conversion.js.map +1 -0
  19. package/lib/path/evaluation.js +84 -149
  20. package/lib/path/evaluation.js.map +1 -0
  21. package/lib/path/family.js +189 -94
  22. package/lib/path/family.js.map +1 -0
  23. package/lib/path/index.js +106 -132
  24. package/lib/path/index.js.map +1 -0
  25. package/lib/path/inference/index.js +81 -64
  26. package/lib/path/inference/index.js.map +1 -0
  27. package/lib/path/inference/inferer-reference.js +22 -52
  28. package/lib/path/inference/inferer-reference.js.map +1 -0
  29. package/lib/path/inference/inferers.js +110 -125
  30. package/lib/path/inference/inferers.js.map +1 -0
  31. package/lib/path/inference/util.js +30 -0
  32. package/lib/path/inference/util.js.map +1 -0
  33. package/lib/path/introspection.js +182 -168
  34. package/lib/path/introspection.js.map +1 -0
  35. package/lib/path/lib/hoister.js +37 -54
  36. package/lib/path/lib/hoister.js.map +1 -0
  37. package/lib/path/lib/removal-hooks.js +4 -4
  38. package/lib/path/lib/removal-hooks.js.map +1 -0
  39. package/lib/path/lib/virtual-types-validator.js +161 -0
  40. package/lib/path/lib/virtual-types-validator.js.map +1 -0
  41. package/lib/path/lib/virtual-types.js +21 -189
  42. package/lib/path/lib/virtual-types.js.map +1 -0
  43. package/lib/path/modification.js +103 -98
  44. package/lib/path/modification.js.map +1 -0
  45. package/lib/path/removal.js +18 -23
  46. package/lib/path/removal.js.map +1 -0
  47. package/lib/path/replacement.js +91 -144
  48. package/lib/path/replacement.js.map +1 -0
  49. package/lib/scope/binding.js +28 -16
  50. package/lib/scope/binding.js.map +1 -0
  51. package/lib/scope/index.js +407 -414
  52. package/lib/scope/index.js.map +1 -0
  53. package/lib/scope/lib/renamer.js +45 -70
  54. package/lib/scope/lib/renamer.js.map +1 -0
  55. package/lib/traverse-node.js +29 -0
  56. package/lib/traverse-node.js.map +1 -0
  57. package/lib/types.js +3 -0
  58. package/lib/types.js.map +1 -0
  59. package/lib/visitors.js +77 -113
  60. package/lib/visitors.js.map +1 -0
  61. package/package.json +28 -17
@@ -3,267 +3,288 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.matchesPattern = matchesPattern;
7
- exports.has = has;
8
- exports.isStatic = isStatic;
9
- exports.isnt = isnt;
10
- exports.equals = equals;
11
- exports.isNodeType = isNodeType;
6
+ exports._guessExecutionStatusRelativeTo = _guessExecutionStatusRelativeTo;
7
+ exports._resolve = _resolve;
12
8
  exports.canHaveVariableDeclarationOrExpression = canHaveVariableDeclarationOrExpression;
13
9
  exports.canSwapBetweenExpressionAndStatement = canSwapBetweenExpressionAndStatement;
10
+ exports.equals = equals;
11
+ exports.getSource = getSource;
12
+ exports.has = has;
13
+ exports.is = void 0;
14
14
  exports.isCompletionRecord = isCompletionRecord;
15
+ exports.isConstantExpression = isConstantExpression;
16
+ exports.isInStrictMode = isInStrictMode;
17
+ exports.isNodeType = isNodeType;
15
18
  exports.isStatementOrBlock = isStatementOrBlock;
19
+ exports.isStatic = isStatic;
20
+ exports.isnt = isnt;
21
+ exports.matchesPattern = matchesPattern;
16
22
  exports.referencesImport = referencesImport;
17
- exports.getSource = getSource;
18
- exports.willIMaybeExecuteBefore = willIMaybeExecuteBefore;
19
- exports._guessExecutionStatusRelativeTo = _guessExecutionStatusRelativeTo;
20
- exports._guessExecutionStatusRelativeToDifferentFunctions = _guessExecutionStatusRelativeToDifferentFunctions;
21
23
  exports.resolve = resolve;
22
- exports._resolve = _resolve;
23
- exports.isConstantExpression = isConstantExpression;
24
- exports.isInStrictMode = isInStrictMode;
25
- exports.is = void 0;
26
-
27
- function _includes() {
28
- const data = _interopRequireDefault(require("lodash/includes"));
29
-
30
- _includes = function () {
31
- return data;
32
- };
33
-
34
- return data;
35
- }
36
-
37
- function t() {
38
- const data = _interopRequireWildcard(require("@babel/types"));
39
-
40
- t = function () {
41
- return data;
42
- };
43
-
44
- return data;
45
- }
46
-
47
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
48
-
49
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
50
-
24
+ exports.willIMaybeExecuteBefore = willIMaybeExecuteBefore;
25
+ var _t = require("@babel/types");
26
+ const {
27
+ STATEMENT_OR_BLOCK_KEYS,
28
+ VISITOR_KEYS,
29
+ isBlockStatement,
30
+ isExpression,
31
+ isIdentifier,
32
+ isLiteral,
33
+ isStringLiteral,
34
+ isType,
35
+ matchesPattern: _matchesPattern
36
+ } = _t;
51
37
  function matchesPattern(pattern, allowPartial) {
52
- return t().matchesPattern(this.node, pattern, allowPartial);
38
+ return _matchesPattern(this.node, pattern, allowPartial);
53
39
  }
54
-
55
40
  function has(key) {
56
41
  const val = this.node && this.node[key];
57
-
58
42
  if (val && Array.isArray(val)) {
59
43
  return !!val.length;
60
44
  } else {
61
45
  return !!val;
62
46
  }
63
47
  }
64
-
65
48
  function isStatic() {
66
49
  return this.scope.isStatic(this.node);
67
50
  }
68
-
69
51
  const is = has;
70
52
  exports.is = is;
71
-
72
53
  function isnt(key) {
73
54
  return !this.has(key);
74
55
  }
75
-
76
56
  function equals(key, value) {
77
57
  return this.node[key] === value;
78
58
  }
79
-
80
59
  function isNodeType(type) {
81
- return t().isType(this.type, type);
60
+ return isType(this.type, type);
82
61
  }
83
-
84
62
  function canHaveVariableDeclarationOrExpression() {
85
63
  return (this.key === "init" || this.key === "left") && this.parentPath.isFor();
86
64
  }
87
-
88
65
  function canSwapBetweenExpressionAndStatement(replacement) {
89
66
  if (this.key !== "body" || !this.parentPath.isArrowFunctionExpression()) {
90
67
  return false;
91
68
  }
92
-
93
69
  if (this.isExpression()) {
94
- return t().isBlockStatement(replacement);
70
+ return isBlockStatement(replacement);
95
71
  } else if (this.isBlockStatement()) {
96
- return t().isExpression(replacement);
72
+ return isExpression(replacement);
97
73
  }
98
-
99
74
  return false;
100
75
  }
101
-
102
76
  function isCompletionRecord(allowInsideFunction) {
103
77
  let path = this;
104
78
  let first = true;
105
-
106
79
  do {
107
- const container = path.container;
108
-
109
- if (path.isFunction() && !first) {
80
+ const {
81
+ type,
82
+ container
83
+ } = path;
84
+ if (!first && (path.isFunction() || type === "StaticBlock")) {
110
85
  return !!allowInsideFunction;
111
86
  }
112
-
113
87
  first = false;
114
-
115
88
  if (Array.isArray(container) && path.key !== container.length - 1) {
116
89
  return false;
117
90
  }
118
- } while ((path = path.parentPath) && !path.isProgram());
119
-
91
+ } while ((path = path.parentPath) && !path.isProgram() && !path.isDoExpression());
120
92
  return true;
121
93
  }
122
-
123
94
  function isStatementOrBlock() {
124
- if (this.parentPath.isLabeledStatement() || t().isBlockStatement(this.container)) {
95
+ if (this.parentPath.isLabeledStatement() || isBlockStatement(this.container)) {
125
96
  return false;
126
97
  } else {
127
- return (0, _includes().default)(t().STATEMENT_OR_BLOCK_KEYS, this.key);
98
+ return STATEMENT_OR_BLOCK_KEYS.includes(this.key);
128
99
  }
129
100
  }
130
-
131
101
  function referencesImport(moduleSource, importName) {
132
- if (!this.isReferencedIdentifier()) return false;
102
+ if (!this.isReferencedIdentifier()) {
103
+ if (this.isJSXMemberExpression() && this.node.property.name === importName || (this.isMemberExpression() || this.isOptionalMemberExpression()) && (this.node.computed ? isStringLiteral(this.node.property, {
104
+ value: importName
105
+ }) : this.node.property.name === importName)) {
106
+ const object = this.get("object");
107
+ return object.isReferencedIdentifier() && object.referencesImport(moduleSource, "*");
108
+ }
109
+ return false;
110
+ }
133
111
  const binding = this.scope.getBinding(this.node.name);
134
112
  if (!binding || binding.kind !== "module") return false;
135
113
  const path = binding.path;
136
114
  const parent = path.parentPath;
137
115
  if (!parent.isImportDeclaration()) return false;
138
-
139
116
  if (parent.node.source.value === moduleSource) {
140
117
  if (!importName) return true;
141
118
  } else {
142
119
  return false;
143
120
  }
144
-
145
121
  if (path.isImportDefaultSpecifier() && importName === "default") {
146
122
  return true;
147
123
  }
148
-
149
124
  if (path.isImportNamespaceSpecifier() && importName === "*") {
150
125
  return true;
151
126
  }
152
-
153
- if (path.isImportSpecifier() && path.node.imported.name === importName) {
127
+ if (path.isImportSpecifier() && isIdentifier(path.node.imported, {
128
+ name: importName
129
+ })) {
154
130
  return true;
155
131
  }
156
-
157
132
  return false;
158
133
  }
159
-
160
134
  function getSource() {
161
135
  const node = this.node;
162
-
163
136
  if (node.end) {
164
137
  const code = this.hub.getCode();
165
138
  if (code) return code.slice(node.start, node.end);
166
139
  }
167
-
168
140
  return "";
169
141
  }
170
-
171
142
  function willIMaybeExecuteBefore(target) {
172
143
  return this._guessExecutionStatusRelativeTo(target) !== "after";
173
144
  }
174
-
175
- function _guessExecutionStatusRelativeTo(target) {
176
- const targetFuncParent = target.scope.getFunctionParent() || target.scope.getProgramParent();
177
- const selfFuncParent = this.scope.getFunctionParent() || target.scope.getProgramParent();
178
-
179
- if (targetFuncParent.node !== selfFuncParent.node) {
180
- const status = this._guessExecutionStatusRelativeToDifferentFunctions(targetFuncParent);
181
-
182
- if (status) {
183
- return status;
184
- } else {
185
- target = targetFuncParent.path;
145
+ function getOuterFunction(path) {
146
+ return path.isProgram() ? path : (path.parentPath.scope.getFunctionParent() || path.parentPath.scope.getProgramParent()).path;
147
+ }
148
+ function isExecutionUncertain(type, key) {
149
+ switch (type) {
150
+ case "LogicalExpression":
151
+ return key === "right";
152
+ case "ConditionalExpression":
153
+ case "IfStatement":
154
+ return key === "consequent" || key === "alternate";
155
+ case "WhileStatement":
156
+ case "DoWhileStatement":
157
+ case "ForInStatement":
158
+ case "ForOfStatement":
159
+ return key === "body";
160
+ case "ForStatement":
161
+ return key === "body" || key === "update";
162
+ case "SwitchStatement":
163
+ return key === "cases";
164
+ case "TryStatement":
165
+ return key === "handler";
166
+ case "AssignmentPattern":
167
+ return key === "right";
168
+ case "OptionalMemberExpression":
169
+ return key === "property";
170
+ case "OptionalCallExpression":
171
+ return key === "arguments";
172
+ default:
173
+ return false;
174
+ }
175
+ }
176
+ function isExecutionUncertainInList(paths, maxIndex) {
177
+ for (let i = 0; i < maxIndex; i++) {
178
+ const path = paths[i];
179
+ if (isExecutionUncertain(path.parent.type, path.parentKey)) {
180
+ return true;
186
181
  }
187
182
  }
188
-
189
- const targetPaths = target.getAncestry();
190
- if (targetPaths.indexOf(this) >= 0) return "after";
191
- const selfPaths = this.getAncestry();
183
+ return false;
184
+ }
185
+ const SYMBOL_CHECKING = Symbol();
186
+ function _guessExecutionStatusRelativeTo(target) {
187
+ return _guessExecutionStatusRelativeToCached(this, target, new Map());
188
+ }
189
+ function _guessExecutionStatusRelativeToCached(base, target, cache) {
190
+ const funcParent = {
191
+ this: getOuterFunction(base),
192
+ target: getOuterFunction(target)
193
+ };
194
+ if (funcParent.target.node !== funcParent.this.node) {
195
+ return _guessExecutionStatusRelativeToDifferentFunctionsCached(base, funcParent.target, cache);
196
+ }
197
+ const paths = {
198
+ target: target.getAncestry(),
199
+ this: base.getAncestry()
200
+ };
201
+ if (paths.target.indexOf(base) >= 0) return "after";
202
+ if (paths.this.indexOf(target) >= 0) return "before";
192
203
  let commonPath;
193
- let targetIndex;
194
- let selfIndex;
195
-
196
- for (selfIndex = 0; selfIndex < selfPaths.length; selfIndex++) {
197
- const selfPath = selfPaths[selfIndex];
198
- targetIndex = targetPaths.indexOf(selfPath);
199
-
200
- if (targetIndex >= 0) {
201
- commonPath = selfPath;
202
- break;
204
+ const commonIndex = {
205
+ target: 0,
206
+ this: 0
207
+ };
208
+ while (!commonPath && commonIndex.this < paths.this.length) {
209
+ const path = paths.this[commonIndex.this];
210
+ commonIndex.target = paths.target.indexOf(path);
211
+ if (commonIndex.target >= 0) {
212
+ commonPath = path;
213
+ } else {
214
+ commonIndex.this++;
203
215
  }
204
216
  }
205
-
206
217
  if (!commonPath) {
207
- return "before";
218
+ throw new Error("Internal Babel error - The two compared nodes" + " don't appear to belong to the same program.");
208
219
  }
209
-
210
- const targetRelationship = targetPaths[targetIndex - 1];
211
- const selfRelationship = selfPaths[selfIndex - 1];
212
-
213
- if (!targetRelationship || !selfRelationship) {
214
- return "before";
220
+ if (isExecutionUncertainInList(paths.this, commonIndex.this - 1) || isExecutionUncertainInList(paths.target, commonIndex.target - 1)) {
221
+ return "unknown";
215
222
  }
216
-
217
- if (targetRelationship.listKey && targetRelationship.container === selfRelationship.container) {
218
- return targetRelationship.key > selfRelationship.key ? "before" : "after";
223
+ const divergence = {
224
+ this: paths.this[commonIndex.this - 1],
225
+ target: paths.target[commonIndex.target - 1]
226
+ };
227
+ if (divergence.target.listKey && divergence.this.listKey && divergence.target.container === divergence.this.container) {
228
+ return divergence.target.key > divergence.this.key ? "before" : "after";
219
229
  }
220
-
221
- const keys = t().VISITOR_KEYS[commonPath.type];
222
- const targetKeyPosition = keys.indexOf(targetRelationship.key);
223
- const selfKeyPosition = keys.indexOf(selfRelationship.key);
224
- return targetKeyPosition > selfKeyPosition ? "before" : "after";
230
+ const keys = VISITOR_KEYS[commonPath.type];
231
+ const keyPosition = {
232
+ this: keys.indexOf(divergence.this.parentKey),
233
+ target: keys.indexOf(divergence.target.parentKey)
234
+ };
235
+ return keyPosition.target > keyPosition.this ? "before" : "after";
225
236
  }
226
-
227
- function _guessExecutionStatusRelativeToDifferentFunctions(targetFuncParent) {
228
- const targetFuncPath = targetFuncParent.path;
229
- if (!targetFuncPath.isFunctionDeclaration()) return;
230
- const binding = targetFuncPath.scope.getBinding(targetFuncPath.node.id.name);
231
- if (!binding.references) return "before";
232
- const referencePaths = binding.referencePaths;
233
-
234
- for (const path of referencePaths) {
235
- if (path.key !== "callee" || !path.parentPath.isCallExpression()) {
236
- return;
237
+ function _guessExecutionStatusRelativeToDifferentFunctionsInternal(base, target, cache) {
238
+ if (!target.isFunctionDeclaration()) {
239
+ if (_guessExecutionStatusRelativeToCached(base, target, cache) === "before") {
240
+ return "before";
237
241
  }
242
+ return "unknown";
243
+ } else if (target.parentPath.isExportDeclaration()) {
244
+ return "unknown";
238
245
  }
239
-
246
+ const binding = target.scope.getBinding(target.node.id.name);
247
+ if (!binding.references) return "before";
248
+ const referencePaths = binding.referencePaths;
240
249
  let allStatus;
241
-
242
250
  for (const path of referencePaths) {
243
- const childOfFunction = !!path.find(path => path.node === targetFuncPath.node);
251
+ const childOfFunction = !!path.find(path => path.node === target.node);
244
252
  if (childOfFunction) continue;
245
-
246
- const status = this._guessExecutionStatusRelativeTo(path);
247
-
248
- if (allStatus) {
249
- if (allStatus !== status) return;
253
+ if (path.key !== "callee" || !path.parentPath.isCallExpression()) {
254
+ return "unknown";
255
+ }
256
+ const status = _guessExecutionStatusRelativeToCached(base, path, cache);
257
+ if (allStatus && allStatus !== status) {
258
+ return "unknown";
250
259
  } else {
251
260
  allStatus = status;
252
261
  }
253
262
  }
254
-
255
263
  return allStatus;
256
264
  }
257
-
265
+ function _guessExecutionStatusRelativeToDifferentFunctionsCached(base, target, cache) {
266
+ let nodeMap = cache.get(base.node);
267
+ let cached;
268
+ if (!nodeMap) {
269
+ cache.set(base.node, nodeMap = new Map());
270
+ } else if (cached = nodeMap.get(target.node)) {
271
+ if (cached === SYMBOL_CHECKING) {
272
+ return "unknown";
273
+ }
274
+ return cached;
275
+ }
276
+ nodeMap.set(target.node, SYMBOL_CHECKING);
277
+ const result = _guessExecutionStatusRelativeToDifferentFunctionsInternal(base, target, cache);
278
+ nodeMap.set(target.node, result);
279
+ return result;
280
+ }
258
281
  function resolve(dangerous, resolved) {
259
282
  return this._resolve(dangerous, resolved) || this;
260
283
  }
261
-
262
284
  function _resolve(dangerous, resolved) {
263
285
  if (resolved && resolved.indexOf(this) >= 0) return;
264
286
  resolved = resolved || [];
265
287
  resolved.push(this);
266
-
267
288
  if (this.isVariableDeclarator()) {
268
289
  if (this.get("id").isIdentifier()) {
269
290
  return this.get("init").resolve(dangerous, resolved);
@@ -273,7 +294,6 @@ function _resolve(dangerous, resolved) {
273
294
  if (!binding) return;
274
295
  if (!binding.constant) return;
275
296
  if (binding.kind === "module") return;
276
-
277
297
  if (binding.path !== this) {
278
298
  const ret = binding.path.resolve(dangerous, resolved);
279
299
  if (this.find(parent => parent.node === ret.node)) return;
@@ -283,13 +303,11 @@ function _resolve(dangerous, resolved) {
283
303
  return this.get("expression").resolve(dangerous, resolved);
284
304
  } else if (dangerous && this.isMemberExpression()) {
285
305
  const targetKey = this.toComputedKey();
286
- if (!t().isLiteral(targetKey)) return;
306
+ if (!isLiteral(targetKey)) return;
287
307
  const targetName = targetKey.value;
288
308
  const target = this.get("object").resolve(dangerous, resolved);
289
-
290
309
  if (target.isObjectExpression()) {
291
310
  const props = target.get("properties");
292
-
293
311
  for (const prop of props) {
294
312
  if (!prop.isProperty()) continue;
295
313
  const key = prop.get("key");
@@ -308,41 +326,35 @@ function _resolve(dangerous, resolved) {
308
326
  }
309
327
  }
310
328
  }
311
-
312
329
  function isConstantExpression() {
313
330
  if (this.isIdentifier()) {
314
331
  const binding = this.scope.getBinding(this.node.name);
315
332
  if (!binding) return false;
316
333
  return binding.constant;
317
334
  }
318
-
319
335
  if (this.isLiteral()) {
320
336
  if (this.isRegExpLiteral()) {
321
337
  return false;
322
338
  }
323
-
324
339
  if (this.isTemplateLiteral()) {
325
340
  return this.get("expressions").every(expression => expression.isConstantExpression());
326
341
  }
327
-
328
342
  return true;
329
343
  }
330
-
331
344
  if (this.isUnaryExpression()) {
332
- if (this.get("operator").node !== "void") {
345
+ if (this.node.operator !== "void") {
333
346
  return false;
334
347
  }
335
-
336
348
  return this.get("argument").isConstantExpression();
337
349
  }
338
-
339
350
  if (this.isBinaryExpression()) {
340
- return this.get("left").isConstantExpression() && this.get("right").isConstantExpression();
351
+ const {
352
+ operator
353
+ } = this.node;
354
+ return operator !== "in" && operator !== "instanceof" && this.get("left").isConstantExpression() && this.get("right").isConstantExpression();
341
355
  }
342
-
343
356
  return false;
344
357
  }
345
-
346
358
  function isInStrictMode() {
347
359
  const start = this.isProgram() ? this : this.parentPath;
348
360
  const strictParent = start.find(path => {
@@ -350,22 +362,24 @@ function isInStrictMode() {
350
362
  sourceType: "module"
351
363
  })) return true;
352
364
  if (path.isClass()) return true;
353
- if (!path.isProgram() && !path.isFunction()) return false;
354
-
355
365
  if (path.isArrowFunctionExpression() && !path.get("body").isBlockStatement()) {
356
366
  return false;
357
367
  }
358
-
359
- let {
360
- node
361
- } = path;
362
- if (path.isFunction()) node = node.body;
363
-
364
- for (const directive of node.directives) {
368
+ let body;
369
+ if (path.isFunction()) {
370
+ body = path.node.body;
371
+ } else if (path.isProgram()) {
372
+ body = path.node;
373
+ } else {
374
+ return false;
375
+ }
376
+ for (const directive of body.directives) {
365
377
  if (directive.value.value === "use strict") {
366
378
  return true;
367
379
  }
368
380
  }
369
381
  });
370
382
  return !!strictParent;
371
- }
383
+ }
384
+
385
+ //# sourceMappingURL=introspection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_t","require","STATEMENT_OR_BLOCK_KEYS","VISITOR_KEYS","isBlockStatement","isExpression","isIdentifier","isLiteral","isStringLiteral","isType","matchesPattern","_matchesPattern","pattern","allowPartial","node","has","key","val","Array","isArray","length","isStatic","scope","is","exports","isnt","equals","value","isNodeType","type","canHaveVariableDeclarationOrExpression","parentPath","isFor","canSwapBetweenExpressionAndStatement","replacement","isArrowFunctionExpression","isCompletionRecord","allowInsideFunction","path","first","container","isFunction","isProgram","isDoExpression","isStatementOrBlock","isLabeledStatement","includes","referencesImport","moduleSource","importName","isReferencedIdentifier","isJSXMemberExpression","property","name","isMemberExpression","isOptionalMemberExpression","computed","object","get","binding","getBinding","kind","parent","isImportDeclaration","source","isImportDefaultSpecifier","isImportNamespaceSpecifier","isImportSpecifier","imported","getSource","end","code","hub","getCode","slice","start","willIMaybeExecuteBefore","target","_guessExecutionStatusRelativeTo","getOuterFunction","getFunctionParent","getProgramParent","isExecutionUncertain","isExecutionUncertainInList","paths","maxIndex","i","parentKey","SYMBOL_CHECKING","Symbol","_guessExecutionStatusRelativeToCached","Map","base","cache","funcParent","this","_guessExecutionStatusRelativeToDifferentFunctionsCached","getAncestry","indexOf","commonPath","commonIndex","Error","divergence","listKey","keys","keyPosition","_guessExecutionStatusRelativeToDifferentFunctionsInternal","isFunctionDeclaration","isExportDeclaration","id","references","referencePaths","allStatus","childOfFunction","find","isCallExpression","status","nodeMap","cached","set","result","resolve","dangerous","resolved","_resolve","push","isVariableDeclarator","constant","ret","isTypeCastExpression","targetKey","toComputedKey","targetName","isObjectExpression","props","prop","isProperty","match","isArrayExpression","isNaN","elems","elem","isConstantExpression","isRegExpLiteral","isTemplateLiteral","every","expression","isUnaryExpression","operator","isBinaryExpression","isInStrictMode","strictParent","sourceType","isClass","body","directive","directives"],"sources":["../../src/path/introspection.ts"],"sourcesContent":["// This file contains methods responsible for introspecting the current path for certain values.\n\nimport type NodePath from \"./index.ts\";\nimport {\n STATEMENT_OR_BLOCK_KEYS,\n VISITOR_KEYS,\n isBlockStatement,\n isExpression,\n isIdentifier,\n isLiteral,\n isStringLiteral,\n isType,\n matchesPattern as _matchesPattern,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\n\n/**\n * Match the current node if it matches the provided `pattern`.\n *\n * For example, given the match `React.createClass` it would match the\n * parsed nodes of `React.createClass` and `React[\"createClass\"]`.\n */\n\nexport function matchesPattern(\n this: NodePath,\n pattern: string,\n allowPartial?: boolean,\n): boolean {\n return _matchesPattern(this.node, pattern, allowPartial);\n}\n\n/**\n * Check whether we have the input `key`. If the `key` references an array then we check\n * if the array has any items, otherwise we just check if it's falsy.\n */\n\nexport function has<N extends t.Node>(\n this: NodePath<N>,\n key: keyof N,\n): boolean {\n const val = this.node && this.node[key];\n if (val && Array.isArray(val)) {\n return !!val.length;\n } else {\n return !!val;\n }\n}\n\n/**\n * Description\n */\n\nexport function isStatic(this: NodePath): boolean {\n return this.scope.isStatic(this.node);\n}\n\n/**\n * Alias of `has`.\n */\n\nexport const is = has;\n\n/**\n * Opposite of `has`.\n */\n\nexport function isnt<N extends t.Node>(\n this: NodePath<N>,\n key: keyof N,\n): boolean {\n return !this.has(key);\n}\n\n/**\n * Check whether the path node `key` strict equals `value`.\n */\n\nexport function equals<N extends t.Node>(\n this: NodePath<N>,\n key: keyof N,\n value: any,\n): boolean {\n return this.node[key] === value;\n}\n\n/**\n * Check the type against our stored internal type of the node. This is handy when a node has\n * been removed yet we still internally know the type and need it to calculate node replacement.\n */\n\nexport function isNodeType(this: NodePath, type: string): boolean {\n return isType(this.type, type);\n}\n\n/**\n * This checks whether or not we're in one of the following positions:\n *\n * for (KEY in right);\n * for (KEY;;);\n *\n * This is because these spots allow VariableDeclarations AND normal expressions so we need\n * to tell the path replacement that it's ok to replace this with an expression.\n */\n\nexport function canHaveVariableDeclarationOrExpression(this: NodePath) {\n return (\n (this.key === \"init\" || this.key === \"left\") && this.parentPath.isFor()\n );\n}\n\n/**\n * This checks whether we are swapping an arrow function's body between an\n * expression and a block statement (or vice versa).\n *\n * This is because arrow functions may implicitly return an expression, which\n * is the same as containing a block statement.\n */\n\nexport function canSwapBetweenExpressionAndStatement(\n this: NodePath,\n replacement: t.Node,\n): boolean {\n if (this.key !== \"body\" || !this.parentPath.isArrowFunctionExpression()) {\n return false;\n }\n\n if (this.isExpression()) {\n return isBlockStatement(replacement);\n } else if (this.isBlockStatement()) {\n return isExpression(replacement);\n }\n\n return false;\n}\n\n/**\n * Check whether the current path references a completion record\n */\n\nexport function isCompletionRecord(\n this: NodePath,\n allowInsideFunction?: boolean,\n): boolean {\n let path = this;\n let first = true;\n\n do {\n const { type, container } = path;\n\n // we're in a function so can't be a completion record\n if (!first && (path.isFunction() || type === \"StaticBlock\")) {\n return !!allowInsideFunction;\n }\n\n first = false;\n\n // check to see if we're the last item in the container and if we are\n // we're a completion record!\n if (Array.isArray(container) && path.key !== container.length - 1) {\n return false;\n }\n } while (\n (path = path.parentPath) &&\n !path.isProgram() &&\n !path.isDoExpression()\n );\n\n return true;\n}\n\n/**\n * Check whether or not the current `key` allows either a single statement or block statement\n * so we can explode it if necessary.\n */\n\nexport function isStatementOrBlock(this: NodePath): boolean {\n if (\n this.parentPath.isLabeledStatement() ||\n isBlockStatement(this.container as t.Node)\n ) {\n return false;\n } else {\n return STATEMENT_OR_BLOCK_KEYS.includes(this.key as string);\n }\n}\n\n/**\n * Check if the currently assigned path references the `importName` of `moduleSource`.\n */\n\nexport function referencesImport(\n this: NodePath,\n moduleSource: string,\n importName: string,\n): boolean {\n if (!this.isReferencedIdentifier()) {\n if (\n (this.isJSXMemberExpression() &&\n this.node.property.name === importName) ||\n ((this.isMemberExpression() || this.isOptionalMemberExpression()) &&\n (this.node.computed\n ? isStringLiteral(this.node.property, { value: importName })\n : (this.node.property as t.Identifier).name === importName))\n ) {\n const object = (\n this as NodePath<t.MemberExpression | t.OptionalMemberExpression>\n ).get(\"object\");\n return (\n object.isReferencedIdentifier() &&\n object.referencesImport(moduleSource, \"*\")\n );\n }\n\n return false;\n }\n\n const binding = this.scope.getBinding((this.node as t.Identifier).name);\n if (!binding || binding.kind !== \"module\") return false;\n\n const path = binding.path;\n const parent = path.parentPath;\n if (!parent.isImportDeclaration()) return false;\n\n // check moduleSource\n if (parent.node.source.value === moduleSource) {\n if (!importName) return true;\n } else {\n return false;\n }\n\n if (path.isImportDefaultSpecifier() && importName === \"default\") {\n return true;\n }\n\n if (path.isImportNamespaceSpecifier() && importName === \"*\") {\n return true;\n }\n\n if (\n path.isImportSpecifier() &&\n isIdentifier(path.node.imported, { name: importName })\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Get the source code associated with this node.\n */\n\nexport function getSource(this: NodePath): string {\n const node = this.node;\n if (node.end) {\n const code = this.hub.getCode();\n if (code) return code.slice(node.start, node.end);\n }\n return \"\";\n}\n\nexport function willIMaybeExecuteBefore(\n this: NodePath,\n target: NodePath,\n): boolean {\n return this._guessExecutionStatusRelativeTo(target) !== \"after\";\n}\n\nfunction getOuterFunction(path: NodePath) {\n return path.isProgram()\n ? path\n : (\n path.parentPath.scope.getFunctionParent() ||\n path.parentPath.scope.getProgramParent()\n ).path;\n}\n\nfunction isExecutionUncertain(type: t.Node[\"type\"], key: string) {\n switch (type) {\n // a && FOO\n // a || FOO\n case \"LogicalExpression\":\n return key === \"right\";\n\n // a ? FOO : FOO\n // if (a) FOO; else FOO;\n case \"ConditionalExpression\":\n case \"IfStatement\":\n return key === \"consequent\" || key === \"alternate\";\n\n // while (a) FOO;\n case \"WhileStatement\":\n case \"DoWhileStatement\":\n case \"ForInStatement\":\n case \"ForOfStatement\":\n return key === \"body\";\n\n // for (a; b; FOO) FOO;\n case \"ForStatement\":\n return key === \"body\" || key === \"update\";\n\n // switch (a) { FOO }\n case \"SwitchStatement\":\n return key === \"cases\";\n\n // try { a } catch FOO finally { b }\n case \"TryStatement\":\n return key === \"handler\";\n\n // var [ x = FOO ]\n case \"AssignmentPattern\":\n return key === \"right\";\n\n // a?.[FOO]\n case \"OptionalMemberExpression\":\n return key === \"property\";\n\n // a?.(FOO)\n case \"OptionalCallExpression\":\n return key === \"arguments\";\n\n default:\n return false;\n }\n}\n\nfunction isExecutionUncertainInList(paths: NodePath[], maxIndex: number) {\n for (let i = 0; i < maxIndex; i++) {\n const path = paths[i];\n if (isExecutionUncertain(path.parent.type, path.parentKey)) {\n return true;\n }\n }\n return false;\n}\n\n// TODO(Babel 8)\n// This can be { before: boolean, after: boolean, unknown: boolean }.\n// This allows transforms like the tdz one to treat cases when the status\n// is both before and unknown/after like if it were before.\ntype RelativeExecutionStatus = \"before\" | \"after\" | \"unknown\";\n\n// Used to avoid infinite recursion in cases like\n// function f() { if (false) f(); }\n// f();\n// It also works with indirect recursion.\nconst SYMBOL_CHECKING = Symbol();\n\ntype ExecutionStatusCache = Map<\n t.Node,\n Map<t.Node, RelativeExecutionStatus | typeof SYMBOL_CHECKING>\n>;\n\n/**\n * Given a `target` check the execution status of it relative to the current path.\n *\n * \"Execution status\" simply refers to where or not we **think** this will execute\n * before or after the input `target` element.\n */\n\nexport function _guessExecutionStatusRelativeTo(\n this: NodePath,\n target: NodePath,\n): RelativeExecutionStatus {\n return _guessExecutionStatusRelativeToCached(this, target, new Map());\n}\n\nfunction _guessExecutionStatusRelativeToCached(\n base: NodePath,\n target: NodePath,\n cache: ExecutionStatusCache,\n): RelativeExecutionStatus {\n // check if the two paths are in different functions, we can't track execution of these\n const funcParent = {\n this: getOuterFunction(base),\n target: getOuterFunction(target),\n };\n\n // here we check the `node` equality as sometimes we may have different paths for the\n // same node due to path thrashing\n if (funcParent.target.node !== funcParent.this.node) {\n return _guessExecutionStatusRelativeToDifferentFunctionsCached(\n base,\n funcParent.target,\n cache,\n );\n }\n\n const paths = {\n target: target.getAncestry(),\n this: base.getAncestry(),\n };\n\n // If this is an ancestor of the target path,\n // e.g. f(g); where this is f and target is g.\n if (paths.target.indexOf(base) >= 0) return \"after\";\n if (paths.this.indexOf(target) >= 0) return \"before\";\n\n // get ancestor where the branches intersect\n let commonPath;\n const commonIndex = { target: 0, this: 0 };\n\n while (!commonPath && commonIndex.this < paths.this.length) {\n const path = paths.this[commonIndex.this];\n commonIndex.target = paths.target.indexOf(path);\n if (commonIndex.target >= 0) {\n commonPath = path;\n } else {\n commonIndex.this++;\n }\n }\n\n if (!commonPath) {\n throw new Error(\n \"Internal Babel error - The two compared nodes\" +\n \" don't appear to belong to the same program.\",\n );\n }\n\n if (\n isExecutionUncertainInList(paths.this, commonIndex.this - 1) ||\n isExecutionUncertainInList(paths.target, commonIndex.target - 1)\n ) {\n return \"unknown\";\n }\n\n const divergence = {\n this: paths.this[commonIndex.this - 1],\n target: paths.target[commonIndex.target - 1],\n };\n\n // container list so let's see which one is after the other\n // e.g. [ THIS, TARGET ]\n if (\n divergence.target.listKey &&\n divergence.this.listKey &&\n divergence.target.container === divergence.this.container\n ) {\n return divergence.target.key > divergence.this.key ? \"before\" : \"after\";\n }\n\n // otherwise we're associated by a parent node, check which key comes before the other\n const keys = VISITOR_KEYS[commonPath.type];\n const keyPosition = {\n this: keys.indexOf(divergence.this.parentKey),\n target: keys.indexOf(divergence.target.parentKey),\n };\n return keyPosition.target > keyPosition.this ? \"before\" : \"after\";\n}\n\nfunction _guessExecutionStatusRelativeToDifferentFunctionsInternal(\n base: NodePath,\n target: NodePath,\n cache: ExecutionStatusCache,\n): RelativeExecutionStatus {\n if (!target.isFunctionDeclaration()) {\n if (\n _guessExecutionStatusRelativeToCached(base, target, cache) === \"before\"\n ) {\n return \"before\";\n }\n return \"unknown\";\n } else if (target.parentPath.isExportDeclaration()) {\n return \"unknown\";\n }\n\n // so we're in a completely different function, if this is a function declaration\n // then we can be a bit smarter and handle cases where the function is either\n // a. not called at all (part of an export)\n // b. called directly\n const binding = target.scope.getBinding(target.node.id.name);\n\n // no references!\n if (!binding.references) return \"before\";\n\n const referencePaths: Array<NodePath> = binding.referencePaths;\n\n let allStatus;\n\n // verify that all the calls have the same execution status\n for (const path of referencePaths) {\n // if a reference is a child of the function we're checking against then we can\n // safely ignore it\n const childOfFunction = !!path.find(path => path.node === target.node);\n if (childOfFunction) continue;\n\n if (path.key !== \"callee\" || !path.parentPath.isCallExpression()) {\n // This function is passed as a reference, so we don't\n // know when it will be called.\n return \"unknown\";\n }\n\n const status = _guessExecutionStatusRelativeToCached(base, path, cache);\n\n if (allStatus && allStatus !== status) {\n return \"unknown\";\n } else {\n allStatus = status;\n }\n }\n\n return allStatus;\n}\n\nfunction _guessExecutionStatusRelativeToDifferentFunctionsCached(\n base: NodePath,\n target: NodePath,\n cache: ExecutionStatusCache,\n): RelativeExecutionStatus {\n let nodeMap = cache.get(base.node);\n let cached;\n\n if (!nodeMap) {\n cache.set(base.node, (nodeMap = new Map()));\n } else if ((cached = nodeMap.get(target.node))) {\n if (cached === SYMBOL_CHECKING) {\n return \"unknown\";\n }\n return cached;\n }\n\n nodeMap.set(target.node, SYMBOL_CHECKING);\n\n const result = _guessExecutionStatusRelativeToDifferentFunctionsInternal(\n base,\n target,\n cache,\n );\n\n nodeMap.set(target.node, result);\n return result;\n}\n\n/**\n * Resolve a \"pointer\" `NodePath` to it's absolute path.\n */\nexport function resolve(\n this: NodePath,\n dangerous?: boolean,\n resolved?: NodePath[],\n) {\n return this._resolve(dangerous, resolved) || this;\n}\n\nexport function _resolve(\n this: NodePath,\n dangerous?: boolean,\n resolved?: NodePath[],\n): NodePath | undefined | null {\n // detect infinite recursion\n // todo: possibly have a max length on this just to be safe\n if (resolved && resolved.indexOf(this) >= 0) return;\n\n // we store all the paths we've \"resolved\" in this array to prevent infinite recursion\n resolved = resolved || [];\n resolved.push(this);\n\n if (this.isVariableDeclarator()) {\n if (this.get(\"id\").isIdentifier()) {\n return this.get(\"init\").resolve(dangerous, resolved);\n } else {\n // otherwise it's a request for a pattern and that's a bit more tricky\n }\n } else if (this.isReferencedIdentifier()) {\n const binding = this.scope.getBinding(this.node.name);\n if (!binding) return;\n\n // reassigned so we can't really resolve it\n if (!binding.constant) return;\n\n // todo - lookup module in dependency graph\n if (binding.kind === \"module\") return;\n\n if (binding.path !== this) {\n const ret = binding.path.resolve(dangerous, resolved);\n // If the identifier resolves to parent node then we can't really resolve it.\n if (this.find(parent => parent.node === ret.node)) return;\n return ret;\n }\n } else if (this.isTypeCastExpression()) {\n // @ ts-ignore todo: babel-types\n return this.get(\"expression\").resolve(dangerous, resolved);\n } else if (dangerous && this.isMemberExpression()) {\n // this is dangerous, as non-direct target assignments will mutate it's state\n // making this resolution inaccurate\n\n const targetKey = this.toComputedKey();\n if (!isLiteral(targetKey)) return;\n\n // @ts-expect-error todo(flow->ts): NullLiteral\n const targetName = targetKey.value;\n\n const target = this.get(\"object\").resolve(dangerous, resolved);\n\n if (target.isObjectExpression()) {\n const props = target.get(\"properties\");\n for (const prop of props as any[]) {\n if (!prop.isProperty()) continue;\n\n const key = prop.get(\"key\");\n\n // { foo: obj }\n let match =\n prop.isnt(\"computed\") && key.isIdentifier({ name: targetName });\n\n // { \"foo\": \"obj\" } or { [\"foo\"]: \"obj\" }\n match = match || key.isLiteral({ value: targetName });\n\n if (match) return prop.get(\"value\").resolve(dangerous, resolved);\n }\n } else if (target.isArrayExpression() && !isNaN(+targetName)) {\n const elems = target.get(\"elements\");\n const elem = elems[targetName];\n if (elem) return elem.resolve(dangerous, resolved);\n }\n }\n}\n\nexport function isConstantExpression(this: NodePath): boolean {\n if (this.isIdentifier()) {\n const binding = this.scope.getBinding(this.node.name);\n if (!binding) return false;\n return binding.constant;\n }\n\n if (this.isLiteral()) {\n if (this.isRegExpLiteral()) {\n return false;\n }\n\n if (this.isTemplateLiteral()) {\n return this.get(\"expressions\").every(expression =>\n expression.isConstantExpression(),\n );\n }\n\n return true;\n }\n\n if (this.isUnaryExpression()) {\n if (this.node.operator !== \"void\") {\n return false;\n }\n\n return this.get(\"argument\").isConstantExpression();\n }\n\n if (this.isBinaryExpression()) {\n const { operator } = this.node;\n return (\n operator !== \"in\" &&\n operator !== \"instanceof\" &&\n this.get(\"left\").isConstantExpression() &&\n this.get(\"right\").isConstantExpression()\n );\n }\n\n return false;\n}\n\nexport function isInStrictMode(this: NodePath) {\n const start = this.isProgram() ? this : this.parentPath;\n\n const strictParent = start.find(path => {\n if (path.isProgram({ sourceType: \"module\" })) return true;\n\n if (path.isClass()) return true;\n\n if (\n path.isArrowFunctionExpression() &&\n !path.get(\"body\").isBlockStatement()\n ) {\n return false;\n }\n\n let body: t.BlockStatement | t.Program;\n if (path.isFunction()) {\n body = path.node.body as t.BlockStatement;\n } else if (path.isProgram()) {\n body = path.node;\n } else {\n return false;\n }\n\n for (const directive of body.directives) {\n if (directive.value.value === \"use strict\") {\n return true;\n }\n }\n });\n\n return !!strictParent;\n}\n"],"mappings":"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"}