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.
		
		
		
		
		
			
		
			
				
					493 lines
				
				16 KiB
			
		
		
			
		
	
	
					493 lines
				
				16 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", {
							 | 
						||
| 
								 | 
							
								  value: true
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								exports.arrowFunctionToExpression = arrowFunctionToExpression;
							 | 
						||
| 
								 | 
							
								exports.arrowFunctionToShadowed = arrowFunctionToShadowed;
							 | 
						||
| 
								 | 
							
								exports.ensureBlock = ensureBlock;
							 | 
						||
| 
								 | 
							
								exports.toComputedKey = toComputedKey;
							 | 
						||
| 
								 | 
							
								exports.unwrapFunctionEnvironment = unwrapFunctionEnvironment;
							 | 
						||
| 
								 | 
							
								var _t = require("@babel/types");
							 | 
						||
| 
								 | 
							
								var _helperEnvironmentVisitor = require("@babel/helper-environment-visitor");
							 | 
						||
| 
								 | 
							
								var _helperFunctionName = require("@babel/helper-function-name");
							 | 
						||
| 
								 | 
							
								var _visitors = require("../visitors");
							 | 
						||
| 
								 | 
							
								const {
							 | 
						||
| 
								 | 
							
								  arrowFunctionExpression,
							 | 
						||
| 
								 | 
							
								  assignmentExpression,
							 | 
						||
| 
								 | 
							
								  binaryExpression,
							 | 
						||
| 
								 | 
							
								  blockStatement,
							 | 
						||
| 
								 | 
							
								  callExpression,
							 | 
						||
| 
								 | 
							
								  conditionalExpression,
							 | 
						||
| 
								 | 
							
								  expressionStatement,
							 | 
						||
| 
								 | 
							
								  identifier,
							 | 
						||
| 
								 | 
							
								  isIdentifier,
							 | 
						||
| 
								 | 
							
								  jsxIdentifier,
							 | 
						||
| 
								 | 
							
								  logicalExpression,
							 | 
						||
| 
								 | 
							
								  LOGICAL_OPERATORS,
							 | 
						||
| 
								 | 
							
								  memberExpression,
							 | 
						||
| 
								 | 
							
								  metaProperty,
							 | 
						||
| 
								 | 
							
								  numericLiteral,
							 | 
						||
| 
								 | 
							
								  objectExpression,
							 | 
						||
| 
								 | 
							
								  restElement,
							 | 
						||
| 
								 | 
							
								  returnStatement,
							 | 
						||
| 
								 | 
							
								  sequenceExpression,
							 | 
						||
| 
								 | 
							
								  spreadElement,
							 | 
						||
| 
								 | 
							
								  stringLiteral,
							 | 
						||
| 
								 | 
							
								  super: _super,
							 | 
						||
| 
								 | 
							
								  thisExpression,
							 | 
						||
| 
								 | 
							
								  toExpression,
							 | 
						||
| 
								 | 
							
								  unaryExpression
							 | 
						||
| 
								 | 
							
								} = _t;
							 | 
						||
