1var cc = require('./lib/utils') 2var join = require('path').join 3var deepExtend = require('deep-extend') 4var etc = '/etc' 5var win = process.platform === "win32" 6var home = win 7 ? process.env.USERPROFILE 8 : process.env.HOME 9 10module.exports = function (name, defaults, argv, parse) { 11 if('string' !== typeof name) 12 throw new Error('rc(name): name *must* be string') 13 if(!argv) 14 argv = require('minimist')(process.argv.slice(2)) 15 defaults = ( 16 'string' === typeof defaults 17 ? cc.json(defaults) : defaults 18 ) || {} 19 20 parse = parse || cc.parse 21 22 var env = cc.env(name + '_') 23 24 var configs = [defaults] 25 var configFiles = [] 26 function addConfigFile (file) { 27 if (configFiles.indexOf(file) >= 0) return 28 var fileConfig = cc.file(file) 29 if (fileConfig) { 30 configs.push(parse(fileConfig)) 31 configFiles.push(file) 32 } 33 } 34 35 // which files do we look at? 36 if (!win) 37 [join(etc, name, 'config'), 38 join(etc, name + 'rc')].forEach(addConfigFile) 39 if (home) 40 [join(home, '.config', name, 'config'), 41 join(home, '.config', name), 42 join(home, '.' + name, 'config'), 43 join(home, '.' + name + 'rc')].forEach(addConfigFile) 44 addConfigFile(cc.find('.'+name+'rc')) 45 if (env.config) addConfigFile(env.config) 46 if (argv.config) addConfigFile(argv.config) 47 48 return deepExtend.apply(null, configs.concat([ 49 env, 50 argv, 51 configFiles.length ? {configs: configFiles, config: configFiles[configFiles.length - 1]} : undefined, 52 ])) 53} 54