furnace

gulp

declaration
 gulp 

var gulp = require('gulp');
var gutil = require('gulp-util');
var streamify = require('gulp-streamify');
var uglify = require('gulp-uglify');
var browserify = require('browserify');
var source = require('vinyl-source-stream');
var sourcemaps = require('gulp-sourcemaps');
var rev = require('gulp-rev');
var buffer = require('vinyl-buffer');
var concat = require('gulp-concat');
var watchify = require('watchify');
var gulpif = require('gulp-if');

// Helpers
var npmPackages = require('../helpers/npm-packages');
var bowerPackages = require('../helpers/bower-packages');
var isProd = require('../helpers/is-prod');
var watchFiles = require('../helpers/watch-files');

// Config
var config = require('../config').config.scripts;

function buildScript() {

    var src = config.src;
    var dest = config.dest;
    var manifest = config.manifest;
    var createSourceMaps = config.createSourceMaps;

    var bundler = browserify({
            entries: config.entries,
            debug: true,
            cache: {},
            packageCache: {},
            insertGlobals: false
        })
        ;

    function markExternal(pack) {
        bundler.external(pack.id);
    }

    bowerPackages.forEach(markExternal);

    npmPackages.forEach(markExternal);


    if (watchFiles.shouldWatch('scripts')) {
        bundler.plugin(watchify);
        bundler.on('update', bundle);
        bundler.on('log', gutil.log);
    }

    function bundle() {
        var stream = bundler.bundle();

        gutil.log('Building Scripts...');
        gutil.log(isProd());

        return stream
            .on('error', gutil.log)
            .pipe(source(src))
            .pipe(gulpif(createSourceMaps, buffer()))
            .pipe(gulpif(createSourceMaps, sourcemaps.init({loadMaps: true})))
            .pipe(gulpif(isProd(), streamify(
                uglify({
                    compress: {
                        drop_console: true
                    },
                    mangle: true
                })
            )))
            .pipe(gulpif(isProd(), rev()))
            .pipe(gulpif(createSourceMaps, sourcemaps.write('./')))
            .pipe(gulp.dest(dest))
            .pipe(gulpif(isProd(), rev.manifest(manifest)))
            .pipe(gulpif(isProd(), gulp.dest(dest)))
            ;
    }

    return bundle();
}

gulp.task('scripts', buildScript);