MailOnline/VPAIDHTML5Client

View on GitHub
gulpfile.js

Summary

Maintainability
A
2 hrs
Test Coverage
'use strict';

var gulp = require('gulp');
var watchify = require('watchify');
var gutil = require('gulp-util');
var ghPages = require('gulp-gh-pages');

//server and autoreload
var browserSync = require('browser-sync');
var reload = browserSync.reload;

//javascript bundle
var browserify = require('browserify');
var source = require('vinyl-source-stream');
var sourcemaps = require('gulp-sourcemaps');
var buffer = require('vinyl-buffer');
var assign = require('lodash').assign;

//test
var KarmaServer = require('karma').Server;
var istanbul = require('browserify-istanbul');

//paths
var testPath = 'test/**/**.js';
var binPath = './bin';

var jsBuilds = [
    'VPAIDHTML5Client.js'
].map(function (entry, index) {

    var build = watchify(
        browserify(
            assign(
                {},
                watchify.args,
                {
                    entries: ['./js/' + entry],
                    debug: true
                }
            )
        )
    );
    var taskName = 'bundle:' + index;

    build.on('log', gutil.log); // output build logs to terminal
    gulp.task(taskName, task);

    return {js: build, task: task, taskName: taskName};

    function task() {
        return build.bundle()
            .on('error', gutil.log.bind(gutil, 'Browserify error'))
            .pipe(source(entry))
            .pipe(buffer())
            .pipe(sourcemaps.init({loadMaps: true}))
            .pipe(sourcemaps.write('./'))
            .pipe(gulp.dest(binPath))
            .pipe(reload({stream: true, once: true}));
    }
});


function watchBundle() {
    jsBuilds.forEach(function (build) {
        build.js.on('update', build.task);
    });
}

gulp.task('browserify', jsBuilds.map(function (build) {
    return build.taskName;
}));

gulp.task('test:ci', function (done) {
    new KarmaServer({
        configFile: __dirname + '/karma.conf.js',
        reporters: ['spec', 'coverage'],
        browsers: ['Firefox'],
        browserify: {
            debug: true,
            transform: [istanbul()]
        },
        coverageReporter: {
            reporters: [
                {
                  type: 'text',
                  dir: 'coverage/',
                  file: 'coverage.txt'
                },
                {
                  type: 'html',
                  dir: 'coverage/'
                },
                {
                  type: 'lcovonly',
                  dir: 'coverage/',
                  subdir: '.'
                },
                {type: 'text-summary'}
            ]
        }
    }, function () {
        done();
    }).start();
});

gulp.task('test:deploy', function (done) {
    new KarmaServer({
        configFile: __dirname + '/karma.conf.js'
    }, function () {
        done();
    }).start();
});

gulp.task('test:dev', function (done) {
    new KarmaServer({
        configFile: __dirname + '/karma.conf.js'
    }, function () {
        done();
    }).start();
});

//watch file changes
gulp.task('watch:demo', function() {
    watchBundle();
    gulp.watch(['demo/*'], reload);
    gulp.watch([binPath + '/*.js'], ['test:dev'], reload);
    gulp.watch([testPath], ['test:dev']);
});

//watch file changes
gulp.task('watch:test', function() {
    watchBundle();
    gulp.watch([binPath + '/*.js'], ['test:dev']);
    gulp.watch([testPath], ['test:dev']);
});


//create the static server
gulp.task('serve', ['browserify', 'watch:demo'], function () {
    browserSync({
        server: {
            baseDir: ['demo', binPath]
        }
    });
});

gulp.task('deploy:demo', ['test:deploy', 'browserify'], function() {
    return gulp.src(['demo/**/*', 'bin/*.js', 'bin/*.map']).pipe(ghPages());
});

gulp.task('default', ['test:dev', 'browserify', 'watch:test']);