seblucas/cops-html-ui

View on GitHub
gulpfile.js

Summary

Maintainability
A
3 hrs
Test Coverage
'use strict';

var gulp = require('gulp');

// Import dependencies
var jshint = require('gulp-jshint');
var mainBowerFiles = require('main-bower-files');
var concat = require('gulp-concat');
var connect = require('gulp-connect');
var bootlint = require('gulp-bootlint');
var gulpFilter = require('gulp-filter');
var rename = require('gulp-rename');
var replace = require('gulp-replace');
var zip = require('gulp-zip');
var Server = require('karma').Server;
var templateCache = require('gulp-angular-templatecache');
var plato = require('plato');
var protractor = require('gulp-protractor').protractor;
var webdriver_update = require('gulp-protractor').webdriver_update;

var source = 'app/';

var jsSources = [source + 'app.module.js',
                 source + 'app.config.js',
                 source + '**/*.js',
                 '!' + source + 'bower_components/**/*.js',
                 '!' + source + '**/*.spec.js',
                 '!' + source + '**/*.e2e.js',
                 '!' + source + '**/*.mock.js'];

var cssSources = [source + '**/*.css',
                  '!' + source + 'bower_components/**/*.css'];

var htmlSources = [source + '**/*.html',
                   '!' + source + 'bower_components/**/*.html',
                   '!' + source + 'index*.html'];

var publishdir = 'public';
var dist = {
css: publishdir + '/css/',
js: publishdir + '/js/',
fonts: publishdir + '/fonts/',
lang: publishdir + '/lang/',
mock: publishdir + '/mock/',
};
// Define tasks

// Lint Task
gulp.task('bootlint', function () {
    gulp.src([source + '**/*.html'])
        .pipe(bootlint({
          disabledIds: ['E001', 'W001', 'W002', 'W003', 'W005']
        }));
});


// Lint Task
gulp.task('lint', function () {
    gulp.src(jsSources)
        .pipe(jshint())
        .pipe(jshint.reporter('default'))
        .pipe(jshint.reporter('fail'));
});

gulp.task('bower', function() {
    var jsFilter = gulpFilter('**/*.js', {restore: true});
    var cssFilter = gulpFilter('**/*.css', {restore: true});
    var fontFilter = gulpFilter('**/*.{otf,eot,svg,ttf,woff,woff2}', {restore: true});

    return gulp.src(mainBowerFiles())
        .pipe(jsFilter)
        .pipe(concat('vendor.js'))
        .pipe(gulp.dest(dist.js))
        .pipe(jsFilter.restore)
        .pipe(cssFilter)
        .pipe(concat('vendor.css'))
        .pipe(gulp.dest(dist.css))
        .pipe(cssFilter.restore)
        .pipe(fontFilter)
        .pipe(gulp.dest(dist.fonts));
});

gulp.task('js', function() {
    return gulp.src(jsSources)
        .pipe(concat('cops.js'))
        .pipe(gulp.dest(dist.js));
});

gulp.task('css', function() {
    return gulp.src(cssSources)
        .pipe(concat('cops.css'))
        .pipe(gulp.dest(dist.css));
});

gulp.task('index', function() {
    return gulp.src([source + 'index_prod.html'])
        .pipe(gulp.dest(publishdir));
});

gulp.task('lang', function() {
    return gulp.src([source + 'lang/*'])
        .pipe(replace(/"content\.series\.data"\:(.*?)\{0\}(.*?),/g, '"content.series.data":$1{{number}}$2,'))
        .pipe(replace(/"content\.series\.data"\:(.*?)\{1\}(.*?),/g, '"content.series.data":$1{{name}}$2,'))
        .pipe(replace(/"splitByLetter\.letter"\:(.*?)\{0\}(.*?),/g, '"splitByLetter.letter":$1{{category}}$2,'))
        .pipe(replace(/"splitByLetter\.letter"\:(.*?)\{1\}(.*?),/g, '"splitByLetter.letter":$1{{letter}}$2,'))
        .pipe(replace('"bookword.title"', '"books.title"'))
        .pipe(replace('authorword', 'authorsword'))
        .pipe(replace('tagword', 'tagsword'))
        .pipe(replace('bookword', 'booksword'))
        .pipe(replace('publisherword', 'publishersword'))
        .pipe(replace('ratingword', 'ratingsword'))
        .pipe(replace('languageword', 'languagesword'))
        .pipe(gulp.dest(dist.lang));
});

gulp.task('plato', function() {
  var jsPlato = [source + 'app.module.js',
                 source + 'app.config.js',
                 source + '**/*.controller.js',
                 source + '**/*.service.js',
                 source + '**/*.route.js'];
  var outputDir = './plato';
  var options = {
    title: 'COPS'
  };

  return plato.inspect(jsPlato, outputDir, options, function() {});
});

gulp.task('html', function() {
  return gulp.src(htmlSources)
        .pipe(templateCache('templates.js', { standalone: true }))
        .pipe(gulp.dest(dist.js));
});

gulp.task('other', ['index', 'lang', 'html']);

gulp.task('default', ['bower', 'css', 'js', 'other']);

gulp.task('watch', ['default'], function() {
  gulp.watch(cssSources, ['css']);
  gulp.watch(jsSources, ['js']);
  gulp.watch(htmlSources, ['html']);
}); // development

gulp.task('test', ['default'], function(done) {
  new Server({
    configFile: __dirname + '/karma.conf.js',
    singleRun: true
  }, done).start();
});

gulp.task('ci', ['lint', 'bootlint', 'test']);

gulp.task('protractor:js', function() {
    return gulp.src([source + 'bower_components/angular-mocks/angular-mocks.js',
                     'protractor/js/*.js'])
        .pipe(gulp.dest(dist.js));
});

gulp.task('protractor:mock', function() {
    return gulp.src(['protractor/mock/*.txt'])
        .pipe(gulp.dest(dist.mock));
});

gulp.task('protractor:index', function() {
    return gulp.src([source + 'index_prod.html'])
        .pipe(replace(/<!-- e2e -->/g, '<script src="js/angular-mocks.js"></script><script src="js/CopsE2E.js"></script>'))
        .pipe(replace(/ng-app="Cops"/g, 'ng-app="CopsE2E"'))
        .pipe(rename('index_protractor.html'))
        .pipe(gulp.dest(publishdir));
});

gulp.task('protractor:webserver:start', function () {
  connect.server({
    root: 'public',
    port: 4321
  });
});

gulp.task('protractor:webserver:stop', function() {
  connect.serverClose();
});

gulp.task('protractor:prepare', ['protractor:index', 'protractor:js', 'protractor:mock']);

// Downloads the selenium webdriver
gulp.task('webdriver_update', webdriver_update);

gulp.task('protractor', ['webdriver_update', 'protractor:prepare', 'protractor:webserver:start'], function() {

  gulp.src([source + 'configuration/*.e2e.js', source + '**/*.e2e.js'])
    .pipe(protractor({
        configFile: 'protractor.conf.js'
  }))
  .on('error', function(e) { throw e; })
  .on('end', function() { connect.serverClose(); });
});


gulp.task('archive', function() {
    return gulp.src([publishdir + '/**',
          '!' + publishdir + '/mock',    // Trick to exclude both directory
          '!' + publishdir + '/mock/**', // and directory content
          '!' + publishdir + '/js/angular-mocks.js',
          '!' + publishdir + '/js/CopsE2E.js',
          '!' + publishdir + '/index_protractor.html',
          ])
        .pipe(zip('cops-html-ui.zip'))
        .pipe(gulp.dest('.'));
});