fargv
Version:
Multi-customizable parser of process.argv for nodejs.
223 lines (141 loc) • 4.6 kB
JavaScript
const isObject = require("../../../dependencies/isObject");
const isEmptyObject = require("../../../dependencies/isEmptyObject");
const copyV = require("../../../dependencies/copyValWithoutBind");
const getValue = require("../../../dependencies/getAnyPropValIfExists");
//to avoid a conflict with the value that can be passed by the user
const sign = "$fargvSetDefault";
/*
Format:
objectOfValues: plainObject = {
...[name]: value<any> | {
_options: { //for no conflict if value is object
value | argValue | v = [undefined, "$notFill"] | any
alias | a | aliases = string | array
}
} | ["$fargvSetDefault", value<[undefined, "$notFill"] | any>, alias<string | array>]
} | "reset"
*/
//defaultArgv: plainObject<usableOptions.defaultArgv>, alias: string; returns boolean
const checkDuplicateAliases = (defaultArgv, alias) => {
for(const prop in defaultArgv) {
const v = defaultArgv[prop];
if(Array.isArray(v)) {
if(~v[1].indexOf(alias)) return true;
}
}
return false;
};
//objectOfValues: plainObject | string, redefine: boolean; returns this<fargvWrapper>
const staticSetDefaultArgValues = function(objectOfValues, redefine) {
if(objectOfValues == "reset" || redefine) {
this.createOptions();
this._options.defaultArgv = null;
if(objectOfValues == "reset") return this;
}
if(!isObject(objectOfValues) || isEmptyObject(objectOfValues)) return this;
const isObjectDefaultArgv = isObject(this._options.defaultArgv);
const defaultArgv = {};
for(const argName in objectOfValues) {
let argValue = copyV(objectOfValues[argName]);
if(isObject(argValue) && isObject(argValue._options)) {
argValue = argValue._options;
const $sign = sign + Math.random();
const value = getValue(argValue, ["value", "v", "argValue"], $sign);
if(value == $sign) continue;
const alias = getValue(argValue, ["alias", "a", "aliases"], $sign);
if(alias == $sign) continue;
defaultArgv[argName] = [value, []];
if(Array.isArray(alias)) {
for(let i = 0; i < alias.length; ++i) {
if(
typeof alias[i] == "string"
&&
alias[i] != argName
&&
!(isObjectDefaultArgv && this._options.defaultArgv[alias[i]])
&&
!(isObjectDefaultArgv && checkDuplicateAliases(this._options.defaultArgv, alias[i]))
&&
!defaultArgv[alias[i]]
&&
!checkDuplicateAliases(defaultArgv, alias[i])
&&
!~defaultArgv[argName][1].indexOf(alias[i])
) {
defaultArgv[argName][1].push(alias[i]);
}
}
} else if(
typeof alias == "string"
&&
alias != argName
&&
!(isObjectDefaultArgv && this._options.defaultArgv[alias])
&&
!(isObjectDefaultArgv && checkDuplicateAliases(this._options.defaultArgv, alias))
&&
!defaultArgv[alias]
&&
!checkDuplicateAliases(defaultArgv, alias)
) {
defaultArgv[argName][1] = [alias];
}
} else if(Array.isArray(argValue) && argValue[0] == sign) {
if(argValue.length > 3 || argValue.length < 2) continue;
if(argValue.length == 2) {
defaultArgv[argName] = [copyV(argValue[1]), []];
} else {
if(
typeof argValue[2] == "string"
&&
argValue[2] != argName
&&
!(isObjectDefaultArgv && this._options.defaultArgv[argValue[2]])
&&
!defaultArgv[argValue[2]]
&&
!checkDuplicateAliases(defaultArgv, argValue[2])
&&
!(isObjectDefaultArgv && checkDuplicateAliases(this._options.defaultArgv, argValue[2]))
) {
argValue[2] = [argValue[2]];
} else if(Array.isArray(argValue[2])) {
const temp = [];
for(let i = 0; i < argValue[2].length; ++i) {
const v = argValue[2][i];
if(
typeof v == "string"
&&
v != argName
&&
!(isObjectDefaultArgv && this._options.defaultArgv[v])
&&
!(isObjectDefaultArgv && checkDuplicateAliases(this._options.defaultArgv, v))
&&
!defaultArgv[v]
&&
!checkDuplicateAliases(defaultArgv, v)
&&
!~temp.indexOf(v)
) {
temp.push(v);
}
}
if(temp.length) argValue[2] = temp;
else continue;
} else {
continue;
}
argValue.splice(0, 1);
defaultArgv[argName] = copyV(argValue);
}
} else {
defaultArgv[argName] = [copyV(argValue), []];
}
}
return this.options({
defaultArgv,
defaultNoneValue: undefined
});
};
module.exports = staticSetDefaultArgValues;