-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
137 lines (124 loc) · 4.02 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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
var merge = require('merge');
var fs = require('fs');
var path = require('path');
var join = path.join;
var dirname = path.dirname;
var pathSetting = require('./lib/path-setting');
var RESERVED_KEYWORD_EXTENDS = '__extends';
var RESERVED_KEYWORD_EXCLUDES = '__excludes';
var RESERVED_KEYWORD_NAME = '__name';
var inst = new Config();
function Config () {
init.call(this);
};
Config.prototype.reload = function (){
init.call(this);
};
Config.prototype.get = function (path) {
var locatorArr = path.split('.');
var tar = this.config;
locatorArr.forEach(function (locator) {
tar = tar[locator];
});
return tar;
};
module.exports = inst;
function init(){
var configPath = pathSetting.buildConfigPath(process.env.NODE_ENV, process.env.CONF_EXT_DIR, process.env.CONF_EXT_NAME);
var basePath = dirname(configPath);
this.config = load(configPath, basePath);
this.path = configPath;
}
function cleanUpConfigObject(configObj, needReserveName) {
var keys = Object.keys(configObj);
if (keys.indexOf(RESERVED_KEYWORD_EXTENDS) >= 0) {
delete configObj[RESERVED_KEYWORD_EXTENDS];
}
if (keys.indexOf(RESERVED_KEYWORD_EXCLUDES) >= 0) {
delete configObj[RESERVED_KEYWORD_EXCLUDES];
}
if (!needReserveName) {
if (keys.indexOf(RESERVED_KEYWORD_NAME) >= 0) {
delete configObj[RESERVED_KEYWORD_NAME];
}
}
return configObj;
}
function validateConfigFormat(configObj) {
var keys = Object.keys(configObj);
if (keys.indexOf(RESERVED_KEYWORD_EXCLUDES) >= 0 && !(configObj[RESERVED_KEYWORD_EXCLUDES] instanceof Array)) {
throw Error('Format error! ' + RESERVED_KEYWORD_EXCLUDES + ' must be an Array');
}
if (keys.indexOf(RESERVED_KEYWORD_NAME) >= 0 && typeof configObj[RESERVED_KEYWORD_NAME] !== 'string') {
throw Error('Format error! ' + RESERVED_KEYWORD_NAME + ' must be a string');
}
if (keys.indexOf(RESERVED_KEYWORD_EXTENDS) >= 0 && !(configObj[RESERVED_KEYWORD_EXTENDS] instanceof Array)) {
throw Error('Format error! ' + RESERVED_KEYWORD_EXTENDS + ' must be an Array');
}
return true;
}
function excludesHandler(excludes, extendDict) {
excludes.forEach(function (item) {
if (extendDict[item]) {
delete extendDict[item];
}
});
return extendDict;
}
function load(config, basePath, innerCall) {
var configObj = typeof config === 'string' ? require(config) : config;
validateConfigFormat(configObj);
var keys = Object.keys(configObj);
var hasExtends = keys.indexOf(RESERVED_KEYWORD_EXTENDS) >= 0;
var hasExcludes = keys.indexOf(RESERVED_KEYWORD_EXCLUDES) >= 0;
var extendDict = {};
var extendKeys = [];
var excludes = [];
var seed = {};
// preset extends
if (hasExtends) {
var extendModules = configObj[RESERVED_KEYWORD_EXTENDS];
extendModules.forEach(function (item, index) {
extendDict[item] = { order: index, ref: {} };
});
}
// handle excludes
if (hasExcludes) {
excludes = configObj[RESERVED_KEYWORD_EXCLUDES];
extendDict = excludesHandler(excludes, extendDict);
}
// load extends
if (hasExtends) {
extendKeys = Object.keys(extendDict);
extendKeys.forEach(function (path) {
var p = join(basePath, path);
var obj = merge.recursive(true, extendDict[path], {
ref: load(p, dirname(p), true),
});
var name = obj.ref[RESERVED_KEYWORD_NAME] || path;
delete extendDict[path];
extendDict[name] = obj;
});
extendKeys = Object.keys(extendDict);
}
// handle excludes
if (hasExcludes){
excludes = configObj[RESERVED_KEYWORD_EXCLUDES];
extendDict = excludesHandler(excludes, extendDict);
extendKeys = Object.keys(extendDict);
}
// handle extends
if (hasExtends) {
var extendArray = [];
extendKeys.forEach(function (key) {
var extendDictObj = extendDict[key];
extendArray[extendDictObj.order] = extendDictObj.ref;
});
extendArray.forEach(function (ref, order) {
seed = merge.recursive(true, seed, ref);
});
cleanUpConfigObject(seed);
}
configObj = cleanUpConfigObject(configObj, innerCall);
return merge.recursive(true, seed, configObj);
}