var _ = require('lodash') , Utils = require('src/utils') , Parser = require('src/parser') , stream = require('stream') , util = require('util') , fs = require('fs') ; /** * @class Compiler * @param {Object|Function} opts */ var Compiler = module.exports = function Compiler(opts) { if(!(this instanceof Compiler)) return new Compiler(opts); stream.Transform.call(this, {objectMode: true}); } util.inherits(Compiler, stream.Transform); Compiler.prototype._transform = function (chunk, enc, done) { return this.compileString(chunk); done(); }; Compiler.prototype._compileRoutine = function (stream, done) { var self = this , done = done || function(){} , parser = new Parser() , out = [] ; parser.on('data', function(chunk){ out = out.concat(chunk); self.push(chunk); }); parser.on('end', function(){ done(null, out); }); parser.on('error', function(err){ if( typeof done === 'function' ) return done(err); throw err; }); return stream .pipe(parser) ; }; /** * @function Compiler#compileString * @param {string} str * * @TODO Write unit test */ Compiler.prototype.compileString = function (str, done) { var stringStream = new stream.Readable() ; stringStream._read = function(){ this.push(str); this.push(null); }; return this._compileRoutine(stringStream, done); ; } /** * @function Compiler#compileFile * @param {string} fileName * * @TODO Write unit test */ Compiler.prototype.compileFile = function (fileName, done) { var fileStream = fs.createReadStream(fileName) return this._compileRoutine(fileStream, done); }