@incanta/config 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/config.d.ts +4 -0
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +82 -40
- package/lib/config.js.map +1 -1
- package/package.json +1 -1
- package/src/config.ts +89 -40
package/lib/config.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export interface IConfigOptions {
|
|
|
5
5
|
export default class Config {
|
|
6
6
|
private configDir;
|
|
7
7
|
private values;
|
|
8
|
+
private normalizedValues;
|
|
8
9
|
private customValues;
|
|
9
10
|
private envVarConfig;
|
|
10
11
|
constructor(options?: IConfigOptions);
|
|
@@ -13,6 +14,9 @@ export default class Config {
|
|
|
13
14
|
getConfiguredEnv(): any;
|
|
14
15
|
get<T>(key: string): T;
|
|
15
16
|
getWithParts<T>(keyParts: string[]): T;
|
|
17
|
+
normalizeString(value: string, currentPath: string[]): string;
|
|
18
|
+
normalizeArray(arr: any[], currentPath: string[]): any[];
|
|
19
|
+
normalizeObject(obj: any, currentPath: string[]): any;
|
|
16
20
|
tryGet<T>(key: string): T | null;
|
|
17
21
|
getJson(): any;
|
|
18
22
|
set<T>(key: string, value: T): void;
|
package/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,CAAC,OAAO,OAAO,MAAM;IACzB,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,YAAY,CAAM;IAE1B,OAAO,CAAC,YAAY,CAAM;gBAEP,OAAO,CAAC,EAAE,cAAc;IAIpC,IAAI,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,CAAC,OAAO,OAAO,MAAM;IACzB,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,YAAY,CAAM;IAE1B,OAAO,CAAC,YAAY,CAAM;gBAEP,OAAO,CAAC,EAAE,cAAc;IAIpC,IAAI,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI;IAuFpC,GAAG,IAAI,MAAM;IAIb,gBAAgB,IAAI,GAAG;IAevB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC;IAKtB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC;IAuBtC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM;IA8C7D,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE;IAkBxD,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,GAAG;IA4BrD,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAShC,OAAO,IAAI,GAAG;IAMd,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAKnC,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAe7C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAMnC"}
|
package/lib/config.js
CHANGED
|
@@ -10,6 +10,7 @@ const loader_1 = require("./loader");
|
|
|
10
10
|
class Config {
|
|
11
11
|
configDir = "";
|
|
12
12
|
values;
|
|
13
|
+
normalizedValues;
|
|
13
14
|
customValues;
|
|
14
15
|
envVarConfig;
|
|
15
16
|
constructor(options) {
|
|
@@ -17,6 +18,7 @@ class Config {
|
|
|
17
18
|
}
|
|
18
19
|
init(options) {
|
|
19
20
|
this.values = {};
|
|
21
|
+
this.normalizedValues = {};
|
|
20
22
|
this.customValues = {};
|
|
21
23
|
let defaultConfigDir = "config";
|
|
22
24
|
let defaultConfigEnv = "default";
|
|
@@ -53,6 +55,7 @@ class Config {
|
|
|
53
55
|
}
|
|
54
56
|
const overrideValues = loader_1.Loader.loadFile(path_1.default.join(this.configDir, "override.json"), {});
|
|
55
57
|
(0, lodash_merge_1.default)(this.values, defaultValues, envValues, overrideValues);
|
|
58
|
+
this.normalizedValues = this.normalizeObject(this.values, []);
|
|
56
59
|
// load the environment variables that are configured to be injected
|
|
57
60
|
// using config-env
|
|
58
61
|
const dirContents = fs_1.default.readdirSync(this.configDir, { encoding: "utf-8" });
|
|
@@ -85,7 +88,7 @@ class Config {
|
|
|
85
88
|
if (keyParts.length === 0) {
|
|
86
89
|
throw new Error("Cannot use an empty key");
|
|
87
90
|
}
|
|
88
|
-
let obj = this.
|
|
91
|
+
let obj = (0, lodash_merge_1.default)({}, this.normalizedValues);
|
|
89
92
|
for (const part of keyParts) {
|
|
90
93
|
// convert to camelCase first
|
|
91
94
|
const newPart = part.replace(/-([a-zA-Z0-9])/g, function (_, match) {
|
|
@@ -96,52 +99,90 @@ class Config {
|
|
|
96
99
|
}
|
|
97
100
|
obj = obj[newPart];
|
|
98
101
|
}
|
|
102
|
+
return obj;
|
|
103
|
+
}
|
|
104
|
+
normalizeString(value, currentPath) {
|
|
105
|
+
let result = value;
|
|
99
106
|
const variableRegex = /\$\{[a-zA-Z\-_0-9./]+\}/g;
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
107
|
+
const regexResult = value.matchAll(variableRegex);
|
|
108
|
+
for (const match of regexResult) {
|
|
109
|
+
const key = match[0].slice(2, match[0].length - 1);
|
|
110
|
+
let keyToFetchValue;
|
|
111
|
+
if (key.startsWith(".")) {
|
|
112
|
+
keyToFetchValue = path_1.default
|
|
113
|
+
.normalize(`${currentPath.join("/")}/${key}`)
|
|
114
|
+
.replaceAll("\\", "/")
|
|
115
|
+
.replaceAll("/", ".");
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
keyToFetchValue = key;
|
|
119
|
+
}
|
|
120
|
+
let obj = (0, lodash_merge_1.default)({}, this.values);
|
|
121
|
+
const keyParts = keyToFetchValue.split(".");
|
|
122
|
+
for (const part of keyParts) {
|
|
123
|
+
// convert to camelCase first
|
|
124
|
+
const newPart = part.replace(/-([a-zA-Z0-9])/g, function (_, match) {
|
|
125
|
+
return match.toUpperCase();
|
|
126
|
+
});
|
|
127
|
+
if (typeof obj[newPart] === "undefined") {
|
|
128
|
+
throw new Error(`Could not find value for key ${keyParts.join(".")}`);
|
|
110
129
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
130
|
+
obj = obj[newPart];
|
|
131
|
+
}
|
|
132
|
+
if (obj !== null) {
|
|
133
|
+
if (typeof obj === "string" && obj.match(variableRegex) !== null) {
|
|
134
|
+
obj = this.normalizeString(obj, keyParts.slice(0, -1));
|
|
114
135
|
}
|
|
136
|
+
result = result.replace(match[0], `${obj}`);
|
|
115
137
|
}
|
|
116
|
-
return result;
|
|
117
|
-
};
|
|
118
|
-
// replace all ${value} with the value from the config
|
|
119
|
-
if (typeof obj === "string") {
|
|
120
|
-
obj = replaceValue(obj);
|
|
121
138
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
normalizeArray(arr, currentPath) {
|
|
142
|
+
return arr.map((value) => {
|
|
143
|
+
if (typeof value === "string") {
|
|
144
|
+
return this.normalizeString(value, currentPath);
|
|
145
|
+
}
|
|
146
|
+
else if (typeof value === "object") {
|
|
147
|
+
if (value === null) {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
else if (Array.isArray(value)) {
|
|
151
|
+
return this.normalizeArray(value, currentPath);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
return this.normalizeObject(value, currentPath);
|
|
138
155
|
}
|
|
139
|
-
};
|
|
140
|
-
if (obj !== null) {
|
|
141
|
-
walkObject(obj);
|
|
142
156
|
}
|
|
157
|
+
return value;
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
normalizeObject(obj, currentPath) {
|
|
161
|
+
if (typeof obj !== "object" || obj === null) {
|
|
162
|
+
return obj;
|
|
143
163
|
}
|
|
144
|
-
|
|
164
|
+
const newObj = (0, lodash_merge_1.default)({}, obj);
|
|
165
|
+
for (const property of Object.keys(newObj)) {
|
|
166
|
+
const value = newObj[property];
|
|
167
|
+
if (typeof value === "string") {
|
|
168
|
+
newObj[property] = this.normalizeString(value, currentPath);
|
|
169
|
+
}
|
|
170
|
+
else if (typeof value === "object") {
|
|
171
|
+
if (value === null) {
|
|
172
|
+
newObj[property] = null;
|
|
173
|
+
}
|
|
174
|
+
else if (Array.isArray(value)) {
|
|
175
|
+
newObj[property] = this.normalizeArray(value, currentPath);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
newObj[property] = this.normalizeObject(value, [
|
|
179
|
+
...currentPath,
|
|
180
|
+
property,
|
|
181
|
+
]);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return newObj;
|
|
145
186
|
}
|
|
146
187
|
tryGet(key) {
|
|
147
188
|
try {
|
|
@@ -153,7 +194,8 @@ class Config {
|
|
|
153
194
|
}
|
|
154
195
|
}
|
|
155
196
|
getJson() {
|
|
156
|
-
|
|
197
|
+
const values = (0, lodash_merge_1.default)({}, this.normalizedValues);
|
|
198
|
+
return values;
|
|
157
199
|
}
|
|
158
200
|
set(key, value) {
|
|
159
201
|
const parts = key.split(".");
|
package/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/config.ts
CHANGED
|
@@ -12,6 +12,7 @@ export default class Config {
|
|
|
12
12
|
private configDir: string = "";
|
|
13
13
|
|
|
14
14
|
private values: any;
|
|
15
|
+
private normalizedValues: any;
|
|
15
16
|
private customValues: any;
|
|
16
17
|
|
|
17
18
|
private envVarConfig: any;
|
|
@@ -22,6 +23,7 @@ export default class Config {
|
|
|
22
23
|
|
|
23
24
|
public init(options?: IConfigOptions): void {
|
|
24
25
|
this.values = {};
|
|
26
|
+
this.normalizedValues = {};
|
|
25
27
|
this.customValues = {};
|
|
26
28
|
|
|
27
29
|
let defaultConfigDir = "config";
|
|
@@ -89,6 +91,7 @@ export default class Config {
|
|
|
89
91
|
);
|
|
90
92
|
|
|
91
93
|
merge(this.values, defaultValues, envValues, overrideValues);
|
|
94
|
+
this.normalizedValues = this.normalizeObject(this.values, []);
|
|
92
95
|
|
|
93
96
|
// load the environment variables that are configured to be injected
|
|
94
97
|
// using config-env
|
|
@@ -134,7 +137,7 @@ export default class Config {
|
|
|
134
137
|
throw new Error("Cannot use an empty key");
|
|
135
138
|
}
|
|
136
139
|
|
|
137
|
-
let obj = this.
|
|
140
|
+
let obj = merge({}, this.normalizedValues);
|
|
138
141
|
|
|
139
142
|
for (const part of keyParts) {
|
|
140
143
|
// convert to camelCase first
|
|
@@ -149,55 +152,99 @@ export default class Config {
|
|
|
149
152
|
obj = obj[newPart];
|
|
150
153
|
}
|
|
151
154
|
|
|
155
|
+
return obj as T;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
public normalizeString(value: string, currentPath: string[]): string {
|
|
159
|
+
let result = value;
|
|
160
|
+
|
|
152
161
|
const variableRegex = /\$\{[a-zA-Z\-_0-9./]+\}/g;
|
|
162
|
+
const regexResult = value.matchAll(variableRegex);
|
|
163
|
+
for (const match of regexResult) {
|
|
164
|
+
const key = match[0].slice(2, match[0].length - 1);
|
|
165
|
+
|
|
166
|
+
let keyToFetchValue: string;
|
|
167
|
+
if (key.startsWith(".")) {
|
|
168
|
+
keyToFetchValue = path
|
|
169
|
+
.normalize(`${currentPath.join("/")}/${key}`)
|
|
170
|
+
.replaceAll("\\", "/")
|
|
171
|
+
.replaceAll("/", ".");
|
|
172
|
+
} else {
|
|
173
|
+
keyToFetchValue = key;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
let obj = merge({}, this.values);
|
|
153
177
|
|
|
154
|
-
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
.slice(0, keyParts.length - 1)
|
|
164
|
-
.join(".")}.${keyToReplace.slice(2)}`;
|
|
178
|
+
const keyParts = keyToFetchValue.split(".");
|
|
179
|
+
for (const part of keyParts) {
|
|
180
|
+
// convert to camelCase first
|
|
181
|
+
const newPart = part.replace(/-([a-zA-Z0-9])/g, function (_, match) {
|
|
182
|
+
return match.toUpperCase();
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
if (typeof obj[newPart] === "undefined") {
|
|
186
|
+
throw new Error(`Could not find value for key ${keyParts.join(".")}`);
|
|
165
187
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
188
|
+
|
|
189
|
+
obj = obj[newPart];
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (obj !== null) {
|
|
193
|
+
if (typeof obj === "string" && obj.match(variableRegex) !== null) {
|
|
194
|
+
obj = this.normalizeString(obj, keyParts.slice(0, -1));
|
|
169
195
|
}
|
|
196
|
+
|
|
197
|
+
result = result.replace(match[0], `${obj}`);
|
|
170
198
|
}
|
|
199
|
+
}
|
|
171
200
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
if (value === null) {
|
|
187
|
-
curObj[property] = null;
|
|
188
|
-
} else {
|
|
189
|
-
walkObject(value);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
public normalizeArray(arr: any[], currentPath: string[]): any[] {
|
|
205
|
+
return arr.map((value) => {
|
|
206
|
+
if (typeof value === "string") {
|
|
207
|
+
return this.normalizeString(value, currentPath);
|
|
208
|
+
} else if (typeof value === "object") {
|
|
209
|
+
if (value === null) {
|
|
210
|
+
return null;
|
|
211
|
+
} else if (Array.isArray(value)) {
|
|
212
|
+
return this.normalizeArray(value, currentPath);
|
|
213
|
+
} else {
|
|
214
|
+
return this.normalizeObject(value, currentPath);
|
|
192
215
|
}
|
|
193
|
-
}
|
|
216
|
+
}
|
|
194
217
|
|
|
195
|
-
|
|
196
|
-
|
|
218
|
+
return value;
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
public normalizeObject(obj: any, currentPath: string[]): any {
|
|
223
|
+
if (typeof obj !== "object" || obj === null) {
|
|
224
|
+
return obj;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const newObj = merge({}, obj);
|
|
228
|
+
|
|
229
|
+
for (const property of Object.keys(newObj)) {
|
|
230
|
+
const value = newObj[property];
|
|
231
|
+
if (typeof value === "string") {
|
|
232
|
+
newObj[property] = this.normalizeString(value, currentPath);
|
|
233
|
+
} else if (typeof value === "object") {
|
|
234
|
+
if (value === null) {
|
|
235
|
+
newObj[property] = null;
|
|
236
|
+
} else if (Array.isArray(value)) {
|
|
237
|
+
newObj[property] = this.normalizeArray(value, currentPath);
|
|
238
|
+
} else {
|
|
239
|
+
newObj[property] = this.normalizeObject(value, [
|
|
240
|
+
...currentPath,
|
|
241
|
+
property,
|
|
242
|
+
]);
|
|
243
|
+
}
|
|
197
244
|
}
|
|
198
245
|
}
|
|
199
246
|
|
|
200
|
-
return
|
|
247
|
+
return newObj;
|
|
201
248
|
}
|
|
202
249
|
|
|
203
250
|
public tryGet<T>(key: string): T | null {
|
|
@@ -210,7 +257,9 @@ export default class Config {
|
|
|
210
257
|
}
|
|
211
258
|
|
|
212
259
|
public getJson(): any {
|
|
213
|
-
|
|
260
|
+
const values = merge({}, this.normalizedValues);
|
|
261
|
+
|
|
262
|
+
return values;
|
|
214
263
|
}
|
|
215
264
|
|
|
216
265
|
public set<T>(key: string, value: T): void {
|