You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							53 lines
						
					
					
						
							1.5 KiB
						
					
					
				
			
		
		
	
	
							53 lines
						
					
					
						
							1.5 KiB
						
					
					
				
 | 
						|
'use strict' | 
						|
const fs = require('fs') | 
						|
const path = require('path') | 
						|
const YError = require('./yerror') | 
						|
 | 
						|
let previouslyVisitedConfigs = [] | 
						|
 | 
						|
function checkForCircularExtends (cfgPath) { | 
						|
  if (previouslyVisitedConfigs.indexOf(cfgPath) > -1) { | 
						|
    throw new YError(`Circular extended configurations: '${cfgPath}'.`) | 
						|
  } | 
						|
} | 
						|
 | 
						|
function getPathToDefaultConfig (cwd, pathToExtend) { | 
						|
  return path.resolve(cwd, pathToExtend) | 
						|
} | 
						|
 | 
						|
function applyExtends (config, cwd) { | 
						|
  let defaultConfig = {} | 
						|
 | 
						|
  if (config.hasOwnProperty('extends')) { | 
						|
    if (typeof config.extends !== 'string') return defaultConfig | 
						|
    const isPath = /\.json|\..*rc$/.test(config.extends) | 
						|
    let 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 Object.assign({}, defaultConfig, config) | 
						|
} | 
						|
 | 
						|
module.exports = applyExtends
 | 
						|
 |