82 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			82 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | //      
 | ||
|  | 'use strict'; | ||
|  | 
 | ||
|  | const os = require('os'); | ||
|  | const createExplorer = require('./createExplorer'); | ||
|  | const loaders = require('./loaders'); | ||
|  | 
 | ||
|  | module.exports = cosmiconfig; | ||
|  | 
 | ||
|  | function cosmiconfig( | ||
|  |   moduleName        , | ||
|  |   options    | ||
|  |                           | ||
|  |                       | ||
|  |                                   | ||
|  |                                        | ||
|  |                       | ||
|  |                      | ||
|  |                                                         | ||
|  |     | ||
|  | ) { | ||
|  |   options = options || {}; | ||
|  |   const defaults = { | ||
|  |     packageProp: moduleName, | ||
|  |     searchPlaces: [ | ||
|  |       'package.json', | ||
|  |       `.${moduleName}rc`, | ||
|  |       `.${moduleName}rc.json`, | ||
|  |       `.${moduleName}rc.yaml`, | ||
|  |       `.${moduleName}rc.yml`, | ||
|  |       `.${moduleName}rc.js`, | ||
|  |       `${moduleName}.config.js`, | ||
|  |     ], | ||
|  |     ignoreEmptySearchPlaces: true, | ||
|  |     stopDir: os.homedir(), | ||
|  |     cache: true, | ||
|  |     transform: identity, | ||
|  |   }; | ||
|  |   const normalizedOptions                  = Object.assign( | ||
|  |     {}, | ||
|  |     defaults, | ||
|  |     options, | ||
|  |     { | ||
|  |       loaders: normalizeLoaders(options.loaders), | ||
|  |     } | ||
|  |   ); | ||
|  | 
 | ||
|  |   return createExplorer(normalizedOptions); | ||
|  | } | ||
|  | 
 | ||
|  | cosmiconfig.loadJs = loaders.loadJs; | ||
|  | cosmiconfig.loadJson = loaders.loadJson; | ||
|  | cosmiconfig.loadYaml = loaders.loadYaml; | ||
|  | 
 | ||
|  | function normalizeLoaders(rawLoaders         )          { | ||
|  |   const defaults = { | ||
|  |     '.js': { sync: loaders.loadJs, async: loaders.loadJs }, | ||
|  |     '.json': { sync: loaders.loadJson, async: loaders.loadJson }, | ||
|  |     '.yaml': { sync: loaders.loadYaml, async: loaders.loadYaml }, | ||
|  |     '.yml': { sync: loaders.loadYaml, async: loaders.loadYaml }, | ||
|  |     noExt: { sync: loaders.loadYaml, async: loaders.loadYaml }, | ||
|  |   }; | ||
|  | 
 | ||
|  |   if (!rawLoaders) { | ||
|  |     return defaults; | ||
|  |   } | ||
|  | 
 | ||
|  |   return Object.keys(rawLoaders).reduce((result, ext) => { | ||
|  |     const entry = rawLoaders && rawLoaders[ext]; | ||
|  |     if (typeof entry === 'function') { | ||
|  |       result[ext] = { sync: entry, async: entry }; | ||
|  |     } else { | ||
|  |       result[ext] = entry; | ||
|  |     } | ||
|  |     return result; | ||
|  |   }, defaults); | ||
|  | } | ||
|  | 
 | ||
|  | function identity(x) { | ||
|  |   return x; | ||
|  | } |