diff options
Diffstat (limited to 'node_modules/pkg-conf/index.js')
-rw-r--r-- | node_modules/pkg-conf/index.js | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/node_modules/pkg-conf/index.js b/node_modules/pkg-conf/index.js new file mode 100644 index 000000000..dff982790 --- /dev/null +++ b/node_modules/pkg-conf/index.js @@ -0,0 +1,64 @@ +'use strict'; +const path = require('path'); +const findUp = require('find-up'); +const loadJsonFile = require('load-json-file'); + +const filepaths = new WeakMap(); +const filepath = conf => filepaths.get(conf); +const findNextCwd = pkgPath => path.resolve(path.dirname(pkgPath), '..'); + +const addFp = (obj, fp) => { + filepaths.set(obj, fp); + return obj; +}; + +const pkgConf = (namespace, opts) => { + if (!namespace) { + return Promise.reject(new TypeError('Expected a namespace')); + } + + opts = opts || {}; + + return findUp('package.json', opts.cwd ? {cwd: opts.cwd} : {}) + .then(fp => { + if (!fp) { + return addFp(Object.assign({}, opts.defaults), fp); + } + + return loadJsonFile(fp).then(pkg => { + if (opts.skipOnFalse && pkg[namespace] === false) { + const newOpts = Object.assign({}, opts, {cwd: findNextCwd(fp)}); + return pkgConf(namespace, newOpts); + } + + return addFp(Object.assign({}, opts.defaults, pkg[namespace]), fp); + }); + }); +}; + +const sync = (namespace, opts) => { + if (!namespace) { + throw new TypeError('Expected a namespace'); + } + + opts = opts || {}; + + const fp = findUp.sync('package.json', opts.cwd ? {cwd: opts.cwd} : {}); + + if (!fp) { + return addFp(Object.assign({}, opts.defaults), fp); + } + + const pkg = loadJsonFile.sync(fp); + + if (opts.skipOnFalse && pkg[namespace] === false) { + const newOpts = Object.assign({}, opts, {cwd: findNextCwd(fp)}); + return sync(namespace, newOpts); + } + + return addFp(Object.assign({}, opts.defaults, pkg[namespace]), fp); +}; + +module.exports = pkgConf; +module.exports.filepath = filepath; +module.exports.sync = sync; |