'use strict'; // native modules const p = require('path'); const fs = require('fs'); // 3rd party modules const _ = require('lodash'); const browserify = require('browserify'); const buffer = require('vinyl-buffer'); const chalk = require('chalk'); const es = require('event-stream'); const gulp = require('gulp'); const gutil = require('gulp-util'); const rename = require('gulp-rename'); const source = require('vinyl-source-stream'); const sourcemaps = require('gulp-sourcemaps'); const uglify = require('gulp-uglify'); const watchify = require('watchify'); const babelify = require('babelify'); require('marko/compiler').defaultOptions.writeToDisk = false; process.env.BABEL_ENV = 'client'; const markoify = require('markoify'); const config = require('../config').browserify; const suffix = ENV === 'production' ? '-' + Date.now().toString(16) : ''; const errorHandler = require('../util/error-handler'); function formatError(err) { err.task = 'browserify'; const matchFileName = err.message.match(/\/[^\s:]*/); if (matchFileName) { let fileName = matchFileName[0]; if (fileName.indexOf(PWD) > -1) fileName = './' + p.relative(PWD, fileName); fileName = chalk.yellow(fileName); const matchNumbers = err.message.match(/ \((.*)\)/); if (matchNumbers) { const arr = matchNumbers[1].split(':'); err.message = err.message.slice(0, matchNumbers.index) + ' at line ' + arr[0] + ', col ' + arr[1]; } err.message = err.message.split(matchFileName[0]).join(fileName); } err.message = err.message.split(/:\s*/).join('\n'); errorHandler.call(this, err); } if (typeof config.entries === 'string') config.entries = [config.entries]; const TASK_NAME = 'browserify'; gulp.task(TASK_NAME, (cb) => { cb = _.after(config.entries.length, cb); if (config.suffix) fs.writeFileSync(config.dest + '.json', JSON.stringify({ suffix })); const tasks = config.entries.map((entry) => { function bundler(bundle) { let pipe = bundle.bundle() .on('error', formatError) .pipe(source(entry)) .on('end', () => { gutil.log(chalk.cyan(TASK_NAME) + ' wrote ' + chalk.magenta(entry) + '.'); cb(); }); if (ENV !== 'development') pipe = pipe.pipe(buffer()) .pipe(sourcemaps.init({ loadMaps: true })) .pipe(uglify()) .pipe(rename({ suffix })) .pipe(sourcemaps.write('./')); return pipe.pipe(gulp.dest(config.dest)); } const bundle = browserify(_.defaults({ entries: [ p.join(config.src, entry) ], cache: {}, packageCache: {} }, config)); if (ENV !== 'production') bundle.plugin(watchify, { ignoreWatch: [ '/public/**', '**/node_modules/**', '**/bower_components/**'] }); bundle.transform(babelify); bundle.transform(markoify); bundle.on('update', () => bundler(bundle)); return bundler(bundle); }); // return a single stream from all bundle streams return es.merge.apply(null, tasks); });