| 
								 | 
							
								function toComputedKey() {
							 | 
						||
| 
								 | 
							
								  let key;
							 | 
						||
| 
								 | 
							
								  if (this.isMemberExpression()) {
							 | 
						||
| 
								 | 
							
								    key = this.node.property;
							 | 
						||
| 
								 | 
							
								  } else if (this.isProperty() || this.isMethod()) {
							 | 
						||
| 
								 | 
							
								    key = this.node.key;
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    throw new ReferenceError("todo");
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!this.node.computed) {
							 | 
						||
| 
								 | 
							
								    if (isIdentifier(key)) key = stringLiteral(key.name);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return key;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								function ensureBlock() {
							 | 
						||
| 
								 | 
							
								  const body = this.get("body");
							 | 
						||
| 
								 | 
							
								  const bodyNode = body.node;
							 | 
						||
| 
								 | 
							
								  if (Array.isArray(body)) {
							 | 
						||
| 
								 | 
							
								    throw new Error("Can't convert array path to a block statement");
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (!bodyNode) {
							 | 
						||
| 
								 | 
							
								    throw new Error("Can't convert node without a body");
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (body.isBlockStatement()) {
							 | 
						||
| 
								 | 
							
								    return bodyNode;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  const statements = [];
							 | 
						||
| 
								 | 
							
								  let stringPath = "body";
							 | 
						||
| 
								 | 
							
								  let key;
							 | 
						||
| 
								 | 
							
								  let listKey;
							 | 
						||
| 
								 | 
							
								  if (body.isStatement()) {
							 | 
						||
| 
								 | 
							
								    listKey = "body";
							 | 
						||
| 
								 | 
							
								    key = 0;
							 | 
						||
| 
								 | 
							
								    statements.push(body.node);
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    stringPath += ".body.0";
							 | 
						||
| 
								 | 
							
								    if (this.isFunction()) {
							 | 
						||
| 
								 | 
							
								      key = "argument";
							 | 
						||
| 
								 | 
							
								      statements.push(returnStatement(body.node));
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      key = "expression";
							 | 
						||
| 
								 | 
							
								      statements.push(expressionStatement(body.node));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  this.node.body = blockStatement(statements);
							 | 
						||
| 
								 | 
							
								  const parentPath = this.get(stringPath);
							 | 
						||
| 
								 | 
							
								  body.setup(parentPath, listKey ?
							 | 
						||
| 
								 | 
							
								  parentPath.node[listKey] : parentPath.node, listKey, key);
							 | 
						||
| 
								 | 
							
								  return this.node;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function arrowFunctionToShadowed() {
							 | 
						||
| 
								 | 
							
								  if (!this.isArrowFunctionExpression()) return;
							 | 
						||
| 
								 | 
							
								  this.arrowFunctionToExpression();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function unwrapFunctionEnvironment() {
							 | 
						||
| 
								 | 
							
								  if (!this.isArrowFunctionExpression() && !this.isFunctionExpression() && !this.isFunctionDeclaration()) {
							 | 
						||
| 
								 | 
							
								    throw this.buildCodeFrameError("Can only unwrap the environment of a function.");
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  hoistFunctionEnvironment(this);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								function setType(path, type) {
							 | 
						||
| 
								 | 
							
								  path.node.type = type;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function arrowFunctionToExpression({
							 | 
						||
| 
								 | 
							
								  allowInsertArrow = true,
							 | 
						||
| 
								 | 
							
								  allowInsertArrowWithRest = allowInsertArrow,
							 | 
						||
| 
								 | 
							
								  specCompliant = false,
							 | 
						||
| 
								 | 
							
								  noNewArrows = !specCompliant
							 | 
						||
| 
								 | 
							
								} = {}) {
							 | 
						||
| 
								 | 
							
								  if (!this.isArrowFunctionExpression()) {
							 | 
						||
| 
								 | 
							
								    throw this.buildCodeFrameError("Cannot convert non-arrow function to a function expression.");
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  const {
							 | 
						||
| 
								 | 
							
								    thisBinding,
							 | 
						||
| 
								 | 
							
								    fnPath: fn
							 | 
						||
| 
								 | 
							
								  } = hoistFunctionEnvironment(this, noNewArrows, allowInsertArrow, allowInsertArrowWithRest);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  fn.ensureBlock();
							 | 
						||
| 
								 | 
							
								  setType(fn, "FunctionExpression");
							 | 
						||
| 
								 | 
							
								  if (!noNewArrows) {
							 | 
						||
| 
								 | 
							
								    const checkBinding = thisBinding ? null : fn.scope.generateUidIdentifier("arrowCheckId");
							 | 
						||
| 
								 | 
							
								    if (checkBinding) {
							 | 
						||
| 
								 | 
							
								      fn.parentPath.scope.push({
							 | 
						||
| 
								 | 
							
								        id: checkBinding,
							 | 
						||
| 
								 | 
							
								        init: objectExpression([])
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    fn.get("body").unshiftContainer("body", expressionStatement(callExpression(this.hub.addHelper("newArrowCheck"), [thisExpression(), checkBinding ? identifier(checkBinding.name) : identifier(thisBinding)])));
							 | 
						||
| 
								 | 
							
								    fn.replaceWith(callExpression(memberExpression(
							 | 
						||
| 
								 | 
							
								    (0, _helperFunctionName.default)(this, true) || fn.node, identifier("bind")), [checkBinding ? identifier(checkBinding.name) : thisExpression()]));
							 | 
						||
| 
								 | 
							
								    return fn.get("callee.object");
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return fn;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								const getSuperCallsVisitor = (0, _visitors.merge)([{
							 | 
						||
| 
								 | 
							
								  CallExpression(child, {
							 | 
						||
| 
								 | 
							
								    allSuperCalls
							 | 
						||
| 
								 | 
							
								  }) {
							 | 
						||
| 
								 | 
							
								    if (!child.get("callee").isSuper()) return;
							 | 
						||
| 
								 | 
							
								    allSuperCalls.push(child);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}, _helperEnvironmentVisitor.default]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function hoistFunctionEnvironment(fnPath,
							 | 
						||
| 
								 | 
							
								noNewArrows = true, allowInsertArrow = true, allowInsertArrowWithRest = true) {
							 | 
						||
| 
								 | 
							
								  let arrowParent;
							 | 
						||
| 
								 | 
							
								  let thisEnvFn = fnPath.findParent(p => {
							 | 
						||
| 
								 | 
							
								    if (p.isArrowFunctionExpression()) {
							 | 
						||
| 
								 | 
							
								      var _arrowParent;
							 | 
						||
| 
								 | 
							
								      (_arrowParent = arrowParent) != null ? _arrowParent : arrowParent = p;
							 | 
						||
| 
								 | 
							
								      return false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return p.isFunction() || p.isProgram() || p.isClassProperty({
							 | 
						||
| 
								 | 
							
								      static: false
							 | 
						||
| 
								 | 
							
								    }) || p.isClassPrivateProperty({
							 | 
						||
| 
								 | 
							
								      static: false
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  const inConstructor = thisEnvFn.isClassMethod({
							 | 
						||
| 
								 | 
							
								    kind: "constructor"
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  if (thisEnvFn.isClassProperty() || thisEnvFn.isClassPrivateProperty()) {
							 | 
						||
| 
								 | 
							
								    if (arrowParent) {
							 | 
						||
| 
								 | 
							
								      thisEnvFn = arrowParent;
							 | 
						||
| 
								 | 
							
								    } else if (allowInsertArrow) {
							 | 
						||
| 
								 | 
							
								      fnPath.replaceWith(callExpression(arrowFunctionExpression([], toExpression(fnPath.node)), []));
							 | 
						||
| 
								 | 
							
								      thisEnvFn = fnPath.get("callee");
							 | 
						||
| 
								 | 
							
								      fnPath = thisEnvFn.get("body");
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      throw fnPath.buildCodeFrameError("Unable to transform arrow inside class property");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  const {
							 | 
						||
| 
								 | 
							
								    thisPaths,
							 | 
						||
| 
								 | 
							
								    argumentsPaths,
							 | 
						||
| 
								 | 
							
								    newTargetPaths,
							 | 
						||
| 
								 | 
							
								    superProps,
							 | 
						||
| 
								 | 
							
								    superCalls
							 | 
						||
| 
								 | 
							
								  } = getScopeInformation(fnPath);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (inConstructor && superCalls.length > 0) {
							 | 
						||
| 
								 | 
							
								    if (!allowInsertArrow) {
							 | 
						||
| 
								 | 
							
								      throw superCalls[0].buildCodeFrameError("When using '@babel/plugin-transform-arrow-functions', " + "it's not possible to compile `super()` in an arrow function without compiling classes.\n" + "Please add '@babel/plugin-transform-classes' to your Babel configuration.");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (!allowInsertArrowWithRest) {
							 | 
						||
| 
								 | 
							
								      throw superCalls[0].buildCodeFrameError("When using '@babel/plugin-transform-parameters', " + "it's not possible to compile `super()` in an arrow function with default or rest parameters without compiling classes.\n" + "Please add '@babel/plugin-transform-classes' to your Babel configuration.");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    const allSuperCalls = [];
							 | 
						||
| 
								 | 
							
								    thisEnvFn.traverse(getSuperCallsVisitor, {
							 | 
						||
| 
								 | 
							
								      allSuperCalls
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    const superBinding = getSuperBinding(thisEnvFn);
							 | 
						||
| 
								 | 
							
								    allSuperCalls.forEach(superCall => {
							 | 
						||
| 
								 | 
							
								      const callee = identifier(superBinding);
							 | 
						||
| 
								 | 
							
								      callee.loc = superCall.node.callee.loc;
							 | 
						||
| 
								 | 
							
								      superCall.get("callee").replaceWith(callee);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (argumentsPaths.length > 0) {
							 | 
						||
| 
								 | 
							
								    const argumentsBinding = getBinding(thisEnvFn, "arguments", () => {
							 | 
						||
| 
								 | 
							
								      const args = () => identifier("arguments");
							 | 
						||
| 
								 | 
							
								      if (thisEnvFn.scope.path.isProgram()) {
							 | 
						||
| 
								 | 
							
								        return conditionalExpression(binaryExpression("===", unaryExpression("typeof", args()), stringLiteral("undefined")), thisEnvFn.scope.buildUndefinedNode(), args());
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        return args();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    argumentsPaths.forEach(argumentsChild => {
							 | 
						||
| 
								 | 
							
								      const argsRef = identifier(argumentsBinding);
							 | 
						||
| 
								 | 
							
								      argsRef.loc = argumentsChild.node.loc;
							 | 
						||
| 
								 | 
							
								      argumentsChild.replaceWith(argsRef);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (newTargetPaths.length > 0) {
							 | 
						||
| 
								 | 
							
								    const newTargetBinding = getBinding(thisEnvFn, "newtarget", () => metaProperty(identifier("new"), identifier("target")));
							 | 
						||
| 
								 | 
							
								    newTargetPaths.forEach(targetChild => {
							 | 
						||
| 
								 | 
							
								      const targetRef = identifier(newTargetBinding);
							 | 
						||
| 
								 | 
							
								      targetRef.loc = targetChild.node.loc;
							 | 
						||
| 
								 | 
							
								      targetChild.replaceWith(targetRef);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (superProps.length > 0) {
							 | 
						||
| 
								 | 
							
								    if (!allowInsertArrow) {
							 | 
						||
| 
								 | 
							
								      throw superProps[0].buildCodeFrameError("When using '@babel/plugin-transform-arrow-functions', " + "it's not possible to compile `super.prop` in an arrow function without compiling classes.\n" + "Please add '@babel/plugin-transform-classes' to your Babel configuration.");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    const flatSuperProps = superProps.reduce((acc, superProp) => acc.concat(standardizeSuperProperty(superProp)), []);
							 | 
						||
| 
								 | 
							
								    flatSuperProps.forEach(superProp => {
							 | 
						||
| 
								 | 
							
								      const key = superProp.node.computed ? "" :
							 | 
						||
| 
								 | 
							
								      superProp.get("property").node.name;
							 | 
						||
| 
								 | 
							
								      const superParentPath = superProp.parentPath;
							 | 
						||
| 
								 | 
							
								      const isAssignment = superParentPath.isAssignmentExpression({
							 | 
						||
| 
								 | 
							
								        left: superProp.node
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      const isCall = superParentPath.isCallExpression({
							 | 
						||
| 
								 | 
							
								        callee: superProp.node
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      const isTaggedTemplate = superParentPath.isTaggedTemplateExpression({
							 | 
						||
| 
								 | 
							
								        tag: superProp.node
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      const superBinding = getSuperPropBinding(thisEnvFn, isAssignment, key);
							 | 
						||
| 
								 | 
							
								      const args = [];
							 | 
						||
| 
								 | 
							
								      if (superProp.node.computed) {
							 | 
						||
| 
								 | 
							
								        args.push(superProp.get("property").node);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (isAssignment) {
							 | 
						||
| 
								 | 
							
								        const value = superParentPath.node.right;
							 | 
						||
| 
								 | 
							
								        args.push(value);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      const call = callExpression(identifier(superBinding), args);
							 | 
						||
| 
								 | 
							
								      if (isCall) {
							 | 
						||
| 
								 | 
							
								        superParentPath.unshiftContainer("arguments", thisExpression());
							 | 
						||
| 
								 | 
							
								        superProp.replaceWith(memberExpression(call, identifier("call")));
							 | 
						||
| 
								 | 
							
								        thisPaths.push(superParentPath.get("arguments.0"));
							 | 
						||
| 
								 | 
							
								      } else if (isAssignment) {
							 | 
						||
| 
								 | 
							
								        superParentPath.replaceWith(call);
							 | 
						||
| 
								 | 
							
								      } else if (isTaggedTemplate) {
							 | 
						||
| 
								 | 
							
								        superProp.replaceWith(callExpression(memberExpression(call, identifier("bind"), false), [thisExpression()]));
							 | 
						||
| 
								 | 
							
								        thisPaths.push(superProp.get("arguments.0"));
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        superProp.replaceWith(call);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let thisBinding;
							 | 
						||
| 
								 | 
							
								  if (thisPaths.length > 0 || !noNewArrows) {
							 | 
						||
| 
								 | 
							
								    thisBinding = getThisBinding(thisEnvFn, inConstructor);
							 | 
						||
| 
								 | 
							
								    if (noNewArrows ||
							 | 
						||
| 
								 | 
							
								    inConstructor && hasSuperClass(thisEnvFn)) {
							 | 
						||
| 
								 | 
							
								      thisPaths.forEach(thisChild => {
							 | 
						||
| 
								 | 
							
								        const thisRef = thisChild.isJSX() ? jsxIdentifier(thisBinding) : identifier(thisBinding);
							 | 
						||
| 
								 | 
							
								        thisRef.loc = thisChild.node.loc;
							 | 
						||
| 
								 | 
							
								        thisChild.replaceWith(thisRef);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      if (!noNewArrows) thisBinding = null;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return {
							 | 
						||
| 
								 | 
							
								    thisBinding,
							 | 
						||
| 
								 | 
							
								    fnPath
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								function isLogicalOp(op) {
							 | 
						||
| 
								 | 
							
								  return LOGICAL_OPERATORS.includes(op);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								function standardizeSuperProperty(superProp) {
							 | 
						||
| 
								 | 
							
								  if (superProp.parentPath.isAssignmentExpression() && superProp.parentPath.node.operator !== "=") {
							 | 
						||
| 
								 | 
							
								    const assignmentPath = superProp.parentPath;
							 | 
						||
| 
								 | 
							
								    const op = assignmentPath.node.operator.slice(0, -1);
							 | 
						||
| 
								 | 
							
								    const value = assignmentPath.node.right;
							 | 
						||
| 
								 | 
							
								    const isLogicalAssignment = isLogicalOp(op);
							 | 
						||
| 
								 | 
							
								    if (superProp.node.computed) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const tmp = superProp.scope.generateDeclaredUidIdentifier("tmp");
							 | 
						||
| 
								 | 
							
								      const object = superProp.node.object;
							 | 
						||
| 
								 | 
							
								      const property = superProp.node.property;
							 | 
						||
| 
								 | 
							
								      assignmentPath.get("left").replaceWith(memberExpression(object, assignmentExpression("=", tmp, property), true));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      assignmentPath.get("right").replaceWith(rightExpression(isLogicalAssignment ? "=" : op, memberExpression(object, identifier(tmp.name), true), value));
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const object = superProp.node.object;
							 | 
						||
| 
								 | 
							
								      const property = superProp.node.property;
							 | 
						||
| 
								 | 
							
								      assignmentPath.get("left").replaceWith(memberExpression(object, property));
							 | 
						||
| 
								 | 
							
								      assignmentPath.get("right").replaceWith(rightExpression(isLogicalAssignment ? "=" : op, memberExpression(object, identifier(property.name)), value));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (isLogicalAssignment) {
							 | 
						||
| 
								 | 
							
								      assignmentPath.replaceWith(logicalExpression(op, assignmentPath.node.left, assignmentPath.node.right));
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      assignmentPath.node.operator = "=";
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return [assignmentPath.get("left"), assignmentPath.get("right").get("left")];
							 | 
						||
| 
								 | 
							
								  } else if (superProp.parentPath.isUpdateExpression()) {
							 | 
						||
| 
								 | 
							
								    const updateExpr = superProp.parentPath;
							 | 
						||
| 
								 | 
							
								    const tmp = superProp.scope.generateDeclaredUidIdentifier("tmp");
							 | 
						||
| 
								 | 
							
								    const computedKey = superProp.node.computed ? superProp.scope.generateDeclaredUidIdentifier("prop") : null;
							 | 
						||
| 
								 | 
							
								    const parts = [assignmentExpression("=", tmp, memberExpression(superProp.node.object, computedKey ? assignmentExpression("=", computedKey, superProp.node.property) : superProp.node.property, superProp.node.computed)), assignmentExpression("=", memberExpression(superProp.node.object, computedKey ? identifier(computedKey.name) : superProp.node.property, superProp.node.computed), binaryExpression(
							 | 
						||
| 
								 | 
							
								    superProp.parentPath.node.operator[0], identifier(tmp.name), numericLiteral(1)))];
							 | 
						||
| 
								 | 
							
								    if (!superProp.parentPath.node.prefix) {
							 | 
						||
| 
								 | 
							
								      parts.push(identifier(tmp.name));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    updateExpr.replaceWith(sequenceExpression(parts));
							 | 
						||
| 
								 | 
							
								    const left = updateExpr.get("expressions.0.right");
							 | 
						||
| 
								 | 
							
								    const right = updateExpr.get("expressions.1.left");
							 | 
						||
| 
								 | 
							
								    return [left, right];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return [superProp];
							 | 
						||
| 
								 | 
							
								  function rightExpression(op, left, right) {
							 | 
						||
| 
								 | 
							
								    if (op === "=") {
							 | 
						||
| 
								 | 
							
								      return assignmentExpression("=", left, right);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      return binaryExpression(op, left, right);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								function hasSuperClass(thisEnvFn) {
							 | 
						||
| 
								 | 
							
								  return thisEnvFn.isClassMethod() && !!thisEnvFn.parentPath.parentPath.node.superClass;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								const assignSuperThisVisitor = (0, _visitors.merge)([{
							 | 
						||
| 
								 | 
							
								  CallExpression(child, {
							 | 
						||
| 
								 | 
							
								    supers,
							 | 
						||
| 
								 | 
							
								    thisBinding
							 | 
						||
| 
								 | 
							
								  }) {
							 | 
						||
| 
								 | 
							
								    if (!child.get("callee").isSuper()) return;
							 | 
						||
| 
								 | 
							
								    if (supers.has(child.node)) return;
							 | 
						||
| 
								 | 
							
								    supers.add(child.node);
							 | 
						||
| 
								 | 
							
								    child.replaceWithMultiple([child.node, assignmentExpression("=", identifier(thisBinding), identifier("this"))]);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}, _helperEnvironmentVisitor.default]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function getThisBinding(thisEnvFn, inConstructor) {
							 | 
						||
| 
								 | 
							
								  return getBinding(thisEnvFn, "this", thisBinding => {
							 | 
						||
| 
								 | 
							
								    if (!inConstructor || !hasSuperClass(thisEnvFn)) return thisExpression();
							 | 
						||
| 
								 | 
							
								    thisEnvFn.traverse(assignSuperThisVisitor, {
							 | 
						||
| 
								 | 
							
								      supers: new WeakSet(),
							 | 
						||
| 
								 | 
							
								      thisBinding
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function getSuperBinding(thisEnvFn) {
							 | 
						||
| 
								 | 
							
								  return getBinding(thisEnvFn, "supercall", () => {
							 | 
						||
| 
								 | 
							
								    const argsBinding = thisEnvFn.scope.generateUidIdentifier("args");
							 | 
						||
| 
								 | 
							
								    return arrowFunctionExpression([restElement(argsBinding)], callExpression(_super(), [spreadElement(identifier(argsBinding.name))]));
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function getSuperPropBinding(thisEnvFn, isAssignment, propName) {
							 | 
						||
| 
								 | 
							
								  const op = isAssignment ? "set" : "get";
							 | 
						||
| 
								 | 
							
								  return getBinding(thisEnvFn, `superprop_${op}:${propName || ""}`, () => {
							 | 
						||
| 
								 | 
							
								    const argsList = [];
							 | 
						||
| 
								 | 
							
								    let fnBody;
							 | 
						||
| 
								 | 
							
								    if (propName) {
							 | 
						||
| 
								 | 
							
								      fnBody = memberExpression(_super(), identifier(propName));
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      const method = thisEnvFn.scope.generateUidIdentifier("prop");
							 | 
						||
| 
								 | 
							
								      argsList.unshift(method);
							 | 
						||
| 
								 | 
							
								      fnBody = memberExpression(_super(), identifier(method.name), true);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (isAssignment) {
							 | 
						||
| 
								 | 
							
								      const valueIdent = thisEnvFn.scope.generateUidIdentifier("value");
							 | 
						||
| 
								 | 
							
								      argsList.push(valueIdent);
							 | 
						||
| 
								 | 
							
								      fnBody = assignmentExpression("=", fnBody, identifier(valueIdent.name));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return arrowFunctionExpression(argsList, fnBody);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								function getBinding(thisEnvFn, key, init) {
							 | 
						||
| 
								 | 
							
								  const cacheKey = "binding:" + key;
							 | 
						||
| 
								 | 
							
								  let data = thisEnvFn.getData(cacheKey);
							 | 
						||
| 
								 | 
							
								  if (!data) {
							 | 
						||
| 
								 | 
							
								    const id = thisEnvFn.scope.generateUidIdentifier(key);
							 | 
						||
| 
								 | 
							
								    data = id.name;
							 | 
						||
| 
								 | 
							
								    thisEnvFn.setData(cacheKey, data);
							 | 
						||
| 
								 | 
							
								    thisEnvFn.scope.push({
							 | 
						||
| 
								 | 
							
								      id: id,
							 | 
						||
| 
								 | 
							
								      init: init(data)
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return data;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								const getScopeInformationVisitor = (0, _visitors.merge)([{
							 | 
						||
| 
								 | 
							
								  ThisExpression(child, {
							 | 
						||
| 
								 | 
							
								    thisPaths
							 | 
						||
| 
								 | 
							
								  }) {
							 | 
						||
| 
								 | 
							
								    thisPaths.push(child);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  JSXIdentifier(child, {
							 | 
						||
| 
								 | 
							
								    thisPaths
							 | 
						||
| 
								 | 
							
								  }) {
							 | 
						||
| 
								 | 
							
								    if (child.node.name !== "this") return;
							 | 
						||
| 
								 | 
							
								    if (!child.parentPath.isJSXMemberExpression({
							 | 
						||
| 
								 | 
							
								      object: child.node
							 | 
						||
| 
								 | 
							
								    }) && !child.parentPath.isJSXOpeningElement({
							 | 
						||
| 
								 | 
							
								      name: child.node
							 | 
						||
| 
								 | 
							
								    })) {
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    thisPaths.push(child);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  CallExpression(child, {
							 | 
						||
| 
								 | 
							
								    superCalls
							 | 
						||
| 
								 | 
							
								  }) {
							 | 
						||
| 
								 | 
							
								    if (child.get("callee").isSuper()) superCalls.push(child);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  MemberExpression(child, {
							 | 
						||
| 
								 | 
							
								    superProps
							 | 
						||
| 
								 | 
							
								  }) {
							 | 
						||
| 
								 | 
							
								    if (child.get("object").isSuper()) superProps.push(child);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  Identifier(child, {
							 | 
						||
| 
								 | 
							
								    argumentsPaths
							 | 
						||
| 
								 | 
							
								  }) {
							 | 
						||
| 
								 | 
							
								    if (!child.isReferencedIdentifier({
							 | 
						||
| 
								 | 
							
								      name: "arguments"
							 | 
						||
| 
								 | 
							
								    })) return;
							 | 
						||
| 
								 | 
							
								    let curr = child.scope;
							 | 
						||
| 
								 | 
							
								    do {
							 | 
						||
| 
								 | 
							
								      if (curr.hasOwnBinding("arguments")) {
							 | 
						||
| 
								 | 
							
								        curr.rename("arguments");
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (curr.path.isFunction() && !curr.path.isArrowFunctionExpression()) {
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } while (curr = curr.parent);
							 | 
						||
| 
								 | 
							
								    argumentsPaths.push(child);
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  MetaProperty(child, {
							 | 
						||
| 
								 | 
							
								    newTargetPaths
							 | 
						||
| 
								 | 
							
								  }) {
							 | 
						||
| 
								 | 
							
								    if (!child.get("meta").isIdentifier({
							 | 
						||
| 
								 | 
							
								      name: "new"
							 | 
						||
| 
								 | 
							
								    })) return;
							 | 
						||
| 
								 | 
							
								    if (!child.get("property").isIdentifier({
							 | 
						||
| 
								 | 
							
								      name: "target"
							 | 
						||
| 
								 | 
							
								    })) return;
							 | 
						||
| 
								 | 
							
								    newTargetPaths.push(child);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}, _helperEnvironmentVisitor.default]);
							 | 
						||
| 
								 | 
							
								function getScopeInformation(fnPath) {
							 | 
						||
| 
								 | 
							
								  const thisPaths = [];
							 | 
						||
| 
								 | 
							
								  const argumentsPaths = [];
							 | 
						||
| 
								 | 
							
								  const newTargetPaths = [];
							 | 
						||
| 
								 | 
							
								  const superProps = [];
							 | 
						||
| 
								 | 
							
								  const superCalls = [];
							 | 
						||
| 
								 | 
							
								  fnPath.traverse(getScopeInformationVisitor, {
							 | 
						||
| 
								 | 
							
								    thisPaths,
							 | 
						||
| 
								 | 
							
								    argumentsPaths,
							 | 
						||
| 
								 | 
							
								    newTargetPaths,
							 | 
						||
| 
								 | 
							
								    superProps,
							 | 
						||
| 
								 | 
							
								    superCalls
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  return {
							 | 
						||
| 
								 | 
							
								    thisPaths,
							 | 
						||
| 
								 | 
							
								    argumentsPaths,
							 | 
						||
| 
								 | 
							
								    newTargetPaths,
							 | 
						||
| 
								 | 
							
								    superProps,
							 | 
						||
| 
								 | 
							
								    superCalls
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=conversion.js.map
							 |