@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
@@ -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,67 +92,53 @@ 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;
132
-
133
- if ((this.key === "key" || this.listKey === "decorators") && path.isMethod()) {
110
+ if (
111
+ (this.key === "key" || this.listKey === "decorators") && path.isMethod() ||
112
+ this.key === "discriminant" && path.isSwitchStatement()) {
134
113
  path = path.parentPath;
135
114
  }
136
-
137
115
  let target;
138
-
139
116
  while (path && !target) {
140
117
  if (path.opts && path.opts.noScope) return;
141
118
  target = path.scope;
142
119
  path = path.parentPath;
143
120
  }
144
-
145
121
  this.scope = this.getScope(target);
146
122
  if (this.scope) this.scope.init();
147
123
  }
148
-
149
124
  function setContext(context) {
150
125
  if (this.skipKeys != null) {
151
126
  this.skipKeys = {};
152
127
  }
153
-
154
128
  this._traverseFlags = 0;
155
-
156
129
  if (context) {
157
130
  this.context = context;
158
131
  this.state = context.state;
159
132
  this.opts = context.opts;
160
133
  }
161
-
162
134
  this.setScope();
163
135
  return this;
164
136
  }
165
137
 
166
138
  function resync() {
167
139
  if (this.removed) return;
168
-
169
140
  this._resyncParent();
170
-
171
141
  this._resyncList();
172
-
173
142
  this._resyncKey();
174
143
  }
175
144
 
@@ -178,11 +147,10 @@ function _resyncParent() {
178
147
  this.parent = this.parentPath.node;
179
148
  }
180
149
  }
