aboutsummaryrefslogtreecommitdiff
path: root/node_modules/cosmiconfig/lib/createExplorer.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/cosmiconfig/lib/createExplorer.js')
-rw-r--r--node_modules/cosmiconfig/lib/createExplorer.js113
1 files changed, 113 insertions, 0 deletions
diff --git a/node_modules/cosmiconfig/lib/createExplorer.js b/node_modules/cosmiconfig/lib/createExplorer.js
new file mode 100644
index 0000000..a79beab
--- /dev/null
+++ b/node_modules/cosmiconfig/lib/createExplorer.js
@@ -0,0 +1,113 @@
+'use strict';
+
+var path = require('path');
+var isDir = require('is-directory');
+var loadPackageProp = require('./loadPackageProp');
+var loadRc = require('./loadRc');
+var loadJs = require('./loadJs');
+var loadDefinedFile = require('./loadDefinedFile');
+
+module.exports = function (options) {
+ // These cache Promises that resolve with results, not the results themselves
+ var fileCache = (options.cache) ? new Map() : null;
+ var directoryCache = (options.cache) ? new Map() : null;
+ var transform = options.transform || identityPromise;
+
+ function clearFileCache() {
+ if (fileCache) fileCache.clear();
+ }
+
+ function clearDirectoryCache() {
+ if (directoryCache) directoryCache.clear();
+ }
+
+ function clearCaches() {
+ clearFileCache();
+ clearDirectoryCache();
+ }
+
+ function load(searchPath, configPath) {
+ if (!configPath && options.configPath) {
+ configPath = options.configPath;
+ }
+
+ if (configPath) {
+ var absoluteConfigPath = path.resolve(process.cwd(), configPath);
+ if (fileCache && fileCache.has(absoluteConfigPath)) {
+ return fileCache.get(absoluteConfigPath);
+ }
+ var result = loadDefinedFile(absoluteConfigPath, options)
+ .then(transform);
+ if (fileCache) fileCache.set(absoluteConfigPath, result);
+ return result;
+ }
+
+ if (!searchPath) return Promise.resolve(null);
+
+ var absoluteSearchPath = path.resolve(process.cwd(), searchPath);
+
+ return isDirectory(absoluteSearchPath)
+ .then(function (searchPathIsDirectory) {
+ var directory = (searchPathIsDirectory)
+ ? absoluteSearchPath
+ : path.dirname(absoluteSearchPath);
+ return searchDirectory(directory);
+ });
+ }
+
+ function searchDirectory(directory) {
+ if (directoryCache && directoryCache.has(directory)) {
+ return directoryCache.get(directory);
+ }
+
+ var result = Promise.resolve()
+ .then(function () {
+ if (!options.packageProp) return;
+ return loadPackageProp(directory, options);
+ })
+ .then(function (result) {
+ if (result || !options.rc) return result;
+ return loadRc(path.join(directory, options.rc), options);
+ })
+ .then(function (result) {
+ if (result || !options.js) return result;
+ return loadJs(path.join(directory, options.js));
+ })
+ .then(function (result) {
+ if (result) return result;
+
+ var splitPath = directory.split(path.sep);
+ var nextDirectory = (splitPath.length > 1)
+ ? splitPath.slice(0, -1).join(path.sep)
+ : null;
+
+ if (!nextDirectory || directory === options.stopDir) return null;
+
+ return searchDirectory(nextDirectory);
+ })
+ .then(transform);
+
+ if (directoryCache) directoryCache.set(directory, result);
+ return result;
+ }
+
+ return {
+ load: load,
+ clearFileCache: clearFileCache,
+ clearDirectoryCache: clearDirectoryCache,
+ clearCaches: clearCaches,
+ };
+};
+
+function isDirectory(filepath) {
+ return new Promise(function (resolve, reject) {
+ return isDir(filepath, function (err, dir) {
+ if (err) return reject(err);
+ return resolve(dir);
+ });
+ });
+}
+
+function identityPromise(x) {
+ return Promise.resolve(x);
+}