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, subKey) { var defaultConfig = {} if (config.hasOwnProperty('extends')) { var pathToDefault = getPathToDefaultConfig(cwd, config.extends) checkForCircularExtends(pathToDefault) previouslyVisitedConfigs.push(pathToDefault) delete config.extends defaultConfig = JSON.parse(fs.readFileSync(pathToDefault, 'utf8')) if (subKey) { defaultConfig = defaultConfig[subKey] || {} } defaultConfig = applyExtends(defaultConfig, path.dirname(pathToDefault), subKey) } previouslyVisitedConfigs = [] return assign(defaultConfig, config) } module.exports = applyExtends