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

Statements: 100% (43 / 43)      Branches: 92.86% (13 / 14)      Functions: 100% (11 / 11)      Lines: 100% (42 / 42)      Ignored: none     

All files » 6to5/transformation/transformers/ » jsx.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      1 1 1   1   1 210     210 1 1       210 209       1 47 46   1       1 1     1   2 2       1 7     1   7 7       1   22   22 21   21 2       22 22 6   16     22       1   22 22   22 13     22      
// Based upon the excellent jsx-transpiler by Ingvar Stepanyan (RReverser)
// https://github.com/RReverser/jsx-transpiler
 
var esutils = require("esutils");
var t       = require("../../types");
var _       = require("lodash");
 
var JSX_ANNOTATION_REGEX = /^\*\s*@jsx\s+([^\s]+)/;
 
exports.Program = function (node, parent, file) {
  var jsx = "React.DOM";
 
  // looking for namespace annotation
  _.each(node.leadingComments, function (comment) {
    var matches = JSX_ANNOTATION_REGEX.exec(comment.value);
    Eif (matches) jsx = matches[1];
  });
 
  // prebuilding AST node
  file.jsx = jsx.split(".").map(t.identifier).reduce(function (object, property) {
    return t.memberExpression(object, property);
  });
};
 
exports.XJSIdentifier = function (node) {
  if (esutils.keyword.isIdentifierName(node.name)) {
    node.type = "Identifier";
  } else {
    return t.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 = t.isLiteral(node.property);
    node.type = "MemberExpression";
  }
};
 
exports.XJSExpressionContainer = function (node) {
  return node.expression;
};
 
exports.XJSAttribute = {
  exit: function (node) {
    var value = node.value || t.literal(true);
    return t.property("init", node.name, value);
  }
};
 
exports.XJSOpeningElement = {
  exit: function (node, parent, file) {
    var tagExpr = node.name;
 
    if (t.isIdentifier(tagExpr)) {
      var tagName = tagExpr.name;
 
      if (/[a-z]/.exec(tagName[0]) || _.contains(tagName, "-")) {
        tagExpr = t.memberExpression(file.jsx, tagExpr);
      }
    }
 
    var props = node.attributes;
    if (props.length) {
      props = t.objectExpression(props);
    } else {
      props = t.literal(null);
    }
 
    return t.callExpression(tagExpr, [props]);
  }
};
 
exports.XJSElement = {
  exit: function (node) {
    var callExpr = node.openingElement;
    var children = node.children;
 
    _.each(children, function (child) {
      callExpr.arguments.push(child);
    });
 
    return t.inherits(callExpr, node);
  }
};