@babel/traverse 7.20.0 → 7.20.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of @babel/traverse might be problematic. Click here for more details.

Files changed (57) hide show
  1. package/lib/cache.js +0 -3
  2. package/lib/cache.js.map +1 -1
  3. package/lib/context.js +7 -21
  4. package/lib/context.js.map +1 -1
  5. package/lib/hub.js +0 -6
  6. package/lib/hub.js.map +1 -1
  7. package/lib/index.js +3 -21
  8. package/lib/index.js.map +1 -1
  9. package/lib/path/ancestry.js +3 -23
  10. package/lib/path/ancestry.js.map +1 -1
  11. package/lib/path/comments.js +0 -4
  12. package/lib/path/comments.js.map +1 -1
  13. package/lib/path/context.js +14 -54
  14. package/lib/path/context.js.map +1 -1
  15. package/lib/path/conversion.js +23 -78
  16. package/lib/path/conversion.js.map +1 -1
  17. package/lib/path/evaluation.js +9 -85
  18. package/lib/path/evaluation.js.map +1 -1
  19. package/lib/path/family.js +6 -73
  20. package/lib/path/family.js.map +1 -1
  21. package/lib/path/index.js +2 -61
  22. package/lib/path/index.js.map +1 -1
  23. package/lib/path/inference/index.js +2 -27
  24. package/lib/path/inference/index.js.map +1 -1
  25. package/lib/path/inference/inferer-reference.js +10 -31
  26. package/lib/path/inference/inferer-reference.js.map +1 -1
  27. package/lib/path/inference/inferers.js +4 -44
  28. package/lib/path/inference/inferers.js.map +1 -1
  29. package/lib/path/inference/util.js +0 -4
  30. package/lib/path/inference/util.js.map +1 -1
  31. package/lib/path/introspection.js +17 -59
  32. package/lib/path/introspection.js.map +1 -1
  33. package/lib/path/lib/hoister.js +7 -23
  34. package/lib/path/lib/hoister.js.map +1 -1
  35. package/lib/path/lib/removal-hooks.js +7 -3
  36. package/lib/path/lib/removal-hooks.js.map +1 -1
  37. package/lib/path/lib/virtual-types-validator.js +0 -23
  38. package/lib/path/lib/virtual-types-validator.js.map +1 -1
  39. package/lib/path/lib/virtual-types.js +1 -0
  40. package/lib/path/lib/virtual-types.js.map +1 -1
  41. package/lib/path/modification.js +12 -47
  42. package/lib/path/modification.js.map +1 -1
  43. package/lib/path/removal.js +0 -16
  44. package/lib/path/removal.js.map +1 -1
  45. package/lib/path/replacement.js +8 -50
  46. package/lib/path/replacement.js.map +1 -1
  47. package/lib/scope/binding.js +2 -14
  48. package/lib/scope/binding.js.map +1 -1
  49. package/lib/scope/index.js +19 -184
  50. package/lib/scope/index.js.map +1 -1
  51. package/lib/scope/lib/renamer.js +2 -25
  52. package/lib/scope/lib/renamer.js.map +1 -1
  53. package/lib/traverse-node.js +0 -7
  54. package/lib/traverse-node.js.map +1 -1
  55. package/lib/visitors.js +13 -44
  56. package/lib/visitors.js.map +1 -1
  57. package/package.json +4 -4
@@ -17,11 +17,8 @@ exports.getOuterBindingIdentifierPaths = getOuterBindingIdentifierPaths;
17
17
  exports.getOuterBindingIdentifiers = getOuterBindingIdentifiers;
18
18
  exports.getPrevSibling = getPrevSibling;
19
19
  exports.getSibling = getSibling;
20
-
21
20
  var _index = require("./index");
22
-
23
21
  var _t = require("@babel/types");
24
-
25
22
  const {
26
23
  getBindingIdentifiers: _getBindingIdentifiers,
27
24
  getOuterBindingIdentifiers: _getOuterBindingIdentifiers,
@@ -31,71 +28,55 @@ 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;
@@ -115,63 +96,51 @@ function replaceBreakStatementInBreakCompletion(completions, reachable) {
115
96
  }
116
97
  });
117
98
  }
