@babel/traverse 7.20.0 → 7.20.1

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 +11 -52
  14. package/lib/path/context.js.map +1 -1
  15. package/lib/path/conversion.js +16 -75
  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 -32
  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 +18 -183
  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 +3 -3
@@ -23,53 +23,42 @@ exports.skip = skip;
23
23
  exports.skipKey = skipKey;
24
24
  exports.stop = stop;
25
25
  exports.visit = visit;
26
-
27
26
  var _traverseNode = require("../traverse-node");
28
-
29
27
  var _index = require("./index");
30
28
 
31
29
  function call(key) {
32
30
  const opts = this.opts;
33
31
  this.debug(key);
34
-
35
32
  if (this.node) {
36
33
  if (this._call(opts[key])) return true;
37
34
  }
38
-
39
35
  if (this.node) {
40
36
  return this._call(opts[this.node.type] && opts[this.node.type][key]);
41
37
  }
42
-
43
38
  return false;
44
39
  }
45
-
46
40
  function _call(fns) {
47
41
  if (!fns) return false;
48
-
49
42
  for (const fn of fns) {
50
43
  if (!fn) continue;
51
44
  const node = this.node;
52
45
  if (!node) return true;
53
46
  const ret = fn.call(this.state, this, this.state);
54
-
55
47
  if (ret && typeof ret === "object" && typeof ret.then === "function") {
56
48
  throw new Error(`You appear to be using a plugin with an async traversal visitor, ` + `which your current version of Babel does not support. ` + `If you're using a published plugin, you may need to upgrade ` + `your @babel/core version.`);
57
49
  }
58
-
59
50
  if (ret) {
60
51
  throw new Error(`Unexpected return value from visitor method ${fn}`);
61
52
  }
62
53
 
63
54
  if (this.node !== node) return true;
55
+
64
56
  if (this._traverseFlags > 0) return true;
65
57
  }
66
-
67
58
  return false;
68
59
  }
69
-
70
60
  function isDenylisted() {
71
61
  var _this$opts$denylist;
72
-
73
62
  const denylist = (_this$opts$denylist = this.opts.denylist) != null ? _this$opts$denylist : this.opts.blacklist;
74
63
  return denylist && denylist.indexOf(this.node.type) > -1;
75
64
  }
@@ -81,27 +70,21 @@ function restoreContext(path, context) {
81
70
  path.opts = context.opts;
82
71
  }
83
72
  }
