stubby
Version:
a lightweight server for stubbing external systems and endpoints
102 lines (77 loc) • 2.46 kB
JavaScript
;
const pp = require('./prettyprint');
const UNARY_FLAGS = /^-[a-zA-Z]+$/;
const ANY_FLAG = /^-.+$/;
function findOption (option, argv) {
let argIndex = -1;
if (option.flag != null) {
argIndex = indexOfFlag(option, argv);
}
if (argIndex === -1 && option.name != null) {
argIndex = argv.indexOf('--' + option.name);
}
return argIndex;
}
function indexOfFlag (option, argv) {
let index = -1;
argv.forEach(function (flag) {
if (!UNARY_FLAGS.test(flag)) { return; }
if (flag.indexOf(option.flag) === -1) { return; }
index = argv.indexOf(flag);
});
return index;
}
function optionSkipped (index, argv) {
return ANY_FLAG.test(argv[index + 1]);
}
function unaryCheck (option, argv) {
if (option.name != null && argv.indexOf('--' + option.name) !== -1) {
return true;
}
if (option.flag == null) {
return false;
}
return indexOfFlag(option, argv) !== -1;
}
function pullPassedValue (option, argv) {
if (option.param == null) { return unaryCheck(option, argv); }
const argIndex = findOption(option, argv);
if (argIndex === -1) { return option.default; }
if (argv[argIndex + 1] == null) { return option.default; }
if (!optionSkipped(argIndex, argv)) { return argv[argIndex + 1]; }
return option.default;
}
function parse (options, argv) {
const args = {};
if (argv == null) { argv = process.argv; }
options.forEach(function (option) {
if (option.default == null) { option.default = null; }
args[option.name || option.flag] = pullPassedValue(option, argv);
});
return args;
}
function helpText (options, programName) {
const inlineList = [];
const firstColumn = {};
const helpLines = [];
let gutter = 3;
options.forEach(function (option) {
const param = option.param != null
? ' <' + option.param + '>'
: '';
firstColumn[option.name] = '-' + option.flag + ', --' + option.name + param;
inlineList.push('[-' + option.flag + param + ']');
gutter = Math.max(gutter, firstColumn[option.name].length + 3);
});
options.forEach(function (option) {
let helpLine = firstColumn[option.name];
helpLine += pp.spacing(gutter - helpLine.length);
helpLine += pp.wrap(option.description.split(' '), gutter);
helpLines.push(helpLine);
});
return programName + ' ' + pp.wrap(inlineList, programName.length + 1) + '\n\n' + helpLines.join('\n');
}
module.exports = {
parse: parse,
helpText: helpText
};