181
-
182
150
  function _resyncKey() {
183
151
  if (!this.container) return;
184
-
185
- if (this.node === this.container[this.key]) {
152
+ if (this.node ===
153
+ this.container[this.key]) {
186
154
  return;
187
155
  }
188
156
 
@@ -202,70 +170,62 @@ function _resyncKey() {
202
170
 
203
171
  this.key = null;
204
172
  }
205
-
206
173
  function _resyncList() {
207
174
  if (!this.parent || !this.inList) return;
208
- const newContainer = this.parent[this.listKey];
175
+ const newContainer =
176
+ this.parent[this.listKey];
209
177
  if (this.container === newContainer) return;
178
+
210
179
  this.container = newContainer || null;
211
180
  }
212
-
213
181
  function _resyncRemoved() {
214
- if (this.key == null || !this.container || this.container[this.key] !== this.node) {
182
+ if (this.key == null || !this.container ||
183
+ this.container[this.key] !== this.node) {
215
184
  this._markRemoved();
216
185
  }
217
186
  }
218
-
219
187
  function popContext() {
220
188
  this.contexts.pop();
221
-
222
189
  if (this.contexts.length > 0) {
223
190
  this.setContext(this.contexts[this.contexts.length - 1]);
224
191
  } else {
225
192
  this.setContext(undefined);
226
193
  }
227
194
  }
228
-
229
195
  function pushContext(context) {
230
196
  this.contexts.push(context);
231
197
  this.setContext(context);
232
198
  }
233
-
234
199
  function setup(parentPath, container, listKey, key) {
235
200
  this.listKey = listKey;
236
201
  this.container = container;
237
202
  this.parentPath = parentPath || this.parentPath;
238
203
  this.setKey(key);
239
204
  }
240
-
241
205
  function setKey(key) {
242
206
  var _this$node;
243
-
244
207
  this.key = key;
245
- this.node = this.container[this.key];
208
+ this.node =
209
+ this.container[this.key];
246
210
  this.type = (_this$node = this.node) == null ? void 0 : _this$node.type;
247
211
  }
248
-
249
212
  function requeue(pathToQueue = this) {
250
213
  if (pathToQueue.removed) return;
214
+
251
215
  ;
252
216
  const contexts = this.contexts;
253
-
254
217
  for (const context of contexts) {
255
218
  context.maybeQueue(pathToQueue);
256
219
  }
257
220
  }
258
-
259
221
  function _getQueueContexts() {
260
222
  let path = this;
261
223
  let contexts = this.contexts;
262
-
263
224
  while (!contexts.length) {
264
225
  path = path.parentPath;
265
226
  if (!path) break;
266
227
  contexts = path.contexts;
267
228
  }
268
-
269
229
  return contexts;
270
230
  }
271
231
 
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;AAEA;;AACA;;AAKO,SAASA,IAAT,CAA8BC,GAA9B,EAAoD;EACzD,MAAMC,IAAI,GAAG,KAAKA,IAAlB;EAEA,KAAKC,KAAL,CAAWF,GAAX;;EAEA,IAAI,KAAKG,IAAT,EAAe;IACb,IAAI,KAAKC,KAAL,CAAWH,IAAI,CAACD,GAAD,CAAf,CAAJ,EAA2B,OAAO,IAAP;EAC5B;;EAED,IAAI,KAAKG,IAAT,EAAe;IACb,OAAO,KAAKC,KAAL,CAAWH,IAAI,CAAC,KAAKE,IAAL,CAAUE,IAAX,CAAJ,IAAwBJ,IAAI,CAAC,KAAKE,IAAL,CAAUE,IAAX,CAAJ,CAAqBL,GAArB,CAAnC,CAAP;EACD;;EAED,OAAO,KAAP;AACD;;AAEM,SAASI,KAAT,CAA+BE,GAA/B,EAA+D;EACpE,IAAI,CAACA,GAAL,EAAU,OAAO,KAAP;;EAEV,KAAK,MAAMC,EAAX,IAAiBD,GAAjB,EAAsB;IACpB,IAAI,CAACC,EAAL,EAAS;IAET,MAAMJ,IAAI,GAAG,KAAKA,IAAlB;IACA,IAAI,CAACA,IAAL,EAAW,OAAO,IAAP;IAEX,MAAMK,GAAG,GAAGD,EAAE,CAACR,IAAH,CAAQ,KAAKU,KAAb,EAAoB,IAApB,EAA0B,KAAKA,KAA/B,CAAZ;;IACA,IAAID,GAAG,IAAI,OAAOA,GAAP,KAAe,QAAtB,IAAkC,OAAOA,GAAG,CAACE,IAAX,KAAoB,UAA1D,EAAsE;MACpE,MAAM,IAAIC,KAAJ,CACH,mEAAD,GACG,wDADH,GAEG,8DAFH,GAGG,2BAJC,CAAN;IAMD;;IACD,IAAIH,GAAJ,EAAS;MACP,MAAM,IAAIG,KAAJ,CAAW,+CAA8CJ,EAAG,EAA5D,CAAN;IACD;;IAGD,IAAI,KAAKJ,IAAL,KAAcA,IAAlB,EAAwB,OAAO,IAAP;IAGxB,IAAI,KAAKS,cAAL,GAAsB,CAA1B,EAA6B,OAAO,IAAP;EAC9B;;EAED,OAAO,KAAP;AACD;;AAEM,SAASC,YAAT,GAA+C;EAAA;;EACpD,MAAMC,QAAQ,0BAAG,KAAKb,IAAL,CAAUa,QAAb,kCAAyB,KAAKb,IAAL,CAAUc,SAAjD;EACA,OAAOD,QAAQ,IAAIA,QAAQ,CAACE,OAAT,CAAiB,KAAKb,IAAL,CAAUE,IAA3B,IAAmC,CAAC,CAAvD;AACD;;AAKD,SAASY,cAAT,CAAwBC,IAAxB,EAAwCC,OAAxC,EAAmE;EACjE,IAAID,IAAI,CAACC,OAAL,KAAiBA,OAArB,EAA8B;IAC5BD,IAAI,CAACC,OAAL,GAAeA,OAAf;IACAD,IAAI,CAACT,KAAL,GAAaU,OAAO,CAACV,KAArB;IACAS,IAAI,CAACjB,IAAL,GAAYkB,OAAO,CAAClB,IAApB;EACD;AACF;;AAEM,SAASmB,KAAT,GAAwC;EAC7C,IAAI,CAAC,KAAKjB,IAAV,EAAgB;IACd,OAAO,KAAP;EACD;;EAED,IAAI,KAAKU,YAAL,EAAJ,EAAyB;IACvB,OAAO,KAAP;EACD;;EAED,IAAI,KAAKZ,IAAL,CAAUoB,UAAV,IAAwB,KAAKpB,IAAL,CAAUoB,UAAV,CAAqB,IAArB,CAA5B,EAAwD;IACtD,OAAO,KAAP;EACD;;EAED,MAAMC,cAAc,GAAG,KAAKH,OAA5B;;EAMA,IAAI,KAAKE,UAAL,IAAmB,KAAKtB,IAAL,CAAU,OAAV,CAAvB,EAA2C;IACzC,KAAKG,KAAL,CAAW,SAAX;IACA,OAAO,KAAKqB,UAAZ;EACD;;EACDN,cAAc,CAAC,IAAD,EAAOK,cAAP,CAAd;EAEA,KAAKpB,KAAL,CAAW,mBAAX;EACA,KAAKqB,UAAL,GAAkB,IAAAC,0BAAA,EAChB,KAAKrB,IADW,EAEhB,KAAKF,IAFW,EAGhB,KAAKwB,KAHW,EAIhB,KAAKhB,KAJW,EAKhB,IALgB,EAMhB,KAAKiB,QANW,CAAlB;EASAT,cAAc,CAAC,IAAD,EAAOK,cAAP,CAAd;EAEA,KAAKvB,IAAL,CAAU,MAAV;EAEA,OAAO,KAAKwB,UAAZ;AACD;;AAEM,SAASI,IAAT,GAA8B;EACnC,KAAKN,UAAL,GAAkB,IAAlB;AACD;;AAEM,SAASO,OAAT,CAAiC5B,GAAjC,EAA8C;EACnD,IAAI,KAAK0B,QAAL,IAAiB,IAArB,EAA2B;IACzB,KAAKA,QAAL,GAAgB,EAAhB;EACD;;EACD,KAAKA,QAAL,CAAc1B,GAAd,IAAqB,IAArB;AACD;;AAEM,SAAS6B,IAAT,GAA8B;EAEnC,KAAKjB,cAAL,IAAuBkB,kBAAA,GAAcC,kBAArC;AACD;;AAEM,SAASC,QAAT,GAAkC;EACvC,IAAI,KAAK/B,IAAL,IAAa,KAAKA,IAAL,CAAUgC,OAA3B,EAAoC;EAEpC,IAAIf,IAAI,GAAG,KAAKgB,UAAhB;;EAGA,IACE,CAAC,KAAKlC,GAAL,KAAa,KAAb,IAAsB,KAAKmC,OAAL,KAAiB,YAAxC,KACAjB,IAAI,CAACkB,QAAL,EAFF,EAGE;IACAlB,IAAI,GAAGA,IAAI,CAACgB,UAAZ;EACD;;EAED,IAAIG,MAAJ;;EACA,OAAOnB,IAAI,IAAI,CAACmB,MAAhB,EAAwB;IACtB,IAAInB,IAAI,CAACjB,IAAL,IAAaiB,IAAI,CAACjB,IAAL,CAAUgC,OAA3B,EAAoC;IAEpCI,MAAM,GAAGnB,IAAI,CAACO,KAAd;IACAP,IAAI,GAAGA,IAAI,CAACgB,UAAZ;EACD;;EAED,KAAKT,KAAL,GAAa,KAAKa,QAAL,CAAcD,MAAd,CAAb;EACA,IAAI,KAAKZ,KAAT,EAAgB,KAAKA,KAAL,CAAWc,IAAX;AACjB;;AAEM,SAASC,UAAT,CAELrB,OAFK,EAGL;EACA,IAAI,KAAKO,QAAL,IAAiB,IAArB,EAA2B;IACzB,KAAKA,QAAL,GAAgB,EAAhB;EACD;;EAED,KAAKd,cAAL,GAAsB,CAAtB;;EAEA,IAAIO,OAAJ,EAAa;IACX,KAAKA,OAAL,GAAeA,OAAf;IACA,KAAKV,KAAL,GAAaU,OAAO,CAACV,KAArB;IACA,KAAKR,IAAL,GAAYkB,OAAO,CAAClB,IAApB;EACD;;EAED,KAAK+B,QAAL;EAEA,OAAO,IAAP;AACD;;AAQM,SAASS,MAAT,GAAgC;EACrC,IAAI,KAAKC,OAAT,EAAkB;;EAElB,KAAKC,aAAL;;EACA,KAAKC,WAAL;;EACA,KAAKC,UAAL;AAED;;AAEM,SAASF,aAAT,GAAuC;EAC5C,IAAI,KAAKT,UAAT,EAAqB;IACnB,KAAKY,MAAL,GAAc,KAAKZ,UAAL,CAAgB/B,IAA9B;EACD;AACF;;AAEM,SAAS0C,UAAT,GAAoC;EACzC,IAAI,CAAC,KAAKE,SAAV,EAAqB;;EAErB,IACE,KAAK5C,IAAL,KAEA,KAAK4C,SAAL,CAAe,KAAK/C,GAApB,CAHF,EAIE;IACA;EACD;;EAKD,IAAIgD,KAAK,CAACC,OAAN,CAAc,KAAKF,SAAnB,CAAJ,EAAmC;IACjC,KAAK,IAAIG,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,KAAKH,SAAL,CAAeI,MAAnC,EAA2CD,CAAC,EAA5C,EAAgD;MAC9C,IAAI,KAAKH,SAAL,CAAeG,CAAf,MAAsB,KAAK/C,IAA/B,EAAqC;QACnC,OAAO,KAAKiD,MAAL,CAAYF,CAAZ,CAAP;MACD;IACF;EACF,CAND,MAMO;IACL,KAAK,MAAMlD,GAAX,IAAkBqD,MAAM,CAACC,IAAP,CAAY,KAAKP,SAAjB,CAAlB,EAA+C;MAE7C,IAAI,KAAKA,SAAL,CAAe/C,GAAf,MAAwB,KAAKG,IAAjC,EAAuC;QACrC,OAAO,KAAKiD,MAAL,CAAYpD,GAAZ,CAAP;MACD;IACF;EACF;;EAGD,KAAKA,GAAL,GAAW,IAAX;AACD;;AAEM,SAAS4C,WAAT,GAAqC;EAC1C,IAAI,CAAC,KAAKE,MAAN,IAAgB,CAAC,KAAKS,MAA1B,EAAkC;EAElC,MAAMC,YAAY,GAEhB,KAAKV,MAAL,CAAY,KAAKX,OAAjB,CAFF;EAGA,IAAI,KAAKY,SAAL,KAAmBS,YAAvB,EAAqC;EAGrC,KAAKT,SAAL,GAAiBS,YAAY,IAAI,IAAjC;AACD;;AAEM,SAASC,cAAT,GAAwC;EAC7C,IACE,KAAKzD,GAAL,IAAY,IAAZ,IACA,CAAC,KAAK+C,SADN,IAGA,KAAKA,SAAL,CAAe,KAAK/C,GAApB,MAA6B,KAAKG,IAJpC,EAKE;IACA,KAAKuD,YAAL;EACD;AACF;;AAEM,SAASC,UAAT,GAAoC;EACzC,KAAKC,QAAL,CAAcC,GAAd;;EACA,IAAI,KAAKD,QAAL,CAAcT,MAAd,GAAuB,CAA3B,EAA8B;IAC5B,KAAKX,UAAL,CAAgB,KAAKoB,QAAL,CAAc,KAAKA,QAAL,CAAcT,MAAd,GAAuB,CAArC,CAAhB;EACD,CAFD,MAEO;IACL,KAAKX,UAAL,CAAgBsB,SAAhB;EACD;AACF;;AAEM,SAASC,WAAT,CAAqC5C,OAArC,EAAgE;EACrE,KAAKyC,QAAL,CAAcI,IAAd,CAAmB7C,OAAnB;EACA,KAAKqB,UAAL,CAAgBrB,OAAhB;AACD;;AAEM,SAAS8C,KAAT,CAEL/B,UAFK,EAGLa,SAHK,EAILZ,OAJK,EAKLnC,GALK,EAML;EACA,KAAKmC,OAAL,GAAeA,OAAf;EACA,KAAKY,SAAL,GAAiBA,SAAjB;EAEA,KAAKb,UAAL,GAAkBA,UAAU,IAAI,KAAKA,UAArC;EACA,KAAKkB,MAAL,CAAYpD,GAAZ;AACD;;AAEM,SAASoD,MAAT,CAAgCpD,GAAhC,EAAsD;EAAA;;EAC3D,KAAKA,GAAL,GAAWA,GAAX;EACA,KAAKG,IAAL,GAEE,KAAK4C,SAAL,CAAe,KAAK/C,GAApB,CAFF;EAGA,KAAKK,IAAL,iBAAY,KAAKF,IAAjB,qBAAY,WAAWE,IAAvB;AACD;;AAEM,SAAS6D,OAAT,CAAiCC,WAAW,GAAG,IAA/C,EAAqD;EAC1D,IAAIA,WAAW,CAACzB,OAAhB,EAAyB;EADiC;EAY1D,MAAMkB,QAAQ,GAAG,KAAKA,QAAtB;;EAEA,KAAK,MAAMzC,OAAX,IAAsByC,QAAtB,EAAgC;IAC9BzC,OAAO,CAACiD,UAAR,CAAmBD,WAAnB;EACD;AACF;;AAEM,SAASE,iBAAT,GAA2C;EAChD,IAAInD,IAAI,GAAG,IAAX;EACA,IAAI0C,QAAQ,GAAG,KAAKA,QAApB;;EACA,OAAO,CAACA,QAAQ,CAACT,MAAjB,EAAyB;IACvBjC,IAAI,GAAGA,IAAI,CAACgB,UAAZ;IACA,IAAI,CAAChB,IAAL,EAAW;IACX0C,QAAQ,GAAG1C,IAAI,CAAC0C,QAAhB;EACD;;EACD,OAAOA,QAAP;AACD"}
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","isSwitchStatement","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 if (\n // Skip method scope if is computed method key or decorator expression\n ((this.key === \"key\" || this.listKey === \"decorators\") &&\n path.isMethod()) ||\n // Skip switch scope if for discriminant (`x` in `switch (x) {}`).\n (this.key === \"discriminant\" && path.isSwitchStatement())\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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"}