1"use strict";
2
3exports.__esModule = true;
4exports.createTypeAnnotationBasedOnTypeof = exports.removeTypeDuplicates = exports.createUnionTypeAnnotation = exports.valueToNode = exports.toBlock = exports.toExpression = exports.toStatement = exports.toBindingIdentifierName = exports.toIdentifier = exports.toKeyAlias = exports.toSequenceExpression = exports.toComputedKey = exports.isNodesEquivalent = exports.isImmutable = exports.isScope = exports.isSpecifierDefault = exports.isVar = exports.isBlockScoped = exports.isLet = exports.isValidIdentifier = exports.isReferenced = exports.isBinding = exports.getOuterBindingIdentifiers = exports.getBindingIdentifiers = exports.TYPES = exports.react = exports.DEPRECATED_KEYS = exports.BUILDER_KEYS = exports.NODE_FIELDS = exports.ALIAS_KEYS = exports.VISITOR_KEYS = exports.NOT_LOCAL_BINDING = exports.BLOCK_SCOPED_SYMBOL = exports.INHERIT_KEYS = exports.UNARY_OPERATORS = exports.STRING_UNARY_OPERATORS = exports.NUMBER_UNARY_OPERATORS = exports.BOOLEAN_UNARY_OPERATORS = exports.BINARY_OPERATORS = exports.NUMBER_BINARY_OPERATORS = exports.BOOLEAN_BINARY_OPERATORS = exports.COMPARISON_BINARY_OPERATORS = exports.EQUALITY_BINARY_OPERATORS = exports.BOOLEAN_NUMBER_BINARY_OPERATORS = exports.UPDATE_OPERATORS = exports.LOGICAL_OPERATORS = exports.COMMENT_KEYS = exports.FOR_INIT_KEYS = exports.FLATTENABLE_KEYS = exports.STATEMENT_OR_BLOCK_KEYS = undefined;
5
6var _getOwnPropertySymbols = require("babel-runtime/core-js/object/get-own-property-symbols");
7
8var _getOwnPropertySymbols2 = _interopRequireDefault(_getOwnPropertySymbols);
9
10var _getIterator2 = require("babel-runtime/core-js/get-iterator");
11
12var _getIterator3 = _interopRequireDefault(_getIterator2);
13
14var _keys = require("babel-runtime/core-js/object/keys");
15
16var _keys2 = _interopRequireDefault(_keys);
17
18var _stringify = require("babel-runtime/core-js/json/stringify");
19
20var _stringify2 = _interopRequireDefault(_stringify);
21
22var _constants = require("./constants");
23
24Object.defineProperty(exports, "STATEMENT_OR_BLOCK_KEYS", {
25  enumerable: true,
26  get: function get() {
27    return _constants.STATEMENT_OR_BLOCK_KEYS;
28  }
29});
30Object.defineProperty(exports, "FLATTENABLE_KEYS", {
31  enumerable: true,
32  get: function get() {
33    return _constants.FLATTENABLE_KEYS;
34  }
35});
36Object.defineProperty(exports, "FOR_INIT_KEYS", {
37  enumerable: true,
38  get: function get() {
39    return _constants.FOR_INIT_KEYS;
40  }
41});
42Object.defineProperty(exports, "COMMENT_KEYS", {
43  enumerable: true,
44  get: function get() {
45    return _constants.COMMENT_KEYS;
46  }
47});
48Object.defineProperty(exports, "LOGICAL_OPERATORS", {
49  enumerable: true,
50  get: function get() {
51    return _constants.LOGICAL_OPERATORS;
52  }
53});
54Object.defineProperty(exports, "UPDATE_OPERATORS", {
55  enumerable: true,
56  get: function get() {
57    return _constants.UPDATE_OPERATORS;
58  }
59});
60Object.defineProperty(exports, "BOOLEAN_NUMBER_BINARY_OPERATORS", {
61  enumerable: true,
62  get: function get() {
63    return _constants.BOOLEAN_NUMBER_BINARY_OPERATORS;
64  }
65});
66Object.defineProperty(exports, "EQUALITY_BINARY_OPERATORS", {
67  enumerable: true,
68  get: function get() {
69    return _constants.EQUALITY_BINARY_OPERATORS;
70  }
71});
72Object.defineProperty(exports, "COMPARISON_BINARY_OPERATORS", {
73  enumerable: true,
74  get: function get() {
75    return _constants.COMPARISON_BINARY_OPERATORS;
76  }
77});
78Object.defineProperty(exports, "BOOLEAN_BINARY_OPERATORS", {
79  enumerable: true,
80  get: function get() {
81    return _constants.BOOLEAN_BINARY_OPERATORS;
82  }
83});
84Object.defineProperty(exports, "NUMBER_BINARY_OPERATORS", {
85  enumerable: true,
86  get: function get() {
87    return _constants.NUMBER_BINARY_OPERATORS;
88  }
89});
90Object.defineProperty(exports, "BINARY_OPERATORS", {
91  enumerable: true,
92  get: function get() {
93    return _constants.BINARY_OPERATORS;
94  }
95});
96Object.defineProperty(exports, "BOOLEAN_UNARY_OPERATORS", {
97  enumerable: true,
98  get: function get() {
99    return _constants.BOOLEAN_UNARY_OPERATORS;
100  }
101});
102Object.defineProperty(exports, "NUMBER_UNARY_OPERATORS", {
103  enumerable: true,
104  get: function get() {
105    return _constants.NUMBER_UNARY_OPERATORS;
106  }
107});
108Object.defineProperty(exports, "STRING_UNARY_OPERATORS", {
109  enumerable: true,
110  get: function get() {
111    return _constants.STRING_UNARY_OPERATORS;
112  }
113});
114Object.defineProperty(exports, "UNARY_OPERATORS", {
115  enumerable: true,
116  get: function get() {
117    return _constants.UNARY_OPERATORS;
118  }
119});
120Object.defineProperty(exports, "INHERIT_KEYS", {
121  enumerable: true,
122  get: function get() {
123    return _constants.INHERIT_KEYS;
124  }
125});
126Object.defineProperty(exports, "BLOCK_SCOPED_SYMBOL", {
127  enumerable: true,
128  get: function get() {
129    return _constants.BLOCK_SCOPED_SYMBOL;
130  }
131});
132Object.defineProperty(exports, "NOT_LOCAL_BINDING", {
133  enumerable: true,
134  get: function get() {
135    return _constants.NOT_LOCAL_BINDING;
136  }
137});
138exports.is = is;
139exports.isType = isType;
140exports.validate = validate;
141exports.shallowEqual = shallowEqual;
142exports.appendToMemberExpression = appendToMemberExpression;
143exports.prependToMemberExpression = prependToMemberExpression;
144exports.ensureBlock = ensureBlock;
145exports.clone = clone;
146exports.cloneWithoutLoc = cloneWithoutLoc;
147exports.cloneDeep = cloneDeep;
148exports.buildMatchMemberExpression = buildMatchMemberExpression;
149exports.removeComments = removeComments;
150exports.inheritsComments = inheritsComments;
151exports.inheritTrailingComments = inheritTrailingComments;
152exports.inheritLeadingComments = inheritLeadingComments;
153exports.inheritInnerComments = inheritInnerComments;
154exports.inherits = inherits;
155exports.assertNode = assertNode;
156exports.isNode = isNode;
157exports.traverseFast = traverseFast;
158exports.removeProperties = removeProperties;
159exports.removePropertiesDeep = removePropertiesDeep;
160
161var _retrievers = require("./retrievers");
162
163Object.defineProperty(exports, "getBindingIdentifiers", {
164  enumerable: true,
165  get: function get() {
166    return _retrievers.getBindingIdentifiers;
167  }
168});
169Object.defineProperty(exports, "getOuterBindingIdentifiers", {
170  enumerable: true,
171  get: function get() {
172    return _retrievers.getOuterBindingIdentifiers;
173  }
174});
175
176var _validators = require("./validators");
177
178Object.defineProperty(exports, "isBinding", {
179  enumerable: true,
180  get: function get() {
181    return _validators.isBinding;
182  }
183});
184Object.defineProperty(exports, "isReferenced", {
185  enumerable: true,
186  get: function get() {
187    return _validators.isReferenced;
188  }
189});
190Object.defineProperty(exports, "isValidIdentifier", {
191  enumerable: true,
192  get: function get() {
193    return _validators.isValidIdentifier;
194  }
195});
196Object.defineProperty(exports, "isLet", {
197  enumerable: true,
198  get: function get() {
199    return _validators.isLet;
200  }
201});
202Object.defineProperty(exports, "isBlockScoped", {
203  enumerable: true,
204  get: function get() {
205    return _validators.isBlockScoped;
206  }
207});
208Object.defineProperty(exports, "isVar", {
209  enumerable: true,
210  get: function get() {
211    return _validators.isVar;
212  }
213});
214Object.defineProperty(exports, "isSpecifierDefault", {
215  enumerable: true,
216  get: function get() {
217    return _validators.isSpecifierDefault;
218  }
219});
220Object.defineProperty(exports, "isScope", {
221  enumerable: true,
222  get: function get() {
223    return _validators.isScope;
224  }
225});
226Object.defineProperty(exports, "isImmutable", {
227  enumerable: true,
228  get: function get() {
229    return _validators.isImmutable;
230  }
231});
232Object.defineProperty(exports, "isNodesEquivalent", {
233  enumerable: true,
234  get: function get() {
235    return _validators.isNodesEquivalent;
236  }
237});
238
239var _converters = require("./converters");
240
241Object.defineProperty(exports, "toComputedKey", {
242  enumerable: true,
243  get: function get() {
244    return _converters.toComputedKey;
245  }
246});
247Object.defineProperty(exports, "toSequenceExpression", {
248  enumerable: true,
249  get: function get() {
250    return _converters.toSequenceExpression;
251  }
252});
253Object.defineProperty(exports, "toKeyAlias", {
254  enumerable: true,
255  get: function get() {
256    return _converters.toKeyAlias;
257  }
258});
259Object.defineProperty(exports, "toIdentifier", {
260  enumerable: true,
261  get: function get() {
262    return _converters.toIdentifier;
263  }
264});
265Object.defineProperty(exports, "toBindingIdentifierName", {
266  enumerable: true,
267  get: function get() {
268    return _converters.toBindingIdentifierName;
269  }
270});
271Object.defineProperty(exports, "toStatement", {
272  enumerable: true,
273  get: function get() {
274    return _converters.toStatement;
275  }
276});
277Object.defineProperty(exports, "toExpression", {
278  enumerable: true,
279  get: function get() {
280    return _converters.toExpression;
281  }
282});
283Object.defineProperty(exports, "toBlock", {
284  enumerable: true,
285  get: function get() {
286    return _converters.toBlock;
287  }
288});
289Object.defineProperty(exports, "valueToNode", {
290  enumerable: true,
291  get: function get() {
292    return _converters.valueToNode;
293  }
294});
295
296var _flow = require("./flow");
297
298Object.defineProperty(exports, "createUnionTypeAnnotation", {
299  enumerable: true,
300  get: function get() {
301    return _flow.createUnionTypeAnnotation;
302  }
303});
304Object.defineProperty(exports, "removeTypeDuplicates", {
305  enumerable: true,
306  get: function get() {
307    return _flow.removeTypeDuplicates;
308  }
309});
310Object.defineProperty(exports, "createTypeAnnotationBasedOnTypeof", {
311  enumerable: true,
312  get: function get() {
313    return _flow.createTypeAnnotationBasedOnTypeof;
314  }
315});
316
317var _toFastProperties = require("to-fast-properties");
318
319var _toFastProperties2 = _interopRequireDefault(_toFastProperties);
320
321var _clone = require("lodash/clone");
322
323var _clone2 = _interopRequireDefault(_clone);
324
325var _uniq = require("lodash/uniq");
326
327var _uniq2 = _interopRequireDefault(_uniq);
328
329require("./definitions/init");
330
331var _definitions = require("./definitions");
332
333var _react2 = require("./react");
334
335var _react = _interopRequireWildcard(_react2);
336
337function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
338
339function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
340
341var t = exports;
342
343function registerType(type) {
344  var is = t["is" + type];
345  if (!is) {
346    is = t["is" + type] = function (node, opts) {
347      return t.is(type, node, opts);
348    };
349  }
350
351  t["assert" + type] = function (node, opts) {
352    opts = opts || {};
353    if (!is(node, opts)) {
354      throw new Error("Expected type " + (0, _stringify2.default)(type) + " with option " + (0, _stringify2.default)(opts));
355    }
356  };
357}
358
359exports.VISITOR_KEYS = _definitions.VISITOR_KEYS;
360exports.ALIAS_KEYS = _definitions.ALIAS_KEYS;
361exports.NODE_FIELDS = _definitions.NODE_FIELDS;
362exports.BUILDER_KEYS = _definitions.BUILDER_KEYS;
363exports.DEPRECATED_KEYS = _definitions.DEPRECATED_KEYS;
364exports.react = _react;
365
366
367for (var type in t.VISITOR_KEYS) {
368  registerType(type);
369}
370
371t.FLIPPED_ALIAS_KEYS = {};
372
373(0, _keys2.default)(t.ALIAS_KEYS).forEach(function (type) {
374  t.ALIAS_KEYS[type].forEach(function (alias) {
375    var types = t.FLIPPED_ALIAS_KEYS[alias] = t.FLIPPED_ALIAS_KEYS[alias] || [];
376    types.push(type);
377  });
378});
379
380(0, _keys2.default)(t.FLIPPED_ALIAS_KEYS).forEach(function (type) {
381  t[type.toUpperCase() + "_TYPES"] = t.FLIPPED_ALIAS_KEYS[type];
382  registerType(type);
383});
384
385var TYPES = exports.TYPES = (0, _keys2.default)(t.VISITOR_KEYS).concat((0, _keys2.default)(t.FLIPPED_ALIAS_KEYS)).concat((0, _keys2.default)(t.DEPRECATED_KEYS));
386
387function is(type, node, opts) {
388  if (!node) return false;
389
390  var matches = isType(node.type, type);
391  if (!matches) return false;
392
393  if (typeof opts === "undefined") {
394    return true;
395  } else {
396    return t.shallowEqual(node, opts);
397  }
398}
399
400function isType(nodeType, targetType) {
401  if (nodeType === targetType) return true;
402
403  if (t.ALIAS_KEYS[targetType]) return false;
404
405  var aliases = t.FLIPPED_ALIAS_KEYS[targetType];
406  if (aliases) {
407    if (aliases[0] === nodeType) return true;
408
409    for (var _iterator = aliases, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
410      var _ref;
411
412      if (_isArray) {
413        if (_i >= _iterator.length) break;
414        _ref = _iterator[_i++];
415      } else {
416        _i = _iterator.next();
417        if (_i.done) break;
418        _ref = _i.value;
419      }
420
421      var alias = _ref;
422
423      if (nodeType === alias) return true;
424    }
425  }
426
427  return false;
428}
429
430(0, _keys2.default)(t.BUILDER_KEYS).forEach(function (type) {
431  var keys = t.BUILDER_KEYS[type];
432
433  function builder() {
434    if (arguments.length > keys.length) {
435      throw new Error("t." + type + ": Too many arguments passed. Received " + arguments.length + " but can receive " + ("no more than " + keys.length));
436    }
437
438    var node = {};
439    node.type = type;
440
441    var i = 0;
442
443    for (var _iterator2 = keys, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {
444      var _ref2;
445
446      if (_isArray2) {
447        if (_i2 >= _iterator2.length) break;
448        _ref2 = _iterator2[_i2++];
449      } else {
450        _i2 = _iterator2.next();
451        if (_i2.done) break;
452        _ref2 = _i2.value;
453      }
454
455      var _key = _ref2;
456
457      var field = t.NODE_FIELDS[type][_key];
458
459      var arg = arguments[i++];
460      if (arg === undefined) arg = (0, _clone2.default)(field.default);
461
462      node[_key] = arg;
463    }
464
465    for (var key in node) {
466      validate(node, key, node[key]);
467    }
468
469    return node;
470  }
471
472  t[type] = builder;
473  t[type[0].toLowerCase() + type.slice(1)] = builder;
474});
475
476var _loop = function _loop(_type) {
477  var newType = t.DEPRECATED_KEYS[_type];
478
479  function proxy(fn) {
480    return function () {
481      console.trace("The node type " + _type + " has been renamed to " + newType);
482      return fn.apply(this, arguments);
483    };
484  }
485
486  t[_type] = t[_type[0].toLowerCase() + _type.slice(1)] = proxy(t[newType]);
487  t["is" + _type] = proxy(t["is" + newType]);
488  t["assert" + _type] = proxy(t["assert" + newType]);
489};
490
491for (var _type in t.DEPRECATED_KEYS) {
492  _loop(_type);
493}
494
495function validate(node, key, val) {
496  if (!node) return;
497
498  var fields = t.NODE_FIELDS[node.type];
499  if (!fields) return;
500
501  var field = fields[key];
502  if (!field || !field.validate) return;
503  if (field.optional && val == null) return;
504
505  field.validate(node, key, val);
506}
507
508function shallowEqual(actual, expected) {
509  var keys = (0, _keys2.default)(expected);
510
511  for (var _iterator3 = keys, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : (0, _getIterator3.default)(_iterator3);;) {
512    var _ref3;
513
514    if (_isArray3) {
515      if (_i3 >= _iterator3.length) break;
516      _ref3 = _iterator3[_i3++];
517    } else {
518      _i3 = _iterator3.next();
519      if (_i3.done) break;
520      _ref3 = _i3.value;
521    }
522
523    var key = _ref3;
524
525    if (actual[key] !== expected[key]) {
526      return false;
527    }
528  }
529
530  return true;
531}
532
533function appendToMemberExpression(member, append, computed) {
534  member.object = t.memberExpression(member.object, member.property, member.computed);
535  member.property = append;
536  member.computed = !!computed;
537  return member;
538}
539
540function prependToMemberExpression(member, prepend) {
541  member.object = t.memberExpression(prepend, member.object);
542  return member;
543}
544
545function ensureBlock(node) {
546  var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "body";
547
548  return node[key] = t.toBlock(node[key], node);
549}
550
551function clone(node) {
552  if (!node) return node;
553  var newNode = {};
554  for (var key in node) {
555    if (key[0] === "_") continue;
556    newNode[key] = node[key];
557  }
558  return newNode;
559}
560
561function cloneWithoutLoc(node) {
562  var newNode = clone(node);
563  delete newNode.loc;
564  return newNode;
565}
566
567function cloneDeep(node) {
568  if (!node) return node;
569  var newNode = {};
570
571  for (var key in node) {
572    if (key[0] === "_") continue;
573
574    var val = node[key];
575
576    if (val) {
577      if (val.type) {
578        val = t.cloneDeep(val);
579      } else if (Array.isArray(val)) {
580        val = val.map(t.cloneDeep);
581      }
582    }
583
584    newNode[key] = val;
585  }
586
587  return newNode;
588}
589
590function buildMatchMemberExpression(match, allowPartial) {
591  var parts = match.split(".");
592
593  return function (member) {
594    if (!t.isMemberExpression(member)) return false;
595
596    var search = [member];
597    var i = 0;
598
599    while (search.length) {
600      var node = search.shift();
601
602      if (allowPartial && i === parts.length) {
603        return true;
604      }
605
606      if (t.isIdentifier(node)) {
607        if (parts[i] !== node.name) return false;
608      } else if (t.isStringLiteral(node)) {
609        if (parts[i] !== node.value) return false;
610      } else if (t.isMemberExpression(node)) {
611        if (node.computed && !t.isStringLiteral(node.property)) {
612          return false;
613        } else {
614          search.push(node.object);
615          search.push(node.property);
616          continue;
617        }
618      } else {
619        return false;
620      }
621
622      if (++i > parts.length) {
623        return false;
624      }
625    }
626
627    return true;
628  };
629}
630
631function removeComments(node) {
632  for (var _iterator4 = t.COMMENT_KEYS, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : (0, _getIterator3.default)(_iterator4);;) {
633    var _ref4;
634
635    if (_isArray4) {
636      if (_i4 >= _iterator4.length) break;
637      _ref4 = _iterator4[_i4++];
638    } else {
639      _i4 = _iterator4.next();
640      if (_i4.done) break;
641      _ref4 = _i4.value;
642    }
643
644    var key = _ref4;
645
646    delete node[key];
647  }
648  return node;
649}
650
651function inheritsComments(child, parent) {
652  inheritTrailingComments(child, parent);
653  inheritLeadingComments(child, parent);
654  inheritInnerComments(child, parent);
655  return child;
656}
657
658function inheritTrailingComments(child, parent) {
659  _inheritComments("trailingComments", child, parent);
660}
661
662function inheritLeadingComments(child, parent) {
663  _inheritComments("leadingComments", child, parent);
664}
665
666function inheritInnerComments(child, parent) {
667  _inheritComments("innerComments", child, parent);
668}
669
670function _inheritComments(key, child, parent) {
671  if (child && parent) {
672    child[key] = (0, _uniq2.default)([].concat(child[key], parent[key]).filter(Boolean));
673  }
674}
675
676function inherits(child, parent) {
677  if (!child || !parent) return child;
678
679  for (var _iterator5 = t.INHERIT_KEYS.optional, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : (0, _getIterator3.default)(_iterator5);;) {
680    var _ref5;
681
682    if (_isArray5) {
683      if (_i5 >= _iterator5.length) break;
684      _ref5 = _iterator5[_i5++];
685    } else {
686      _i5 = _iterator5.next();
687      if (_i5.done) break;
688      _ref5 = _i5.value;
689    }
690
691    var _key2 = _ref5;
692
693    if (child[_key2] == null) {
694      child[_key2] = parent[_key2];
695    }
696  }
697
698  for (var key in parent) {
699    if (key[0] === "_") child[key] = parent[key];
700  }
701
702  for (var _iterator6 = t.INHERIT_KEYS.force, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : (0, _getIterator3.default)(_iterator6);;) {
703    var _ref6;
704
705    if (_isArray6) {
706      if (_i6 >= _iterator6.length) break;
707      _ref6 = _iterator6[_i6++];
708    } else {
709      _i6 = _iterator6.next();
710      if (_i6.done) break;
711      _ref6 = _i6.value;
712    }
713
714    var _key3 = _ref6;
715
716    child[_key3] = parent[_key3];
717  }
718
719  t.inheritsComments(child, parent);
720
721  return child;
722}
723
724function assertNode(node) {
725  if (!isNode(node)) {
726    throw new TypeError("Not a valid node " + (node && node.type));
727  }
728}
729
730function isNode(node) {
731  return !!(node && _definitions.VISITOR_KEYS[node.type]);
732}
733
734(0, _toFastProperties2.default)(t);
735(0, _toFastProperties2.default)(t.VISITOR_KEYS);
736
737function traverseFast(node, enter, opts) {
738  if (!node) return;
739
740  var keys = t.VISITOR_KEYS[node.type];
741  if (!keys) return;
742
743  opts = opts || {};
744  enter(node, opts);
745
746  for (var _iterator7 = keys, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : (0, _getIterator3.default)(_iterator7);;) {
747    var _ref7;
748
749    if (_isArray7) {
750      if (_i7 >= _iterator7.length) break;
751      _ref7 = _iterator7[_i7++];
752    } else {
753      _i7 = _iterator7.next();
754      if (_i7.done) break;
755      _ref7 = _i7.value;
756    }
757
758    var key = _ref7;
759
760    var subNode = node[key];
761
762    if (Array.isArray(subNode)) {
763      for (var _iterator8 = subNode, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : (0, _getIterator3.default)(_iterator8);;) {
764        var _ref8;
765
766        if (_isArray8) {
767          if (_i8 >= _iterator8.length) break;
768          _ref8 = _iterator8[_i8++];
769        } else {
770          _i8 = _iterator8.next();
771          if (_i8.done) break;
772          _ref8 = _i8.value;
773        }
774
775        var _node = _ref8;
776
777        traverseFast(_node, enter, opts);
778      }
779    } else {
780      traverseFast(subNode, enter, opts);
781    }
782  }
783}
784
785var CLEAR_KEYS = ["tokens", "start", "end", "loc", "raw", "rawValue"];
786
787var CLEAR_KEYS_PLUS_COMMENTS = t.COMMENT_KEYS.concat(["comments"]).concat(CLEAR_KEYS);
788
789function removeProperties(node, opts) {
790  opts = opts || {};
791  var map = opts.preserveComments ? CLEAR_KEYS : CLEAR_KEYS_PLUS_COMMENTS;
792  for (var _iterator9 = map, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : (0, _getIterator3.default)(_iterator9);;) {
793    var _ref9;
794
795    if (_isArray9) {
796      if (_i9 >= _iterator9.length) break;
797      _ref9 = _iterator9[_i9++];
798    } else {
799      _i9 = _iterator9.next();
800      if (_i9.done) break;
801      _ref9 = _i9.value;
802    }
803
804    var _key4 = _ref9;
805
806    if (node[_key4] != null) node[_key4] = undefined;
807  }
808
809  for (var key in node) {
810    if (key[0] === "_" && node[key] != null) node[key] = undefined;
811  }
812
813  var syms = (0, _getOwnPropertySymbols2.default)(node);
814  for (var _iterator10 = syms, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : (0, _getIterator3.default)(_iterator10);;) {
815    var _ref10;
816
817    if (_isArray10) {
818      if (_i10 >= _iterator10.length) break;
819      _ref10 = _iterator10[_i10++];
820    } else {
821      _i10 = _iterator10.next();
822      if (_i10.done) break;
823      _ref10 = _i10.value;
824    }
825
826    var sym = _ref10;
827
828    node[sym] = null;
829  }
830}
831
832function removePropertiesDeep(tree, opts) {
833  traverseFast(tree, removeProperties, opts);
834  return tree;
835}