UNPKG

babel-plugin-transform-proto-to-assign

Version:

Babel plugin for turning __proto__ into a shallow property clone

89 lines (67 loc) 2.77 kB
"use strict"; exports.__esModule = true; var _getIterator2 = require("babel-runtime/core-js/get-iterator"); var _getIterator3 = _interopRequireDefault(_getIterator2); exports.default = function (_ref) { var t = _ref.types; function isProtoKey(node) { return t.isLiteral(t.toComputedKey(node, node.key), { value: "__proto__" }); } function isProtoAssignmentExpression(node) { var left = node.left; return t.isMemberExpression(left) && t.isLiteral(t.toComputedKey(left, left.property), { value: "__proto__" }); } function buildDefaultsCallExpression(expr, ref, file) { return t.expressionStatement(t.callExpression(file.addHelper("defaults"), [ref, expr.right])); } return { visitor: { AssignmentExpression: function AssignmentExpression(path, file) { if (!isProtoAssignmentExpression(path.node)) return; var nodes = []; var left = path.node.left.object; var temp = path.scope.maybeGenerateMemoised(left); if (temp) nodes.push(t.expressionStatement(t.assignmentExpression("=", temp, left))); nodes.push(buildDefaultsCallExpression(path.node, temp || left, file)); if (temp) nodes.push(temp); path.replaceWithMultiple(nodes); }, ExpressionStatement: function ExpressionStatement(path, file) { var expr = path.node.expression; if (!t.isAssignmentExpression(expr, { operator: "=" })) return; if (isProtoAssignmentExpression(expr)) { path.replaceWith(buildDefaultsCallExpression(expr, expr.left.object, file)); } }, ObjectExpression: function ObjectExpression(path, file) { var proto = void 0; var node = path.node; for (var _iterator = node.properties, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) { var _ref2; if (_isArray) { if (_i >= _iterator.length) break; _ref2 = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref2 = _i.value; } var prop = _ref2; if (isProtoKey(prop)) { proto = prop.value; (0, _pull2.default)(node.properties, prop); } } if (proto) { var args = [t.objectExpression([]), proto]; if (node.properties.length) args.push(node); path.replaceWith(t.callExpression(file.addHelper("extends"), args)); } } } }; }; var _pull = require("lodash/pull"); var _pull2 = _interopRequireDefault(_pull); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } module.exports = exports["default"];