58 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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;
 | 
