cmd-args-parser
Version:
Command line arguments parser like Angular CLI 😃
50 lines (49 loc) • 2.19 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const inputRe = '([^\\s]+)';
function Parser(directives, context = process.argv.slice(2).join(' ')) {
const tree = {};
directives.forEach((directive) => {
const { alias, name, input, flags } = directive;
const matcher1 = new RegExp(`${name} ${input ? inputRe : ''}`);
const matcher2 = new RegExp(`${alias} ${input ? inputRe : ''}`);
const res = matcher(matcher1, context) || matcher(matcher2, context);
let flagsRes = flags ? matchFlags(flags, context) : null;
res && (tree[directive.name] = { value: res, flags: flagsRes });
if (directive.children) {
directive.children.forEach((child) => {
const { alias: aliasNest, name: nameNest, input: inputNest, flags: flagsNest, } = child;
const matcher1 = new RegExp(`${name} ${nameNest} ${inputNest ? inputRe : ''}`);
const matcher2 = new RegExp(`${alias} ${aliasNest} ${inputNest ? inputRe : ''}`);
const res = matcher(matcher1, context) || matcher(matcher2, context);
let flags = flagsNest ? matchFlags(flagsNest, context) : null;
res && (tree[directive.name] = {});
res &&
(tree[directive.name][child.name] = { value: res, ...(flags && { flags }) });
});
}
});
return tree;
}
exports.default = Parser;
function matcher(regex, context) {
const result = regex.exec(context);
return result && (result[1] || true);
}
function matchFlags(flags, context) {
const res = {};
flags.forEach((flag) => {
const flagName = flag.replace('$', '');
if (flag.includes('$')) {
const flagRe = new RegExp(`-?-${flagName}[=\\s]${inputRe}`);
const result = flagRe.exec(context);
result && (res[flagName] = result[1] || true);
}
else {
const flagRe = new RegExp(`-?-${flagName}`);
const result = flagRe.exec(context);
res[flag] = result ? true : false;
}
});
return res;
}