babel-core
Version:
A compiler for writing next generation JavaScript
131 lines (99 loc) • 3.19 kB
JavaScript
/* eslint no-unused-vars: 0 */
;
exports.__esModule = true;
// istanbul ignore next
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } }
var _types = require("../../../types");
var t = _interopRequireWildcard(_types);
var metadata = {
group: "builtin-pre"
};
exports.metadata = metadata;
/**
* [Please add a description.]
*/
function isString(node) {
return t.isLiteral(node) && typeof node.value === "string";
}
/**
* [Please add a description.]
*/
function buildBinaryExpression(left, right) {
var node = t.binaryExpression("+", left, right);
node._templateLiteralProduced = true;
return node;
}
/**
* [Please add a description.]
*/
function crawl(path) {
if (path.is("_templateLiteralProduced")) {
crawl(path.get("left"));
crawl(path.get("right"));
} else if (!path.isBaseType("string") && !path.isBaseType("number")) {
path.replaceWith(t.callExpression(t.identifier("String"), [path.node]));
}
}
/**
* [Please add a description.]
*/
var visitor = {
/**
* [Please add a description.]
*/
TaggedTemplateExpression: function TaggedTemplateExpression(node, parent, scope, file) {
var quasi = node.quasi;
var args = [];
var strings = [];
var raw = [];
var _arr = quasi.quasis;
for (var _i = 0; _i < _arr.length; _i++) {
var elem = _arr[_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";
var templateObject = file.addTemplateObject(templateName, strings, raw);
args.push(templateObject);
args = args.concat(quasi.expressions);
return t.callExpression(node.tag, args);
},
/**
* [Please add a description.]
*/
TemplateLiteral: function TemplateLiteral(node, parent, scope, file) {
var nodes = [];
var _arr2 = node.quasis;
for (var _i2 = 0; _i2 < _arr2.length; _i2++) {
var elem = _arr2[_i2];
nodes.push(t.literal(elem.value.cooked));
var expr = node.expressions.shift();
if (expr) nodes.push(expr);
}
// filter out empty string literals
nodes = nodes.filter(function (n) {
return !t.isLiteral(n, { value: "" });
});
// since `+` is left-to-right associative
// ensure the first node is a string if first/second isn't
if (!isString(nodes[0]) && !isString(nodes[1])) {
nodes.unshift(t.literal(""));
}
if (nodes.length > 1) {
var root = buildBinaryExpression(nodes.shift(), nodes.shift());
var _arr3 = nodes;
for (var _i3 = 0; _i3 < _arr3.length; _i3++) {
var _node = _arr3[_i3];
root = buildBinaryExpression(root, _node);
}
this.replaceWith(root);
//crawl(this);
} else {
return nodes[0];
}
}
};
exports.visitor = visitor;