it('initializes', function(done) { var assetsJson = new formation.TextFileCache('./example/assets.json'); var assetsObject = new formation.JSObject(assetsJson); var moduleWrapper = new formation.TextFileCache('./example/module.js'); var moduleReplacer = new Replacer(moduleWrapper, assetsObject); assetsJson.toString = function () {return 'assetsJson';}; assetsObject.toString = function () {return 'assetsObject';}; moduleWrapper.toString = function () {return 'moduleWrapper';}; moduleReplacer.toString = function () {return 'moduleReplacer';}; racetrack.configure( [assetsObject, assetsJson, moduleWrapper, moduleReplacer], silentTracer_ ); besync.waterfall(done, [ moduleReplacer.init.bind(moduleReplacer), function (next) { should.ok(assetsJson.isInitialized); should.ok(assetsObject.isInitialized); should.ok(moduleWrapper.isInitialized); should.ok(moduleReplacer.isInitialized); moduleReplacer.cached.should.include('ASSET.SDK'); next(); } ]); });
var dispose = function (next) { besync.waterfall(next, [ assetsJson.dispose.bind(assetsJson), moduleWrapper.dispose.bind(moduleWrapper), moduleReplacer.dispose.bind(moduleReplacer), assetsObject.dispose.bind(assetsObject), ], this); };
PBJS.prototype.build = function (inputRoot, cb) { return besync.waterfall(cb, [ funct.injector(inputRoot), this._buildTaskMap, this._writeTaskMapFiles, this._cleanup ], this); };
var resolveFile = function (protoFile, cb) { cli.log('[PBJS] Resolving types... ' + protoFile.path); return besync.waterfall(cb, [ funct.injector(protoFile), resolveIncludes, resolveJsNamespace, dereferenceFileTypes, ], this); };
server.on('listening', function () { return besync.waterfall(done, [ moduleWrapper.init, visitUrl, funct.dropAll, checkJsLoaded, dispose, ], moduleWrapper); });
PBJS.prototype._getProtoFileSet = function (inputRoot, cb) { this.inputRoot = inputRoot; // TODO(gregp): parallelize return besync.waterfall(cb, [ this._initTemplates, this.parser.parseFileSet.bind(this.parser, this.inputRoot), ], this); };
PBJS.prototype._getTemplates = function(cb) { if (this.templates) { return cb(null, this.templates); } return besync.waterfall(cb, [ this.soyset.toFunctions.bind(this.soyset), this._setTemplates, ], this); };
PBJS.prototype._writeTaskFile = function (task, cb) { var outdata = task.build(); var outpath = task.outputPath; var outdir = path.dirname(outpath); return besync.waterfall(cb, [ funct.injector(outdir), mkdirp, fs.writeFile.bind(this, outpath, outdata, 'utf8') ]); };
PBJS.prototype._buildTaskMap = function (inputRoot, cb) { return besync.waterfall(cb, [ this._checkEmptyOutput, this._initTemplates, funct.dropAll, funct.injector(inputRoot), this._getProtoFileSet, this._fileSetToTaskMap, ], this); };
it('only initializes once', function (done) { var assetsJson = new formation.TextFileCache('./example/assets.json'); var assetsObject = new formation.JSObject(assetsJson); assetsObject.toString = function () {return 'assetsObject'}; assetsJson.toString = function () {return 'assetsJson'}; racetrack.configure(assetsObject, silentTracer_); racetrack.configure(assetsJson, silentTracer_); should.equal(assetsJson.isInitialized, false); should.equal(assetsObject.isInitialized, false); var outerCount = 0; var checkInitialized = function (next) { // Both should be initialized. should.equal(assetsJson.isInitialized, true); should.equal(assetsObject.isInitialized, true); // We should only init the inner dependency once. should.exist(assetsJson.init.calls); assetsJson.init.calls.should.have.length(1); // We should init the outer dependency once per init call, obviously. should.exist(assetsObject.init.calls); assetsObject.init.calls.should.have.length(++outerCount); // But we should *calulate* the outer dep only once. should.exist(assetsObject.calculate.calls); assetsObject.calculate.calls.should.have.length(1); next(); }; besync.waterfall(done, [ assetsObject.init, checkInitialized, assetsObject.init, checkInitialized, ], assetsObject); });
it('console and browser sinks have expected log output', function(done) { var assetsJson = new formation.TextFileCache('./example/assets.json'); var assetsObject = new formation.JSObject(assetsJson); var moduleWrapper = new formation.TextFileCache('./example/module.js'); var moduleReplacer = new Replacer(moduleWrapper, assetsObject); var port = Math.floor(Math.random() * 30000 + 12000); var bs = new formation.BrowserSink(); var cs = new formation.ConsoleSink(); var app = express(); var startExpressApp = function(port, cb) { var server = app.listen(port); bs.expressify(app, server); server.on('listening', cb); }; assetsJson.toString = function () {return 'assetsJson';}; assetsObject.toString = function () {return 'assetsObject';}; moduleWrapper.toString = function () {return 'moduleWrapper';}; moduleReplacer.toString = function () {return 'moduleReplacer';}; racetrack.configure( [moduleWrapper, moduleReplacer, assetsObject, assetsJson], silentTracer_ ); var browser = new Browser(); // Shut up the console reporter. browser.removeAllListeners('console'); var logs = []; formation.ConsoleSink.log = function () { logs.push([].slice.call(arguments).map(trim)); // console.log.apply(console, arguments); }; var visitUrl = function (next) { var url = 'http://localhost:' + port + '/'; // console.log('Browser trying to connect to ' + url); browser.visit(url, next); }; var watchAndTouch = function (next) { bs.watch(assetsJson); bs.watch(moduleWrapper); bs.watch(moduleReplacer); bs.watch(assetsObject); cs.watch(assetsJson); cs.watch(assetsObject); cs.watch(moduleWrapper); cs.watch(moduleReplacer); // console.log(new Array(70).join('-')); fs.supertouch('./example/assets.json', next); }; var checkConsole = function (next) { // console.log(new Array(70).join('-')); logs.should.eql([ // Dirty messages cascade; we may get them potentially in random order. ['<cli ([Replacer]) dirty>'], ['<cli ([JSObject]) dirty>'], ['<cli ([TextFileCache ./example/assets.json]) dirty>'], ['<cli ([TextFileCache ./example/assets.json]) update: 661 chars>'], ['<cli ([JSObject]) update: 5 keys>'], ['<cli ([Replacer]) update: 71 chars>'], ]); next(); }; var registerConsoleCheck = function (next) { moduleReplacer.on('update', function () { setTimeout(checkConsole.bind(this, next), 0); }); }; var checkBrowser = function (next) { // Should have 1 socket open Object.keys(bs.streams).should.have.length(1); // Check that we got some good stuff back from the browser bs.logs.should.eql([ '<browser ([Replacer]) dirty: 36 bytes>\n', '<browser ([JSObject]) dirty: 36 bytes>\n', '<browser ([TextFileCache ./example/assets.json]) dirty: 63 bytes>\n', '<browser ([TextFileCache ./example/assets.json]) update: 872 bytes>\n', '<browser ([JSObject]) update: 534 bytes>\n', '<browser ([Replacer]) update: 125 bytes>\n', ]); next(); }; var dispose = function (next) { besync.waterfall(next, [ assetsJson.dispose.bind(assetsJson), moduleWrapper.dispose.bind(moduleWrapper), moduleReplacer.dispose.bind(moduleReplacer), assetsObject.dispose.bind(assetsObject), ], this); }; besync.waterfall(done, [ moduleReplacer.init.bind(moduleReplacer), moduleWrapper.init.bind(moduleWrapper), assetsJson.init.bind(assetsJson), // bs.init.bind(bs, port), startExpressApp.bind(this, port), visitUrl, funct.dropAll, watchAndTouch, funct.dropAll, registerConsoleCheck, function (next) { // Zombie takes a few ms to catch up... setTimeout(next, 5); }, checkBrowser, dispose, ]); });
PBJS.prototype._initTemplates = function (cb) { return besync.waterfall(cb, [ this._getTemplates, funct.dropAll ], this); };