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.
82 lines
2.4 KiB
82 lines
2.4 KiB
"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-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
|
|
|