Beispiel #1
0
  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();
      }
    ]);
  });
Beispiel #2
0
 var dispose = function (next) {
   besync.waterfall(next, [
     assetsJson.dispose.bind(assetsJson),
     moduleWrapper.dispose.bind(moduleWrapper),
     moduleReplacer.dispose.bind(moduleReplacer),
     assetsObject.dispose.bind(assetsObject),
   ], this);
 };
Beispiel #3
0
PBJS.prototype.build = function (inputRoot, cb) {
  return besync.waterfall(cb, [
    funct.injector(inputRoot),
    this._buildTaskMap,
    this._writeTaskMapFiles,
    this._cleanup
  ], this);
};
Beispiel #4
0
var resolveFile = function (protoFile, cb) {
  cli.log('[PBJS] Resolving types... ' + protoFile.path);
  return besync.waterfall(cb, [
    funct.injector(protoFile),
    resolveIncludes,
    resolveJsNamespace,
    dereferenceFileTypes,
  ], this);
};
Beispiel #5
0
 server.on('listening', function () {
   return besync.waterfall(done, [
     moduleWrapper.init,
     visitUrl,
     funct.dropAll,
     checkJsLoaded,
     dispose,
   ], moduleWrapper);
 });
Beispiel #6
0
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);
};
Beispiel #7
0
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);
};
Beispiel #8
0
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')
  ]);
};
Beispiel #9
0
PBJS.prototype._buildTaskMap = function (inputRoot, cb) {
  return besync.waterfall(cb, [
    this._checkEmptyOutput,
    this._initTemplates,
    funct.dropAll,
    funct.injector(inputRoot),
    this._getProtoFileSet,
    this._fileSetToTaskMap,
  ], this);
};
Beispiel #10
0
    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);
    });
Beispiel #11
0
    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,
      ]);
    });
Beispiel #12
0
PBJS.prototype._initTemplates = function (cb) {
  return besync.waterfall(cb, [
    this._getTemplates,
    funct.dropAll
  ], this);
};