UNPKG

cmd-args-parser

Version:

Command line arguments parser like Angular CLI 😃

50 lines (49 loc) • 2.19 kB
"use strict"; 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; }