Code coverage report for 6to5/transformers/jsx/index.js

Statements: 90% (45 / 50)      Branches: 66.67% (8 / 12)      Functions: 91.67% (11 / 12)      Lines: 93.75% (45 / 48)      Ignored: none     

All files » 6to5/transformers/jsx/ » index.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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97      1 1 1   1 1   1 185     185               185 185       1 47 46   1       1 1     1   2 2       1 1 1     1 7     1   7 7 7 7       1   22   22 2     22 22 6   16     22       1   22 22   22 13     22 22      
// Based upon the excellent jsx-transpiler by Ingvar Stepanyan (RReverser)
// https://github.com/RReverser/jsx-transpiler
 
var esutils = require("esutils");
var b       = require("acorn-ast-types").builders;
var _       = require("lodash");
 
var JSX_ANNOTATION_REGEX = /^\*\s*@jsx\s+([^\s]+)/;
var KNOWN_TAGS           = require("./known-tags");
 
exports.Program = function (node, parent, file) {
  var jsx = "React.DOM";
 
  // looking for namespace annotation
  _.each(node.comments, function (comment) {
    if (!comment.possiblyLeading) return;
 
    var matches = JSX_ANNOTATION_REGEX.exec(comment.value);
    if (matches) jsx = matches[1];
  });
 
  // prebuilding AST node
  file.jsx = jsx.split(".").map(b.identifier).reduce(function (object, property) {
    return b.memberExpression(object, property, false);
  });
};
 
exports.XJSIdentifier = function (node) {
  if (esutils.keyword.isIdentifierName(node.name)) {
    node.type = "Identifier";
  } else {
    return b.literal(node.name);
  }
};
 
exports.XJSNamespacedName = function () {
  throw new Error("Namespace tags are not supported. ReactJSX is not XML.");
};
 
exports.XJSMemberExpression = {
  exit: function (node) {
    node.computed = node.property.type === "Literal";
    node.type = "MemberExpression";
  }
};
 
exports.XJSEmptyExpression = function (node) {
  node.value = null;
  node.type = "Literal";
};
 
exports.XJSExpressionContainer = function (node) {
  return node.expression;
};
 
exports.XJSAttribute = {
  exit: function (node) {
    var value = node.value || b.literal(true);
    var propNode = b.property("init", node.name, value);
    propNode.loc = node.loc;
    return propNode;
  }
};
 
exports.XJSOpeningElement = {
  exit: function (node, parent, file) {
    var tagExpr = node.name;
 
    if (_.contains(KNOWN_TAGS, tagExpr.name)) {
      tagExpr = b.memberExpression(file.jsx, tagExpr, false);
    }
 
    var props = node.attributes;
    if (props.length) {
      props = b.objectExpression(props);
    } else {
      props = b.literal(null);
    }
 
    return b.callExpression(tagExpr, [props]);
  }
};
 
exports.XJSElement = {
  exit: function (node) {
    var callExpr = node.openingElement;
    var children = node.children;
 
    _.each(children, function (child) {
      callExpr.arguments.push(child);
    });
 
    callExpr.loc = node.loc;
    return callExpr;
  }
};