| var cc = require('./lib/utils') |
| var join = require('path').join |
| var deepExtend = require('deep-extend') |
| var etc = '/etc' |
| var win = process.platform === "win32" |
| var home = win |
| ? process.env.USERPROFILE |
| : process.env.HOME |
| |
| module.exports = function (name, defaults, argv, parse) { |
| if('string' !== typeof name) |
| throw new Error('rc(name): name *must* be string') |
| if(!argv) |
| argv = require('minimist')(process.argv.slice(2)) |
| defaults = ( |
| 'string' === typeof defaults |
| ? cc.json(defaults) : defaults |
| ) || {} |
| |
| parse = parse || cc.parse |
| |
| var env = cc.env(name + '_') |
| |
| var configs = [defaults] |
| var configFiles = [] |
| function addConfigFile (file) { |
| if (configFiles.indexOf(file) >= 0) return |
| var fileConfig = cc.file(file) |
| if (fileConfig) { |
| configs.push(parse(fileConfig)) |
| configFiles.push(file) |
| } |
| } |
| |
| // which files do we look at? |
| if (!win) |
| [join(etc, name, 'config'), |
| join(etc, name + 'rc')].forEach(addConfigFile) |
| if (home) |
| [join(home, '.config', name, 'config'), |
| join(home, '.config', name), |
| join(home, '.' + name, 'config'), |
| join(home, '.' + name + 'rc')].forEach(addConfigFile) |
| addConfigFile(cc.find('.'+name+'rc')) |
| if (env.config) addConfigFile(env.config) |
| if (argv.config) addConfigFile(argv.config) |
| |
| return deepExtend.apply(null, configs.concat([ |
| env, |
| argv, |
| configFiles.length ? {configs: configFiles, config: configFiles[configFiles.length - 1]} : undefined, |
| ])) |
| } |