| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 | "use strict";Object.defineProperty(exports, "__esModule", {  value: true});exports._containerInsert = _containerInsert;exports._containerInsertAfter = _containerInsertAfter;exports._containerInsertBefore = _containerInsertBefore;exports._verifyNodeList = _verifyNodeList;exports.hoist = hoist;exports.insertAfter = insertAfter;exports.insertBefore = insertBefore;exports.pushContainer = pushContainer;exports.unshiftContainer = unshiftContainer;exports.updateSiblingKeys = updateSiblingKeys;var _cache = require("../cache");var _hoister = require("./lib/hoister");var _index = require("./index");var _t = require("@babel/types");const {  arrowFunctionExpression,  assertExpression,  assignmentExpression,  blockStatement,  callExpression,  cloneNode,  expressionStatement,  isExpression} = _t;function insertBefore(nodes_) {  this._assertUnremoved();  const nodes = this._verifyNodeList(nodes_);  const {    parentPath  } = this;  if (parentPath.isExpressionStatement() || parentPath.isLabeledStatement() || parentPath.isExportNamedDeclaration() || parentPath.isExportDefaultDeclaration() && this.isDeclaration()) {    return parentPath.insertBefore(nodes);  } else if (this.isNodeType("Expression") && !this.isJSXElement() || parentPath.isForStatement() && this.key === "init") {    if (this.node) nodes.push(this.node);    return this.replaceExpressionWithStatements(nodes);  } else if (Array.isArray(this.container)) {    return this._containerInsertBefore(nodes);  } else if (this.isStatementOrBlock()) {    const node = this.node;    const shouldInsertCurrentNode = node && (!this.isExpressionStatement() || node.expression != null);    this.replaceWith(blockStatement(shouldInsertCurrentNode ? [node] : []));    return this.unshiftContainer("body", nodes);  } else {    throw new Error("We don't know what to do with this node type. " + "We were previously a Statement but we can't fit in here?");  }}function _containerInsert(from, nodes) {  this.updateSiblingKeys(from, nodes.length);  const paths = [];  this.container.splice(from, 0, ...nodes);  for (let i = 0; i < nodes.length; i++) {    const to = from + i;    const path = this.getSibling(to);    paths.push(path);    if (this.context && this.context.queue) {      path.pushContext(this.context);    }  }  const contexts = this._getQueueContexts();  for (const path of paths) {    path.setScope();    path.debug("Inserted.");    for (const context of contexts) {      context.maybeQueue(path, true);    }  }  return paths;}function _containerInsertBefore(nodes) {  return this._containerInsert(this.key, nodes);}function _containerInsertAfter(nodes) {  return this._containerInsert(this.key + 1, nodes);}function insertAfter(nodes_) {  this._assertUnremoved();  const nodes = this._verifyNodeList(nodes_);  const {    parentPath  } = this;  if (parentPath.isExpressionStatement() || parentPath.isLabeledStatement() || parentPath.isExportNamedDeclaration() || parentPath.isExportDefaultDeclaration() && this.isDeclaration()) {    return parentPath.insertAfter(nodes.map(node => {      return isExpression(node) ? expressionStatement(node) : node;    }));  } else if (this.isNodeType("Expression") && !this.isJSXElement() && !parentPath.isJSXElement() || parentPath.isForStatement() && this.key === "init") {    if (this.node) {      const node = this.node;      let {        scope      } = this;      if (scope.path.isPattern()) {        assertExpression(node);        this.replaceWith(callExpression(arrowFunctionExpression([], node), []));        this.get("callee.body").insertAfter(nodes);        return [this];      }      if (parentPath.isMethod({        computed: true,        key: node      })) {        scope = scope.parent;      }      const temp = scope.generateDeclaredUidIdentifier();      nodes.unshift(expressionStatement(assignmentExpression("=", cloneNode(temp), node)));      nodes.push(expressionStatement(cloneNode(temp)));    }    return this.replaceExpressionWithStatements(nodes);  } else if (Array.isArray(this.container)) {    return this._containerInsertAfter(nodes);  } else if (this.isStatementOrBlock()) {    const node = this.node;    const shouldInsertCurrentNode = node && (!this.isExpressionStatement() || node.expression != null);    this.replaceWith(blockStatement(shouldInsertCurrentNode ? [node] : []));    return this.pushContainer("body", nodes);  } else {    throw new Error("We don't know what to do with this node type. " + "We were previously a Statement but we can't fit in here?");  }}function updateSiblingKeys(fromIndex, incrementBy) {  if (!this.parent) return;  const paths = _cache.path.get(this.parent);  for (const [, path] of paths) {    if (path.key >= fromIndex) {      path.key += incrementBy;    }  }}function _verifyNodeList(nodes) {  if (!nodes) {    return [];  }  if (!Array.isArray(nodes)) {    nodes = [nodes];  }  for (let i = 0; i < nodes.length; i++) {    const node = nodes[i];    let msg;    if (!node) {      msg = "has falsy node";    } else if (typeof node !== "object") {      msg = "contains a non-object node";    } else if (!node.type) {      msg = "without a type";    } else if (node instanceof _index.default) {      msg = "has a NodePath when it expected a raw object";    }    if (msg) {      const type = Array.isArray(node) ? "array" : typeof node;      throw new Error(`Node list ${msg} with the index of ${i} and type of ${type}`);    }  }  return nodes;}function unshiftContainer(listKey, nodes) {  this._assertUnremoved();  nodes = this._verifyNodeList(nodes);  const path = _index.default.get({    parentPath: this,    parent: this.node,    container: this.node[listKey],    listKey,    key: 0  }).setContext(this.context);  return path._containerInsertBefore(nodes);}function pushContainer(listKey, nodes) {  this._assertUnremoved();  const verifiedNodes = this._verifyNodeList(nodes);  const container = this.node[listKey];  const path = _index.default.get({    parentPath: this,    parent: this.node,    container: container,    listKey,    key: container.length  }).setContext(this.context);  return path.replaceWithMultiple(verifiedNodes);}function hoist(scope = this.scope) {  const hoister = new _hoister.default(this, scope);  return hoister.run();}
 |