@incanta/config 0.2.3 → 0.3.1
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 +1 -0
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +19 -8
- package/lib/config.js.map +1 -1
- package/lib/loader.d.ts +7 -4
- package/lib/loader.d.ts.map +1 -1
- package/lib/loader.js +55 -40
- package/lib/loader.js.map +1 -1
- package/package.json +1 -1
- package/src/config.ts +36 -9
- package/src/loader.ts +83 -50
package/lib/config.d.ts
CHANGED
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,
|
|
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;IAqFpC,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;IAuEtC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAShC,OAAO,IAAI,GAAG;IAId,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
|
@@ -8,11 +8,14 @@ const path_1 = __importDefault(require("path"));
|
|
|
8
8
|
const fs_1 = __importDefault(require("fs"));
|
|
9
9
|
const loader_1 = require("./loader");
|
|
10
10
|
class Config {
|
|
11
|
-
configDir;
|
|
11
|
+
configDir = "";
|
|
12
12
|
values;
|
|
13
13
|
customValues;
|
|
14
14
|
envVarConfig;
|
|
15
15
|
constructor(options) {
|
|
16
|
+
this.init(options);
|
|
17
|
+
}
|
|
18
|
+
init(options) {
|
|
16
19
|
this.values = {};
|
|
17
20
|
this.customValues = {};
|
|
18
21
|
let defaultConfigDir = "config";
|
|
@@ -33,18 +36,22 @@ class Config {
|
|
|
33
36
|
(process.env["NODE_CONFIG_DIR"] &&
|
|
34
37
|
path_1.default.relative(process.cwd(), process.env["NODE_CONFIG_DIR"])) ||
|
|
35
38
|
path_1.default.join(process.cwd(), defaultConfigDir);
|
|
36
|
-
const defaultValues = loader_1.Loader.load(path_1.default.join(this.configDir, "default"));
|
|
37
|
-
let envValues = {};
|
|
38
39
|
const configEnvDir = options?.configEnv || process.env["NODE_CONFIG_ENV"] || defaultConfigEnv;
|
|
40
|
+
const configFolderOptions = loader_1.Loader.readConfigSettings(path_1.default.join(this.configDir, configEnvDir));
|
|
41
|
+
const defaultValues = loader_1.Loader.loadRoot(path_1.default.join(this.configDir, "default"), {
|
|
42
|
+
...configFolderOptions,
|
|
43
|
+
parentNames: [],
|
|
44
|
+
});
|
|
45
|
+
let envValues = {};
|
|
39
46
|
if (configEnvDir) {
|
|
40
47
|
if (fs_1.default.existsSync(path_1.default.join(this.configDir, configEnvDir))) {
|
|
41
|
-
envValues = loader_1.Loader.
|
|
48
|
+
envValues = loader_1.Loader.loadRoot(path_1.default.join(this.configDir, configEnvDir), configFolderOptions);
|
|
42
49
|
}
|
|
43
50
|
else {
|
|
44
51
|
console.log(`Cannot use environment deployment value of ${configEnvDir} because ${path_1.default.join(this.configDir, configEnvDir)} doesn't exist`);
|
|
45
52
|
}
|
|
46
53
|
}
|
|
47
|
-
const overrideValues = loader_1.Loader.loadFile(path_1.default.join(this.configDir, "override.json"));
|
|
54
|
+
const overrideValues = loader_1.Loader.loadFile(path_1.default.join(this.configDir, "override.json"), {});
|
|
48
55
|
(0, lodash_merge_1.default)(this.values, defaultValues, envValues, overrideValues);
|
|
49
56
|
// load the environment variables that are configured to be injected
|
|
50
57
|
// using config-env
|
|
@@ -52,7 +59,7 @@ class Config {
|
|
|
52
59
|
this.envVarConfig = {};
|
|
53
60
|
for (const file of dirContents) {
|
|
54
61
|
if (file.startsWith("environment.")) {
|
|
55
|
-
this.envVarConfig = loader_1.Loader.loadFile(path_1.default.join(this.configDir, file));
|
|
62
|
+
this.envVarConfig = loader_1.Loader.loadFile(path_1.default.join(this.configDir, file), {});
|
|
56
63
|
break;
|
|
57
64
|
}
|
|
58
65
|
}
|
|
@@ -80,10 +87,14 @@ class Config {
|
|
|
80
87
|
}
|
|
81
88
|
let obj = this.values;
|
|
82
89
|
for (const part of keyParts) {
|
|
83
|
-
|
|
90
|
+
// convert to camelCase first
|
|
91
|
+
const newPart = part.replace(/-([a-zA-Z0-9])/g, function (_, match) {
|
|
92
|
+
return match.toUpperCase();
|
|
93
|
+
});
|
|
94
|
+
if (typeof obj[newPart] === "undefined") {
|
|
84
95
|
throw new Error(`Could not find value for key ${keyParts.join(".")}`);
|
|
85
96
|
}
|
|
86
|
-
obj = obj[
|
|
97
|
+
obj = obj[newPart];
|
|
87
98
|
}
|
|
88
99
|
const variableRegex = /\$\{[a-zA-Z\-_0-9./]+\}/g;
|
|
89
100
|
const replaceValue = (value) => {
|
package/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;AAAA,gEAAiC;AACjC,gDAAwB;AACxB,4CAAoB;AACpB,qCAAkC;AAOlC,MAAqB,MAAM;IACjB,SAAS,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/lib/loader.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
export interface
|
|
1
|
+
export interface IConfigFolderOptions {
|
|
2
|
+
keepKebabCase?: boolean;
|
|
2
3
|
parentNames?: string[];
|
|
3
4
|
}
|
|
4
5
|
export declare class Loader {
|
|
5
|
-
static
|
|
6
|
-
static
|
|
7
|
-
static
|
|
6
|
+
static readConfigSettings(folder: string): IConfigFolderOptions;
|
|
7
|
+
static convertKebabToCamelCase(obj: any, options: IConfigFolderOptions): any;
|
|
8
|
+
static loadFile(filePath: string, options: IConfigFolderOptions): any;
|
|
9
|
+
static loadRoot(folder: string, options: IConfigFolderOptions): any;
|
|
10
|
+
static load(folder: string, options: IConfigFolderOptions): any;
|
|
8
11
|
}
|
|
9
12
|
//# sourceMappingURL=loader.d.ts.map
|
package/lib/loader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,qBAAa,MAAM;WACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB;WA8BxD,uBAAuB,CACnC,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,oBAAoB,GAC5B,GAAG;WAgDQ,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,GAAG;WAuC9D,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,GAAG;WAqB5D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,GAAG;CAmEvE"}
|
package/lib/loader.js
CHANGED
|
@@ -11,21 +11,48 @@ const json5_1 = __importDefault(require("json5"));
|
|
|
11
11
|
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
12
12
|
const lodash_merge_1 = __importDefault(require("lodash.merge"));
|
|
13
13
|
class Loader {
|
|
14
|
+
static readConfigSettings(folder) {
|
|
15
|
+
let options = {};
|
|
16
|
+
const configFiles = ["_config.json", "config.json"];
|
|
17
|
+
for (const configFile of configFiles) {
|
|
18
|
+
if (fs_1.default.existsSync(path_1.default.join(folder, configFile))) {
|
|
19
|
+
try {
|
|
20
|
+
options = JSON.parse(fs_1.default.readFileSync(path_1.default.join(folder, configFile), {
|
|
21
|
+
encoding: "utf-8",
|
|
22
|
+
}));
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
console.error(`Invalid JSON in ${path_1.default.join(folder, configFile)} file; skipping configuration`);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return options;
|
|
32
|
+
}
|
|
14
33
|
// add additional camelCase keys for any kebab-case keys (without overwriting existing keys)
|
|
15
|
-
static convertKebabToCamelCase(obj) {
|
|
34
|
+
static convertKebabToCamelCase(obj, options) {
|
|
16
35
|
const newObj = {};
|
|
17
36
|
for (const key of Object.keys(obj)) {
|
|
37
|
+
const newKey = key.replace(/-([a-zA-Z0-9])/g, function (_, match) {
|
|
38
|
+
return match.toUpperCase();
|
|
39
|
+
});
|
|
40
|
+
if (typeof obj[newKey] !== "undefined" && newKey !== key) {
|
|
41
|
+
console.error(`Key ${newKey} already exists in object, but ${key} was also defined, skipping ${key}`);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
let newSubObj = {};
|
|
18
45
|
if (typeof obj[key] === "object" &&
|
|
19
46
|
!Array.isArray(obj[key]) &&
|
|
20
47
|
obj[key] !== null) {
|
|
21
|
-
|
|
48
|
+
newSubObj = Loader.convertKebabToCamelCase(obj[key], options);
|
|
22
49
|
}
|
|
23
50
|
else if (Array.isArray(obj[key])) {
|
|
24
|
-
|
|
51
|
+
newSubObj = obj[key].map((item) => {
|
|
25
52
|
if (typeof item === "object" &&
|
|
26
53
|
!Array.isArray(item) &&
|
|
27
54
|
item !== null) {
|
|
28
|
-
return Loader.convertKebabToCamelCase(item);
|
|
55
|
+
return Loader.convertKebabToCamelCase(item, options);
|
|
29
56
|
}
|
|
30
57
|
else {
|
|
31
58
|
return item;
|
|
@@ -33,18 +60,16 @@ class Loader {
|
|
|
33
60
|
});
|
|
34
61
|
}
|
|
35
62
|
else {
|
|
36
|
-
|
|
63
|
+
newSubObj = obj[key];
|
|
37
64
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (newKey !== key) {
|
|
42
|
-
newObj[newKey] = newObj[key];
|
|
65
|
+
newObj[newKey] = newSubObj;
|
|
66
|
+
if (options.keepKebabCase === true && newKey !== key) {
|
|
67
|
+
newObj[key] = newSubObj;
|
|
43
68
|
}
|
|
44
69
|
}
|
|
45
70
|
return newObj;
|
|
46
71
|
}
|
|
47
|
-
static loadFile(filePath) {
|
|
72
|
+
static loadFile(filePath, options) {
|
|
48
73
|
if (!fs_1.default.existsSync(filePath)) {
|
|
49
74
|
return {};
|
|
50
75
|
}
|
|
@@ -75,39 +100,29 @@ class Loader {
|
|
|
75
100
|
obj = {};
|
|
76
101
|
}
|
|
77
102
|
if (typeof obj === "object" && obj !== null && !Array.isArray(obj)) {
|
|
78
|
-
obj = Loader.convertKebabToCamelCase(obj);
|
|
103
|
+
obj = Loader.convertKebabToCamelCase(obj, options);
|
|
79
104
|
}
|
|
80
105
|
return obj;
|
|
81
106
|
}
|
|
82
|
-
static
|
|
83
|
-
if (!fs_1.default.existsSync(folder)) {
|
|
84
|
-
return {};
|
|
85
|
-
}
|
|
107
|
+
static loadRoot(folder, options) {
|
|
86
108
|
const baseObj = {};
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
encoding: "utf-8",
|
|
93
|
-
}));
|
|
94
|
-
if (folderConfig.parentNames) {
|
|
95
|
-
for (const parentName of folderConfig.parentNames) {
|
|
96
|
-
if (parentName === "default") {
|
|
97
|
-
// skip explicitly stated default parents; they're already loaded
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
(0, lodash_merge_1.default)(baseObj, Loader.load(path_1.default.join(folder, "..", parentName)));
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
catch (e) {
|
|
106
|
-
console.error(`Invalid JSON in ${path_1.default.join(folder, configFile)} file; skipping configuration`);
|
|
107
|
-
break;
|
|
109
|
+
if (options.parentNames) {
|
|
110
|
+
for (const parentName of options.parentNames) {
|
|
111
|
+
if (parentName === "default") {
|
|
112
|
+
// skip explicitly stated default parents; they're already loaded
|
|
113
|
+
continue;
|
|
108
114
|
}
|
|
115
|
+
(0, lodash_merge_1.default)(baseObj, Loader.load(path_1.default.join(folder, "..", parentName), options));
|
|
109
116
|
}
|
|
110
117
|
}
|
|
118
|
+
(0, lodash_merge_1.default)(baseObj, Loader.load(folder, options));
|
|
119
|
+
return baseObj;
|
|
120
|
+
}
|
|
121
|
+
static load(folder, options) {
|
|
122
|
+
if (!fs_1.default.existsSync(folder)) {
|
|
123
|
+
return {};
|
|
124
|
+
}
|
|
125
|
+
const baseObj = {};
|
|
111
126
|
const contents = fs_1.default.readdirSync(folder, {
|
|
112
127
|
encoding: "utf-8",
|
|
113
128
|
withFileTypes: true,
|
|
@@ -115,7 +130,7 @@ class Loader {
|
|
|
115
130
|
// first load the index file
|
|
116
131
|
for (const content of contents) {
|
|
117
132
|
if (!content.isDirectory() && /^_?index\./.exec(content.name) !== null) {
|
|
118
|
-
(0, lodash_merge_1.default)(baseObj, Loader.loadFile(path_1.default.join(folder, content.name)));
|
|
133
|
+
(0, lodash_merge_1.default)(baseObj, Loader.loadFile(path_1.default.join(folder, content.name), options));
|
|
119
134
|
}
|
|
120
135
|
}
|
|
121
136
|
// then load other files
|
|
@@ -129,7 +144,7 @@ class Loader {
|
|
|
129
144
|
if (typeof baseObj[key] === "undefined") {
|
|
130
145
|
baseObj[key] = {};
|
|
131
146
|
}
|
|
132
|
-
const obj = Loader.load(path_1.default.join(folder, content.name));
|
|
147
|
+
const obj = Loader.load(path_1.default.join(folder, content.name), options);
|
|
133
148
|
(0, lodash_merge_1.default)(baseObj[key], obj);
|
|
134
149
|
}
|
|
135
150
|
else {
|
|
@@ -143,7 +158,7 @@ class Loader {
|
|
|
143
158
|
if (typeof baseObj[key] === "undefined") {
|
|
144
159
|
baseObj[key] = {};
|
|
145
160
|
}
|
|
146
|
-
const obj = Loader.loadFile(path_1.default.join(folder, content.name));
|
|
161
|
+
const obj = Loader.loadFile(path_1.default.join(folder, content.name), options);
|
|
147
162
|
(0, lodash_merge_1.default)(baseObj[key], obj);
|
|
148
163
|
}
|
|
149
164
|
else {
|
package/lib/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,+CAAmD;AACnD,kDAA0B;AAC1B,sDAA2B;AAC3B,gEAAiC;
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,+CAAmD;AACnD,kDAA0B;AAC1B,sDAA2B;AAC3B,gEAAiC;AAOjC,MAAa,MAAM;IACV,MAAM,CAAC,kBAAkB,CAAC,MAAc;QAC7C,IAAI,OAAO,GAAyB,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QACpD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;YACpC,IAAI,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE;gBAChD,IAAI;oBACF,OAAO,GAAG,IAAI,CAAC,KAAK,CAClB,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE;wBAC7C,QAAQ,EAAE,OAAO;qBAClB,CAAC,CACH,CAAC;oBAEF,MAAM;iBACP;gBAAC,OAAO,CAAM,EAAE;oBACf,OAAO,CAAC,KAAK,CACX,mBAAmB,cAAI,CAAC,IAAI,CAC1B,MAAM,EACN,UAAU,CACX,+BAA+B,CACjC,CAAC;oBAEF,MAAM;iBACP;aACF;SACF;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,4FAA4F;IACrF,MAAM,CAAC,uBAAuB,CACnC,GAAQ,EACR,OAA6B;QAE7B,MAAM,MAAM,GAAQ,EAAE,CAAC;QAEvB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAClC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,CAAC,EAAE,KAAK;gBAC9D,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,IAAI,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,WAAW,IAAI,MAAM,KAAK,GAAG,EAAE;gBACxD,OAAO,CAAC,KAAK,CACX,OAAO,MAAM,kCAAkC,GAAG,+BAA+B,GAAG,EAAE,CACvF,CAAC;gBACF,SAAS;aACV;YAED,IAAI,SAAS,GAAQ,EAAE,CAAC;YACxB,IACE,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ;gBAC5B,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACxB,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EACjB;gBACA,SAAS,GAAG,MAAM,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;aAC/D;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;gBAClC,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;oBACrC,IACE,OAAO,IAAI,KAAK,QAAQ;wBACxB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;wBACpB,IAAI,KAAK,IAAI,EACb;wBACA,OAAO,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;qBACtD;yBAAM;wBACL,OAAO,IAAI,CAAC;qBACb;gBACH,CAAC,CAAC,CAAC;aACJ;iBAAM;gBACL,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;aACtB;YAED,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;YAE3B,IAAI,OAAO,CAAC,aAAa,KAAK,IAAI,IAAI,MAAM,KAAK,GAAG,EAAE;gBACpD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;aACzB;SACF;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,QAAQ,CAAC,QAAgB,EAAE,OAA6B;QACpE,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;YAC5B,OAAO,EAAE,CAAC;SACX;QAED,MAAM,YAAY,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE;YAC7C,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAElD,IAAI,GAAQ,CAAC;QACb,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YAC9B,YAAY;YACZ,GAAG,GAAG,iBAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SAC/B;aAAM,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACpC,YAAY;YACZ,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;SAChC;aAAM,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACrC,aAAa;YACb,GAAG,GAAG,IAAA,oBAAU,EAAC,YAAY,CAAC,CAAC,CAAC,8BAA8B;SAC/D;aAAM,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACrC,aAAa;YACb,GAAG,GAAG,eAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;SACjC;aAAM;YACL,OAAO,CAAC,GAAG,CACT,qBAAqB,QAAQ,mFAAmF,CACjH,CAAC;YACF,GAAG,GAAG,EAAE,CAAC;SACV;QAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAClE,GAAG,GAAG,MAAM,CAAC,uBAAuB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;SACpD;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAEM,MAAM,CAAC,QAAQ,CAAC,MAAc,EAAE,OAA6B;QAClE,MAAM,OAAO,GAAQ,EAAE,CAAC;QAExB,IAAI,OAAO,CAAC,WAAW,EAAE;YACvB,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE;gBAC5C,IAAI,UAAU,KAAK,SAAS,EAAE;oBAC5B,iEAAiE;oBACjE,SAAS;iBACV;gBACD,IAAA,sBAAK,EACH,OAAO,EACP,MAAM,CAAC,IAAI,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAC1D,CAAC;aACH;SACF;QAED,IAAA,sBAAK,EAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAE7C,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,MAAM,CAAC,IAAI,CAAC,MAAc,EAAE,OAA6B;QAC9D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YAC1B,OAAO,EAAE,CAAC;SACX;QAED,MAAM,OAAO,GAAQ,EAAE,CAAC;QAExB,MAAM,QAAQ,GAAG,YAAE,CAAC,WAAW,CAAC,MAAM,EAAE;YACtC,QAAQ,EAAE,OAAO;YACjB,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEH,4BAA4B;QAC5B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;gBACtE,IAAA,sBAAK,EACH,OAAO,EACP,MAAM,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAC1D,CAAC;aACH;SACF;QAED,wBAAwB;QACxB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,wDAAwD;YACxD,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;gBACxC,SAAS;aACV;YAED,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE;gBACzB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;gBAEzB,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE;oBACvC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;iBACnB;gBAED,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBAElE,IAAA,sBAAK,EAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;aAC1B;iBAAM;gBACL,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;oBAC5C,qDAAqD;oBACrD,SAAS;iBACV;gBAED,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC1C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC1B,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;oBAEzB,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE;wBACvC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;qBACnB;oBAED,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;oBAEtE,IAAA,sBAAK,EAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;iBAC1B;qBAAM;oBACL,OAAO,CAAC,GAAG,CACT,qBAAqB,OAAO,CAAC,IAAI,8FAA8F,CAChI,CAAC;oBACF,SAAS;iBACV;aACF;SACF;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAjND,wBAiNC"}
|
package/package.json
CHANGED
package/src/config.ts
CHANGED
|
@@ -9,7 +9,7 @@ export interface IConfigOptions {
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export default class Config {
|
|
12
|
-
private configDir: string;
|
|
12
|
+
private configDir: string = "";
|
|
13
13
|
|
|
14
14
|
private values: any;
|
|
15
15
|
private customValues: any;
|
|
@@ -17,6 +17,10 @@ export default class Config {
|
|
|
17
17
|
private envVarConfig: any;
|
|
18
18
|
|
|
19
19
|
public constructor(options?: IConfigOptions) {
|
|
20
|
+
this.init(options);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public init(options?: IConfigOptions): void {
|
|
20
24
|
this.values = {};
|
|
21
25
|
this.customValues = {};
|
|
22
26
|
|
|
@@ -47,14 +51,28 @@ export default class Config {
|
|
|
47
51
|
path.relative(process.cwd(), process.env["NODE_CONFIG_DIR"])) ||
|
|
48
52
|
path.join(process.cwd(), defaultConfigDir);
|
|
49
53
|
|
|
50
|
-
const defaultValues = Loader.load(path.join(this.configDir, "default"));
|
|
51
|
-
|
|
52
|
-
let envValues: any = {};
|
|
53
54
|
const configEnvDir =
|
|
54
55
|
options?.configEnv || process.env["NODE_CONFIG_ENV"] || defaultConfigEnv;
|
|
56
|
+
|
|
57
|
+
const configFolderOptions = Loader.readConfigSettings(
|
|
58
|
+
path.join(this.configDir, configEnvDir)
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
const defaultValues = Loader.loadRoot(
|
|
62
|
+
path.join(this.configDir, "default"),
|
|
63
|
+
{
|
|
64
|
+
...configFolderOptions,
|
|
65
|
+
parentNames: [],
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
let envValues: any = {};
|
|
55
70
|
if (configEnvDir) {
|
|
56
71
|
if (fs.existsSync(path.join(this.configDir, configEnvDir))) {
|
|
57
|
-
envValues = Loader.
|
|
72
|
+
envValues = Loader.loadRoot(
|
|
73
|
+
path.join(this.configDir, configEnvDir),
|
|
74
|
+
configFolderOptions
|
|
75
|
+
);
|
|
58
76
|
} else {
|
|
59
77
|
console.log(
|
|
60
78
|
`Cannot use environment deployment value of ${configEnvDir} because ${path.join(
|
|
@@ -66,7 +84,8 @@ export default class Config {
|
|
|
66
84
|
}
|
|
67
85
|
|
|
68
86
|
const overrideValues = Loader.loadFile(
|
|
69
|
-
path.join(this.configDir, "override.json")
|
|
87
|
+
path.join(this.configDir, "override.json"),
|
|
88
|
+
{}
|
|
70
89
|
);
|
|
71
90
|
|
|
72
91
|
merge(this.values, defaultValues, envValues, overrideValues);
|
|
@@ -77,7 +96,10 @@ export default class Config {
|
|
|
77
96
|
this.envVarConfig = {};
|
|
78
97
|
for (const file of dirContents) {
|
|
79
98
|
if (file.startsWith("environment.")) {
|
|
80
|
-
this.envVarConfig = Loader.loadFile(
|
|
99
|
+
this.envVarConfig = Loader.loadFile(
|
|
100
|
+
path.join(this.configDir, file),
|
|
101
|
+
{}
|
|
102
|
+
);
|
|
81
103
|
break;
|
|
82
104
|
}
|
|
83
105
|
}
|
|
@@ -115,11 +137,16 @@ export default class Config {
|
|
|
115
137
|
let obj = this.values;
|
|
116
138
|
|
|
117
139
|
for (const part of keyParts) {
|
|
118
|
-
|
|
140
|
+
// convert to camelCase first
|
|
141
|
+
const newPart = part.replace(/-([a-zA-Z0-9])/g, function (_, match) {
|
|
142
|
+
return match.toUpperCase();
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
if (typeof obj[newPart] === "undefined") {
|
|
119
146
|
throw new Error(`Could not find value for key ${keyParts.join(".")}`);
|
|
120
147
|
}
|
|
121
148
|
|
|
122
|
-
obj = obj[
|
|
149
|
+
obj = obj[newPart];
|
|
123
150
|
}
|
|
124
151
|
|
|
125
152
|
const variableRegex = /\$\{[a-zA-Z\-_0-9./]+\}/g;
|
package/src/loader.ts
CHANGED
|
@@ -5,51 +5,94 @@ import JSON5 from "json5";
|
|
|
5
5
|
import YAML from "js-yaml";
|
|
6
6
|
import merge from "lodash.merge";
|
|
7
7
|
|
|
8
|
-
export interface
|
|
8
|
+
export interface IConfigFolderOptions {
|
|
9
|
+
keepKebabCase?: boolean;
|
|
9
10
|
parentNames?: string[];
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
export class Loader {
|
|
14
|
+
public static readConfigSettings(folder: string): IConfigFolderOptions {
|
|
15
|
+
let options: IConfigFolderOptions = {};
|
|
16
|
+
const configFiles = ["_config.json", "config.json"];
|
|
17
|
+
for (const configFile of configFiles) {
|
|
18
|
+
if (fs.existsSync(path.join(folder, configFile))) {
|
|
19
|
+
try {
|
|
20
|
+
options = JSON.parse(
|
|
21
|
+
fs.readFileSync(path.join(folder, configFile), {
|
|
22
|
+
encoding: "utf-8",
|
|
23
|
+
})
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
break;
|
|
27
|
+
} catch (e: any) {
|
|
28
|
+
console.error(
|
|
29
|
+
`Invalid JSON in ${path.join(
|
|
30
|
+
folder,
|
|
31
|
+
configFile
|
|
32
|
+
)} file; skipping configuration`
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return options;
|
|
41
|
+
}
|
|
42
|
+
|
|
13
43
|
// add additional camelCase keys for any kebab-case keys (without overwriting existing keys)
|
|
14
|
-
public static convertKebabToCamelCase(
|
|
44
|
+
public static convertKebabToCamelCase(
|
|
45
|
+
obj: any,
|
|
46
|
+
options: IConfigFolderOptions
|
|
47
|
+
): any {
|
|
15
48
|
const newObj: any = {};
|
|
16
49
|
|
|
17
50
|
for (const key of Object.keys(obj)) {
|
|
51
|
+
const newKey = key.replace(/-([a-zA-Z0-9])/g, function (_, match) {
|
|
52
|
+
return match.toUpperCase();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
if (typeof obj[newKey] !== "undefined" && newKey !== key) {
|
|
56
|
+
console.error(
|
|
57
|
+
`Key ${newKey} already exists in object, but ${key} was also defined, skipping ${key}`
|
|
58
|
+
);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
let newSubObj: any = {};
|
|
18
63
|
if (
|
|
19
64
|
typeof obj[key] === "object" &&
|
|
20
65
|
!Array.isArray(obj[key]) &&
|
|
21
66
|
obj[key] !== null
|
|
22
67
|
) {
|
|
23
|
-
|
|
68
|
+
newSubObj = Loader.convertKebabToCamelCase(obj[key], options);
|
|
24
69
|
} else if (Array.isArray(obj[key])) {
|
|
25
|
-
|
|
70
|
+
newSubObj = obj[key].map((item: any) => {
|
|
26
71
|
if (
|
|
27
72
|
typeof item === "object" &&
|
|
28
73
|
!Array.isArray(item) &&
|
|
29
74
|
item !== null
|
|
30
75
|
) {
|
|
31
|
-
return Loader.convertKebabToCamelCase(item);
|
|
76
|
+
return Loader.convertKebabToCamelCase(item, options);
|
|
32
77
|
} else {
|
|
33
78
|
return item;
|
|
34
79
|
}
|
|
35
80
|
});
|
|
36
81
|
} else {
|
|
37
|
-
|
|
82
|
+
newSubObj = obj[key];
|
|
38
83
|
}
|
|
39
84
|
|
|
40
|
-
|
|
41
|
-
return match.toUpperCase();
|
|
42
|
-
});
|
|
85
|
+
newObj[newKey] = newSubObj;
|
|
43
86
|
|
|
44
|
-
if (newKey !== key) {
|
|
45
|
-
newObj[
|
|
87
|
+
if (options.keepKebabCase === true && newKey !== key) {
|
|
88
|
+
newObj[key] = newSubObj;
|
|
46
89
|
}
|
|
47
90
|
}
|
|
48
91
|
|
|
49
92
|
return newObj;
|
|
50
93
|
}
|
|
51
94
|
|
|
52
|
-
public static loadFile(filePath: string): any {
|
|
95
|
+
public static loadFile(filePath: string, options: IConfigFolderOptions): any {
|
|
53
96
|
if (!fs.existsSync(filePath)) {
|
|
54
97
|
return {};
|
|
55
98
|
}
|
|
@@ -82,53 +125,40 @@ export class Loader {
|
|
|
82
125
|
}
|
|
83
126
|
|
|
84
127
|
if (typeof obj === "object" && obj !== null && !Array.isArray(obj)) {
|
|
85
|
-
obj = Loader.convertKebabToCamelCase(obj);
|
|
128
|
+
obj = Loader.convertKebabToCamelCase(obj, options);
|
|
86
129
|
}
|
|
87
130
|
|
|
88
131
|
return obj;
|
|
89
132
|
}
|
|
90
133
|
|
|
91
|
-
public static
|
|
92
|
-
if (!fs.existsSync(folder)) {
|
|
93
|
-
return {};
|
|
94
|
-
}
|
|
95
|
-
|
|
134
|
+
public static loadRoot(folder: string, options: IConfigFolderOptions): any {
|
|
96
135
|
const baseObj: any = {};
|
|
97
136
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
)
|
|
137
|
+
if (options.parentNames) {
|
|
138
|
+
for (const parentName of options.parentNames) {
|
|
139
|
+
if (parentName === "default") {
|
|
140
|
+
// skip explicitly stated default parents; they're already loaded
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
merge(
|
|
144
|
+
baseObj,
|
|
145
|
+
Loader.load(path.join(folder, "..", parentName), options)
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
107
149
|
|
|
108
|
-
|
|
109
|
-
for (const parentName of folderConfig.parentNames) {
|
|
110
|
-
if (parentName === "default") {
|
|
111
|
-
// skip explicitly stated default parents; they're already loaded
|
|
112
|
-
continue;
|
|
113
|
-
}
|
|
114
|
-
merge(baseObj, Loader.load(path.join(folder, "..", parentName)));
|
|
115
|
-
}
|
|
116
|
-
}
|
|
150
|
+
merge(baseObj, Loader.load(folder, options));
|
|
117
151
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
console.error(
|
|
121
|
-
`Invalid JSON in ${path.join(
|
|
122
|
-
folder,
|
|
123
|
-
configFile
|
|
124
|
-
)} file; skipping configuration`
|
|
125
|
-
);
|
|
152
|
+
return baseObj;
|
|
153
|
+
}
|
|
126
154
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
155
|
+
public static load(folder: string, options: IConfigFolderOptions): any {
|
|
156
|
+
if (!fs.existsSync(folder)) {
|
|
157
|
+
return {};
|
|
130
158
|
}
|
|
131
159
|
|
|
160
|
+
const baseObj: any = {};
|
|
161
|
+
|
|
132
162
|
const contents = fs.readdirSync(folder, {
|
|
133
163
|
encoding: "utf-8",
|
|
134
164
|
withFileTypes: true,
|
|
@@ -137,7 +167,10 @@ export class Loader {
|
|
|
137
167
|
// first load the index file
|
|
138
168
|
for (const content of contents) {
|
|
139
169
|
if (!content.isDirectory() && /^_?index\./.exec(content.name) !== null) {
|
|
140
|
-
merge(
|
|
170
|
+
merge(
|
|
171
|
+
baseObj,
|
|
172
|
+
Loader.loadFile(path.join(folder, content.name), options)
|
|
173
|
+
);
|
|
141
174
|
}
|
|
142
175
|
}
|
|
143
176
|
|
|
@@ -155,7 +188,7 @@ export class Loader {
|
|
|
155
188
|
baseObj[key] = {};
|
|
156
189
|
}
|
|
157
190
|
|
|
158
|
-
const obj = Loader.load(path.join(folder, content.name));
|
|
191
|
+
const obj = Loader.load(path.join(folder, content.name), options);
|
|
159
192
|
|
|
160
193
|
merge(baseObj[key], obj);
|
|
161
194
|
} else {
|
|
@@ -172,7 +205,7 @@ export class Loader {
|
|
|
172
205
|
baseObj[key] = {};
|
|
173
206
|
}
|
|
174
207
|
|
|
175
|
-
const obj = Loader.loadFile(path.join(folder, content.name));
|
|
208
|
+
const obj = Loader.loadFile(path.join(folder, content.name), options);
|
|
176
209
|
|
|
177
210
|
merge(baseObj[key], obj);
|
|
178
211
|
} else {
|