babel-core
Version:
Turn ES6 code into readable vanilla ES5 with source maps
73 lines (53 loc) • 1.93 kB
JavaScript
;
var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { "default": obj }; };
exports.check = check;
exports.TaggedTemplateExpression = TaggedTemplateExpression;
exports.TemplateLiteral = TemplateLiteral;
exports.__esModule = true;
var t = _interopRequireWildcard(require("../../../types"));
var buildBinaryExpression = function buildBinaryExpression(left, right) {
return t.binaryExpression("+", left, right);
};
function check(node) {
return t.isTemplateLiteral(node) || t.isTaggedTemplateExpression(node);
}
function TaggedTemplateExpression(node, parent, scope, file) {
var quasi = node.quasi;
var args = [];
var strings = [];
var raw = [];
for (var i = 0; i < quasi.quasis.length; i++) {
var elem = quasi.quasis[i];
strings.push(t.literal(elem.value.cooked));
raw.push(t.literal(elem.value.raw));
}
strings = t.arrayExpression(strings);
raw = t.arrayExpression(raw);
var templateName = "tagged-template-literal";
if (file.isLoose("es6.templateLiterals")) templateName += "-loose";
args.push(t.callExpression(file.addHelper(templateName), [strings, raw]));
args = args.concat(quasi.expressions);
return t.callExpression(node.tag, args);
}
function TemplateLiteral(node, parent, scope, file) {
var nodes = [];
var i;
for (i = 0; i < node.quasis.length; i++) {
var elem = node.quasis[i];
nodes.push(t.literal(elem.value.cooked));
var expr = node.expressions.shift();
if (expr) nodes.push(expr);
}
if (nodes.length > 1) {
// remove redundant '' at the end of the expression
var last = nodes[nodes.length - 1];
if (t.isLiteral(last, { value: "" })) nodes.pop();
var root = buildBinaryExpression(nodes.shift(), nodes.shift());
for (i = 0; i < nodes.length; i++) {
root = buildBinaryExpression(root, nodes[i]);
}
return root;
} else {
return nodes[0];
}
}