Code coverage report for 6to5/lib/6to5/transformation/transformers/optional-proto-to-assign.js

Statements: 100% (42 / 42)      Branches: 94.44% (17 / 18)      Functions: 100% (6 / 6)      Lines: 100% (37 / 37)      Ignored: none     

All files » 6to5/lib/6to5/transformation/transformers/ » optional-proto-to-assign.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 621 1   1 13     1 15 15     1 5     1 1   1 13 9   3 3 3   3 3 3   3     1 17 17   6 2       1 15   15 13   13 3 3       15 3 3 3      
var t = require("../../types");
var _ = require("lodash");
 
var isProtoKey = function (node) {
  return t.isLiteral(t.toComputedKey(node, node.key), { value: "__proto__" });
};
 
var isProtoAssignmentExpression = function (node) {
  var left = node.left;
  return t.isMemberExpression(left) && t.isLiteral(t.toComputedKey(left, left.property), { value: "__proto__" });
};
 
var buildDefaultsCallExpression = function (expr, ref, file) {
  return t.expressionStatement(t.callExpression(file.addHelper("defaults"), [ref, expr.right]));
};
 
exports.optional = true;
exports.secondPass = true;
 
exports.AssignmentExpression = function (node, parent, file, scope) {
  if (t.isExpressionStatement(parent)) return;
  if (!isProtoAssignmentExpression(node)) return;
 
  var nodes = [];
  var left  = node.left.object;
  var temp  = scope.generateTempBasedOnNode(node.left.object, file);
 
  nodes.push(t.expressionStatement(t.assignmentExpression("=", temp, left)));
  nodes.push(buildDefaultsCallExpression(node, temp, file));
  Eif (temp) nodes.push(temp);
 
  return t.toSequenceExpression(nodes);
};
 
exports.ExpressionStatement = function (node, parent, file) {
  var expr = node.expression;
  if (!t.isAssignmentExpression(expr, { operator: "=" })) return;
 
  if (isProtoAssignmentExpression(expr)) {
    return buildDefaultsCallExpression(expr, expr.left.object, file);
  }
};
 
exports.ObjectExpression = function (node, parent, file) {
  var proto;
 
  for (var i in node.properties) {
    var prop = node.properties[i];
 
    if (isProtoKey(prop)) {
      proto = prop.value;
      _.pull(node.properties, prop);
    }
  }
 
  if (proto) {
    var args = [t.objectExpression([]), proto];
    if (node.properties.length) args.push(node);
    return t.callExpression(file.addHelper("extends"), args);
  }
};