@babel/traverse 7.17.9 → 7.23.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +1 -1
  2. package/lib/cache.js +27 -7
  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 +17 -33
  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 +26 -90
  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 +54 -105
  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 -4
  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 -206
  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 +17 -72
  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 +115 -245
  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 +59 -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
@@ -17,11 +17,8 @@ exports.getOuterBindingIdentifierPaths = getOuterBindingIdentifierPaths;
17
17
  exports.getOuterBindingIdentifiers = getOuterBindingIdentifiers;
18
18
  exports.getPrevSibling = getPrevSibling;
19
19
  exports.getSibling = getSibling;
20
-
21
- var _index = require("./index");
22
-
20
+ var _index = require("./index.js");
23
21
  var _t = require("@babel/types");
24
-
25
22
  const {
26
23
  getBindingIdentifiers: _getBindingIdentifiers,
27
24
  getOuterBindingIdentifiers: _getOuterBindingIdentifiers,
@@ -31,77 +28,60 @@ const {
31
28
  } = _t;
32
29
  const NORMAL_COMPLETION = 0;
33
30
  const BREAK_COMPLETION = 1;
34
-
35
31
  function NormalCompletion(path) {
36
32
  return {
37
33
  type: NORMAL_COMPLETION,
38
34
  path
39
35
  };
40
36
  }
41
-
42
37
  function BreakCompletion(path) {
43
38
  return {
44
39
  type: BREAK_COMPLETION,
45
40
  path
46
41
  };
47
42
  }
48
-
49
43
  function getOpposite() {
50
44
  if (this.key === "left") {
51
45
  return this.getSibling("right");
52
46
  } else if (this.key === "right") {
53
47
  return this.getSibling("left");
54
48
  }
55
-
56
49
  return null;
57
50
  }
58
-
59
51
  function addCompletionRecords(path, records, context) {
60
52
  if (path) {
61
53
  records.push(..._getCompletionRecords(path, context));
62
54
  }
63
-
64
55
  return records;
65
56
  }
66
-
67
57
  function completionRecordForSwitch(cases, records, context) {
68
58
  let lastNormalCompletions = [];
69
-
70
59
  for (let i = 0; i < cases.length; i++) {
71
60
  const casePath = cases[i];
72
-
73
61
  const caseCompletions = _getCompletionRecords(casePath, context);
74
-
75
62
  const normalCompletions = [];
76
63
  const breakCompletions = [];
77
-
78
64
  for (const c of caseCompletions) {
79
65
  if (c.type === NORMAL_COMPLETION) {
80
66
  normalCompletions.push(c);
81
67
  }
82
-
83
68
  if (c.type === BREAK_COMPLETION) {
84
69
  breakCompletions.push(c);
85
70
  }
86
71
  }
87
-
88
72
  if (normalCompletions.length) {
89
73
  lastNormalCompletions = normalCompletions;
90
74
  }
91
-
92
75
  records.push(...breakCompletions);
93
76
  }
94
-
95
77
  records.push(...lastNormalCompletions);
96
78
  return records;
97
79
  }
98
-
99
80
  function normalCompletionToBreak(completions) {
100
81
  completions.forEach(c => {
101
82
  c.type = BREAK_COMPLETION;
102
83
  });
103
84
  }
104
-
105
85
  function replaceBreakStatementInBreakCompletion(completions, reachable) {
106
86
  completions.forEach(c => {
107
87
  if (c.path.isBreakStatement({
@@ -115,63 +95,49 @@ function replaceBreakStatementInBreakCompletion(completions, reachable) {
115
95
  }
116
96
  });
117
97
  }
118
-
119
98
  function getStatementListCompletion(paths, context) {
120
99
  const completions = [];
121
-
122
100
  if (context.canHaveBreak) {
123
101
  let lastNormalCompletions = [];
124
-
125
102
  for (let i = 0; i < paths.length; i++) {
126
103
  const path = paths[i];
127
104
  const newContext = Object.assign({}, context, {
128
105
  inCaseClause: false
129
106
  });
130
-
131
107
  if (path.isBlockStatement() && (context.inCaseClause || context.shouldPopulateBreak)) {
132
108
  newContext.shouldPopulateBreak = true;
133
109
  } else {
134
110
  newContext.shouldPopulateBreak = false;
135
111
  }
136
-
137
112
  const statementCompletions = _getCompletionRecords(path, newContext);
138
-
139
113
  if (statementCompletions.length > 0 && statementCompletions.every(c => c.type === BREAK_COMPLETION)) {
140
114
  if (lastNormalCompletions.length > 0 && statementCompletions.every(c => c.path.isBreakStatement({
141
115
  label: null
142
116
  }))) {
143
117
  normalCompletionToBreak(lastNormalCompletions);
144
118
  completions.push(...lastNormalCompletions);
145
-
146
119
  if (lastNormalCompletions.some(c => c.path.isDeclaration())) {
147
120
  completions.push(...statementCompletions);
148
121
  replaceBreakStatementInBreakCompletion(statementCompletions, true);
149
122
  }
150
-
151
123
  replaceBreakStatementInBreakCompletion(statementCompletions, false);
152
124
  } else {
153
125
  completions.push(...statementCompletions);
154
-
155
126
  if (!context.shouldPopulateBreak) {
156
127
  replaceBreakStatementInBreakCompletion(statementCompletions, true);
157
128
  }
158
129
  }
159
-
160
130
  break;
161
131
  }
162
-
163
132
  if (i === paths.length - 1) {
164
133
  completions.push(...statementCompletions);
165
134
  } else {
166
135
  lastNormalCompletions = [];
167
-
168
136
  for (let i = 0; i < statementCompletions.length; i++) {
169
137
  const c = statementCompletions[i];
170
-
171
138
  if (c.type === BREAK_COMPLETION) {
172
139
  completions.push(c);
173
140
  }
174
-
175
141
  if (c.type === NORMAL_COMPLETION) {
176
142
  lastNormalCompletions.push(c);
177
143
  }
@@ -181,20 +147,16 @@ function getStatementListCompletion(paths, context) {
181
147
  } else if (paths.length) {
182
148
  for (let i = paths.length - 1; i >= 0; i--) {
183
149
  const pathCompletions = _getCompletionRecords(paths[i], context);
184
-
185
150
  if (pathCompletions.length > 1 || pathCompletions.length === 1 && !pathCompletions[0].path.isVariableDeclaration()) {
186
151
  completions.push(...pathCompletions);
187
152
  break;
188
153
  }
189
154
  }
190
155
  }
191
-
192
156
  return completions;
193
157
  }
194
-
195
158
  function _getCompletionRecords(path, context) {
196
159
  let records = [];
197
-
198
160
  if (path.isIfStatement()) {
199
161
  records = addCompletionRecords(path.get("consequent"), records, context);
200
162
  records = addCompletionRecords(path.get("alternate"), records, context);
@@ -222,20 +184,16 @@ function _getCompletionRecords(path, context) {
222
184
  } else {
223
185
  records.push(NormalCompletion(path));
224
186
  }
225
-
226
187
  return records;
227
188
  }
228
-
229
189
  function getCompletionRecords() {
230
190
  const records = _getCompletionRecords(this, {
231
191
  canHaveBreak: false,
232
192
  shouldPopulateBreak: false,
233
193
  inCaseClause: false
234
194
  });
235
-
236
195
  return records.map(r => r.path);
237
196
  }
238
-
239
197
  function getSibling(key) {
240
198
  return _index.default.get({
241
199
  parentPath: this.parentPath,
@@ -245,56 +203,44 @@ function getSibling(key) {
245
203
  key: key
246
204
  }).setContext(this.context);
247
205
  }
248
-
249
206
  function getPrevSibling() {
250
207
  return this.getSibling(this.key - 1);
251
208
  }
252
-
253
209
  function getNextSibling() {
254
210
  return this.getSibling(this.key + 1);
255
211
  }
256
-
257
212
  function getAllNextSiblings() {
258
213
  let _key = this.key;
259
214
  let sibling = this.getSibling(++_key);
260
215
  const siblings = [];
261
-
262
216
  while (sibling.node) {
263
217
  siblings.push(sibling);
264
218
  sibling = this.getSibling(++_key);
265
219
  }
266
-
267
220
  return siblings;
268
221
  }
269
-
270
222
  function getAllPrevSiblings() {
271
223
  let _key = this.key;
272
224
  let sibling = this.getSibling(--_key);
273
225
  const siblings = [];
274
-
275
226
  while (sibling.node) {
276
227
  siblings.push(sibling);
277
228
  sibling = this.getSibling(--_key);
278
229
  }
279
-
280
230
  return siblings;
281
231
  }
282
-
283
232
  function get(key, context = true) {
284
233
  if (context === true) context = this.context;
285
234
  const parts = key.split(".");
286
-
287
235
  if (parts.length === 1) {
288
236
  return this._getKey(key, context);
289
237
  } else {
290
238
  return this._getPattern(parts, context);
291
239
  }
292
240
  }
293
-
294
241
  function _getKey(key, context) {
295
242
  const node = this.node;
296
243
  const container = node[key];
297
-
298
244
  if (Array.isArray(container)) {
299
245
  return container.map((_, i) => {
300
246
  return _index.default.get({
@@ -314,10 +260,8 @@ function _getKey(key, context) {
314
260
  }).setContext(context);
315
261
  }
316
262
  }
317
-
318
263
  function _getPattern(parts, context) {
319
264
  let path = this;
320
-
321
265
  for (const part of parts) {
322
266
  if (part === ".") {
323
267
  path = path.parentPath;
@@ -329,67 +273,52 @@ function _getPattern(parts, context) {
329
273
  }
330
274
  }
331
275
  }
332
-
333
276
  return path;
334
277
  }
335
-
336
278
  function getBindingIdentifiers(duplicates) {
337
279
  return _getBindingIdentifiers(this.node, duplicates);
338
280
  }
339
-
340
281
  function getOuterBindingIdentifiers(duplicates) {
341
282
  return _getOuterBindingIdentifiers(this.node, duplicates);
342
283
  }
343
-
344
284
  function getBindingIdentifierPaths(duplicates = false, outerOnly = false) {
345
285
  const path = this;
346
286
  const search = [path];
347
287
  const ids = Object.create(null);
348
-
349
288
  while (search.length) {
350
289
  const id = search.shift();
351
290
  if (!id) continue;
352
291
  if (!id.node) continue;
353
292
  const keys = _getBindingIdentifiers.keys[id.node.type];
354
-
355
293
  if (id.isIdentifier()) {
356
294
  if (duplicates) {
357
295
  const _ids = ids[id.node.name] = ids[id.node.name] || [];
358
-
359
296
  _ids.push(id);
360
297
  } else {
361
298
  ids[id.node.name] = id;
362
299
  }
363
-
364
300
  continue;
365
301
  }
366
-
367
302
  if (id.isExportDeclaration()) {
368
303
  const declaration = id.get("declaration");
369
-
370
304
  if (isDeclaration(declaration)) {
371
305
  search.push(declaration);
372
306
  }
373
-
374
307
  continue;
375
308
  }
376
-
377
309
  if (outerOnly) {
378
310
  if (id.isFunctionDeclaration()) {
379
311
  search.push(id.get("id"));
380
312
  continue;
381
313
  }
382
-
383
314
  if (id.isFunctionExpression()) {
384
315
  continue;
385
316
  }
386
317
  }
387
-
388
318
  if (keys) {
389
319
  for (let i = 0; i < keys.length; i++) {
390
320
  const key = keys[i];
391
321
  const child = id.get(key);
392
-
393
322
  if (Array.isArray(child)) {
394
323
  search.push(...child);
395
324
  } else if (child.node) {
@@ -398,10 +327,10 @@ function getBindingIdentifierPaths(duplicates = false, outerOnly = false) {
398
327
  }
399
328
  }
400
329
  }
401
-
402
330
  return ids;
403
331
  }
404
-
405
- function getOuterBindingIdentifierPaths(duplicates) {
332
+ function getOuterBindingIdentifierPaths(duplicates = false) {
406
333
  return this.getBindingIdentifierPaths(duplicates, true);
407
- }
334
+ }
335
+
336
+ //# sourceMappingURL=family.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_index","require","_t","getBindingIdentifiers","_getBindingIdentifiers","getOuterBindingIdentifiers","_getOuterBindingIdentifiers","isDeclaration","numericLiteral","unaryExpression","NORMAL_COMPLETION","BREAK_COMPLETION","NormalCompletion","path","type","BreakCompletion","getOpposite","key","getSibling","addCompletionRecords","records","context","push","_getCompletionRecords","completionRecordForSwitch","cases","lastNormalCompletions","i","length","casePath","caseCompletions","normalCompletions","breakCompletions","c","normalCompletionToBreak","completions","forEach","replaceBreakStatementInBreakCompletion","reachable","isBreakStatement","label","replaceWith","remove","getStatementListCompletion","paths","canHaveBreak","newContext","Object","assign","inCaseClause","isBlockStatement","shouldPopulateBreak","statementCompletions","every","some","pathCompletions","isVariableDeclaration","isIfStatement","get","isDoExpression","isFor","isWhile","isLabeledStatement","isProgram","isFunction","isTryStatement","isCatchClause","isSwitchStatement","isSwitchCase","getCompletionRecords","map","r","NodePath","parentPath","parent","container","listKey","setContext","getPrevSibling","getNextSibling","getAllNextSiblings","_key","sibling","siblings","node","getAllPrevSiblings","parts","split","_getKey","_getPattern","Array","isArray","_","part","duplicates","getBindingIdentifierPaths","outerOnly","search","ids","create","id","shift","keys","isIdentifier","_ids","name","isExportDeclaration","declaration","isFunctionDeclaration","isFunctionExpression","child","getOuterBindingIdentifierPaths"],"sources":["../../src/path/family.ts"],"sourcesContent":["// This file contains methods responsible for dealing with/retrieving children or siblings.\n\nimport type TraversalContext from \"../context.ts\";\nimport NodePath from \"./index.ts\";\nimport {\n getBindingIdentifiers as _getBindingIdentifiers,\n getOuterBindingIdentifiers as _getOuterBindingIdentifiers,\n isDeclaration,\n numericLiteral,\n unaryExpression,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\n\nconst NORMAL_COMPLETION = 0 as const;\nconst BREAK_COMPLETION = 1 as const;\n\ntype Completion = {\n path: NodePath;\n type: 0 | 1;\n};\n\ntype CompletionContext = {\n // whether the current context allows `break` statement. When it allows, we have\n // to search all the statements for potential `break`\n canHaveBreak: boolean;\n // whether the statement is an immediate descendant of a switch case clause\n inCaseClause: boolean;\n // whether the `break` statement record should be populated to upper level\n // when a `break` statement is an immediate descendant of a block statement, e.g.\n // `{ break }`, it can influence the control flow in the upper levels.\n shouldPopulateBreak: boolean;\n};\n\nfunction NormalCompletion(path: NodePath) {\n return { type: NORMAL_COMPLETION, path };\n}\n\nfunction BreakCompletion(path: NodePath) {\n return { type: BREAK_COMPLETION, path };\n}\n\nexport function getOpposite(this: NodePath): NodePath | null {\n if (this.key === \"left\") {\n return this.getSibling(\"right\");\n } else if (this.key === \"right\") {\n return this.getSibling(\"left\");\n }\n return null;\n}\n\nfunction addCompletionRecords(\n path: NodePath | null | undefined,\n records: Completion[],\n context: CompletionContext,\n): Completion[] {\n if (path) {\n records.push(..._getCompletionRecords(path, context));\n }\n return records;\n}\n\nfunction completionRecordForSwitch(\n cases: NodePath<t.SwitchCase>[],\n records: Completion[],\n context: CompletionContext,\n): Completion[] {\n // https://tc39.es/ecma262/#sec-runtime-semantics-caseblockevaluation\n let lastNormalCompletions: Completion[] = [];\n for (let i = 0; i < cases.length; i++) {\n const casePath = cases[i];\n const caseCompletions = _getCompletionRecords(casePath, context);\n const normalCompletions = [];\n const breakCompletions = [];\n for (const c of caseCompletions) {\n if (c.type === NORMAL_COMPLETION) {\n normalCompletions.push(c);\n }\n if (c.type === BREAK_COMPLETION) {\n breakCompletions.push(c);\n }\n }\n if (normalCompletions.length) {\n lastNormalCompletions = normalCompletions;\n }\n records.push(...breakCompletions);\n }\n records.push(...lastNormalCompletions);\n return records;\n}\n\nfunction normalCompletionToBreak(completions: Completion[]) {\n completions.forEach(c => {\n c.type = BREAK_COMPLETION;\n });\n}\n\n/**\n * Determine how we should handle the break statement for break completions\n *\n * @param {Completion[]} completions\n * @param {boolean} reachable Whether the break statement is reachable after\n we mark the normal completions _before_ the given break completions as the final\n completions. For example,\n `{ 0 }; break;` is transformed to `{ return 0 }; break;`, the `break` here is unreachable\n and thus can be removed without consequences. We may in the future reserve them instead since\n we do not consistently remove unreachable statements _after_ break\n `{ var x = 0 }; break;` is transformed to `{ var x = 0 }; return void 0;`, the `break` is reachable\n because we can not wrap variable declaration under a return statement\n */\nfunction replaceBreakStatementInBreakCompletion(\n completions: Completion[],\n reachable: boolean,\n) {\n completions.forEach(c => {\n if (c.path.isBreakStatement({ label: null })) {\n if (reachable) {\n c.path.replaceWith(unaryExpression(\"void\", numericLiteral(0)));\n } else {\n c.path.remove();\n }\n }\n });\n}\n\nfunction getStatementListCompletion(\n paths: NodePath[],\n context: CompletionContext,\n): Completion[] {\n const completions = [];\n if (context.canHaveBreak) {\n let lastNormalCompletions = [];\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i];\n const newContext = { ...context, inCaseClause: false };\n if (\n path.isBlockStatement() &&\n (context.inCaseClause || // case test: { break }\n context.shouldPopulateBreak) // case test: { { break } }\n ) {\n newContext.shouldPopulateBreak = true;\n } else {\n newContext.shouldPopulateBreak = false;\n }\n const statementCompletions = _getCompletionRecords(path, newContext);\n if (\n statementCompletions.length > 0 &&\n // we can stop search `paths` when we have seen a `path` that is\n // effectively a `break` statement. Examples are\n // - `break`\n // - `if (true) { 1; break } else { 2; break }`\n // - `{ break }```\n // In other words, the paths after this `path` are unreachable\n statementCompletions.every(c => c.type === BREAK_COMPLETION)\n ) {\n if (\n lastNormalCompletions.length > 0 &&\n statementCompletions.every(c =>\n c.path.isBreakStatement({ label: null }),\n )\n ) {\n // when a break completion has a path as BreakStatement, it must be `{ break }`\n // whose completion value we can not determine, otherwise it would have been\n // replaced by `replaceBreakStatementInBreakCompletion`\n // When we have seen normal completions from the last statement\n // it is safe to stop populating break and mark normal completions as break\n normalCompletionToBreak(lastNormalCompletions);\n completions.push(...lastNormalCompletions);\n // Declarations have empty completion record, however they can not be nested\n // directly in return statement, i.e. `return (var a = 1)` is invalid.\n if (lastNormalCompletions.some(c => c.path.isDeclaration())) {\n completions.push(...statementCompletions);\n replaceBreakStatementInBreakCompletion(\n statementCompletions,\n /* reachable */ true,\n );\n }\n replaceBreakStatementInBreakCompletion(\n statementCompletions,\n /* reachable */ false,\n );\n } else {\n completions.push(...statementCompletions);\n if (!context.shouldPopulateBreak) {\n replaceBreakStatementInBreakCompletion(\n statementCompletions,\n /* reachable */ true,\n );\n }\n }\n break;\n }\n if (i === paths.length - 1) {\n completions.push(...statementCompletions);\n } else {\n lastNormalCompletions = [];\n for (let i = 0; i < statementCompletions.length; i++) {\n const c = statementCompletions[i];\n if (c.type === BREAK_COMPLETION) {\n completions.push(c);\n }\n if (c.type === NORMAL_COMPLETION) {\n lastNormalCompletions.push(c);\n }\n }\n }\n }\n } else if (paths.length) {\n // When we are in a context where `break` must not exist, we can skip linear\n // search on statement lists and assume that the last\n // non-variable-declaration statement determines the completion.\n for (let i = paths.length - 1; i >= 0; i--) {\n const pathCompletions = _getCompletionRecords(paths[i], context);\n if (\n pathCompletions.length > 1 ||\n (pathCompletions.length === 1 &&\n !pathCompletions[0].path.isVariableDeclaration())\n ) {\n completions.push(...pathCompletions);\n break;\n }\n }\n }\n return completions;\n}\n\nfunction _getCompletionRecords(\n path: NodePath,\n context: CompletionContext,\n): Completion[] {\n let records: Completion[] = [];\n if (path.isIfStatement()) {\n records = addCompletionRecords(path.get(\"consequent\"), records, context);\n records = addCompletionRecords(path.get(\"alternate\"), records, context);\n } else if (\n path.isDoExpression() ||\n path.isFor() ||\n path.isWhile() ||\n path.isLabeledStatement()\n ) {\n // @ts-expect-error(flow->ts): todo\n return addCompletionRecords(path.get(\"body\"), records, context);\n } else if (path.isProgram() || path.isBlockStatement()) {\n // @ts-expect-error(flow->ts): todo\n return getStatementListCompletion(path.get(\"body\"), context);\n } else if (path.isFunction()) {\n return _getCompletionRecords(path.get(\"body\"), context);\n } else if (path.isTryStatement()) {\n records = addCompletionRecords(path.get(\"block\"), records, context);\n records = addCompletionRecords(path.get(\"handler\"), records, context);\n } else if (path.isCatchClause()) {\n return addCompletionRecords(path.get(\"body\"), records, context);\n } else if (path.isSwitchStatement()) {\n return completionRecordForSwitch(path.get(\"cases\"), records, context);\n } else if (path.isSwitchCase()) {\n return getStatementListCompletion(path.get(\"consequent\"), {\n canHaveBreak: true,\n shouldPopulateBreak: false,\n inCaseClause: true,\n });\n } else if (path.isBreakStatement()) {\n records.push(BreakCompletion(path));\n } else {\n records.push(NormalCompletion(path));\n }\n\n return records;\n}\n\n/**\n * Retrieve the completion records of a given path.\n * Note: to ensure proper support on `break` statement, this method\n * will manipulate the AST around the break statement. Do not call the method\n * twice for the same path.\n *\n * @export\n * @param {NodePath} this\n * @returns {NodePath[]} Completion records\n */\nexport function getCompletionRecords(this: NodePath): NodePath[] {\n const records = _getCompletionRecords(this, {\n canHaveBreak: false,\n shouldPopulateBreak: false,\n inCaseClause: false,\n });\n return records.map(r => r.path);\n}\n\nexport function getSibling(this: NodePath, key: string | number): NodePath {\n return NodePath.get({\n parentPath: this.parentPath,\n parent: this.parent,\n container: this.container,\n listKey: this.listKey,\n key: key,\n }).setContext(this.context);\n}\n\nexport function getPrevSibling(this: NodePath): NodePath {\n // @ts-expect-error todo(flow->ts) this.key could be a string\n return this.getSibling(this.key - 1);\n}\n\nexport function getNextSibling(this: NodePath): NodePath {\n // @ts-expect-error todo(flow->ts) this.key could be a string\n return this.getSibling(this.key + 1);\n}\n\nexport function getAllNextSiblings(this: NodePath): NodePath[] {\n // @ts-expect-error todo(flow->ts) this.key could be a string\n let _key: number = this.key;\n let sibling = this.getSibling(++_key);\n const siblings = [];\n while (sibling.node) {\n siblings.push(sibling);\n sibling = this.getSibling(++_key);\n }\n return siblings;\n}\n\nexport function getAllPrevSiblings(this: NodePath): NodePath[] {\n // @ts-expect-error todo(flow->ts) this.key could be a string\n let _key: number = this.key;\n let sibling = this.getSibling(--_key);\n const siblings = [];\n while (sibling.node) {\n siblings.push(sibling);\n sibling = this.getSibling(--_key);\n }\n return siblings;\n}\n\n// convert \"1\" to 1 (string index to number index)\ntype MaybeToIndex<T extends string> = T extends `${bigint}` ? number : T;\n\ntype Pattern<Obj extends string, Prop extends string> = `${Obj}.${Prop}`;\n\n// split \"body.body.1\" to [\"body\", \"body\", 1]\ntype Split<P extends string> = P extends Pattern<infer O, infer U>\n ? [MaybeToIndex<O>, ...Split<U>]\n : [MaybeToIndex<P>];\n\n// get all K with Node[K] is t.Node | t.Node[]\ntype NodeKeyOf<Node extends t.Node | t.Node[]> = keyof Pick<\n Node,\n {\n [Key in keyof Node]-?: Node[Key] extends t.Node | t.Node[] ? Key : never;\n }[keyof Node]\n>;\n\n// traverse the Node with tuple path [\"body\", \"body\", 1]\n// Path should be created with Split\ntype Trav<\n Node extends t.Node | t.Node[],\n Path extends unknown[],\n> = Path extends [infer K, ...infer R]\n ? K extends NodeKeyOf<Node>\n ? R extends []\n ? Node[K]\n : // @ts-expect-error ignore since TS is not smart enough\n Trav<Node[K], R>\n : never\n : never;\n\ntype ToNodePath<T> = T extends Array<t.Node | null | undefined>\n ? Array<NodePath<T[number]>>\n : T extends t.Node | null | undefined\n ? NodePath<T>\n : never;\n\nfunction get<T extends t.Node, K extends keyof T>(\n this: NodePath<T>,\n key: K,\n context?: boolean | TraversalContext,\n): T[K] extends Array<t.Node | null | undefined>\n ? Array<NodePath<T[K][number]>>\n : T[K] extends t.Node | null | undefined\n ? NodePath<T[K]>\n : never;\n\nfunction get<T extends t.Node, K extends string>(\n this: NodePath<T>,\n key: K,\n context?: boolean | TraversalContext,\n): ToNodePath<Trav<T, Split<K>>>;\n\nfunction get<T extends t.Node>(\n this: NodePath<T>,\n key: string,\n context?: true | TraversalContext,\n): NodePath | NodePath[];\n\nfunction get<T extends t.Node>(\n this: NodePath<T>,\n key: string,\n context: true | TraversalContext = true,\n): NodePath | NodePath[] {\n if (context === true) context = this.context;\n const parts = key.split(\".\");\n if (parts.length === 1) {\n // \"foo\"\n // @ts-expect-error key may not index T\n return this._getKey(key, context);\n } else {\n // \"foo.bar\"\n return this._getPattern(parts, context);\n }\n}\n\nexport { get };\n\nexport function _getKey<T extends t.Node>(\n this: NodePath<T>,\n key: keyof T & string,\n context?: TraversalContext,\n): NodePath | NodePath[] {\n const node = this.node;\n const container = node[key];\n\n if (Array.isArray(container)) {\n // requested a container so give them all the paths\n return container.map((_, i) => {\n return NodePath.get({\n listKey: key,\n parentPath: this,\n parent: node,\n container: container,\n key: i,\n }).setContext(context);\n });\n } else {\n return NodePath.get({\n parentPath: this,\n parent: node,\n container: node,\n key: key,\n }).setContext(context);\n }\n}\n\nexport function _getPattern(\n this: NodePath,\n parts: string[],\n context?: TraversalContext,\n): NodePath | NodePath[] {\n let path: NodePath | NodePath[] = this;\n for (const part of parts) {\n if (part === \".\") {\n // @ts-expect-error todo(flow-ts): Can path be an array here?\n path = path.parentPath;\n } else {\n if (Array.isArray(path)) {\n // @ts-expect-error part may not index path\n path = path[part];\n } else {\n path = path.get(part, context);\n }\n }\n }\n return path;\n}\n\nfunction getBindingIdentifiers(\n duplicates: true,\n): Record<string, t.Identifier[]>;\nfunction getBindingIdentifiers(\n duplicates?: false,\n): Record<string, t.Identifier>;\nfunction getBindingIdentifiers(\n duplicates: boolean,\n): Record<string, t.Identifier[] | t.Identifier>;\n\nfunction getBindingIdentifiers(\n this: NodePath,\n duplicates?: boolean,\n): Record<string, t.Identifier[] | t.Identifier> {\n return _getBindingIdentifiers(this.node, duplicates);\n}\n\nexport { getBindingIdentifiers };\n\nfunction getOuterBindingIdentifiers(\n duplicates: true,\n): Record<string, t.Identifier[]>;\nfunction getOuterBindingIdentifiers(\n duplicates?: false,\n): Record<string, t.Identifier>;\nfunction getOuterBindingIdentifiers(\n duplicates: boolean,\n): Record<string, t.Identifier[] | t.Identifier>;\n\nfunction getOuterBindingIdentifiers(\n this: NodePath,\n duplicates?: boolean,\n): Record<string, t.Identifier[] | t.Identifier> {\n return _getOuterBindingIdentifiers(this.node, duplicates);\n}\n\nexport { getOuterBindingIdentifiers };\n\nfunction getBindingIdentifierPaths(\n duplicates: true,\n outerOnly?: boolean,\n): Record<string, NodePath<t.Identifier>[]>;\nfunction getBindingIdentifierPaths(\n duplicates: false,\n outerOnly?: boolean,\n): Record<string, NodePath<t.Identifier>>;\nfunction getBindingIdentifierPaths(\n duplicates?: boolean,\n outerOnly?: boolean,\n): Record<string, NodePath<t.Identifier> | NodePath<t.Identifier>[]>;\n\n// original source - https://github.com/babel/babel/blob/main/packages/babel-types/src/retrievers/getBindingIdentifiers.js\n// path.getBindingIdentifiers returns nodes where the following re-implementation returns paths\nfunction getBindingIdentifierPaths(\n this: NodePath,\n duplicates: boolean = false,\n outerOnly: boolean = false,\n): Record<string, NodePath<t.Identifier> | NodePath<t.Identifier>[]> {\n const path = this;\n const search = [path];\n const ids = Object.create(null);\n\n while (search.length) {\n const id = search.shift();\n if (!id) continue;\n if (!id.node) continue;\n\n const keys =\n // @ts-expect-error _getBindingIdentifiers.keys do not cover all node types\n _getBindingIdentifiers.keys[id.node.type];\n\n if (id.isIdentifier()) {\n if (duplicates) {\n const _ids = (ids[id.node.name] = ids[id.node.name] || []);\n _ids.push(id);\n } else {\n ids[id.node.name] = id;\n }\n continue;\n }\n\n if (id.isExportDeclaration()) {\n const declaration = id.get(\"declaration\");\n if (isDeclaration(declaration)) {\n search.push(declaration);\n }\n continue;\n }\n\n if (outerOnly) {\n if (id.isFunctionDeclaration()) {\n search.push(id.get(\"id\"));\n continue;\n }\n if (id.isFunctionExpression()) {\n continue;\n }\n }\n\n if (keys) {\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const child = id.get(key);\n if (Array.isArray(child)) {\n search.push(...child);\n } else if (child.node) {\n search.push(child);\n }\n }\n }\n }\n\n return ids;\n}\n\nexport { getBindingIdentifierPaths };\n\nfunction getOuterBindingIdentifierPaths(\n duplicates: true,\n): Record<string, NodePath<t.Identifier>[]>;\nfunction getOuterBindingIdentifierPaths(\n duplicates?: false,\n): Record<string, NodePath<t.Identifier>>;\nfunction getOuterBindingIdentifierPaths(\n duplicates?: boolean,\n): Record<string, NodePath<t.Identifier> | NodePath<t.Identifier>[]>;\n\nfunction getOuterBindingIdentifierPaths(\n this: NodePath,\n duplicates: boolean = false,\n) {\n return this.getBindingIdentifierPaths(duplicates, true);\n}\n\nexport { getOuterBindingIdentifierPaths };\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAGA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,EAAA,GAAAD,OAAA;AAMsB;EALpBE,qBAAqB,EAAIC,sBAAsB;EAC/CC,0BAA0B,EAAIC,2BAA2B;EACzDC,aAAa;EACbC,cAAc;EACdC;AAAe,IAAAP,EAAA;AAIjB,MAAMQ,iBAAiB,GAAG,CAAU;AACpC,MAAMC,gBAAgB,GAAG,CAAU;AAmBnC,SAASC,gBAAgBA,CAACC,IAAc,EAAE;EACxC,OAAO;IAAEC,IAAI,EAAEJ,iBAAiB;IAAEG;EAAK,CAAC;AAC1C;AAEA,SAASE,eAAeA,CAACF,IAAc,EAAE;EACvC,OAAO;IAAEC,IAAI,EAAEH,gBAAgB;IAAEE;EAAK,CAAC;AACzC;AAEO,SAASG,WAAWA,CAAA,EAAkC;EAC3D,IAAI,IAAI,CAACC,GAAG,KAAK,MAAM,EAAE;IACvB,OAAO,IAAI,CAACC,UAAU,CAAC,OAAO,CAAC;EACjC,CAAC,MAAM,IAAI,IAAI,CAACD,GAAG,KAAK,OAAO,EAAE;IAC/B,OAAO,IAAI,CAACC,UAAU,CAAC,MAAM,CAAC;EAChC;EACA,OAAO,IAAI;AACb;AAEA,SAASC,oBAAoBA,CAC3BN,IAAiC,EACjCO,OAAqB,EACrBC,OAA0B,EACZ;EACd,IAAIR,IAAI,EAAE;IACRO,OAAO,CAACE,IAAI,CAAC,GAAGC,qBAAqB,CAACV,IAAI,EAAEQ,OAAO,CAAC,CAAC;EACvD;EACA,OAAOD,OAAO;AAChB;AAEA,SAASI,yBAAyBA,CAChCC,KAA+B,EAC/BL,OAAqB,EACrBC,OAA0B,EACZ;EAEd,IAAIK,qBAAmC,GAAG,EAAE;EAC5C,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,KAAK,CAACG,MAAM,EAAED,CAAC,EAAE,EAAE;IACrC,MAAME,QAAQ,GAAGJ,KAAK,CAACE,CAAC,CAAC;IACzB,MAAMG,eAAe,GAAGP,qBAAqB,CAACM,QAAQ,EAAER,OAAO,CAAC;IAChE,MAAMU,iBAAiB,GAAG,EAAE;IAC5B,MAAMC,gBAAgB,GAAG,EAAE;IAC3B,KAAK,MAAMC,CAAC,IAAIH,eAAe,EAAE;MAC/B,IAAIG,CAAC,CAACnB,IAAI,KAAKJ,iBAAiB,EAAE;QAChCqB,iBAAiB,CAACT,IAAI,CAACW,CAAC,CAAC;MAC3B;MACA,IAAIA,CAAC,CAACnB,IAAI,KAAKH,gBAAgB,EAAE;QAC/BqB,gBAAgB,CAACV,IAAI,CAACW,CAAC,CAAC;MAC1B;IACF;IACA,IAAIF,iBAAiB,CAACH,MAAM,EAAE;MAC5BF,qBAAqB,GAAGK,iBAAiB;IAC3C;IACAX,OAAO,CAACE,IAAI,CAAC,GAAGU,gBAAgB,CAAC;EACnC;EACAZ,OAAO,CAACE,IAAI,CAAC,GAAGI,qBAAqB,CAAC;EACtC,OAAON,OAAO;AAChB;AAEA,SAASc,uBAAuBA,CAACC,WAAyB,EAAE;EAC1DA,WAAW,CAACC,OAAO,CAACH,CAAC,IAAI;IACvBA,CAAC,CAACnB,IAAI,GAAGH,gBAAgB;EAC3B,CAAC,CAAC;AACJ;AAeA,SAAS0B,sCAAsCA,CAC7CF,WAAyB,EACzBG,SAAkB,EAClB;EACAH,WAAW,CAACC,OAAO,CAACH,CAAC,IAAI;IACvB,IAAIA,CAAC,CAACpB,IAAI,CAAC0B,gBAAgB,CAAC;MAAEC,KAAK,EAAE;IAAK,CAAC,CAAC,EAAE;MAC5C,IAAIF,SAAS,EAAE;QACbL,CAAC,CAACpB,IAAI,CAAC4B,WAAW,CAAChC,eAAe,CAAC,MAAM,EAAED,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;MAChE,CAAC,MAAM;QACLyB,CAAC,CAACpB,IAAI,CAAC6B,MAAM,CAAC,CAAC;MACjB;IACF;EACF,CAAC,CAAC;AACJ;AAEA,SAASC,0BAA0BA,CACjCC,KAAiB,EACjBvB,OAA0B,EACZ;EACd,MAAMc,WAAW,GAAG,EAAE;EACtB,IAAId,OAAO,CAACwB,YAAY,EAAE;IACxB,IAAInB,qBAAqB,GAAG,EAAE;IAC9B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGiB,KAAK,CAAChB,MAAM,EAAED,CAAC,EAAE,EAAE;MACrC,MAAMd,IAAI,GAAG+B,KAAK,CAACjB,CAAC,CAAC;MACrB,MAAMmB,UAAU,GAAAC,MAAA,CAAAC,MAAA,KAAQ3B,OAAO;QAAE4B,YAAY,EAAE;MAAK,EAAE;MACtD,IACEpC,IAAI,CAACqC,gBAAgB,CAAC,CAAC,KACtB7B,OAAO,CAAC4B,YAAY,IACnB5B,OAAO,CAAC8B,mBAAmB,CAAC,EAC9B;QACAL,UAAU,CAACK,mBAAmB,GAAG,IAAI;MACvC,CAAC,MAAM;QACLL,UAAU,CAACK,mBAAmB,GAAG,KAAK;MACxC;MACA,MAAMC,oBAAoB,GAAG7B,qBAAqB,CAACV,IAAI,EAAEiC,UAAU,CAAC;MACpE,IACEM,oBAAoB,CAACxB,MAAM,GAAG,CAAC,IAO/BwB,oBAAoB,CAACC,KAAK,CAACpB,CAAC,IAAIA,CAAC,CAACnB,IAAI,KAAKH,gBAAgB,CAAC,EAC5D;QACA,IACEe,qBAAqB,CAACE,MAAM,GAAG,CAAC,IAChCwB,oBAAoB,CAACC,KAAK,CAACpB,CAAC,IAC1BA,CAAC,CAACpB,IAAI,CAAC0B,gBAAgB,CAAC;UAAEC,KAAK,EAAE;QAAK,CAAC,CACzC,CAAC,EACD;UAMAN,uBAAuB,CAACR,qBAAqB,CAAC;UAC9CS,WAAW,CAACb,IAAI,CAAC,GAAGI,qBAAqB,CAAC;UAG1C,IAAIA,qBAAqB,CAAC4B,IAAI,CAACrB,CAAC,IAAIA,CAAC,CAACpB,IAAI,CAACN,aAAa,CAAC,CAAC,CAAC,EAAE;YAC3D4B,WAAW,CAACb,IAAI,CAAC,GAAG8B,oBAAoB,CAAC;YACzCf,sCAAsC,CACpCe,oBAAoB,EACJ,IAClB,CAAC;UACH;UACAf,sCAAsC,CACpCe,oBAAoB,EACJ,KAClB,CAAC;QACH,CAAC,MAAM;UACLjB,WAAW,CAACb,IAAI,CAAC,GAAG8B,oBAAoB,CAAC;UACzC,IAAI,CAAC/B,OAAO,CAAC8B,mBAAmB,EAAE;YAChCd,sCAAsC,CACpCe,oBAAoB,EACJ,IAClB,CAAC;UACH;QACF;QACA;MACF;MACA,IAAIzB,CAAC,KAAKiB,KAAK,CAAChB,MAAM,GAAG,CAAC,EAAE;QAC1BO,WAAW,CAACb,IAAI,CAAC,GAAG8B,oBAAoB,CAAC;MAC3C,CAAC,MAAM;QACL1B,qBAAqB,GAAG,EAAE;QAC1B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGyB,oBAAoB,CAACxB,MAAM,EAAED,CAAC,EAAE,EAAE;UACpD,MAAMM,CAAC,GAAGmB,oBAAoB,CAACzB,CAAC,CAAC;UACjC,IAAIM,CAAC,CAACnB,IAAI,KAAKH,gBAAgB,EAAE;YAC/BwB,WAAW,CAACb,IAAI,CAACW,CAAC,CAAC;UACrB;UACA,IAAIA,CAAC,CAACnB,IAAI,KAAKJ,iBAAiB,EAAE;YAChCgB,qBAAqB,CAACJ,IAAI,CAACW,CAAC,CAAC;UAC/B;QACF;MACF;IACF;EACF,CAAC,MAAM,IAAIW,KAAK,CAAChB,MAAM,EAAE;IAIvB,KAAK,IAAID,CAAC,GAAGiB,KAAK,CAAChB,MAAM,GAAG,CAAC,EAAED,CAAC,IAAI,CAAC,EAAEA,CAAC,EAAE,EAAE;MAC1C,MAAM4B,eAAe,GAAGhC,qBAAqB,CAACqB,KAAK,CAACjB,CAAC,CAAC,EAAEN,OAAO,CAAC;MAChE,IACEkC,eAAe,CAAC3B,MAAM,GAAG,CAAC,IACzB2B,eAAe,CAAC3B,MAAM,KAAK,CAAC,IAC3B,CAAC2B,eAAe,CAAC,CAAC,CAAC,CAAC1C,IAAI,CAAC2C,qBAAqB,CAAC,CAAE,EACnD;QACArB,WAAW,CAACb,IAAI,CAAC,GAAGiC,eAAe,CAAC;QACpC;MACF;IACF;EACF;EACA,OAAOpB,WAAW;AACpB;AAEA,SAASZ,qBAAqBA,CAC5BV,IAAc,EACdQ,OAA0B,EACZ;EACd,IAAID,OAAqB,GAAG,EAAE;EAC9B,IAAIP,IAAI,CAAC4C,aAAa,CAAC,CAAC,EAAE;IACxBrC,OAAO,GAAGD,oBAAoB,CAACN,IAAI,CAAC6C,GAAG,CAAC,YAAY,CAAC,EAAEtC,OAAO,EAAEC,OAAO,CAAC;IACxED,OAAO,GAAGD,oBAAoB,CAACN,IAAI,CAAC6C,GAAG,CAAC,WAAW,CAAC,EAAEtC,OAAO,EAAEC,OAAO,CAAC;EACzE,CAAC,MAAM,IACLR,IAAI,CAAC8C,cAAc,CAAC,CAAC,IACrB9C,IAAI,CAAC+C,KAAK,CAAC,CAAC,IACZ/C,IAAI,CAACgD,OAAO,CAAC,CAAC,IACdhD,IAAI,CAACiD,kBAAkB,CAAC,CAAC,EACzB;IAEA,OAAO3C,oBAAoB,CAACN,IAAI,CAAC6C,GAAG,CAAC,MAAM,CAAC,EAAEtC,OAAO,EAAEC,OAAO,CAAC;EACjE,CAAC,MAAM,IAAIR,IAAI,CAACkD,SAAS,CAAC,CAAC,IAAIlD,IAAI,CAACqC,gBAAgB,CAAC,CAAC,EAAE;IAEtD,OAAOP,0BAA0B,CAAC9B,IAAI,CAAC6C,GAAG,CAAC,MAAM,CAAC,EAAErC,OAAO,CAAC;EAC9D,CAAC,MAAM,IAAIR,IAAI,CAACmD,UAAU,CAAC,CAAC,EAAE;IAC5B,OAAOzC,qBAAqB,CAACV,IAAI,CAAC6C,GAAG,CAAC,MAAM,CAAC,EAAErC,OAAO,CAAC;EACzD,CAAC,MAAM,IAAIR,IAAI,CAACoD,cAAc,CAAC,CAAC,EAAE;IAChC7C,OAAO,GAAGD,oBAAoB,CAACN,IAAI,CAAC6C,GAAG,CAAC,OAAO,CAAC,EAAEtC,OAAO,EAAEC,OAAO,CAAC;IACnED,OAAO,GAAGD,oBAAoB,CAACN,IAAI,CAAC6C,GAAG,CAAC,SAAS,CAAC,EAAEtC,OAAO,EAAEC,OAAO,CAAC;EACvE,CAAC,MAAM,IAAIR,IAAI,CAACqD,aAAa,CAAC,CAAC,EAAE;IAC/B,OAAO/C,oBAAoB,CAACN,IAAI,CAAC6C,GAAG,CAAC,MAAM,CAAC,EAAEtC,OAAO,EAAEC,OAAO,CAAC;EACjE,CAAC,MAAM,IAAIR,IAAI,CAACsD,iBAAiB,CAAC,CAAC,EAAE;IACnC,OAAO3C,yBAAyB,CAACX,IAAI,CAAC6C,GAAG,CAAC,OAAO,CAAC,EAAEtC,OAAO,EAAEC,OAAO,CAAC;EACvE,CAAC,MAAM,IAAIR,IAAI,CAACuD,YAAY,CAAC,CAAC,EAAE;IAC9B,OAAOzB,0BAA0B,CAAC9B,IAAI,CAAC6C,GAAG,CAAC,YAAY,CAAC,EAAE;MACxDb,YAAY,EAAE,IAAI;MAClBM,mBAAmB,EAAE,KAAK;MAC1BF,YAAY,EAAE;IAChB,CAAC,CAAC;EACJ,CAAC,MAAM,IAAIpC,IAAI,CAAC0B,gBAAgB,CAAC,CAAC,EAAE;IAClCnB,OAAO,CAACE,IAAI,CAACP,eAAe,CAACF,IAAI,CAAC,CAAC;EACrC,CAAC,MAAM;IACLO,OAAO,CAACE,IAAI,CAACV,gBAAgB,CAACC,IAAI,CAAC,CAAC;EACtC;EAEA,OAAOO,OAAO;AAChB;AAYO,SAASiD,oBAAoBA,CAAA,EAA6B;EAC/D,MAAMjD,OAAO,GAAGG,qBAAqB,CAAC,IAAI,EAAE;IAC1CsB,YAAY,EAAE,KAAK;IACnBM,mBAAmB,EAAE,KAAK;IAC1BF,YAAY,EAAE;EAChB,CAAC,CAAC;EACF,OAAO7B,OAAO,CAACkD,GAAG,CAACC,CAAC,IAAIA,CAAC,CAAC1D,IAAI,CAAC;AACjC;AAEO,SAASK,UAAUA,CAAiBD,GAAoB,EAAY;EACzE,OAAOuD,cAAQ,CAACd,GAAG,CAAC;IAClBe,UAAU,EAAE,IAAI,CAACA,UAAU;IAC3BC,MAAM,EAAE,IAAI,CAACA,MAAM;IACnBC,SAAS,EAAE,IAAI,CAACA,SAAS;IACzBC,OAAO,EAAE,IAAI,CAACA,OAAO;IACrB3D,GAAG,EAAEA;EACP,CAAC,CAAC,CAAC4D,UAAU,CAAC,IAAI,CAACxD,OAAO,CAAC;AAC7B;AAEO,SAASyD,cAAcA,CAAA,EAA2B;EAEvD,OAAO,IAAI,CAAC5D,UAAU,CAAC,IAAI,CAACD,GAAG,GAAG,CAAC,CAAC;AACtC;AAEO,SAAS8D,cAAcA,CAAA,EAA2B;EAEvD,OAAO,IAAI,CAAC7D,UAAU,CAAC,IAAI,CAACD,GAAG,GAAG,CAAC,CAAC;AACtC;AAEO,SAAS+D,kBAAkBA,CAAA,EAA6B;EAE7D,IAAIC,IAAY,GAAG,IAAI,CAAChE,GAAG;EAC3B,IAAIiE,OAAO,GAAG,IAAI,CAAChE,UAAU,CAAC,EAAE+D,IAAI,CAAC;EACrC,MAAME,QAAQ,GAAG,EAAE;EACnB,OAAOD,OAAO,CAACE,IAAI,EAAE;IACnBD,QAAQ,CAAC7D,IAAI,CAAC4D,OAAO,CAAC;IACtBA,OAAO,GAAG,IAAI,CAAChE,UAAU,CAAC,EAAE+D,IAAI,CAAC;EACnC;EACA,OAAOE,QAAQ;AACjB;AAEO,SAASE,kBAAkBA,CAAA,EAA6B;EAE7D,IAAIJ,IAAY,GAAG,IAAI,CAAChE,GAAG;EAC3B,IAAIiE,OAAO,GAAG,IAAI,CAAChE,UAAU,CAAC,EAAE+D,IAAI,CAAC;EACrC,MAAME,QAAQ,GAAG,EAAE;EACnB,OAAOD,OAAO,CAACE,IAAI,EAAE;IACnBD,QAAQ,CAAC7D,IAAI,CAAC4D,OAAO,CAAC;IACtBA,OAAO,GAAG,IAAI,CAAChE,UAAU,CAAC,EAAE+D,IAAI,CAAC;EACnC;EACA,OAAOE,QAAQ;AACjB;AA8DA,SAASzB,GAAGA,CAEVzC,GAAW,EACXI,OAAgC,GAAG,IAAI,EAChB;EACvB,IAAIA,OAAO,KAAK,IAAI,EAAEA,OAAO,GAAG,IAAI,CAACA,OAAO;EAC5C,MAAMiE,KAAK,GAAGrE,GAAG,CAACsE,KAAK,CAAC,GAAG,CAAC;EAC5B,IAAID,KAAK,CAAC1D,MAAM,KAAK,CAAC,EAAE;IAGtB,OAAO,IAAI,CAAC4D,OAAO,CAACvE,GAAG,EAAEI,OAAO,CAAC;EACnC,CAAC,MAAM;IAEL,OAAO,IAAI,CAACoE,WAAW,CAACH,KAAK,EAAEjE,OAAO,CAAC;EACzC;AACF;AAIO,SAASmE,OAAOA,CAErBvE,GAAqB,EACrBI,OAA0B,EACH;EACvB,MAAM+D,IAAI,GAAG,IAAI,CAACA,IAAI;EACtB,MAAMT,SAAS,GAAGS,IAAI,CAACnE,GAAG,CAAC;EAE3B,IAAIyE,KAAK,CAACC,OAAO,CAAChB,SAAS,CAAC,EAAE;IAE5B,OAAOA,SAAS,CAACL,GAAG,CAAC,CAACsB,CAAC,EAAEjE,CAAC,KAAK;MAC7B,OAAO6C,cAAQ,CAACd,GAAG,CAAC;QAClBkB,OAAO,EAAE3D,GAAG;QACZwD,UAAU,EAAE,IAAI;QAChBC,MAAM,EAAEU,IAAI;QACZT,SAAS,EAAEA,SAAS;QACpB1D,GAAG,EAAEU;MACP,CAAC,CAAC,CAACkD,UAAU,CAACxD,OAAO,CAAC;IACxB,CAAC,CAAC;EACJ,CAAC,MAAM;IACL,OAAOmD,cAAQ,CAACd,GAAG,CAAC;MAClBe,UAAU,EAAE,IAAI;MAChBC,MAAM,EAAEU,IAAI;MACZT,SAAS,EAAES,IAAI;MACfnE,GAAG,EAAEA;IACP,CAAC,CAAC,CAAC4D,UAAU,CAACxD,OAAO,CAAC;EACxB;AACF;AAEO,SAASoE,WAAWA,CAEzBH,KAAe,EACfjE,OAA0B,EACH;EACvB,IAAIR,IAA2B,GAAG,IAAI;EACtC,KAAK,MAAMgF,IAAI,IAAIP,KAAK,EAAE;IACxB,IAAIO,IAAI,KAAK,GAAG,EAAE;MAEhBhF,IAAI,GAAGA,IAAI,CAAC4D,UAAU;IACxB,CAAC,MAAM;MACL,IAAIiB,KAAK,CAACC,OAAO,CAAC9E,IAAI,CAAC,EAAE;QAEvBA,IAAI,GAAGA,IAAI,CAACgF,IAAI,CAAC;MACnB,CAAC,MAAM;QACLhF,IAAI,GAAGA,IAAI,CAAC6C,GAAG,CAACmC,IAAI,EAAExE,OAAO,CAAC;MAChC;IACF;EACF;EACA,OAAOR,IAAI;AACb;AAYA,SAASV,qBAAqBA,CAE5B2F,UAAoB,EAC2B;EAC/C,OAAO1F,sBAAsB,CAAC,IAAI,CAACgF,IAAI,EAAEU,UAAU,CAAC;AACtD;AAcA,SAASzF,0BAA0BA,CAEjCyF,UAAoB,EAC2B;EAC/C,OAAOxF,2BAA2B,CAAC,IAAI,CAAC8E,IAAI,EAAEU,UAAU,CAAC;AAC3D;AAmBA,SAASC,yBAAyBA,CAEhCD,UAAmB,GAAG,KAAK,EAC3BE,SAAkB,GAAG,KAAK,EACyC;EACnE,MAAMnF,IAAI,GAAG,IAAI;EACjB,MAAMoF,MAAM,GAAG,CAACpF,IAAI,CAAC;EACrB,MAAMqF,GAAG,GAAGnD,MAAM,CAACoD,MAAM,CAAC,IAAI,CAAC;EAE/B,OAAOF,MAAM,CAACrE,MAAM,EAAE;IACpB,MAAMwE,EAAE,GAAGH,MAAM,CAACI,KAAK,CAAC,CAAC;IACzB,IAAI,CAACD,EAAE,EAAE;IACT,IAAI,CAACA,EAAE,CAAChB,IAAI,EAAE;IAEd,MAAMkB,IAAI,GAERlG,sBAAsB,CAACkG,IAAI,CAACF,EAAE,CAAChB,IAAI,CAACtE,IAAI,CAAC;IAE3C,IAAIsF,EAAE,CAACG,YAAY,CAAC,CAAC,EAAE;MACrB,IAAIT,UAAU,EAAE;QACd,MAAMU,IAAI,GAAIN,GAAG,CAACE,EAAE,CAAChB,IAAI,CAACqB,IAAI,CAAC,GAAGP,GAAG,CAACE,EAAE,CAAChB,IAAI,CAACqB,IAAI,CAAC,IAAI,EAAG;QAC1DD,IAAI,CAAClF,IAAI,CAAC8E,EAAE,CAAC;MACf,CAAC,MAAM;QACLF,GAAG,CAACE,EAAE,CAAChB,IAAI,CAACqB,IAAI,CAAC,GAAGL,EAAE;MACxB;MACA;IACF;IAEA,IAAIA,EAAE,CAACM,mBAAmB,CAAC,CAAC,EAAE;MAC5B,MAAMC,WAAW,GAAGP,EAAE,CAAC1C,GAAG,CAAC,aAAa,CAAC;MACzC,IAAInD,aAAa,CAACoG,WAAW,CAAC,EAAE;QAC9BV,MAAM,CAAC3E,IAAI,CAACqF,WAAW,CAAC;MAC1B;MACA;IACF;IAEA,IAAIX,SAAS,EAAE;MACb,IAAII,EAAE,CAACQ,qBAAqB,CAAC,CAAC,EAAE;QAC9BX,MAAM,CAAC3E,IAAI,CAAC8E,EAAE,CAAC1C,GAAG,CAAC,IAAI,CAAC,CAAC;QACzB;MACF;MACA,IAAI0C,EAAE,CAACS,oBAAoB,CAAC,CAAC,EAAE;QAC7B;MACF;IACF;IAEA,IAAIP,IAAI,EAAE;MACR,KAAK,IAAI3E,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG2E,IAAI,CAAC1E,MAAM,EAAED,CAAC,EAAE,EAAE;QACpC,MAAMV,GAAG,GAAGqF,IAAI,CAAC3E,CAAC,CAAC;QACnB,MAAMmF,KAAK,GAAGV,EAAE,CAAC1C,GAAG,CAACzC,GAAG,CAAC;QACzB,IAAIyE,KAAK,CAACC,OAAO,CAACmB,KAAK,CAAC,EAAE;UACxBb,MAAM,CAAC3E,IAAI,CAAC,GAAGwF,KAAK,CAAC;QACvB,CAAC,MAAM,IAAIA,KAAK,CAAC1B,IAAI,EAAE;UACrBa,MAAM,CAAC3E,IAAI,CAACwF,KAAK,CAAC;QACpB;MACF;IACF;EACF;EAEA,OAAOZ,GAAG;AACZ;AAcA,SAASa,8BAA8BA,CAErCjB,UAAmB,GAAG,KAAK,EAC3B;EACA,OAAO,IAAI,CAACC,yBAAyB,CAACD,UAAU,EAAE,IAAI,CAAC;AACzD"}
package/lib/path/index.js CHANGED
@@ -4,58 +4,36 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.SHOULD_STOP = exports.SHOULD_SKIP = exports.REMOVED = void 0;
7
-
8
- var virtualTypes = require("./lib/virtual-types");
9
-
7
+ var virtualTypes = require("./lib/virtual-types.js");
10
8
  var _debug = require("debug");
11
-
12
- var _index = require("../index");
13
-
14
- var _scope = require("../scope");
15
-
9
+ var _index = require("../index.js");
10
+ var _index2 = require("../scope/index.js");
16
11
  var _t = require("@babel/types");
17
-
18
12
  var t = _t;
19
-
20
- var _cache = require("../cache");
21
-
13
+ var cache = require("../cache.js");
22
14
  var _generator = require("@babel/generator");
23
-
24
- var NodePath_ancestry = require("./ancestry");
25
-
26
- var NodePath_inference = require("./inference");
27
-
28
- var NodePath_replacement = require("./replacement");
29
-
30
- var NodePath_evaluation = require("./evaluation");
31
-
32
- var NodePath_conversion = require("./conversion");
33
-
34
- var NodePath_introspection = require("./introspection");
35
-
36
- var NodePath_context = require("./context");
37
-
38
- var NodePath_removal = require("./removal");
39
-
40
- var NodePath_modification = require("./modification");
41
-
42
- var NodePath_family = require("./family");
43
-
44
- var NodePath_comments = require("./comments");
45
-
15
+ var NodePath_ancestry = require("./ancestry.js");
16
+ var NodePath_inference = require("./inference/index.js");
17
+ var NodePath_replacement = require("./replacement.js");
18
+ var NodePath_evaluation = require("./evaluation.js");
19
+ var NodePath_conversion = require("./conversion.js");
20
+ var NodePath_introspection = require("./introspection.js");
21
+ var NodePath_context = require("./context.js");
22
+ var NodePath_removal = require("./removal.js");
23
+ var NodePath_modification = require("./modification.js");
24
+ var NodePath_family = require("./family.js");
25
+ var NodePath_comments = require("./comments.js");
26
+ var NodePath_virtual_types_validator = require("./lib/virtual-types-validator.js");
46
27
  const {
47
28
  validate
48
29
  } = _t;
49
-
50
30
  const debug = _debug("babel");
51
-
52
31
  const REMOVED = 1 << 0;
53
32
  exports.REMOVED = REMOVED;
54
33
  const SHOULD_STOP = 1 << 1;
55
34
  exports.SHOULD_STOP = SHOULD_STOP;
56
35
  const SHOULD_SKIP = 1 << 2;
57
36
  exports.SHOULD_SKIP = SHOULD_SKIP;
58
-
59
37
  class NodePath {
60
38
  constructor(hub, parent) {
61
39
  this.contexts = [];
@@ -75,7 +53,6 @@ class NodePath {
75
53
  this.context = null;
76
54
  this.scope = null;
77
55
  }
78
-
79
56
  static get({
80
57
  hub,
81
58
  parentPath,
@@ -87,111 +64,80 @@ class NodePath {
87
64
  if (!hub && parentPath) {
88
65
  hub = parentPath.hub;
89
66
  }
90
-
91
67
  if (!parent) {
92
68
  throw new Error("To get a node path the parent needs to exist");
93
69
  }
94
-
95
70
  const targetNode = container[key];
96
-
97
- let paths = _cache.path.get(parent);
98
-
99
- if (!paths) {
100
- paths = new Map();
101
-
102
- _cache.path.set(parent, paths);
103
- }
104
-
71
+ const paths = cache.getOrCreateCachedPaths(hub, parent);
105
72
  let path = paths.get(targetNode);
106
-
107
73
  if (!path) {
108
74
  path = new NodePath(hub, parent);
109
75
  if (targetNode) paths.set(targetNode, path);
110
76
  }
111
-
112
77
  path.setup(parentPath, container, listKey, key);
113
78
  return path;
114
79
  }
115
-
116
80
  getScope(scope) {
117
- return this.isScope() ? new _scope.default(this) : scope;
81
+ return this.isScope() ? new _index2.default(this) : scope;
118
82
  }
119
-
120
83
  setData(key, val) {
121
84
  if (this.data == null) {
122
85
  this.data = Object.create(null);
123
86
  }
124
-
125
87
  return this.data[key] = val;
126
88
  }
127
-
128
89
  getData(key, def) {
129
90
  if (this.data == null) {
130
91
  this.data = Object.create(null);
131
92
  }
132
-
133
93
  let val = this.data[key];
134
94
  if (val === undefined && def !== undefined) val = this.data[key] = def;
135
95
  return val;
136
96
  }
137
-
138
97
  hasNode() {
139
98
  return this.node != null;
140
99
  }
141
-
142
100
  buildCodeFrameError(msg, Error = SyntaxError) {
143
101
  return this.hub.buildError(this.node, msg, Error);
144
102
  }
145
-
146
103
  traverse(visitor, state) {
147
104
  (0, _index.default)(this.node, visitor, this.scope, state, this);
148
105
  }
149
-
150
106
  set(key, node) {
151
107
  validate(this.node, key, node);
152
108
  this.node[key] = node;
153
109
  }
154
-
155
110
  getPathLocation() {
156
111
  const parts = [];
157
112
  let path = this;
158
-
159
113
  do {
160
114
  let key = path.key;
161
115
  if (path.inList) key = `${path.listKey}[${key}]`;
162
116
  parts.unshift(key);
163
117
  } while (path = path.parentPath);
164
-
165
118
  return parts.join(".");
166
119
  }
167
-
168
120
  debug(message) {
169
121
  if (!debug.enabled) return;
170
122
  debug(`${this.getPathLocation()} ${this.type}: ${message}`);
171
123
  }
172
-
173
124
  toString() {
174
125
  return (0, _generator.default)(this.node).code;
175
126
  }
176
-
177
127
  get inList() {
178
128
  return !!this.listKey;
179
129
  }
180
-
181
130
  set inList(inList) {
182
131
  if (!inList) {
183
132
  this.listKey = null;
184
133
  }
185
134
  }
186
-
187
135
  get parentKey() {
188
136
  return this.listKey || this.key;
189
137
  }
190
-
191
138
  get shouldSkip() {
192
139
  return !!(this._traverseFlags & SHOULD_SKIP);
193
140
  }
194
-
195
141
  set shouldSkip(v) {
196
142
  if (v) {
197
143
  this._traverseFlags |= SHOULD_SKIP;
@@ -199,11 +145,9 @@ class NodePath {
199
145
  this._traverseFlags &= ~SHOULD_SKIP;
200
146
  }
201
147
  }
202
-
203
148
  get shouldStop() {
204
149
  return !!(this._traverseFlags & SHOULD_STOP);
205
150
  }
206
-
207
151
  set shouldStop(v) {
208
152
  if (v) {
209
153
  this._traverseFlags |= SHOULD_STOP;
@@ -211,11 +155,9 @@ class NodePath {
211
155
  this._traverseFlags &= ~SHOULD_STOP;
212
156
  }
213
157
  }
214
-
215
158
  get removed() {
216
159
  return !!(this._traverseFlags & REMOVED);
217
160
  }
218
-
219
161
  set removed(v) {
220
162
  if (v) {
221
163
  this._traverseFlags |= REMOVED;
@@ -223,35 +165,29 @@ class NodePath {
223
165
  this._traverseFlags &= ~REMOVED;
224
166
  }
225
167
  }
226
-
227
168
  }
228
-
229
169
  Object.assign(NodePath.prototype, NodePath_ancestry, NodePath_inference, NodePath_replacement, NodePath_evaluation, NodePath_conversion, NodePath_introspection, NodePath_context, NodePath_removal, NodePath_modification, NodePath_family, NodePath_comments);
230
-
170
+ {
171
+ NodePath.prototype._guessExecutionStatusRelativeToDifferentFunctions = NodePath_introspection._guessExecutionStatusRelativeTo;
172
+ }
231
173
  for (const type of t.TYPES) {
232
174
  const typeKey = `is${type}`;
233
175
  const fn = t[typeKey];
234
-
235
176
  NodePath.prototype[typeKey] = function (opts) {
236
177
  return fn(this.node, opts);
237
178
  };
238
-
239
179
  NodePath.prototype[`assert${type}`] = function (opts) {
240
180
  if (!fn(this.node, opts)) {
241
181
  throw new TypeError(`Expected node path of type ${type}`);
242
182
  }
243
183
  };
244
184
  }
245
-
185
+ Object.assign(NodePath.prototype, NodePath_virtual_types_validator);
246
186
  for (const type of Object.keys(virtualTypes)) {
247
187
  if (type[0] === "_") continue;
248
- if (t.TYPES.indexOf(type) < 0) t.TYPES.push(type);
249
- const virtualType = virtualTypes[type];
250
-
251
- NodePath.prototype[`is${type}`] = function (opts) {
252
- return virtualType.checkPath(this, opts);
253
- };
188
+ if (!t.TYPES.includes(type)) t.TYPES.push(type);
254
189
  }
255
-
256
190
  var _default = NodePath;
257
- exports.default = _default;
191
+ exports.default = _default;
192
+
193
+ //# sourceMappingURL=index.js.map