/* jshint node:true, camelcase:false */
|
|
var gulp = require('gulp');
|
|
var del = require('del');
|
|
var glob = require('glob');
|
|
var karma = require('karma').server;
|
|
var merge = require('merge-stream');
|
|
var plato = require('plato');
|
|
var plug = require('gulp-load-plugins')();
|
|
|
|
var paths = {
|
|
js: './toastr.js',
|
|
less: './toastr.less',
|
|
report: './report',
|
|
build: './build'
|
|
};
|
|
|
|
var colors = plug.util.colors;
|
|
var log = plug.util.log;
|
|
|
|
/**
|
|
* List the available gulp tasks
|
|
*/
|
|
gulp.task('help', plug.taskListing);
|
|
|
|
/**
|
|
* Lint the code, create coverage report, and a visualizer
|
|
* @return {Stream}
|
|
*/
|
|
gulp.task('analyze', function() {
|
|
log('Analyzing source with JSHint, JSCS, and Plato');
|
|
|
|
var jshint = analyzejshint([paths.js]);
|
|
var jscs = analyzejscs([paths.js]);
|
|
|
|
startPlatoVisualizer();
|
|
|
|
return merge(jshint, jscs);
|
|
});
|
|
|
|
/**
|
|
* Minify and bundle the app's JavaScript
|
|
* @return {Stream}
|
|
*/
|
|
gulp.task('js', function() {
|
|
log('Bundling, minifying, and copying the app\'s JavaScript');
|
|
|
|
return gulp
|
|
.src(paths.js)
|
|
.pipe(plug.sourcemaps.init())
|
|
.pipe(plug.bytediff.start())
|
|
.pipe(plug.uglify({}))
|
|
.pipe(plug.bytediff.stop(bytediffFormatter))
|
|
.pipe(plug.sourcemaps.write('.'))
|
|
.pipe(plug.rename(function(path) {
|
|
if (path.extname === '.js') {
|
|
path.basename += '.min';
|
|
}
|
|
}))
|
|
.pipe(gulp.dest(paths.build));
|
|
});
|
|
|
|
/**
|
|
* Minify and bundle the CSS
|
|
* @return {Stream}
|
|
*/
|
|
gulp.task('css', function() {
|
|
log('Bundling, minifying, and copying the app\'s CSS');
|
|
|
|
return gulp.src(paths.less)
|
|
.pipe(plug.less())
|
|
// .pipe(plug.autoprefixer('last 2 version', '> 5%'))
|
|
.pipe(gulp.dest(paths.build))
|
|
.pipe(plug.bytediff.start())
|
|
.pipe(plug.minifyCss({}))
|
|
.pipe(plug.bytediff.stop(bytediffFormatter))
|
|
.pipe(plug.rename('toastr.min.css'))
|
|
.pipe(gulp.dest(paths.build));
|
|
});
|
|
|
|
/**
|
|
* Build js and css
|
|
*/
|
|
gulp.task('default', ['js', 'css'], function() {
|
|
log('Analyze, Build CSS and JS');
|
|
});
|
|
|
|
/**
|
|
* Remove all files from the build folder
|
|
* One way to run clean before all tasks is to run
|
|
* from the cmd line: gulp clean && gulp build
|
|
* @return {Stream}
|
|
*/
|
|
gulp.task('clean', function(cb) {
|
|
log('Cleaning: ' + plug.util.colors.blue(paths.report));
|
|
log('Cleaning: ' + plug.util.colors.blue(paths.build));
|
|
|
|
var delPaths = [paths.build, paths.report];
|
|
del(delPaths, cb);
|
|
});
|
|
|
|
/**
|
|
* Run specs once and exit
|
|
* To start servers and run midway specs as well:
|
|
* gulp test --startServers
|
|
* @return {Stream}
|
|
*/
|
|
gulp.task('test', function(done) {
|
|
startTests(true /*singleRun*/ , done);
|
|
});
|
|
|
|
////////////////
|
|
|
|
/**
|
|
* Execute JSHint on given source files
|
|
* @param {Array} sources
|
|
* @param {String} overrideRcFile
|
|
* @return {Stream}
|
|
*/
|
|
function analyzejshint(sources, overrideRcFile) {
|
|
var jshintrcFile = overrideRcFile || './.jshintrc';
|
|
log('Running JSHint');
|
|
return gulp
|
|
.src(sources)
|
|
.pipe(plug.jshint(jshintrcFile))
|
|
.pipe(plug.jshint.reporter('jshint-stylish'));
|
|
}
|
|
|
|
/**
|
|
* Execute JSCS on given source files
|
|
* @param {Array} sources
|
|
* @return {Stream}
|
|
*/
|
|
function analyzejscs(sources) {
|
|
log('Running JSCS');
|
|
return gulp
|
|
.src(sources)
|
|
.pipe(plug.jscs('./.jscsrc'));
|
|
}
|
|
|
|
/**
|
|
* Start Plato inspector and visualizer
|
|
*/
|
|
function startPlatoVisualizer() {
|
|
log('Running Plato');
|
|
|
|
var files = glob.sync('toastr.js');
|
|
|
|
var options = {
|
|
title: 'Plato Inspections Report'
|
|
};
|
|
var outputDir = './report/plato';
|
|
|
|
plato.inspect(files, outputDir, options, platoCompleted);
|
|
|
|
function platoCompleted(report) {
|
|
var overview = plato.getOverviewReport(report);
|
|
log(overview.summary);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Start the tests using karma.
|
|
* @param {boolean} singleRun - True means run once and end (CI), or keep running (dev)
|
|
* @param {Function} done - Callback to fire when karma is done
|
|
* @return {undefined}
|
|
*/
|
|
function startTests(singleRun, done) {
|
|
karma.start({
|
|
configFile: __dirname + '/karma.conf.js',
|
|
singleRun: !!singleRun
|
|
}, karmaCompleted);
|
|
|
|
////////////////
|
|
|
|
function karmaCompleted() {
|
|
done();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Formatter for bytediff to display the size changes after processing
|
|
* @param {Object} data - byte data
|
|
* @return {String} Difference in bytes, formatted
|
|
*/
|
|
function bytediffFormatter(data) {
|
|
var difference = (data.savings > 0) ? ' smaller.' : ' larger.';
|
|
return data.fileName + ' went from ' +
|
|
(data.startSize / 1000).toFixed(2) + ' kB to ' + (data.endSize / 1000).toFixed(2) + ' kB' +
|
|
' and is ' + formatPercent(1 - data.percent, 2) + '%' + difference;
|
|
}
|
|
|
|
/**
|
|
* Format a number as a percentage
|
|
* @param {Number} num Number to format as a percent
|
|
* @param {Number} precision Precision of the decimal
|
|
* @return {Number} Formatted perentage
|
|
*/
|
|
function formatPercent(num, precision) {
|
|
return (num * 100).toFixed(precision);
|
|
}
|