node-getopt
Version:
featured command line args parser
359 lines (328 loc) • 11.1 kB
JavaScript
// Generated by ToffeeScript 1.6.3-4
(function() {
var Getopt, path, __matches,
__slice = [].slice;
path = require('path');
Getopt = (function() {
Getopt.HAS_ARGUMENT = true;
Getopt.NO_ARGUMENT = false;
Getopt.MULTI_SUPPORTED = true;
Getopt.SINGLE_ONLY = false;
Getopt.VERSION = '0.3.2';
function Getopt(optionsPattern) {
this.short_options = {};
this.long_options = {};
this.long_names = [];
this.events = {};
this.argv = [];
this.options = {};
this.unique_names = {};
this.optionsPattern = [];
this.errorFunc = function(e) {
console.info(e.message);
return process.exit(1);
};
if (process.argv[1]) {
this.help = "Usage:\n node " + (path.basename(process.argv[1])) + " [OPTION]\n\nOptions:\n[[OPTIONS]]";
} else {
this.help = "[[OPTIONS]]";
}
this.append(optionsPattern);
}
Getopt.prototype.append = function(optionsPattern) {
var comment, def, definition, fixed_long_name, has_argument, long_name, multi_supported, name, option, optional, short_name, _i, _len;
for (_i = 0, _len = optionsPattern.length; _i < _len; _i++) {
option = optionsPattern[_i];
short_name = option[0], definition = option[1], comment = option[2], def = option[3];
if (comment == null) {
comment = '';
}
if (definition == null) {
definition = '';
}
if (short_name == null) {
short_name = '';
}
__matches = definition.match(/^([\w\-]*)/);
long_name = __matches[1];
has_argument = definition.indexOf('=') !== -1;
multi_supported = definition.indexOf('+') !== -1;
optional = /\[=.*?\]/.test(definition);
long_name = long_name.trim();
short_name = short_name.trim();
if (optional && short_name) {
throw new Error('optional argument can only work with long option');
}
long_name || (long_name = short_name);
fixed_long_name = 'opt_' + long_name;
name = long_name;
if (long_name === '') {
throw new Error("empty option found. the last option name is " + (this.long_names.slice(-1)));
}
if (this.unique_names[fixed_long_name] == null) {
this.long_names.push(long_name);
this.long_options[long_name] = {
name: name,
short_name: short_name,
long_name: long_name,
has_argument: has_argument,
multi_supported: multi_supported,
comment: comment,
optional: optional,
definition: definition,
def: def
};
this.unique_names[fixed_long_name] = true;
} else {
throw new Error("option " + long_name + " is redefined.");
}
if (short_name !== '') {
if (short_name.length !== 1) {
throw new Error('short option must be single characters');
}
this.short_options[short_name] = this.long_options[long_name];
}
}
return this;
};
Getopt.prototype.fill = function(pattern) {
var l, l_, s, s_;
s_ = pattern[0], l_ = pattern[1];
s = '';
l = '';
this.short_options[s_] || (s = s_);
this.long_options[l_] || (l = l_);
if (s || l) {
return this.append([[s, l].concat(__slice.call(pattern.slice(2)))]);
}
};
Getopt.prototype.getOptionByName = function(name) {
var _ref;
return (_ref = this.long_options[name]) != null ? _ref : this.short_options[name];
};
Getopt.prototype.getOptionName = function(name) {
var _ref;
return (_ref = this.getOptionByName(name)) != null ? _ref.name : void 0;
};
Getopt.prototype.on = function(name, cb) {
var iname;
if (name) {
iname = this.getOptionName(name);
if (!iname) {
throw new Error("unknown option " + name);
}
} else {
iname = name;
}
this.events[iname] = cb;
return this;
};
Getopt.prototype.emit = function(name, value) {
var event;
event = this.events[this.getOptionName(name)];
if (event) {
return event.call(this, value);
} else {
throw new Error("Getopt event on '" + name + "' is not found");
}
};
Getopt.prototype.save_option_ = function(options, option, argv) {
var name, value, _ref;
if (option.has_argument) {
if (argv.length === 0) {
throw new Error("option " + option.long_name + " need argument");
}
value = argv.shift();
} else {
value = true;
}
name = option.name;
if (option.multi_supported) {
if (options[name] == null) {
options[name] = [];
}
options[name].push(value);
} else {
options[name] = value;
}
if ((_ref = this.events[name]) != null) {
_ref.call(this, value);
}
return this;
};
Getopt.prototype.parse = function(argv) {
var arg, e, i, long_name, name, option, rt_argv, rt_options, short_name, short_names, sname, value, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3;
try {
argv = argv.slice(0);
rt_options = {};
rt_argv = [];
_ref = this.long_names;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
long_name = _ref[_i];
option = this.long_options[long_name];
if ((option.def != null) || (rt_options[option.long_name] != null)) {
rt_options[option.long_name] = option.def;
}
}
while ((arg = argv.shift()) != null) {
if (__matches = arg.match(/^-(\w[\w\-]*)/)) {
short_names = __matches[1];
for (i = _j = 0, _len1 = short_names.length; _j < _len1; i = ++_j) {
short_name = short_names[i];
option = this.short_options[short_name];
if (!option) {
throw new Error("invalid option " + short_name);
}
if (option.has_argument) {
if (i < arg.length - 2) {
argv.unshift(arg.slice(i + 2));
}
this.save_option_(rt_options, option, argv);
break;
} else {
this.save_option_(rt_options, option, argv);
}
}
} else if (__matches = arg.match(/^--(\w[\w\-]*)((?:=[^]*)?)$/)) {
long_name = __matches[1];
value = __matches[2];
option = this.long_options[long_name];
if (!option) {
throw new Error("invalid option " + long_name);
}
if (value !== '') {
value = value.slice(1);
argv.unshift(value);
} else if (option.optional) {
argv.unshift('');
}
this.save_option_(rt_options, option, argv);
} else if (arg === '--') {
rt_argv = rt_argv.concat(argv);
for (_k = 0, _len2 = argv.length; _k < _len2; _k++) {
arg = argv[_k];
if ((_ref1 = this.events['']) != null) {
_ref1.call(this, arg);
}
}
break;
} else {
rt_argv.push(arg);
if ((_ref2 = this.events['']) != null) {
_ref2.call(this, arg);
}
}
}
_ref3 = Object.keys(rt_options);
for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) {
name = _ref3[_l];
sname = this.long_options[name].short_name;
if (sname !== '') {
rt_options[sname] = rt_options[name];
}
}
} catch (_error) {
e = _error;
this.errorFunc(e);
}
this.argv = rt_argv;
this.options = rt_options;
return this;
};
Getopt.prototype.parse_system = function() {
return this.parseSystem();
};
Getopt.prototype.parseSystem = function() {
return this.parse(process.argv.slice(2));
};
Getopt.prototype.setHelp = function(help) {
this.help = help;
return this;
};
Getopt.prototype.sort = function() {
return this.long_names.sort(function(a, b) {
return a > b && 1 || a < b && -1 || 0;
});
};
Getopt.prototype.getHelp = function() {
var comment, def, definition, i, line, lines, long_name, n, option, options, short_name, table, td, tr, ws, _i, _j, _k, _len, _len1, _len2, _ref;
ws = [];
options = [];
table = [];
_ref = this.long_names;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
long_name = _ref[_i];
tr = [];
option = this.long_options[long_name];
short_name = option.short_name, long_name = option.long_name, comment = option.comment, definition = option.definition, def = option.def;
tr.push(short_name ? short_name === long_name ? " -" + short_name : " -" + short_name + ", --" + definition : " --" + definition);
tr.push(" " + comment);
if (def) {
tr.push(" (default: " + def + ")");
}
table.push(tr);
}
for (_j = 0, _len1 = table.length; _j < _len1; _j++) {
tr = table[_j];
for (i = _k = 0, _len2 = tr.length; _k < _len2; i = ++_k) {
td = tr[i];
if (ws[i] == null) {
ws[i] = 0;
}
ws[i] = Math.max(ws[i], td.length);
}
}
lines = (function() {
var _l, _len3, _len4, _m, _results;
_results = [];
for (_l = 0, _len3 = table.length; _l < _len3; _l++) {
tr = table[_l];
line = '';
for (i = _m = 0, _len4 = tr.length; _m < _len4; i = ++_m) {
td = tr[i];
if (i) {
n = ws[i - 1] - tr[i - 1].length;
while (n--) {
line += ' ';
}
}
line += td;
}
_results.push(line.trimRight());
}
return _results;
})();
return this.help.replace('[[OPTIONS]]', lines.join("\n"));
};
Getopt.prototype.showHelp = function() {
console.info(this.getHelp());
return this;
};
Getopt.prototype.bindHelp = function(help) {
if (help) {
this.setHelp(help);
}
this.fill(['h', 'help', 'display this help']);
this.on('help', function() {
this.showHelp();
return process.exit(0);
});
return this;
};
Getopt.prototype.getVersion = function() {
return Getopt.VERSION;
};
Getopt.prototype.error = function(errorFunc) {
this.errorFunc = errorFunc;
return this;
};
Getopt.getVersion = function() {
return this.VERSION;
};
Getopt.create = function(options) {
return new Getopt(options);
};
return Getopt;
})();
module.exports = Getopt;
}).call(this);