blob: 9933babb90d9726765ac94943024668b8a72d6a0 [file] [log] [blame]
var assert = require('assert');
var recast = require('recast');
var types = recast.types;
var PathVisitor = types.PathVisitor;
var n = types.namedTypes;
var b = types.builders;
function Visitor() {
PathVisitor.apply(this, arguments);
}
Visitor.prototype = Object.create(PathVisitor.prototype);
Visitor.prototype.constructor = Visitor;
/**
* Visits a template literal, replacing it with a series of string
* concatenations. For example, given:
*
* ```js
* `1 + 1 = ${1 + 1}`
* ```
*
* The following output will be generated:
*
* ```js
* "1 + 1 = " + (1 + 1)
* ```
*
* @param {NodePath} path
* @returns {AST.Literal|AST.BinaryExpression}
*/
Visitor.prototype.visitTemplateLiteral = function(path) {
var node = path.node;
var replacement = b.literal(node.quasis[0].value.cooked);
for (var i = 1, length = node.quasis.length; i < length; i++) {
replacement = b.binaryExpression(
'+',
b.binaryExpression(
'+',
replacement,
node.expressions[i - 1]
),
b.literal(node.quasis[i].value.cooked)
);
}
return replacement;
};
/**
* Visits the path wrapping a TaggedTemplateExpression node, which has the form
*
* ```js
* htmlEncode `<span id=${id}>${text}</span>`
* ```
*
* @param {NodePath} path
* @returns {AST.CallExpression}
*/
Visitor.prototype.visitTaggedTemplateExpression = function(path) {
var node = path.node;
var args = [];
var strings = b.callExpression(
b.functionExpression(
null,
[],
b.blockStatement([
b.variableDeclaration(
'var',
[
b.variableDeclarator(
b.identifier('strings'),
b.arrayExpression(node.quasi.quasis.map(function(quasi) {
return b.literal(quasi.value.cooked);
}))
)
]
),
b.expressionStatement(b.assignmentExpression(
'=',
b.memberExpression(b.identifier('strings'), b.identifier('raw'), false),
b.arrayExpression(node.quasi.quasis.map(function(quasi) {
return b.literal(quasi.value.raw);
}))
)),
b.returnStatement(b.identifier('strings'))
])
),
[]
);
args.push(strings);
args.push.apply(args, node.quasi.expressions);
return b.callExpression(
node.tag,
args
);
};
Visitor.visitor = new Visitor();
module.exports = Visitor;