gulpfile.js

Summary

Maintainability
B
4 hrs
Test Coverage
'use strict';

/* global require, process, __dirname */

var log = require('debug-logdown')('gulp');

var bold = require('quote')({ quotes: '*' });
log.info('node', bold(process.version));

var babel = require('babel-core/register');

var gulp = require('gulp'),
  eslint = require('gulp-eslint'),
  uglify = require('gulp-uglify'),
  rename = require('gulp-rename'),
  del = require('del'),
  watch = require('gulp-watch'),
  gutil = require('gulp-util'),
  webpack = require('gulp-webpack'),
  header = require('gulp-header');
var glob = require('glob');
var mocha = require('gulp-mocha');
var pkg = require('./package.json');
var join = require('path').join;

var banner = ['/**',
  ' * <%= pkg.name %> - <%= pkg.description %>',
  ' * @version v<%= pkg.version %>',
  ' */',
  ''].join('\n');

var allSources = glob.sync('src/*.{es6,js}');
log.log('all source files:\n' + allSources.join('\n  '));

// need to skip specs
function isSpecFile(filename) {
  return /-spec\./.test(filename);
}
var src = allSources.filter(function (filename) {
  return !isSpecFile(filename);
});
log.log('just source files:\n' + src.join('\n  '));

var specs = allSources.filter(isSpecFile);
log.log('spec files');
log.log(specs);

var dest = './dist';

gulp.task('deps-ok', function () {
  var depsOk = require('deps-ok');
  var ok = depsOk(process.cwd(), false);
  if (!ok) {
    gulp.emit('error', new gutil.PluginError('deps-ok', 'Found outdated installs'));
  }
});

gulp.task('clean', function(cb) {
  del([dest], cb);
});

gulp.task('lint:src', function () {
  return gulp.src(src)
    .pipe(eslint({
      useEslintrc: true
    }))
    .pipe(eslint.format())
    .pipe(eslint.failOnError());
});

gulp.task('lint:specs', function () {
  return gulp.src(specs)
    .pipe(eslint({
      useEslintrc: true
    }))
    .pipe(eslint.format())
    .pipe(eslint.failOnError());
});

gulp.task('lint:gulpfile', function () {
  return gulp.src('gulpfile.js')
    .pipe(eslint({
      useEslintrc: true
    }))
    .pipe(eslint.format())
    .pipe(eslint.failOnError());
});

var webpackPlugins = (function () {
  // Include webpack -- rather than gulp-webpack -- but avoid making it global
  // since that will lead to confusion. Additionally, avoid inlining it since
  // that would confuse the `new` syntax.
  var pack = require('webpack');
  return [new pack.BannerPlugin('@gener' + 'ated' + ' @no' + 'lint')];
}());

gulp.task('webpack', function () {
  return gulp.src('')
    .pipe(webpack({
      entry: './src/k2.es6',
      module: {
        loaders: [
          { test: /\.es6$/, exclude: /node_modules/, loader: 'babel-loader' }
        ]
      },
      plugins: webpackPlugins,
      output: {
        filename: 'k2.js',
        library: 'k2',
        libraryTarget: 'umd'
      }
    }))
    .pipe(header(banner, { pkg: pkg }))
    .pipe(gulp.dest(dest))
    .pipe(rename({suffix: '.min'}))
    .pipe(uglify())
    .pipe(gulp.dest(dest));
});

gulp.task('webpack-browser', function () {
  return gulp.src('')
    .pipe(webpack({
      entry: './src/k2.es6',
      module: {
        loaders: [
          { test: /\.es6$/, exclude: /node_modules/, loader: 'babel-loader' }
        ]
      },
      externals: {
        lodash: '_'
      },
      plugins: webpackPlugins,
      output: {
        filename: 'k2-browser.js',
        library: 'k2',
        libraryTarget: 'umd'
      }
    }))
    .pipe(header(banner, { pkg: pkg }))
    .pipe(gulp.dest(dest))
    .pipe(rename({suffix: '.min'}))
    .pipe(uglify())
    .pipe(gulp.dest(dest));
});

gulp.task('mocha', function () {
  var outputFolder = process.env.CIRCLE_TEST_REPORTS;
  var outputFilename = outputFolder ? join(outputFolder, 'junit.xml') : null;
  var reporter = outputFilename ? 'xunit' : 'spec';

  return gulp.src(specs, {read: false})
    .pipe(mocha({
      compilers: {
        js: babel
      },
      reporter: reporter,
      ui: 'bdd',
      reporterOptions: {
        output: outputFilename
      }
    }));
});

gulp.task('test', ['mocha']);

gulp.task('watch', function() {
  var options = { ignoreInitial: true };
  watch(src, options, function () {
    gulp.start('lint', 'webpack');
  });
});

gulp.task('lint', ['lint:src', 'lint:specs', 'lint:gulpfile']);

gulp.task('default', ['deps-ok', 'clean'], function () {
  gulp.start('lint', 'webpack', 'webpack-browser');
});