118
-
119
99
  function getStatementListCompletion(paths, context) {
120
100
  const completions = [];
121
-
122
101
  if (context.canHaveBreak) {
123
102
  let lastNormalCompletions = [];
124
-
125
103
  for (let i = 0; i < paths.length; i++) {
126
104
  const path = paths[i];
127
105
  const newContext = Object.assign({}, context, {
128
106
  inCaseClause: false
129
107
  });
130
-
131
- if (path.isBlockStatement() && (context.inCaseClause || context.shouldPopulateBreak)) {
108
+ if (path.isBlockStatement() && (context.inCaseClause ||
109
+ context.shouldPopulateBreak)) {
132
110
  newContext.shouldPopulateBreak = true;
133
111
  } else {
134
112
  newContext.shouldPopulateBreak = false;
135
113
  }
136
-
137
114
  const statementCompletions = _getCompletionRecords(path, newContext);
138
-
139
- if (statementCompletions.length > 0 && statementCompletions.every(c => c.type === BREAK_COMPLETION)) {
115
+ if (statementCompletions.length > 0 &&
116
+ statementCompletions.every(c => c.type === BREAK_COMPLETION)) {
140
117
  if (lastNormalCompletions.length > 0 && statementCompletions.every(c => c.path.isBreakStatement({
141
118
  label: null
142
119
  }))) {
143
120
  normalCompletionToBreak(lastNormalCompletions);
144
121
  completions.push(...lastNormalCompletions);
145
-
146
122
  if (lastNormalCompletions.some(c => c.path.isDeclaration())) {
147
123
  completions.push(...statementCompletions);
148
124
  replaceBreakStatementInBreakCompletion(statementCompletions, true);
149
125
  }
150
-
151
126
  replaceBreakStatementInBreakCompletion(statementCompletions, false);
152
127
  } else {
153
128
  completions.push(...statementCompletions);
154
-
155
129
  if (!context.shouldPopulateBreak) {
156
130
  replaceBreakStatementInBreakCompletion(statementCompletions, true);
157
131
  }
158
132
  }
159
-
160
133
  break;
161
134
  }
162
-
163
135
  if (i === paths.length - 1) {
164
136
  completions.push(...statementCompletions);
165
137
  } else {
166
138
  lastNormalCompletions = [];
167
-
168
139
  for (let i = 0; i < statementCompletions.length; i++) {
169
140
  const c = statementCompletions[i];
170
-
171
141
  if (c.type === BREAK_COMPLETION) {
172
142
  completions.push(c);
173
143
  }
174
-
175
144
  if (c.type === NORMAL_COMPLETION) {
176
145
  lastNormalCompletions.push(c);
177
146
  }
@@ -181,20 +150,16 @@ function getStatementListCompletion(paths, context) {
181
150
  } else if (paths.length) {
182
151
  for (let i = paths.length - 1; i >= 0; i--) {
183
152
  const pathCompletions = _getCompletionRecords(paths[i], context);
184
-
185
153
  if (pathCompletions.length > 1 || pathCompletions.length === 1 && !pathCompletions[0].path.isVariableDeclaration()) {
186
154
  completions.push(...pathCompletions);
187
155
  break;
188
156
  }
189
157
  }
190
158
  }
191
-
192
159
  return completions;
193
160
  }
194
-
195
161
  function _getCompletionRecords(path, context) {
196
162
  let records = [];
197
-
198
163
  if (path.isIfStatement()) {
199
164
  records = addCompletionRecords(path.get("consequent"), records, context);
200
165
  records = addCompletionRecords(path.get("alternate"), records, context);
@@ -222,7 +187,6 @@ function _getCompletionRecords(path, context) {
222
187
  } else {
223
188
  records.push(NormalCompletion(path));
224
189
  }
225
-
226
190
  return records;
227
191
  }
228
192
 
@@ -232,10 +196,8 @@ function getCompletionRecords() {
232
196
  shouldPopulateBreak: false,
233
197
  inCaseClause: false
234
198
  });
235
-
236
199
  return records.map(r => r.path);
237
200
  }
238
-
239
201
  function getSibling(key) {
240
202
  return _index.default.get({
241
203
  parentPath: this.parentPath,
@@ -245,56 +207,45 @@ function getSibling(key) {
245
207
  key: key
246
208
  }).setContext(this.context);
247
209
  }
248
-
249
210
  function getPrevSibling() {
250
211
  return this.getSibling(this.key - 1);
251
212
  }
252
-
253
213
  function getNextSibling() {
254
214
  return this.getSibling(this.key + 1);
255
215
  }
256
-
257
216
  function getAllNextSiblings() {
258
217
  let _key = this.key;
259
218
  let sibling = this.getSibling(++_key);
260
219
  const siblings = [];
261
-
262
220
  while (sibling.node) {
263
221
  siblings.push(sibling);
264
222
  sibling = this.getSibling(++_key);
265
223
  }
266
-
267
224
  return siblings;
268
225
  }
269
-
270
226
  function getAllPrevSiblings() {
271
227
  let _key = this.key;
272
228
  let sibling = this.getSibling(--_key);
273
229
  const siblings = [];
274
-
275
230
  while (sibling.node) {
276
231
  siblings.push(sibling);
277
232
  sibling = this.getSibling(--_key);
278
233
  }
279
-
280
234
  return siblings;
281
235
  }
282
236
 
283
237
  function get(key, context = true) {
284
238
  if (context === true) context = this.context;
285
239
  const parts = key.split(".");
286
-
287
240
  if (parts.length === 1) {
288
241
  return this._getKey(key, context);
289
242
  } else {
290
243
  return this._getPattern(parts, context);
291
244
  }
292
245
  }
293
-
294
246
  function _getKey(key, context) {
295
247
  const node = this.node;
296
248
  const container = node[key];
297
-
298
249
  if (Array.isArray(container)) {
299
250
  return container.map((_, i) => {
300
251
  return _index.default.get({
@@ -314,10 +265,8 @@ function _getKey(key, context) {
314
265
  }).setContext(context);
315
266
  }
316
267
  }
317
-
318
268
  function _getPattern(parts, context) {
319
269
  let path = this;
320
-
321
270
  for (const part of parts) {
322
271
  if (part === ".") {
323
272
  path = path.parentPath;
@@ -329,67 +278,53 @@ function _getPattern(parts, context) {
329
278
  }
330
279
  }
331
280
  }
332
-
333
281
  return path;
334
282
  }
335
-
336
283
  function getBindingIdentifiers(duplicates) {
337
284
  return _getBindingIdentifiers(this.node, duplicates);
338
285
  }
339
-
340
286
  function getOuterBindingIdentifiers(duplicates) {
341
287
  return _getOuterBindingIdentifiers(this.node, duplicates);
342
288
  }
343
-
344
289
  function getBindingIdentifierPaths(duplicates = false, outerOnly = false) {
345
290
  const path = this;
346
291
  const search = [path];
347
292
  const ids = Object.create(null);
348
-
349
293
  while (search.length) {
350
294
  const id = search.shift();
351
295
  if (!id) continue;
352
296
  if (!id.node) continue;
353
- const keys = _getBindingIdentifiers.keys[id.node.type];
354
-
297
+ const keys =
298
+ _getBindingIdentifiers.keys[id.node.type];
355
299
  if (id.isIdentifier()) {
356
300
  if (duplicates) {
357
301
  const _ids = ids[id.node.name] = ids[id.node.name] || [];
358
-
359
302
  _ids.push(id);
360
303
  } else {
361
304
  ids[id.node.name] = id;
362
305
  }
363
-
364
306
  continue;
365
307
  }
366
-
367
308
  if (id.isExportDeclaration()) {
368
309
  const declaration = id.get("declaration");
369
-
370
310
  if (isDeclaration(declaration)) {
371
311
  search.push(declaration);
372
312
  }
373
-
374
313
  continue;
375
314
  }
376
-
377
315
  if (outerOnly) {
378
316
  if (id.isFunctionDeclaration()) {
379
317
  search.push(id.get("id"));
380
318
  continue;
381
319
  }
382
-
383
320
  if (id.isFunctionExpression()) {
384
321
  continue;
385
322
  }
386
323
  }
387
-
388
324
  if (keys) {
389
325
  for (let i = 0; i < keys.length; i++) {
390
326
  const key = keys[i];
391
327
  const child = id.get(key);
392
-
393
328
  if (Array.isArray(child)) {
394
329
  search.push(...child);
395
330
  } else if (child.node) {
@@ -398,10 +333,8 @@ function getBindingIdentifierPaths(duplicates = false, outerOnly = false) {
398
333
  }
399
334
  }
400
335
  }
401
-
402
336
  return ids;
403
337
  }
404
-
405
338
  function getOuterBindingIdentifierPaths(duplicates = false) {
406
339
  return this.getBindingIdentifierPaths(duplicates, true);
407
340
  }
@@ -1 +1 @@
1
- {"version":3,"names":["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","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","Object","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\";\nimport NodePath from \"./index\";\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":"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"}
1
+ {"version":3,"names":["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","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","Object","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\";\nimport NodePath from \"./index\";\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":"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"}