(function () { 'use strict'; var gulp = require('gulp'); var glob = require('glob'); var del = require('del'); var $ = require('gulp-load-plugins')(); var pkg = require('./package.json'); var _short_name = pkg.shortName.toLowerCase(); var _bower_dir = 'bower_components'; var _theme_dir = 'web/wp-content/themes'; var _child_dir = _theme_dir + '/' + _short_name; var _assets_dir = _child_dir + '/assets'; var _src_dir = _assets_dir + '/src'; var _dist_dir = _assets_dir + '/dist'; var _dev_dir = _assets_dir + '/dev'; var _img_dir = _assets_dir + '/images'; var _banner = '/*!' + (pkg.title || pkg.name) + ' - v' + pkg.version + ' - ' + (new Date()).toDateString() + '*/\n'; var _clrgrd_opts = { whitelist: [ ['#fff', '#fefefe'] ] }; // Cleans the dist directory gulp.task('clean:dist', function(callback) { del([_dist_dir + '/**'], callback); }); // Cleans the dev directory gulp.task('clean:dev', function(callback) { del([_dev_dir + '/**'], callback); }); // Lints the gulpfile for errors gulp.task('lint:gulpfile', function() { gulp.src('gulpfile.js') .pipe( $.jshint() ) .pipe( $.jshint.reporter('default') ); }); // Lints the source js files for errors gulp.task('lint:src', function() { var _src = [ _src_dir + '/js/**/*.js', '!**/libs/**/*.js' ]; var _options = { lookup: _src_dir + '/.jshintrc' }; gulp.src(_src) .pipe( $.jshint(_options) ) .pipe( $.jshint.reporter('default') ); }); // Concatonates, minifies and renames the source JS files for Dist gulp.task('scripts:dist', function() { glob.sync(_src_dir + '/js/*', function(err, matches) { if (err) { throw err; } if (matches.length) { matches.forEach(function(match) { var dir = match.split('/js/')[1]; var scripts = [ _src_dir + '/js/' + dir + '/libs/**/*.js', _src_dir + '/js/' + dir + '/**/*.js' ]; if (dir === 'footer') { var footer_scripts = [ _bower_dir + '/history.js/scripts/uncompressed/history.js', _bower_dir + '/history.js/scripts/uncompressed/history.adapter.jquery.js', ]; scripts = footer_scripts.concat(scripts); } gulp.src(scripts) .pipe( $.plumber() ) .pipe( $.concat(dir + '.js') ) .pipe( $.uglify() ) .pipe( $.header(_banner, {pkg : pkg}) ) .pipe( $.rename(dir + '.min.js') ) .pipe( gulp.dest(_dist_dir) ); }); } }); }); // Concatonates the source JS files for Dev gulp.task('scripts:dev', function() { glob.sync(_src_dir + '/js/*', function(err, matches) { if (err) { throw err; } if (matches.length) { matches.forEach(function(match) { var dir = match.split('/js/')[1]; var scripts = [ _src_dir + '/js/' + dir + '/libs/**/*.js', _src_dir + '/js/' + dir + '/**/*.js' ]; gulp.src(scripts) .pipe( $.plumber() ) .pipe( $.concat(dir + '.js') ) .pipe( gulp.dest(_dev_dir) ); }); } }); }); // Compiles and compresses the source Sass files for Dist gulp.task('styles:dist', function() { var _sass_opts = { loadPath: _bower_dir, style: 'compressed', lineNumbers: false }; gulp.src(_src_dir + '/scss/style.scss') .pipe( $.plumber() ) .pipe( $.rubySass(_sass_opts) ) .pipe( $.colorguard(_clrgrd_opts) ) .pipe( $.rename('style.min.css') ) .pipe( gulp.dest(_dist_dir) ); }); // Compiles the source Sass files for Dev gulp.task('styles:dev', function() { var _sass_opts = { loadPath: _bower_dir, style: 'expanded', lineNumbers: true }; gulp.src(_src_dir + '/scss/style.scss') .pipe( $.plumber() ) .pipe( $.rubySass(_sass_opts) ) .pipe( $.colorguard(_clrgrd_opts) ) .pipe( gulp.dest(_dev_dir) ); }); // Minimizes all the images gulp.task('images', function() { var _options = { progressive: true, svgoPlugins: [{removeViewBox: false}] }; gulp.src(_img_dir + '/src/**/*') .pipe( $.changed(_img_dir + '/min/') ) .pipe( $.imagemin(_options) ) .pipe( gulp.dest(_img_dir + '/min/') ); }); // Lints all the js files for errors gulp.task('lint', [ 'lint:gulpfile', 'lint:src' ]); // Builds for distribution (staging or production) gulp.task('build', [ 'clean:dist', 'lint', 'scripts:dist', 'styles:dist', 'images' ]); // Builds for development (local) gulp.task('build:dev', [ 'clean:dev', 'lint:src', 'scripts:dev', 'styles:dev', ]); // Builds assets and reloads the page when any php, html, img or dev files change gulp.task('watch', function() { $.livereload.listen(); gulp.watch(_src_dir + '/scss/**/*', ['sass:dev']); gulp.watch(_src_dir + '/js/**/*', [ 'lint:src', 'scripts:dev' ]); gulp.watch([ _child_dir + '/**/*.php', _child_dir + '/**/*.html', _dev_dir + '/**/*', _img_dir + '/*' ]).on('change', $.livereload.changed); }); // Backup default task just triggers a build gulp.task('default', ['build']); }());