You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					203 lines
				
				5.3 KiB
			
		
		
			
		
	
	
					203 lines
				
				5.3 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", {
							 | 
						||
| 
								 | 
							
								  value: true
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								exports.default = exports.SHOULD_STOP = exports.SHOULD_SKIP = exports.REMOVED = void 0;
							 | 
						||
| 
								 | 
							
								var virtualTypes = require("./lib/virtual-types");
							 | 
						||
| 
								 | 
							
								var _debug = require("debug");
							 | 
						||
| 
								 | 
							
								var _index = require("../index");
							 | 
						||
| 
								 | 
							
								var _scope = require("../scope");
							 | 
						||
| 
								 | 
							
								var _t = require("@babel/types");
							 | 
						||
| 
								 | 
							
								var t = _t;
							 | 
						||
| 
								 | 
							
								var _cache = require("../cache");
							 | 
						||
| 
								 | 
							
								var _generator = require("@babel/generator");
							 | 
						||
| 
								 | 
							
								var NodePath_ancestry = require("./ancestry");
							 | 
						||
| 
								 | 
							
								var NodePath_inference = require("./inference");
							 | 
						||
| 
								 | 
							
								var NodePath_replacement = require("./replacement");
							 | 
						||
| 
								 | 
							
								var NodePath_evaluation = require("./evaluation");
							 | 
						||
| 
								 | 
							
								var NodePath_conversion = require("./conversion");
							 | 
						||
| 
								 | 
							
								var NodePath_introspection = require("./introspection");
							 | 
						||
| 
								 | 
							
								var NodePath_context = require("./context");
							 | 
						||
| 
								 | 
							
								var NodePath_removal = require("./removal");
							 | 
						||
| 
								 | 
							
								var NodePath_modification = require("./modification");
							 | 
						||
| 
								 | 
							
								var NodePath_family = require("./family");
							 | 
						||
| 
								 | 
							
								var NodePath_comments = require("./comments");
							 | 
						||
| 
								 | 
							
								var NodePath_virtual_types_validator = require("./lib/virtual-types-validator");
							 | 
						||
| 
								 | 
							
								const {
							 | 
						||
| 
								 | 
							
								  validate
							 | 
						||
| 
								 | 
							
								} = _t;
							 | 
						||
| 
								 | 
							
								const debug = _debug("babel");
							 | 
						||
| 
								 | 
							
								const REMOVED = 1 << 0;
							 | 
						||
| 
								 | 
							
								exports.REMOVED = REMOVED;
							 | 
						||
| 
								 | 
							
								const SHOULD_STOP = 1 << 1;
							 | 
						||
| 
								 | 
							
								exports.SHOULD_STOP = SHOULD_STOP;
							 | 
						||
| 
								 | 
							
								const SHOULD_SKIP = 1 << 2;
							 | 
						||
| 
								 | 
							
								exports.SHOULD_SKIP = SHOULD_SKIP;
							 | 
						||
