diff options
Diffstat (limited to 'node_modules/cosmiconfig/lib/createExplorer.js')
| -rw-r--r-- | node_modules/cosmiconfig/lib/createExplorer.js | 113 | 
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); +} | 
