UNPKG

vigour-config

Version:
131 lines (107 loc) 3.33 kB
'use strict' 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 }