| 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; |