UNPKG

capitano

Version:

Powerful, non opitionated command line parser for serious applications

139 lines (122 loc) 4.15 kB
var Command, Option, Signature, _, parse, settings, state, utils; _ = require('lodash'); parse = require('./parse'); settings = require('./settings'); state = require('./state'); Option = require('./option'); Signature = require('./signature'); utils = require('./utils'); module.exports = Command = (function() { function Command(options) { if (options == null) { options = {}; } if (!(options.signature instanceof Signature)) { throw new Error('Missing or invalid command signature'); } if (!_.isFunction(options.action)) { throw new Error('Missing or invalid command action'); } if ((options.options != null) && !_.isArray(options.options)) { throw new Error('Invalid options'); } this.options = []; _.forEach(options.options, (function(_this) { return function(option) { return _this.option(option); }; })(this)); _.extend(this, _.omit(options, 'options')); } Command.prototype.applyPermissions = function(callback) { var error, permissionFunction; if (this.permission == null) { return callback(); } permissionFunction = state.permissions[this.permission]; if (permissionFunction == null) { error = new Error("Permission not found: " + this.permission); return callback(error); } return permissionFunction.call(this, callback); }; Command.prototype._parseOptions = function(options) { var allOptions, parsedOptions; allOptions = _.union(state.globalOptions, this.options); return parsedOptions = parse.parseOptions(allOptions, options); }; Command.prototype._checkElevation = function(callback) { if (this.root != null) { return utils.isElevated(callback); } else { return callback(null, true); } }; Command.prototype.execute = function(args, callback) { if (args == null) { args = {}; } return this.signature.compileParameters(args.command, (function(_this) { return function(error, params) { if (error != null) { return typeof callback === "function" ? callback(error) : void 0; } return _this._checkElevation(function(error, isElevated) { var parsedOptions; if (error != null) { return typeof callback === "function" ? callback(error) : void 0; } if (_this.root && !isElevated) { error = new Error('You need admin privileges to run this command'); error.code = 'EACCES'; return callback(error); } try { parsedOptions = _this._parseOptions(args.options); } catch (error1) { error = error1; return typeof callback === "function" ? callback(error) : void 0; } return _this.applyPermissions(function(error) { var actionPromise; if (error != null) { return typeof callback === "function" ? callback(error) : void 0; } try { actionPromise = _this.action(params, parsedOptions, callback); } catch (error1) { error = error1; return typeof callback === "function" ? callback(error) : void 0; } if (callback != null) { if ((actionPromise != null ? actionPromise.then : void 0) != null) { return actionPromise.then(function(_value) { if (_this.action.length < 3) { return callback(); } }, callback); } else { if (_this.action.length < 3) { return callback(); } } } }); }); }; })(this)); }; Command.prototype.option = function(option) { if (!(option instanceof Option)) { throw new Error('Invalid option'); } if (_.find(this.options, option) != null) { return; } return this.options.push(option); }; Command.prototype.isWildcard = function() { return this.signature.isWildcard(); }; return Command; })();