nedf23
8/15/2015 - 7:03 PM

gulpfile.js

var gulp = require('gulp');
var runSequence = require('run-sequence');
var minifyCss = require('gulp-minify-css');

var buildDir = './build/';
var build = new Date().getTime();

var minifyCssSettings = { advanced: true, aggressiveMerging: true };

// Main build
gulp.task('build', function() {
  return runSequence(
    'clean',
    ['move-js', 'move-php', 'move-images', 'compile-stylus'],
    ['clone-history'],
    ['clone-prism'],
    ['move-prism-css', 'move-prism-js'],
    'remove-prism',
    ['minify-css', 'minify-js'],
    ['concat-prism-css'],
    ['replace-build-ids'],
    'create-backup-zip',
    'move-to-wordpress'
  );
});

// Just a quick build for fast development
gulp.task('build-quick', function() {
  runSequence(['move-js', 'move-php', 'move-images', 'compile-stylus'], 'replace-build-ids', 'move-to-wordpress');
});

// Wipes out the build dir
gulp.task('clean', function() {
  return gulp.src(buildDir, { read: false }).pipe(require('gulp-clean')());
});

// Validate JS
gulp.task('validate-js', function() {
  return gulp.src('./js/**.js').pipe(require('gulp-jshint')());
});

// Move files to build dir before minifying them
[['js', 'js'], ['php', ''], ['images', 'images']].forEach(function(item) {
  gulp.task('move-' + item[0], function() {
    return gulp.src('./' + item[0] + '/**').pipe(gulp.dest(buildDir + item[1]));
  });
});

// Minify JS and create sourcemaps
gulp.task('minify-js', function() {
  return gulp.src(buildDir + '/js/**.js').pipe(require('gulp-uglify')()).pipe(gulp.dest(buildDir + 'js'));
});

// Minify CSS and create sourcemaps
gulp.task('minify-css', function() {
  var sourcemaps = require('gulp-sourcemaps');

  return gulp.src(buildDir + '**.css')
    .pipe(sourcemaps.init())
    .pipe(minifyCss(minifyCssSettings))
    .pipe(sourcemaps.write('./maps'))
    .pipe(gulp.dest(buildDir));
});

// Concat the prism CSS to main CSS to save a request
gulp.task('concat-prism-css', function() {
  return gulp.src([buildDir + 'style.css', buildDir + 'js/libs/prism.css']).pipe(require('gulp-concat')('style.css')).pipe(gulp.dest(buildDir));
});

// Compiles stylus but doesn't minify or cleanup
gulp.task('compile-stylus', function() {
  var sourcemaps = require('gulp-sourcemaps');

  return gulp.src('./stylus/**')
    .pipe(sourcemaps.init())
    .pipe(require('gulp-stylus')({ compress: false }))
    .pipe(gulp.dest(buildDir));
});

// Minify HTML
gulp.task('minify-html', function() {
  return gulp.src('./php/**').pipe(require('gulp-htmlmin')({ collapseWhitespace: true })).pipe(gulp.dest(buildDir));
});

// Minify Images
gulp.task('minify-images', function() {
  return gulp.src('./images/**').pipe(require('gulp-imagemin')({ progressive: true, use: [require('imagemin-pngquant')()] })).pipe(gulp.dest(buildDir + '/images'));
});

// Clones down MooTools History
gulp.task('clone-history', function(done) { 
  require('gulp-git').clone('https://github.com/cpojer/mootools-history.git', { args: buildDir + 'js/libs/mootools-history' }, function() {
    done();
  });
});

// Clones down the Prism repo
gulp.task('clone-prism', function(done) { 
  require('gulp-git').clone('https://github.com/LeaVerou/prism.git', { args: buildDir + 'js/libs/prism' }, function(err) {
    done();
  });
});

// Move the Prism CSS file out of its burried place
gulp.task('move-prism-css', function() {
  return gulp.src(buildDir + '/js/libs/prism/themes/prism.css').pipe(minifyCss(minifyCssSettings)).pipe(gulp.dest(buildDir + '/js/libs/')); 
});

// Concatenate and move the Prism JS files
gulp.task('move-prism-js', function() {
  var base = buildDir + '/js/libs/prism/components/';
  var files = [];
  ['core', 'clike', 'apacheconf', 'bash', 'css', 'css-extras', 'javascript', 'markup', 'php', 'php-extras', 'python', 'sass', 'scss', 'stylus', 'sql'].forEach(function(item) {
    files.push(base + 'prism-' + item + '.min.js');
  });
  return gulp.src(files, { base: '.' }).pipe(require('gulp-concat')('prism.js')).pipe(gulp.dest(buildDir + '/js/libs/'));
});

// Remove the stuff from prism we never wanted
gulp.task('remove-prism', function() {
  return gulp.src(buildDir + '/js/libs/prism', { read: false }).pipe(require('gulp-clean')());
});

// Replace build IDs inside required PHP and JS files
gulp.task('replace-build-ids', function() {
  return gulp.src([buildDir + '/**/*.php', buildDir + '/**/*.js']).pipe(require('gulp-replace')('{{ VERSION }}', build)).pipe(gulp.dest(buildDir));
});

// Create ZIP of this for backup
gulp.task('create-backup-zip', function() {
  return gulp.src('./**').pipe(require('gulp-zip')('punky_source.zip')).pipe(gulp.dest(buildDir));
});

// Move dist files to Wordpress-visible theme
gulp.task('move-to-wordpress', function() {
  return gulp.src(buildDir + '/**').pipe(gulp.dest('../punky'));
});