You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

200 lines
4.9 KiB

/* 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);
}