var source = require('vinyl-source-stream'); var gulp = require('gulp'); var gutil = require('gulp-util'); var browserify = require('browserify'); var babelify = require('babelify'); var watchify = require('watchify'); var notify = require('gulp-notify'); var stylus = require('gulp-stylus'); var autoprefixer = require('gulp-autoprefixer'); var uglify = require('gulp-uglify'); var rename = require('gulp-rename'); var buffer = require('vinyl-buffer'); var browserSync = require('browser-sync'); var reload = browserSync.reload; var historyApiFallback = require('connect-history-api-fallback') /* Styles Task */ gulp.task('styles',function() { // move over fonts gulp.src('css/fonts/**.*') .pipe(gulp.dest('build/css/fonts')) // Compiles CSS gulp.src('css/style.styl') .pipe(stylus()) .pipe(autoprefixer()) .pipe(gulp.dest('./build/css/')) .pipe(reload({stream:true})) }); /* Images */ gulp.task('images',function(){ gulp.src('css/images/**') .pipe(gulp.dest('./build/css/images')) }); /* Browser Sync */ gulp.task('browser-sync', function() { browserSync({ // we need to disable clicks and forms for when we test multiple rooms server : {}, middleware : [ historyApiFallback() ], ghostMode: false }); }); function handleErrors() { var args = Array.prototype.slice.call(arguments); notify.onError({ title: 'Compile Error', message: '<%= error.message %>' }).apply(this, args); this.emit('end'); // Keep gulp from hanging on this task } function buildScript(file, watch) { var props = { entries: ['./src/' + file], debug : true, transform: [babelify.configure({ stage : 0 })], cache: {}, packageCache: {}, fullPaths: true // Requirement of watchify }; // watchify() if watch requested, otherwise run browserify() once var bundler = watch ? watchify(browserify(props)) : browserify(props); function rebundle() { var stream = bundler.bundle(); return stream .on('error', handleErrors) .pipe(source(file)) .pipe(rename('build.js')) .pipe(gulp.dest('./build/')) // If you also want to uglify it // .pipe(buffer()) // .pipe(uglify()) // .pipe(rename('app.min.js')) // .pipe(gulp.dest('./build')) .pipe(reload({stream:true})) } // listen for an update and run rebundle bundler.on('update', function() { rebundle(); gutil.log('Rebundle...'); }); // run it once the first time buildScript is called return rebundle(); } gulp.task('scripts', function() { return buildScript('app.jsx', false); // this will run once because we set watch to false }); // run 'scripts' task first, then watch for future changes gulp.task('default', ['images','styles','scripts','browser-sync'], function() { gulp.watch('css/**/*', ['styles']); // gulp watch for stylus changes return buildScript('app.jsx', true); // browserify watch for JS changes });