Code coverage report for tasks/serve.js

Statements: 24.66% (18 / 73)      Branches: 0% (0 / 24)      Functions: 0% (0 / 16)      Lines: 26.09% (18 / 69)      Ignored: none     

All files » tasks/ » serve.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 1151 1 1 1 1 1 1 1 1   1                                                                             1           1             1                 1                     1           1                         1                         1
var Promise = require('es6-promise').Promise;
var path = require('path');
var log = require('./utils/log');
var helper = require('./utils/config-helper');
var Browserify = require('./wrappers/browserify.js');
var browserSync = require('browser-sync').create();
var extend = require('util')._extend;
var build = require('./build');
var config, serve = {};
 
function getWatchOptions(options){
    var files = [],
        htmlPaths = [],
        stylesPaths = [],
        scriptsPaths = [];
    config.buildPaths.forEach(function(pathObj, i){
        htmlPaths.push(path.join(pathObj.source,    config.globs.html.replace('{.,*}','**').replace('!(_)','')));
        stylesPaths.push(path.join(pathObj.source,  config.globs.styles.replace('{.,*}','**').replace('!(_)','')));
        scriptsPaths.push(path.join(pathObj.source, config.globs.scripts.replace('{.,*}','**').replace('!(_)','')));
    });
    var chokidarOptions = {
        persistent: true
    };
    var callBack = function(task){
        return function(event, file){
            switch (event) {
                case 'change':
                    log.info(['Watch: `' + file + '` changed'].join('\n'));
                    options.reload = browserSync.reload;
                    build[task](options).catch(log.onError);
                    break;
                default :
                    if (options.verbose){
                        log.info('   * ' + ((event=='add')?'watch':event) + ' ' + file);
                    }
                    break;
            }
        };
    };
    files.push({ match: htmlPaths, fn: callBack('html'), options: chokidarOptions });
    files.push({ match: stylesPaths, fn: callBack('styles'), options: chokidarOptions });
    if (helper.matches(config.tasks.build, ['browserify'])) {
        browserifyWatch(options);
    } else {
        files.push({ match: scriptsPaths, fn: callBack('scripts'), options: chokidarOptions });
    }
    return files;
}
 
function startBrowserSync(options) {
    log.info(' * Started');
    options.files = getWatchOptions(options);
    browserSync.init(options);
}
 
function browserifyWatch(options){
    config.buildPaths.forEach(function(pathObj, i){
        var src = path.join(pathObj.source, config.globs.scripts);
        new Browserify(src, pathObj.target, options).watch(browserSync);
    });
}
 
function nodeApp(options){
    var nodemon = require('nodemon');
    return new Promise(function(resolve, reject){
        nodemon(options).on('start', function(e){
            resolve(options);
        });
    });
}
 
serve.staticApp = function(options){
    if (!options.server) {
        var targets = config.buildPaths.map(function(pathObj){ return pathObj.target;});
        targets = targets.filter(function removeDuplicates(elem, pos, self) {
            return self.indexOf(elem) === pos && elem !== '';
        });
        options.server = { baseDir : targets };
    }
    return startBrowserSync(options);
};
 
serve.nodeApp = function(options){
    if (!options.proxy) options.proxy = 'http://localhost:3000';
    if (!options.port) options.port = 3001;
    return nodeApp(options).then(startBrowserSync);
};
 
serve.adhoc = function (baseDir){
    if (baseDir.split('.').pop() === 'js'){
        return serve.nodeApp({
            script: baseDir
        });
    } else {
        return serve.staticApp({
            server: { baseDir : baseDir }
        });
    }
};
 
 
function exec(options){
    config = helper.getConfig();
    if (!config.tasks.serve) return Promise.resolve();
 
    log.info('Server :');
    if (['nodeApp','staticApp'].indexOf(options)<0) {
        return serve.adhoc(options);
    } else {
        options = extend(config[config.tasks.serve] || {}, options);
        return serve[config.tasks.serve](options);
    }
}
 
module.exports = exec;