vigour-config
Version:
Observable configuration
131 lines (107 loc) • 3.33 kB
JavaScript
var Observable = require('vigour-observable')
const ISNODE = require('vigour-util/is/node')
var merge = require('lodash.merge')
var include = require('vigour-util/include')
var resolveNameSpace = require('./util/resolveNameSpace')
var findPackage = require('./util/findPackage')
var parseArgv = ISNODE && require('./util/parseArgv')
var path = ISNODE && require('path')
const OBJ = 'object'
exports.define = {
generateConstructor: function () {
return function Config (options, event, parent, key) {
var config = this
var nameSpace = config._nameSpace && config._nameSpace.val
var val = {}
var packageDir = (options && options._packageDir)
var pkg = config._findPackage && config._findPackage.val &&
findPackage && findPackage(packageDir)
if (pkg) {
var pkgObj = resolveNameSpace(pkg, nameSpace)
merge(val, pkgObj)
}
var dowhap
if (ISNODE) {
let topVal = {}
// environment variables and inline arguments go in topVal first, to be
// used to evaluate configFiles
merge(topVal, val)
findEnv(topVal)
let mergeFiles = []
if (val.mergeFiles) {
include(mergeFiles, val.mergeFiles)
}
if (topVal.mergeFiles) {
include(mergeFiles, topVal.mergeFiles)
}
let argv = parseArgv && config._argv && config._argv.val && parseArgv(val)
dowhap = argv.dowhap
let setArgv = argv.setobj
if (setArgv) {
merge(topVal, setArgv)
if (topVal.mergeFiles) {
include(mergeFiles, topVal.mergeFiles)
}
}
let configFiles = topVal.configFiles || val.configFiles
mergeFromFiles(val, configFiles, nameSpace)
mergeFromFiles(val, mergeFiles, nameSpace)
// now actually apply env and inline on val
findEnv(val)
if (setArgv) {
merge(val, setArgv)
}
delete val.configFiles
delete val.mergeFiles
}
if (options) {
options = resolveNameSpace(options, nameSpace)
merge(val, options)
}
Observable.call(config, val, false, parent, key)
if (config.autoMerge) {
config.merge(config.autoMerge)
}
if (dowhap) {
insertConfig(dowhap, config)
}
}
}
}
function findEnv (obj) {
var env = obj._env
if (env && env in process.env) {
obj.val = process.env[env]
}
for (let key in obj) {
var val = obj[key]
if (typeof val === OBJ) {
findEnv(val)
}
}
}
function mergeFromFiles (obj, files, nameSpace) {
for (let key in files) {
let configFile = files[key]
if (!path.isAbsolute(configFile)) {
configFile = path.join(process.cwd(), configFile)
}
try {
let configObj = require(configFile)
configObj = resolveNameSpace(configObj, nameSpace)
merge(obj, configObj)
} catch (e) {
// console.log('could not require configFile', configFile)
}
}
}
function insertConfig (dowhap, config) {
var total = new Observable(dowhap.total)
var path = dowhap.myPath
var parent = total.get(path).parent
var lastKey = path[path.length - 1]
parent[lastKey] = config
config.setParent(false, false, parent, lastKey)
global.config = config
}