-
Notifications
You must be signed in to change notification settings - Fork 2
/
index.js
90 lines (73 loc) · 2.48 KB
/
index.js
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
module.exports = RcLoader;
var path = require('path');
var assign = require('lodash.assign');
var isObject = require('lodash.isobject');
var merge = require('lodash.merge');
var RcFinder = require('rcfinder');
function RcLoader(name, userConfig, finderConfig) {
if (!(this instanceof RcLoader))
return new RcLoader(name, userConfig, finderConfig);
if (!name)
throw new TypeError('Specify a name for your config files');
finderConfig = isObject(finderConfig) ? finderConfig : {};
var config = {};
var configPending = false;
var lookup = userConfig && userConfig.lookup !== void 0 ? !!userConfig.lookup : true;
var finder = new RcFinder(name, finderConfig);
if (typeof userConfig === 'string') {
lookup = false;
config.defaultFile = userConfig;
} else {
assign(config, userConfig || {});
}
var defaultFileGiven = (config.defaultFile !== undefined);
if (defaultFileGiven) {
if (finder.canLoadSync) {
assign(config, finder.get(config.defaultFile));
} else {
// push callbacks here that need to wait for config to load
configPending = [];
// force the async loader
finder.get(config.defaultFile, function (err, defaults) {
if (err) throw err;
assign(config, defaults);
// clear the configPending queue
var cbs = configPending;
configPending = null;
cbs.forEach(function (cb) { cb(); });
});
}
}
// these shouldn't be a part of the final config
delete config.defaultFile;
delete config.lookup;
// get the config for a file
this.for = function (filename, cb) {
var sync = typeof cb !== 'function';
function respond(err, configFile) {
if (err && !sync) return cb(err);
// the config has not loaded yet, delay our response
// until it is
if (!sync && configPending) {
return configPending.push(function () {
respond(err, configFile);
});
}
// merge these into a fresh object to ensure that configFile
// is never the same object.
if (defaultFileGiven) {
configFile = merge({}, config, configFile || {});
} else {
configFile = merge({}, configFile || {}, config);
}
if (sync) return configFile;
cb(void 0, configFile);
}
if (!lookup) {
if (sync) return respond();
return process.nextTick(respond);
}
if (sync) return respond(null, finder.find(path.dirname(filename)));
finder.find(path.dirname(filename), respond);
};
}