UNPKG

fargv

Version:

Multi-customizable parser of process.argv for nodejs.

148 lines (83 loc) 2.78 kB
const isObject = require("../dependencies/isObject"); const { deepCloneObject } = require("../dependencies/deepClone"); const defaultOptions = require("./data/_options"); const defaultTypesModel = [ "numericSeparator", "number", "bigint", "boolean", "array", "object", "null", "undefined", "NaN", "Infinity" ]; const defaultTypesModelAsObjectOfTrues = defaultTypesModel.map(el => ( { [el]: true } ) ).reduce((prev, cur) => Object.assign(cur, prev)); const defaultParseModel = Object.keys(defaultOptions.mainParse); const parseWhat = ["mainParse", "arrayParse", "objectParse"]; module.exports = function(options) { if(!isObject(options)) return Object.assign({}, defaultOptions); if(options.___fargvISPARSED) return Object.assign({}, options); const usableOptions = deepCloneObject({}, defaultOptions, options); if(!isObject(usableOptions.help)) { usableOptions.help = Object.assign({}, defaultOptions.help); } if(usableOptions.noParse || usableOptions.noParseNoDefault) return usableOptions; //sets defaultOptions just in case for(let i = 0; i < parseWhat.length; i++) { const parse = parseWhat[i]; //!!! only if !plainObject if(!isObject(usableOptions[parse])) { usableOptions[parse] = deepCloneObject({}, defaultOptions[parseWhat]); } } //move the appropriate lower options to mainParse for(const k in options) { if(defaultParseModel.indexOf(k) != -1) { //anyway they(usableOptions) have a mainParse property usableOptions.mainParse[k] = options[k]; } } if(usableOptions.allParse) { for(let i = 0; i < parseWhat.length; i++) { const parse = parseWhat[i]; usableOptions[parse] = deepCloneObject(usableOptions[parse], defaultTypesModelAsObjectOfTrues); } return usableOptions } for(let i = 0; i < parseWhat.length; i++) { const parse = parseWhat[i]; const opts = deepCloneObject({}, usableOptions[parse]); const allTypes = opts.allTypes; const mainTypes = opts.mainTypes; const minorTypes = opts.minorTypes; if(allTypes) { //we leave only types for(const k in opts) { if(defaultTypesModel.indexOf(k) == -1) delete opts[k]; } for(const k in opts) { usableOptions[parse][k] = true; } } else { if(mainTypes) { usableOptions[parse] = Object.assign(usableOptions[parse], { "boolean": true, "array": true, "object": true, }); } if(minorTypes) { usableOptions[parse] = Object.assign(usableOptions[parse], { "null": true, "undefined": true, "NaN": true, "Infinity": true, }); } } } usableOptions.___fargvISPARSED = true; return usableOptions };