| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 | 
'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
 |