var through = require('through'); var Visitor = require('./visitor'); var recast = require('recast'); var types = recast.types; /** * Transform an Esprima AST generated from ES6 by replacing all template string * nodes with the equivalent ES5. * * NOTE: The argument may be modified by this function. To prevent modification * of your AST, pass a copy instead of a direct reference: * * // instead of transform(ast), pass a copy * transform(JSON.parse(JSON.stringify(ast)); * * @param {Object} ast * @return {Object} */ function transform(ast) { return types.visit(ast, Visitor.visitor); } /** * Transform JavaScript written using ES6 by replacing all template string * usages with the equivalent ES5. * * compile('`Hey, ${name}!'); // '"Hey, " + name + "!"' * * @param {string} source * @param {{sourceFileName: string, sourceMapName: string}} mapOptions * @return {string} */ function compile(source, mapOptions) { mapOptions = mapOptions || {}; var recastOptions = { sourceFileName: mapOptions.sourceFileName, sourceMapName: mapOptions.sourceMapName }; var ast = recast.parse(source, recastOptions); return recast.print(transform(ast), recastOptions); } module.exports = function() { var data = ''; return through(write, end); function write(buf) { data += buf; } function end() { this.queue(module.exports.compile(data).code); this.queue(null); } }; module.exports.compile = compile; module.exports.transform = transform;