diff --git a/app.js b/app.js index 1998e4c60c..9e2be418e5 100644 --- a/app.js +++ b/app.js @@ -79,6 +79,8 @@ if (nconf.get('setup') || nconf.get('install')) { activate(); } else if (nconf.get('plugins')) { listPlugins(); +} else if (nconf.get('build')) { + build(nconf.get('build')); } else { start(); } @@ -281,7 +283,76 @@ function setup() { }); } -function upgrade() { +function build (targets) { + var db = require('./src/database'); + var meta = require('./src/meta'); + var valid = ['js', 'css', 'tpl']; + var step = function(target, next) { + winston.info('[build] Build step completed in ' + ((Date.now() - startTime) / 1000) + 's'); + next(); + }; + var startTime; + + targets = (targets === true ? valid : targets.split(',').filter(function(target) { + return valid.indexOf(target) !== -1; + })); + + if (!targets) { + winston.error('[build] No valid build targets found. Aborting.'); + return process.exit(0); + } + + async.series([ + async.apply(db.init), + async.apply(meta.themes.setupPaths) + ], function (err) { + if (err) { + winston.error('[build] Encountered error preparing for build: ' + err.message); + return process.exit(1); + } + + // eachSeries because it potentially(tm) runs faster on Windows this way + async.eachSeries(targets, function(target, next) { + switch(target) { + case 'js': + winston.info('[build] Building javascript'); + startTime = Date.now(); + async.series([ + async.apply(meta.js.minify, 'nodebb.min.js'), + async.apply(meta.js.minify, 'acp.min.js') + ], step.bind(this, target, next)); + break; + + case 'css': + winston.info('[build] Building CSS stylesheets'); + startTime = Date.now(); + meta.css.minify(step.bind(this, target, next)); + break; + + case 'tpl': + winston.info('[build] Building templates'); + startTime = Date.now(); + meta.templates.compile(step.bind(this, target, next)); + break; + + default: + winston.warn('[build] Unknown target: \'' + target + '\''); + setImmediate(next); + break; + } + }, function(err) { + if (err) { + winston.error('[build] Encountered error during build step: ' + err.message); + return process.exit(1); + } + + winston.info('[build] Asset compilation successful. Exiting.'); + process.exit(0); + }); + }); +}; + +function upgrade () { require('./src/database').init(function (err) { if (err) { winston.error(err.stack); @@ -291,7 +362,7 @@ function upgrade() { require('./src/upgrade').upgrade(); }); }); -} +}; function activate() { var db = require('./src/database');