vigour-config
Version:
Observable configuration
85 lines (77 loc) • 1.81 kB
JavaScript
var get = require('lodash.get')
var set = require('lodash.set')
var isParam = /^--./
const DOT = '.'
const CAST = {
number: Number,
string: JSON.stringify,
boolean: Boolean,
object: tryParse
}
function tryParse (val) {
try {
return JSON.parse(val)
} catch (err) {
return val
}
}
module.exports = function parseArgv (config) {
var setobj = {}
var args = process.argv
for (let i = 0, param; (param = args[i]); i++) {
if (isParam.test(param)) {
param = param.slice(2)
let path = hasDot(param) && param.split(DOT)
let val = args[i + 1]
if (isParam.test(val)) {
val = true
} else {
i++
let hasValue = path
? get(config, path)
: config[param]
let parsed = tryParse(val)
let type = hasValue && hasValue._type
if (type) {
if (typeof parsed !== type) {
parsed = CAST[type](parsed)
if (typeof parsed !== type) {
throw new Error(
'Config: wrong type! ' + val + ' should be ' + type
)
}
}
}
val = parsed
}
if (!(val instanceof Object)) {
val = { val: val }
}
if (path) {
set(setobj, path, val)
} else {
setobj[param] = val
}
}
}
var dowhap = setobj.config
if (dowhap) {
try {
var configSet = get(dowhap.total, dowhap.myPath)
delete setobj.config
for (var s in setobj) {
configSet[s] = setobj[s]
}
setobj = configSet
} catch (err) {
console.log('CONFIG ERROR! could not parse setobj.config:\n',
setobj.config, '\nerror: ', err
)
}
}
return {setobj, dowhap}
}
function hasDot (str) {
return ~str.indexOf(DOT)
}