53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var fs = require('fs')
 | 
						|
var path = require('path')
 | 
						|
var assign = require('./assign')
 | 
						|
var YError = require('./yerror')
 | 
						|
 | 
						|
var previouslyVisitedConfigs = []
 | 
						|
 | 
						|
function checkForCircularExtends (path) {
 | 
						|
  if (previouslyVisitedConfigs.indexOf(path) > -1) {
 | 
						|
    throw new YError("Circular extended configurations: '" + path + "'.")
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function getPathToDefaultConfig (cwd, pathToExtend) {
 | 
						|
  return path.resolve(cwd, pathToExtend)
 | 
						|
}
 | 
						|
 | 
						|
function applyExtends (config, cwd) {
 | 
						|
  var defaultConfig = {}
 | 
						|
 | 
						|
  if (config.hasOwnProperty('extends')) {
 | 
						|
    if (typeof config.extends !== 'string') return defaultConfig
 | 
						|
    var isPath = /\.json$/.test(config.extends)
 | 
						|
    var pathToDefault = null
 | 
						|
    if (!isPath) {
 | 
						|
      try {
 | 
						|
        pathToDefault = require.resolve(config.extends)
 | 
						|
      } catch (err) {
 | 
						|
        // most likely this simply isn't a module.
 | 
						|
      }
 | 
						|
    } else {
 | 
						|
      pathToDefault = getPathToDefaultConfig(cwd, config.extends)
 | 
						|
    }
 | 
						|
    // maybe the module uses key for some other reason,
 | 
						|
    // err on side of caution.
 | 
						|
    if (!pathToDefault && !isPath) return config
 | 
						|
 | 
						|
    checkForCircularExtends(pathToDefault)
 | 
						|
 | 
						|
    previouslyVisitedConfigs.push(pathToDefault)
 | 
						|
 | 
						|
    defaultConfig = isPath ? JSON.parse(fs.readFileSync(pathToDefault, 'utf8')) : require(config.extends)
 | 
						|
    delete config.extends
 | 
						|
    defaultConfig = applyExtends(defaultConfig, path.dirname(pathToDefault))
 | 
						|
  }
 | 
						|
 | 
						|
  previouslyVisitedConfigs = []
 | 
						|
 | 
						|
  return assign(defaultConfig, config)
 | 
						|
}
 | 
						|
 | 
						|
module.exports = applyExtends
 |