| 
								 | 
							
								class NodePath {
							 | 
						||
| 
								 | 
							
								  constructor(hub, parent) {
							 | 
						||
| 
								 | 
							
								    this.contexts = [];
							 | 
						||
| 
								 | 
							
								    this.state = null;
							 | 
						||
| 
								 | 
							
								    this.opts = null;
							 | 
						||
| 
								 | 
							
								    this._traverseFlags = 0;
							 | 
						||
| 
								 | 
							
								    this.skipKeys = null;
							 | 
						||
| 
								 | 
							
								    this.parentPath = null;
							 | 
						||
| 
								 | 
							
								    this.container = null;
							 | 
						||
| 
								 | 
							
								    this.listKey = null;
							 | 
						||
| 
								 | 
							
								    this.key = null;
							 | 
						||
| 
								 | 
							
								    this.node = null;
							 | 
						||
| 
								 | 
							
								    this.type = null;
							 | 
						||
| 
								 | 
							
								    this.parent = parent;
							 | 
						||
| 
								 | 
							
								    this.hub = hub;
							 | 
						||
| 
								 | 
							
								    this.data = null;
							 | 
						||
| 
								 | 
							
								    this.context = null;
							 | 
						||
| 
								 | 
							
								    this.scope = null;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  static get({
							 | 
						||
| 
								 | 
							
								    hub,
							 | 
						||
| 
								 | 
							
								    parentPath,
							 | 
						||
| 
								 | 
							
								    parent,
							 | 
						||
| 
								 | 
							
								    container,
							 | 
						||
| 
								 | 
							
								    listKey,
							 | 
						||
| 
								 | 
							
								    key
							 | 
						||
| 
								 | 
							
								  }) {
							 | 
						||
| 
								 | 
							
								    if (!hub && parentPath) {
							 | 
						||
| 
								 | 
							
								      hub = parentPath.hub;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (!parent) {
							 | 
						||
| 
								 | 
							
								      throw new Error("To get a node path the parent needs to exist");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    const targetNode =
							 | 
						||
| 
								 | 
							
								    container[key];
							 | 
						||
| 
								 | 
							
								    let paths = _cache.path.get(parent);
							 | 
						||
| 
								 | 
							
								    if (!paths) {
							 | 
						||
| 
								 | 
							
								      paths = new Map();
							 | 
						||
| 
								 | 
							
								      _cache.path.set(parent, paths);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    let path = paths.get(targetNode);
							 | 
						||
| 
								 | 
							
								    if (!path) {
							 | 
						||
| 
								 | 
							
								      path = new NodePath(hub, parent);
							 | 
						||
| 
								 | 
							
								      if (targetNode) paths.set(targetNode, path);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    path.setup(parentPath, container, listKey, key);
							 | 
						||
| 
								 | 
							
								    return path;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  getScope(scope) {
							 | 
						||
| 
								 | 
							
								    return this.isScope() ? new _scope.default(this) : scope;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  setData(key, val) {
							 | 
						||
| 
								 | 
							
								    if (this.data == null) {
							 | 
						||
| 
								 | 
							
								      this.data = Object.create(null);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return this.data[key] = val;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  getData(key, def) {
							 | 
						||
| 
								 | 
							
								    if (this.data == null) {
							 | 
						||
| 
								 | 
							
								      this.data = Object.create(null);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    let val = this.data[key];
							 | 
						||
| 
								 | 
							
								    if (val === undefined && def !== undefined) val = this.data[key] = def;
							 | 
						||
| 
								 | 
							
								    return val;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  hasNode() {
							 | 
						||
| 
								 | 
							
								    return this.node != null;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  buildCodeFrameError(msg, Error = SyntaxError) {
							 | 
						||
| 
								 | 
							
								    return this.hub.buildError(this.node, msg, Error);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  traverse(visitor, state) {
							 | 
						||
| 
								 | 
							
								    (0, _index.default)(this.node, visitor, this.scope, state, this);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  set(key, node) {
							 | 
						||
| 
								 | 
							
								    validate(this.node, key, node);
							 | 
						||
| 
								 | 
							
								    this.node[key] = node;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  getPathLocation() {
							 | 
						||
| 
								 | 
							
								    const parts = [];
							 | 
						||
| 
								 | 
							
								    let path = this;
							 | 
						||
| 
								 | 
							
								    do {
							 | 
						||
| 
								 | 
							
								      let key = path.key;
							 | 
						||
| 
								 | 
							
								      if (path.inList) key = `${path.listKey}[${key}]`;
							 | 
						||
| 
								 | 
							
								      parts.unshift(key);
							 | 
						||
| 
								 | 
							
								    } while (path = path.parentPath);
							 | 
						||
| 
								 | 
							
								    return parts.join(".");
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  debug(message) {
							 | 
						||
| 
								 | 
							
								    if (!debug.enabled) return;
							 | 
						||
| 
								 | 
							
								    debug(`${this.getPathLocation()} ${this.type}: ${message}`);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  toString() {
							 | 
						||
| 
								 | 
							
								    return (0, _generator.default)(this.node).code;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  get inList() {
							 | 
						||
| 
								 | 
							
								    return !!this.listKey;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  set inList(inList) {
							 | 
						||
| 
								 | 
							
								    if (!inList) {
							 | 
						||
| 
								 | 
							
								      this.listKey = null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  get parentKey() {
							 | 
						||
| 
								 | 
							
								    return this.listKey || this.key;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  get shouldSkip() {
							 | 
						||
| 
								 | 
							
								    return !!(this._traverseFlags & SHOULD_SKIP);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  set shouldSkip(v) {
							 | 
						||
| 
								 | 
							
								    if (v) {
							 | 
						||
| 
								 | 
							
								      this._traverseFlags |= SHOULD_SKIP;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      this._traverseFlags &= ~SHOULD_SKIP;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  get shouldStop() {
							 | 
						||
| 
								 | 
							
								    return !!(this._traverseFlags & SHOULD_STOP);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  set shouldStop(v) {
							 | 
						||
| 
								 | 
							
								    if (v) {
							 | 
						||
| 
								 | 
							
								      this._traverseFlags |= SHOULD_STOP;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      this._traverseFlags &= ~SHOULD_STOP;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  get removed() {
							 | 
						||
| 
								 | 
							
								    return !!(this._traverseFlags & REMOVED);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  set removed(v) {
							 | 
						||
| 
								 | 
							
								    if (v) {
							 | 
						||
| 
								 | 
							
								      this._traverseFlags |= REMOVED;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      this._traverseFlags &= ~REMOVED;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								Object.assign(NodePath.prototype, NodePath_ancestry, NodePath_inference, NodePath_replacement, NodePath_evaluation, NodePath_conversion, NodePath_introspection, NodePath_context, NodePath_removal, NodePath_modification, NodePath_family, NodePath_comments);
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  NodePath.prototype._guessExecutionStatusRelativeToDifferentFunctions = NodePath_introspection._guessExecutionStatusRelativeTo;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								for (const type of t.TYPES) {
							 | 
						||
| 
								 | 
							
								  const typeKey = `is${type}`;
							 | 
						||
| 
								 | 
							
								  const fn = t[typeKey];
							 | 
						||
| 
								 | 
							
								  NodePath.prototype[typeKey] = function (opts) {
							 | 
						||
| 
								 | 
							
								    return fn(this.node, opts);
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  NodePath.prototype[`assert${type}`] = function (opts) {
							 | 
						||
| 
								 | 
							
								    if (!fn(this.node, opts)) {
							 | 
						||
| 
								 | 
							
								      throw new TypeError(`Expected node path of type ${type}`);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Object.assign(NodePath.prototype, NodePath_virtual_types_validator);
							 | 
						||
| 
								 | 
							
								for (const type of Object.keys(virtualTypes)) {
							 | 
						||
| 
								 | 
							
								  if (type[0] === "_") continue;
							 | 
						||
| 
								 | 
							
								  if (!t.TYPES.includes(type)) t.TYPES.push(type);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								var _default = NodePath;
							 | 
						||
| 
								 | 
							
								exports.default = _default;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=index.js.map
							 |