tarifa
Version:
Your friendly toolchain for mobile app development on top of Apache Cordova
130 lines (111 loc) • 3.98 kB
JavaScript
var chalk = require('chalk'),
Q = require('q'),
fs = require('q-io/fs'),
path = require('path'),
util = require('util'),
argv = require('minimist')(process.argv.slice(2)),
pkg = require('../package.json'),
log = require('../lib/helper/log'),
argsHelper = require('../lib/helper/args');
function printHelp(errMessage) {
if(errMessage) log.send('error', errMessage);
fs.read(path.join(__dirname, 'usage.txt'))
.then(function (help) {
log.send('msg', help);
process.exit(0);
});
}
function printVersion() {
log.send('msg', pkg.version);
process.exit(0);
}
var t0 = (new Date()).getTime();
var availableActions = [
{ name: 'create', action: '../actions/create' },
{ name: 'platform', action: '../actions/platform' },
{ name: 'plugin', action: '../actions/plugin' },
{ name: 'prepare', action: '../actions/prepare' },
{ name: 'info', action: '../actions/info' },
{ name: 'config', action: '../actions/config' },
{ name: 'build', action: '../actions/build' },
{ name: 'run', action: '../actions/run' },
{ name: 'clean', action: '../actions/clean' },
{ name: 'cls', action: '../actions/clean' }, // clean alias
{ name: 'check', action: '../actions/check' },
{ name: 'hockeyapp', action: '../actions/hockeyapp' },
{ name: 'update', action: '../actions/update' },
{ name: 'watch', action: '../actions/watch' },
{ name: 'test', action: '../actions/test'},
{ name: 'version', action: '../actions/version'},
{ name: 'device', action: '../actions/device'},
{ name: 'devices', action: '../actions/device'} // alias
],
singleOptions = [
{ small: 'v', name: 'version', action: printVersion },
{ small: 'h', name: 'help', action: printHelp }
],
globalOptions = [
{ small: 'd', name: 'debug' }
];
function matchAction(args) {
var actions = availableActions.map(function (a) { return a.name; });
return args._[0] && actions.indexOf(args._[0]) >= 0;
}
function actionSuccess() {
var t = (new Date()).getTime();
log.send(
'info',
chalk.magenta('done in ~ %ds'),
Math.floor((t - t0) / 1000)
);
process.exit();
}
function actionError(name, options) {
return function (err) {
log.send('error', chalk.red(err.stack || err));
if(!options.debug && err.stack) {
log.send(
'msg',
chalk.yellow('use -d or --debug for more helpful stack trace!')
);
}
process.exit(1);
};
}
function main(args) {
log.init(argsHelper.matchOption(argv, 'V', 'verbose'));
var validArgs = false,
keys = Object.keys(args),
options = { };
for(var i = 0, l = singleOptions.length; i < l; i++) {
validArgs = argsHelper.matchSingleOptionWithArguments(
args, singleOptions[i].small, singleOptions[i].name, [0]
);
if(validArgs) {
return singleOptions[i].action();
}
}
globalOptions.forEach(function (opt) {
if(keys.indexOf(opt.small) > -1) options[opt.name] = args[opt.small];
if(keys.indexOf(opt.name) > -1) options[opt.name] = args[opt.name];
delete args[opt.small];
delete args[opt.name];
});
if(options.debug) Q.longStackSupport = true;
if(matchAction(args)) {
var action = args._.shift(0),
actionName = availableActions.filter(function (a) {
return a.name === action;
})[0].action;
require(actionName)(args)
.done(actionSuccess, actionError(action, options));
} else {
var unknownCmd = util.format(
'Tarifa does not know command \'%s\'\n',
args._.join(' ')
);
printHelp(args._.length && unknownCmd);
}
}
main(argv);