84
-
85
73
  function visit() {
86
74
  if (!this.node) {
87
75
  return false;
88
76
  }
89
-
90
77
  if (this.isDenylisted()) {
91
78
  return false;
92
79
  }
93
-
94
80
  if (this.opts.shouldSkip && this.opts.shouldSkip(this)) {
95
81
  return false;
96
82
  }
97
-
98
83
  const currentContext = this.context;
99
-
100
84
  if (this.shouldSkip || this.call("enter")) {
101
85
  this.debug("Skip...");
102
86
  return this.shouldStop;
103
87
  }
104
-
105
88
  restoreContext(this, currentContext);
106
89
  this.debug("Recursing into...");
107
90
  this.shouldStop = (0, _traverseNode.traverseNode)(this.node, this.opts, this.scope, this.state, this, this.skipKeys);
@@ -109,23 +92,18 @@ function visit() {
109
92
  this.call("exit");
110
93
  return this.shouldStop;
111
94
  }
112
-
113
95
  function skip() {
114
96
  this.shouldSkip = true;
115
97
  }
116
-
117
98
  function skipKey(key) {
118
99
  if (this.skipKeys == null) {
119
100
  this.skipKeys = {};
120
101
  }
121
-
122
102
  this.skipKeys[key] = true;
123
103
  }
124
-
125
104
  function stop() {
126
105
  this._traverseFlags |= _index.SHOULD_SKIP | _index.SHOULD_STOP;
127
106
  }
128
-
129
107
  function setScope() {
130
108
  if (this.opts && this.opts.noScope) return;
131
109
  let path = this.parentPath;
@@ -133,43 +111,33 @@ function setScope() {
133
111
  if ((this.key === "key" || this.listKey === "decorators") && path.isMethod()) {
134
112
  path = path.parentPath;
135
113
  }
136
-
137
114
  let target;
138
-
139
115
  while (path && !target) {
140
116
  if (path.opts && path.opts.noScope) return;
141
117
  target = path.scope;
142
118
  path = path.parentPath;
143
119
  }
144
-
145
120
  this.scope = this.getScope(target);
146
121
  if (this.scope) this.scope.init();
147
122
  }
148
-
149
123
  function setContext(context) {
150
124
  if (this.skipKeys != null) {
151
125
  this.skipKeys = {};
152
126
  }
153
-
154
127
  this._traverseFlags = 0;
155
-
156
128
  if (context) {
157
129
  this.context = context;
158
130
  this.state = context.state;
159
131
  this.opts = context.opts;
160
132
  }
161
-
162
133
  this.setScope();
163
134
  return this;
164
135
  }
165
136
 
166
137
  function resync() {
167
138
  if (this.removed) return;
168
-
169
139
  this._resyncParent();
170
-
171
140
  this._resyncList();
172
-
173
141
  this._resyncKey();
174
142
  }
175
143
 
@@ -178,11 +146,10 @@ function _resyncParent() {
178
146
  this.parent = this.parentPath.node;
179
147
  }
180
148
  }
181
-
182
149
  function _resyncKey() {
183
150
  if (!this.container) return;
184
-
185
- if (this.node === this.container[this.key]) {
151
+ if (this.node ===
152
+ this.container[this.key]) {
186
153
  return;
187
154
  }
188
155
 
@@ -202,70 +169,62 @@ function _resyncKey() {
202
169
 
203
170
  this.key = null;
204
171
  }
205
-
206
172
  function _resyncList() {
207
173
  if (!this.parent || !this.inList) return;
208
- const newContainer = this.parent[this.listKey];
174
+ const newContainer =
175
+ this.parent[this.listKey];
209
176
  if (this.container === newContainer) return;
177
+
210
178
  this.container = newContainer || null;
211
179
  }
212
-
213
180
  function _resyncRemoved() {
214
- if (this.key == null || !this.container || this.container[this.key] !== this.node) {
181
+ if (this.key == null || !this.container ||
182
+ this.container[this.key] !== this.node) {
215
183
  this._markRemoved();
216
184
  }
217
185
  }
218
-
219
186
  function popContext() {
220
187
  this.contexts.pop();
221
-
222
188
  if (this.contexts.length > 0) {
223
189
  this.setContext(this.contexts[this.contexts.length - 1]);
224
190
  } else {
225
191
  this.setContext(undefined);
226
192
  }
227
193
  }
228
-
229
194
  function pushContext(context) {
230
195
  this.contexts.push(context);
231
196
  this.setContext(context);
232
197
  }
233
-
234
198
  function setup(parentPath, container, listKey, key) {
235
199
  this.listKey = listKey;
236
200
  this.container = container;
237
201
  this.parentPath = parentPath || this.parentPath;
238
202
  this.setKey(key);
239
203
  }
240
-
241
204
  function setKey(key) {
242
205
  var _this$node;
243
-
244
206
  this.key = key;
245
- this.node = this.container[this.key];
207
+ this.node =
208
+ this.container[this.key];
246
209
  this.type = (_this$node = this.node) == null ? void 0 : _this$node.type;
247
210
  }
248
-
249
211
  function requeue(pathToQueue = this) {
250
212
  if (pathToQueue.removed) return;
213
+
251
214
  ;
252
215
  const contexts = this.contexts;
253
-
254
216
  for (const context of contexts) {
255
217
  context.maybeQueue(pathToQueue);
256
218
  }
257
219
  }
258
-
259
220
  function _getQueueContexts() {
260
221
  let path = this;
261
222
  let contexts = this.contexts;
262
-
263
223
  while (!contexts.length) {
264
224
  path = path.parentPath;
265
225
  if (!path) break;
266
226
  contexts = path.contexts;
267
227
  }
268
-
269
228
  return contexts;
270
229
  }
271
230
 
@@ -1 +1 @@
1
- {"version":3,"names":["call","key","opts","debug","node","_call","type","fns","fn","ret","state","then","Error","_traverseFlags","isDenylisted","denylist","blacklist","indexOf","restoreContext","path","context","visit","shouldSkip","currentContext","shouldStop","traverseNode","scope","skipKeys","skip","skipKey","stop","SHOULD_SKIP","SHOULD_STOP","setScope","noScope","parentPath","listKey","isMethod","target","getScope","init","setContext","resync","removed","_resyncParent","_resyncList","_resyncKey","parent","container","Array","isArray","i","length","setKey","Object","keys","inList","newContainer","_resyncRemoved","_markRemoved","popContext","contexts","pop","undefined","pushContext","push","setup","requeue","pathToQueue","maybeQueue","_getQueueContexts"],"sources":["../../src/path/context.ts"],"sourcesContent":["// This file contains methods responsible for maintaining a TraversalContext.\n\nimport { traverseNode } from \"../traverse-node\";\nimport { SHOULD_SKIP, SHOULD_STOP } from \"./index\";\nimport type TraversalContext from \"../context\";\nimport type NodePath from \"./index\";\nimport type * as t from \"@babel/types\";\n\nexport function call(this: NodePath, key: string): boolean {\n const opts = this.opts;\n\n this.debug(key);\n\n if (this.node) {\n if (this._call(opts[key])) return true;\n }\n\n if (this.node) {\n return this._call(opts[this.node.type] && opts[this.node.type][key]);\n }\n\n return false;\n}\n\nexport function _call(this: NodePath, fns?: Array<Function>): boolean {\n if (!fns) return false;\n\n for (const fn of fns) {\n if (!fn) continue;\n\n const node = this.node;\n if (!node) return true;\n\n const ret = fn.call(this.state, this, this.state);\n if (ret && typeof ret === \"object\" && typeof ret.then === \"function\") {\n throw new Error(\n `You appear to be using a plugin with an async traversal visitor, ` +\n `which your current version of Babel does not support. ` +\n `If you're using a published plugin, you may need to upgrade ` +\n `your @babel/core version.`,\n );\n }\n if (ret) {\n throw new Error(`Unexpected return value from visitor method ${fn}`);\n }\n\n // node has been replaced, it will have been requeued\n if (this.node !== node) return true;\n\n // this.shouldSkip || this.shouldStop || this.removed\n if (this._traverseFlags > 0) return true;\n }\n\n return false;\n}\n\nexport function isDenylisted(this: NodePath): boolean {\n const denylist = this.opts.denylist ?? this.opts.blacklist;\n return denylist && denylist.indexOf(this.node.type) > -1;\n}\n\n// TODO: Remove in Babel 8\nexport { isDenylisted as isBlacklisted };\n\nfunction restoreContext(path: NodePath, context: TraversalContext) {\n if (path.context !== context) {\n path.context = context;\n path.state = context.state;\n path.opts = context.opts;\n }\n}\n\nexport function visit(this: NodePath): boolean {\n if (!this.node) {\n return false;\n }\n\n if (this.isDenylisted()) {\n return false;\n }\n\n if (this.opts.shouldSkip && this.opts.shouldSkip(this)) {\n return false;\n }\n\n const currentContext = this.context;\n // Note: We need to check \"this.shouldSkip\" first because\n // another visitor can set it to true. Usually .shouldSkip is false\n // before calling the enter visitor, but it can be true in case of\n // a requeued node (e.g. by .replaceWith()) that is then marked\n // with .skip().\n if (this.shouldSkip || this.call(\"enter\")) {\n this.debug(\"Skip...\");\n return this.shouldStop;\n }\n restoreContext(this, currentContext);\n\n this.debug(\"Recursing into...\");\n this.shouldStop = traverseNode(\n this.node,\n this.opts,\n this.scope,\n this.state,\n this,\n this.skipKeys,\n );\n\n restoreContext(this, currentContext);\n\n this.call(\"exit\");\n\n return this.shouldStop;\n}\n\nexport function skip(this: NodePath) {\n this.shouldSkip = true;\n}\n\nexport function skipKey(this: NodePath, key: string) {\n if (this.skipKeys == null) {\n this.skipKeys = {};\n }\n this.skipKeys[key] = true;\n}\n\nexport function stop(this: NodePath) {\n // this.shouldSkip = true; this.shouldStop = true;\n this._traverseFlags |= SHOULD_SKIP | SHOULD_STOP;\n}\n\nexport function setScope(this: NodePath) {\n if (this.opts && this.opts.noScope) return;\n\n let path = this.parentPath;\n\n // Skip method scope if is computed method key or decorator expression\n if (\n (this.key === \"key\" || this.listKey === \"decorators\") &&\n path.isMethod()\n ) {\n path = path.parentPath;\n }\n\n let target;\n while (path && !target) {\n if (path.opts && path.opts.noScope) return;\n\n target = path.scope;\n path = path.parentPath;\n }\n\n this.scope = this.getScope(target);\n if (this.scope) this.scope.init();\n}\n\nexport function setContext<S = unknown>(\n this: NodePath,\n context?: TraversalContext<S>,\n) {\n if (this.skipKeys != null) {\n this.skipKeys = {};\n }\n // this.shouldSkip = false; this.shouldStop = false; this.removed = false;\n this._traverseFlags = 0;\n\n if (context) {\n this.context = context;\n this.state = context.state;\n this.opts = context.opts;\n }\n\n this.setScope();\n\n return this;\n}\n\n/**\n * Here we resync the node paths `key` and `container`. If they've changed according\n * to what we have stored internally then we attempt to resync by crawling and looking\n * for the new values.\n */\n\nexport function resync(this: NodePath) {\n if (this.removed) return;\n\n this._resyncParent();\n this._resyncList();\n this._resyncKey();\n //this._resyncRemoved();\n}\n\nexport function _resyncParent(this: NodePath) {\n if (this.parentPath) {\n this.parent = this.parentPath.node;\n }\n}\n\nexport function _resyncKey(this: NodePath) {\n if (!this.container) return;\n\n if (\n this.node ===\n // @ts-expect-error this.key should present in this.container\n this.container[this.key]\n ) {\n return;\n }\n\n // grrr, path key is out of sync. this is likely due to a modification to the AST\n // not done through our path APIs\n\n if (Array.isArray(this.container)) {\n for (let i = 0; i < this.container.length; i++) {\n if (this.container[i] === this.node) {\n return this.setKey(i);\n }\n }\n } else {\n for (const key of Object.keys(this.container)) {\n // @ts-expect-error this.key should present in this.container\n if (this.container[key] === this.node) {\n return this.setKey(key);\n }\n }\n }\n\n // ¯\\_(ツ)_/¯ who knows where it's gone lol\n this.key = null;\n}\n\nexport function _resyncList(this: NodePath) {\n if (!this.parent || !this.inList) return;\n\n const newContainer =\n // @ts-expect-error this.listKey should present in this.parent\n this.parent[this.listKey];\n if (this.container === newContainer) return;\n\n // container is out of sync. this is likely the result of it being reassigned\n this.container = newContainer || null;\n}\n\nexport function _resyncRemoved(this: NodePath) {\n if (\n this.key == null ||\n !this.container ||\n // @ts-expect-error this.key should present in this.container\n this.container[this.key] !== this.node\n ) {\n this._markRemoved();\n }\n}\n\nexport function popContext(this: NodePath) {\n this.contexts.pop();\n if (this.contexts.length > 0) {\n this.setContext(this.contexts[this.contexts.length - 1]);\n } else {\n this.setContext(undefined);\n }\n}\n\nexport function pushContext(this: NodePath, context: TraversalContext) {\n this.contexts.push(context);\n this.setContext(context);\n}\n\nexport function setup(\n this: NodePath,\n parentPath: NodePath | undefined,\n container: t.Node,\n listKey: string,\n key: string | number,\n) {\n this.listKey = listKey;\n this.container = container;\n\n this.parentPath = parentPath || this.parentPath;\n this.setKey(key);\n}\n\nexport function setKey(this: NodePath, key: string | number) {\n this.key = key;\n this.node =\n // @ts-expect-error this.key must present in this.container\n this.container[this.key];\n this.type = this.node?.type;\n}\n\nexport function requeue(this: NodePath, pathToQueue = this) {\n if (pathToQueue.removed) return;\n\n // If a path is skipped, and then replaced with a\n // new one, the new one shouldn't probably be skipped.\n if (process.env.BABEL_8_BREAKING) {\n pathToQueue.shouldSkip = false;\n }\n\n // TODO(loganfsmyth): This should be switched back to queue in parent contexts\n // automatically once #2892 and #4135 have been resolved. See #4140.\n // let contexts = this._getQueueContexts();\n const contexts = this.contexts;\n\n for (const context of contexts) {\n context.maybeQueue(pathToQueue);\n }\n}\n\nexport function _getQueueContexts(this: NodePath) {\n let path = this;\n let contexts = this.contexts;\n while (!contexts.length) {\n path = path.parentPath;\n if (!path) break;\n contexts = path.contexts;\n }\n return contexts;\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["call","key","opts","debug","node","_call","type","fns","fn","ret","state","then","Error","_traverseFlags","isDenylisted","denylist","blacklist","indexOf","restoreContext","path","context","visit","shouldSkip","currentContext","shouldStop","traverseNode","scope","skipKeys","skip","skipKey","stop","SHOULD_SKIP","SHOULD_STOP","setScope","noScope","parentPath","listKey","isMethod","target","getScope","init","setContext","resync","removed","_resyncParent","_resyncList","_resyncKey","parent","container","Array","isArray","i","length","setKey","Object","keys","inList","newContainer","_resyncRemoved","_markRemoved","popContext","contexts","pop","undefined","pushContext","push","setup","requeue","pathToQueue","maybeQueue","_getQueueContexts"],"sources":["../../src/path/context.ts"],"sourcesContent":["// This file contains methods responsible for maintaining a TraversalContext.\n\nimport { traverseNode } from \"../traverse-node\";\nimport { SHOULD_SKIP, SHOULD_STOP } from \"./index\";\nimport type TraversalContext from \"../context\";\nimport type NodePath from \"./index\";\nimport type * as t from \"@babel/types\";\n\nexport function call(this: NodePath, key: string): boolean {\n const opts = this.opts;\n\n this.debug(key);\n\n if (this.node) {\n if (this._call(opts[key])) return true;\n }\n\n if (this.node) {\n return this._call(opts[this.node.type] && opts[this.node.type][key]);\n }\n\n return false;\n}\n\nexport function _call(this: NodePath, fns?: Array<Function>): boolean {\n if (!fns) return false;\n\n for (const fn of fns) {\n if (!fn) continue;\n\n const node = this.node;\n if (!node) return true;\n\n const ret = fn.call(this.state, this, this.state);\n if (ret && typeof ret === \"object\" && typeof ret.then === \"function\") {\n throw new Error(\n `You appear to be using a plugin with an async traversal visitor, ` +\n `which your current version of Babel does not support. ` +\n `If you're using a published plugin, you may need to upgrade ` +\n `your @babel/core version.`,\n );\n }\n if (ret) {\n throw new Error(`Unexpected return value from visitor method ${fn}`);\n }\n\n // node has been replaced, it will have been requeued\n if (this.node !== node) return true;\n\n // this.shouldSkip || this.shouldStop || this.removed\n if (this._traverseFlags > 0) return true;\n }\n\n return false;\n}\n\nexport function isDenylisted(this: NodePath): boolean {\n const denylist = this.opts.denylist ?? this.opts.blacklist;\n return denylist && denylist.indexOf(this.node.type) > -1;\n}\n\n// TODO: Remove in Babel 8\nexport { isDenylisted as isBlacklisted };\n\nfunction restoreContext(path: NodePath, context: TraversalContext) {\n if (path.context !== context) {\n path.context = context;\n path.state = context.state;\n path.opts = context.opts;\n }\n}\n\nexport function visit(this: NodePath): boolean {\n if (!this.node) {\n return false;\n }\n\n if (this.isDenylisted()) {\n return false;\n }\n\n if (this.opts.shouldSkip && this.opts.shouldSkip(this)) {\n return false;\n }\n\n const currentContext = this.context;\n // Note: We need to check \"this.shouldSkip\" first because\n // another visitor can set it to true. Usually .shouldSkip is false\n // before calling the enter visitor, but it can be true in case of\n // a requeued node (e.g. by .replaceWith()) that is then marked\n // with .skip().\n if (this.shouldSkip || this.call(\"enter\")) {\n this.debug(\"Skip...\");\n return this.shouldStop;\n }\n restoreContext(this, currentContext);\n\n this.debug(\"Recursing into...\");\n this.shouldStop = traverseNode(\n this.node,\n this.opts,\n this.scope,\n this.state,\n this,\n this.skipKeys,\n );\n\n restoreContext(this, currentContext);\n\n this.call(\"exit\");\n\n return this.shouldStop;\n}\n\nexport function skip(this: NodePath) {\n this.shouldSkip = true;\n}\n\nexport function skipKey(this: NodePath, key: string) {\n if (this.skipKeys == null) {\n this.skipKeys = {};\n }\n this.skipKeys[key] = true;\n}\n\nexport function stop(this: NodePath) {\n // this.shouldSkip = true; this.shouldStop = true;\n this._traverseFlags |= SHOULD_SKIP | SHOULD_STOP;\n}\n\nexport function setScope(this: NodePath) {\n if (this.opts && this.opts.noScope) return;\n\n let path = this.parentPath;\n\n // Skip method scope if is computed method key or decorator expression\n if (\n (this.key === \"key\" || this.listKey === \"decorators\") &&\n path.isMethod()\n ) {\n path = path.parentPath;\n }\n\n let target;\n while (path && !target) {\n if (path.opts && path.opts.noScope) return;\n\n target = path.scope;\n path = path.parentPath;\n }\n\n this.scope = this.getScope(target);\n if (this.scope) this.scope.init();\n}\n\nexport function setContext<S = unknown>(\n this: NodePath,\n context?: TraversalContext<S>,\n) {\n if (this.skipKeys != null) {\n this.skipKeys = {};\n }\n // this.shouldSkip = false; this.shouldStop = false; this.removed = false;\n this._traverseFlags = 0;\n\n if (context) {\n this.context = context;\n this.state = context.state;\n this.opts = context.opts;\n }\n\n this.setScope();\n\n return this;\n}\n\n/**\n * Here we resync the node paths `key` and `container`. If they've changed according\n * to what we have stored internally then we attempt to resync by crawling and looking\n * for the new values.\n */\n\nexport function resync(this: NodePath) {\n if (this.removed) return;\n\n this._resyncParent();\n this._resyncList();\n this._resyncKey();\n //this._resyncRemoved();\n}\n\nexport function _resyncParent(this: NodePath) {\n if (this.parentPath) {\n this.parent = this.parentPath.node;\n }\n}\n\nexport function _resyncKey(this: NodePath) {\n if (!this.container) return;\n\n if (\n this.node ===\n // @ts-expect-error this.key should present in this.container\n this.container[this.key]\n ) {\n return;\n }\n\n // grrr, path key is out of sync. this is likely due to a modification to the AST\n // not done through our path APIs\n\n if (Array.isArray(this.container)) {\n for (let i = 0; i < this.container.length; i++) {\n if (this.container[i] === this.node) {\n return this.setKey(i);\n }\n }\n } else {\n for (const key of Object.keys(this.container)) {\n // @ts-expect-error this.key should present in this.container\n if (this.container[key] === this.node) {\n return this.setKey(key);\n }\n }\n }\n\n // ¯\\_(ツ)_/¯ who knows where it's gone lol\n this.key = null;\n}\n\nexport function _resyncList(this: NodePath) {\n if (!this.parent || !this.inList) return;\n\n const newContainer =\n // @ts-expect-error this.listKey should present in this.parent\n this.parent[this.listKey];\n if (this.container === newContainer) return;\n\n // container is out of sync. this is likely the result of it being reassigned\n this.container = newContainer || null;\n}\n\nexport function _resyncRemoved(this: NodePath) {\n if (\n this.key == null ||\n !this.container ||\n // @ts-expect-error this.key should present in this.container\n this.container[this.key] !== this.node\n ) {\n this._markRemoved();\n }\n}\n\nexport function popContext(this: NodePath) {\n this.contexts.pop();\n if (this.contexts.length > 0) {\n this.setContext(this.contexts[this.contexts.length - 1]);\n } else {\n this.setContext(undefined);\n }\n}\n\nexport function pushContext(this: NodePath, context: TraversalContext) {\n this.contexts.push(context);\n this.setContext(context);\n}\n\nexport function setup(\n this: NodePath,\n parentPath: NodePath | undefined,\n container: t.Node,\n listKey: string,\n key: string | number,\n) {\n this.listKey = listKey;\n this.container = container;\n\n this.parentPath = parentPath || this.parentPath;\n this.setKey(key);\n}\n\nexport function setKey(this: NodePath, key: string | number) {\n this.key = key;\n this.node =\n // @ts-expect-error this.key must present in this.container\n this.container[this.key];\n this.type = this.node?.type;\n}\n\nexport function requeue(this: NodePath, pathToQueue = this) {\n if (pathToQueue.removed) return;\n\n // If a path is skipped, and then replaced with a\n // new one, the new one shouldn't probably be skipped.\n if (process.env.BABEL_8_BREAKING) {\n pathToQueue.shouldSkip = false;\n }\n\n // TODO(loganfsmyth): This should be switched back to queue in parent contexts\n // automatically once #2892 and #4135 have been resolved. See #4140.\n // let contexts = this._getQueueContexts();\n const contexts = this.contexts;\n\n for (const context of contexts) {\n context.maybeQueue(pathToQueue);\n }\n}\n\nexport function _getQueueContexts(this: NodePath) {\n let path = this;\n let contexts = this.contexts;\n while (!contexts.length) {\n path = path.parentPath;\n if (!path) break;\n contexts = path.contexts;\n }\n return contexts;\n}\n"],"mappings":"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"}