83 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
Object.defineProperty(exports, "__esModule", {
 | 
						|
  value: true
 | 
						|
});
 | 
						|
exports.default = void 0;
 | 
						|
var _helperPluginUtils = require("@babel/helper-plugin-utils");
 | 
						|
var _default = exports.default = (0, _helperPluginUtils.declare)(api => {
 | 
						|
  api.assertVersion("^7.0.0-0 || >8.0.0-alpha <8.0.0-beta");
 | 
						|
  const {
 | 
						|
    types: t,
 | 
						|
    template
 | 
						|
  } = api;
 | 
						|
  function build(left, right) {
 | 
						|
    return t.callExpression(t.memberExpression(t.identifier("Math"), t.identifier("pow")), [left, right]);
 | 
						|
  }
 | 
						|
  function maybeMemoize(node, scope) {
 | 
						|
    if (scope.isStatic(node)) {
 | 
						|
      return {
 | 
						|
        assign: node,
 | 
						|
        ref: t.cloneNode(node)
 | 
						|
      };
 | 
						|
    }
 | 
						|
    if (scope.path.isPattern()) {
 | 
						|
      return null;
 | 
						|
    }
 | 
						|
    const id = scope.generateUidIdentifierBasedOnNode(node);
 | 
						|
    scope.push({
 | 
						|
      id
 | 
						|
    });
 | 
						|
    return {
 | 
						|
      assign: t.assignmentExpression("=", t.cloneNode(id), node),
 | 
						|
      ref: t.cloneNode(id)
 | 
						|
    };
 | 
						|
  }
 | 
						|
  return {
 | 
						|
    name: "transform-exponentiation-operator",
 | 
						|
    visitor: {
 | 
						|
      AssignmentExpression(path) {
 | 
						|
        const {
 | 
						|
          node,
 | 
						|
          scope
 | 
						|
        } = path;
 | 
						|
        if (node.operator !== "**=") return;
 | 
						|
        if (t.isMemberExpression(node.left)) {
 | 
						|
          let member1;
 | 
						|
          let member2;
 | 
						|
          const object = maybeMemoize(node.left.object, scope);
 | 
						|
          if (!object) {
 | 
						|
            path.replaceWith(template.expression.ast`(() => ${path.node})()`);
 | 
						|
            return;
 | 
						|
          }
 | 
						|
          const {
 | 
						|
            property,
 | 
						|
            computed
 | 
						|
          } = node.left;
 | 
						|
          if (computed) {
 | 
						|
            const prop = maybeMemoize(property, scope);
 | 
						|
            member1 = t.memberExpression(object.assign, prop.assign, true);
 | 
						|
            member2 = t.memberExpression(object.ref, prop.ref, true);
 | 
						|
          } else {
 | 
						|
            member1 = t.memberExpression(object.assign, property, false);
 | 
						|
            member2 = t.memberExpression(object.ref, t.cloneNode(property), false);
 | 
						|
          }
 | 
						|
          path.replaceWith(t.assignmentExpression("=", member1, build(member2, node.right)));
 | 
						|
        } else {
 | 
						|
          path.replaceWith(t.assignmentExpression("=", node.left, build(t.cloneNode(node.left), node.right)));
 | 
						|
        }
 | 
						|
      },
 | 
						|
      BinaryExpression(path) {
 | 
						|
        const {
 | 
						|
          node
 | 
						|
        } = path;
 | 
						|
        if (node.operator === "**") {
 | 
						|
          path.replaceWith(build(node.left, node.right));
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  };
 | 
						|
});
 | 
						|
 | 
						|
//# sourceMappingURL=index.js.map
 |