Blame view

node_modules/cosmiconfig/lib/createExplorer.js 3.15 KB
ce4c83ff   wxy   初始提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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);
  }