UNPKG

fargv

Version:

Multi-customizable parser of process.argv for nodejs.

222 lines (135 loc) 4.68 kB
const nodePath = require("path"); const isObject = require("../dependencies/isObject"); const isEmptyObject = require("../dependencies/isEmptyObject"); const { deepCloneObject } = require("../dependencies/deepClone"); const copyV = require("../dependencies/copyValWithoutBind"); const parseOptions = require("./parseOptions"); /* Fargv props: usableOptions, errors parsedArgs props: _?: plainObject = { execNodePath?: string, execFilePath?: string, execFileBasename?: string, }, warns: null | Array<...string,>, flags: Object<...any,>, commands: Array<...string,> */ class fargv { //its only to avoid IDE conflitcs result = {} constructor(options) { this.usableOptions = parseOptions(options); const argsList = Array.isArray(this.usableOptions.customArgv) ? copyV(this.usableOptions.customArgv) : process.argv.slice(2); let parsedArgs = { //_: {}, warns: null, flags: {}, commands: [], }; const returnFilter = typeof this.usableOptions.returnFilter == "string" ? [this.usableOptions.returnFilter] : this.usableOptions.returnFilter === null ? null : []; if(returnFilter && !returnFilter.length) { for (let i = 0; i < this.usableOptions.returnFilter.length; ++i) { returnFilter.push(this.usableOptions.returnFilter[i]); } } if( !this.usableOptions.customArgv && (this.usableOptions.rememberExecNodePath || this.usableOptions.rememberExecFilePath || this.usableOptions.rememberExecFileBasename) && ( !returnFilter || ~returnFilter.indexOf("_") ) ) { parsedArgs._ = {}; if(this.usableOptions.rememberExecNodePath) parsedArgs["_"].execNodePath = process.argv[0]; if(this.usableOptions.rememberExecFilePath) parsedArgs["_"].execFilePath = process.argv[1]; if(this.usableOptions.rememberExecFileBasename) parsedArgs["_"].execFileBasename = nodePath.basename(process.argv[1]); } const optionsHaveCommands = Array.isArray(this.usableOptions.commands); const optionsHaveSeparateCommandHandler = typeof this.usableOptions.separateCommandHandler == "function"; const rememberAllFlags = {}; const rememberAllCommands = []; //rememberAllFlags && rememberAllCommands can change /*parsedArgs = */this.parseFlags(argsList, parsedArgs, rememberAllFlags, rememberAllCommands); if(Array.isArray(this.usableOptions.demandWithSkippedFlags)) { this.checkDemand("demandWithSkippedFlags", rememberAllFlags); } if(Array.isArray(this.usableOptions.demandFlags)) { this.checkDemand("demandFlags", parsedArgs.flags); } this.parseFlagAliases(parsedArgs); if( this.usableOptions.rememberWarns && Array.isArray(this.errors) && this.errors.length && ( !returnFilter || ~returnFilter.indexOf("warns") ) ) { parsedArgs.warns = []; for (let i = 0; i < this.errors.length; ++i) { parsedArgs.warns.push(this.errors[i]); } } //checking command aliases this.parseCommandAliases(rememberAllCommands); if(this.usableOptions.help.flags && this.usableOptions.help.flags.version && parsedArgs.flags.hasOwnProperty("version")) { console.log( this.usableOptions.help.flags.version.version ); if(this.usableOptions.help.flags.version.exit) process.exit(0); } if( !returnFilter || ~returnFilter.indexOf("commands") ) { for (let i = 0; i < rememberAllCommands.length; ++i) { parsedArgs.commands.push(rememberAllCommands[i]); } } if(returnFilter && returnFilter.length == 1) { if(!parsedArgs.hasOwnProperty(returnFilter[0])) { parsedArgs = {}; } else { //move it on top-level parsedArgs = parsedArgs[returnFilter[0]]; } } else if(returnFilter && returnFilter.length > 1) { const filterArgs = {}; for (let i = 0; i < returnFilter.length; ++i) { if(parsedArgs.hasOwnProperty(returnFilter[i])) { filterArgs[returnFilter[i]] = copyV(parsedArgs[returnFilter[i]]); } } parsedArgs = filterArgs; } if(optionsHaveCommands && rememberAllCommands.length) { this.parseCommands(rememberAllCommands, parsedArgs); } else if(optionsHaveSeparateCommandHandler) { this.parseCommands.callSeparateCommandHandler( this.usableOptions, deepCloneObject({}, parsedArgs), rememberAllCommands ); } return { result: parsedArgs }; } //abstract methods checkDemand(demandType, parsedArgs){} parseFlags(argsList, parsedArgs, rememberAllFlags, rememberCommands){} parseFlagAliases(parsedArgs){} parseCommandAliases(rememberAllCommands){} parseCommands(rememberCommands, parsedArgs){} } module.exports = fargv;