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, ]) ); };