rwwarren/door-lock

View on GitHub
web/gulp/JSGulp.js

Summary

Maintainability
C
1 day
Test Coverage
var argv = require('yargs').argv;
var browserify = require('browserify');
var buffer = require('vinyl-buffer');
var del = require('del');
var es6ify = require('es6ify');
var gulp = require('gulp');
var notify = require('gulp-notify');
var reactify = require('reactify');
var rename = require("gulp-rename");
var replacestream = require('replacestream');
var source = require('vinyl-source-stream');
var uglify = require('gulp-uglify');
var watchify = require('watchify');

es6ify.traceurOverrides = {experimental: true};

var jsBundler;
var rootJSPath = __dirname + '/../src/inc/appRouter.js';
var outputPath = __dirname + '/../src/root/js';
var buildFile = 'Bundle.js';
var devreact = __dirname + '/../src/inc/react-with-addons-0.13.3.js';
var prodreact = __dirname + '/../src/inc/react-with-addons-0.13.3.min.js';
var reactFile = 'react.js';

var JSGulp = {
  createTask: function() {
    gulp.task('js', function() {
      return JSGulp.getBundleStream();
    });
  },
  _createBundler: function(watch) {
    var bundler = browserify({
      basedir: __dirname,
      bundleExternal: false,
      cache: {},
      debug: !argv.production,
      entries: rootJSPath,
      extensions: ['.js'],
      packageCache: {},
      fullPaths: true
    });
    bundler.transform(reactify);
    bundler.transform(es6ify.configure(/.js/));
    if(watch) {
      bundler = watchify(bundler);
      bundler.on('update', JSGulp.getBundleStream);
    }
    jsBundler = bundler;
  },
  getBundleStream: function() {
    if(!jsBundler) {
      JSGulp._createBundler(false);
    }
    console.log('Bundling JS');
    var start = Date.now();
    var filename = rootJSPath.substring(rootJSPath.lastIndexOf('/') + 1);
    var stream = jsBundler.bundle();
    stream.on('error', notify.onError({
      title: 'JS Gulp',
      subtitle: 'Failure!',
      message: 'Error: <%= error.message %>',
      sound: 'beep'
    }));
    stream.on('end', function() {
      var time = Date.now() - start;
      console.log('Bundled JS (' + time + ' ms)');
    });

    stream = stream.pipe(replacestream('__DEV__', !argv.production));
    stream = stream.pipe(source(buildFile));

    if(argv.production) {
      // minification
      console.log('In production mode');
      gulp.src(prodreact)
        .pipe(rename(reactFile))
        .pipe(gulp.dest(outputPath));
      stream = stream.pipe(buffer());
      stream = stream.pipe(uglify());
    } else {
      console.log('In dev mode');
      gulp.src(devreact)
        .pipe(rename(reactFile))
        .pipe(gulp.dest(outputPath));
    }
    stream = stream.pipe(gulp.dest(outputPath));
    return stream;
  },

  watch: function() {
    JSGulp._createBundler(true);
    var stream = JSGulp.getBundleStream();
    stream.read();
  },

  clean: function() {
    del([outputPath + '/' + buildFile], function(err, paths) {
      if(err) {
        console.error('Error cleaning JS: ' + err.toString());
        return;
      }
      console.log('Cleaned Bundle JS');
    });
    del([outputPath + '/' + reactFile], function(err, paths) {
      if(err) {
        console.error('Error cleaning JS: ' + err.toString());
        return;
      }
      console.log('Cleaned React JS');
    });
  }
};

module.exports = JSGulp;