This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
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.4 KiB
53 lines
1.4 KiB
|
|
'use strict' |
|
const fs = require('fs') |
|
const path = require('path') |
|
const YError = require('./yerror') |
|
|
|
let 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) { |
|
let defaultConfig = {} |
|
|
|
if (config.hasOwnProperty('extends')) { |
|
if (typeof config.extends !== 'string') return defaultConfig |
|
const isPath = /\.json$/.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
|
|
|