12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- 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
|