ebednarz/browserifix

View on GitHub
library/initialize.js

Summary

Maintainability
B
4 hrs
Test Coverage
'use strict';
var babelify = require('babelify');
var benchmark = require('./benchmark');
var browserify = require('browserify');
var getFileName = require('./get-file-name');
var getLintifyOptions = require('./get-lintify-options');
var lintify = require('lintify');
var lodash = require('lodash');
var log = require('./log');
var path = require('path');
var uglify = require('./uglify');
var watchify = require('watchify');

function logError(error) {
    if (0 !== error.message.indexOf('ESLint')) {
        console.error(error.stack);
    }
}

function initialize(value, key, deferred, config) {
    var fileName = getFileName(key, config.source);
    var lintifyOptions = getLintifyOptions(key, true);
    var action = 'created';
    var bundle;
    var external;
    var options;
    var startTime;
    var watcher;

    function onBuildError(error) {
        logError(error);
        deferred.reject(error);
    }

    function onBuildResolved() {
        var performance = benchmark(startTime);
        log([action, [key, 'magenta'], 'bundle in', performance]);
        deferred.resolve();
    }

    function onBuildRejected(reason) {
        console.error(reason);
        deferred.reject(reason);
    }

    function onBundle(error, buffer) {
        startTime = Number(new Date());

        if (error) {
            onBuildError(error);
        } else {
            uglify(key + '.js', String(buffer), config)
                .then(onBuildResolved)
                .then(null, onBuildRejected);
        }
    }

    external = lodash.union(
        lodash(config.vendors)
            .map(function (item) {
                return item;
            })
            .flatten()
            .value(),
        value.external
    );

    options = {
        basedir: config.source,
        debug: true,
        extensions: [
            '.jsx'
        ]
    };

    if (config.watch) {
        options.cache = {};
        options.poll = true;
        options.packageCache = {};
    }

    bundle = browserify(fileName, options)
        .require(value.require || [])
        .external(external)
        .transform(lintify, lintifyOptions)
        .transform(babelify.configure({
            sourceMapRelative: process.cwd(),
            only: config.babel
        }), {
            global: true
        });

    if (config.watch) {
        startTime = Number(new Date());
        watcher = watchify(bundle);
        watcher
            .on('update', function (ids) {
                ids.forEach(function (file) {
                    var relativePath = path.relative(process.cwd(), file);
                    log(['changed', [relativePath, 'cyan']]);
                });
                action = 'updated';
                watcher.bundle(onBundle);
            })
            .on('error', onBuildError)
            .bundle(function (error) {
                if (error) {
                    onBuildError(error);
                }

                deferred.resolve();
            });
    } else {
        bundle
            .bundle(onBundle)
            .on('error', onBuildError);
    }
}

module.exports = initialize;