bigint-crypto-utils/node_modules/config-master/lib/config-master.js

49 lines
1.7 KiB
JavaScript

'use strict'
const path = require('path')
const walkBack = require('walk-back')
/**
* A convention for storing and retrieving application config. You supply a string (e.g. `'example-app'`), the libary will walk up the directory tree merging config stored for this app. The following locations are searched, with the latter taking precedence:
*
* - Any package.json, beneath the `example-app` property.
* - Any `.example-app.json` files (or a custom filename you specify).
*
* @module config-master
*/
module.exports = loadConfig
/**
* @param {string} - config name
* @param [options] {object} - options
* @param [options.startFrom] {string} - directory to begin looking for config
* @param [options.filename] {string} - config filename (defaults to `.${configName}.json`)
* @returns {Object}
* @alias module:config-master
*/
function loadConfig (configName, options) {
options = options || {}
const configFileName = options.filename || `.${configName}.json`
const startFrom = options.startFrom || process.cwd()
const configs = Array.from(configsInTree(startFrom, configFileName)).reverse()
const packageConfigs = Array.from(packageConfigsInTree(startFrom, configName)).reverse()
return Object.assign.apply(null, [ {} ].concat(packageConfigs).concat(configs))
}
function * configsInTree (startFrom, fileName) {
let file
while ((file = walkBack(startFrom, fileName))) {
yield require(file)
startFrom = path.resolve(path.dirname(file), '..')
}
}
function * packageConfigsInTree (startFrom, configName) {
let file
while ((file = walkBack(startFrom, 'package.json'))) {
let config = require(file)[configName]
if (config) yield config
startFrom = path.resolve(path.dirname(file), '..')
}
}