@incanta/config 0.3.0 → 0.4.0
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.map +1 -1
- package/lib/config.js +15 -7
- 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 +68 -40
- package/lib/loader.js.map +1 -1
- package/package.json +1 -1
- package/src/config.ts +31 -8
- package/src/loader.ts +101 -50
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,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
|
@@ -36,18 +36,22 @@ class Config {
|
|
|
36
36
|
(process.env["NODE_CONFIG_DIR"] &&
|
|
37
37
|
path_1.default.relative(process.cwd(), process.env["NODE_CONFIG_DIR"])) ||
|
|
38
38
|
path_1.default.join(process.cwd(), defaultConfigDir);
|
|
39
|
-
const defaultValues = loader_1.Loader.load(path_1.default.join(this.configDir, "default"));
|
|
40
|
-
let envValues = {};
|
|
41
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 = {};
|
|
42
46
|
if (configEnvDir) {
|
|
43
47
|
if (fs_1.default.existsSync(path_1.default.join(this.configDir, configEnvDir))) {
|
|
44
|
-
envValues = loader_1.Loader.
|
|
48
|
+
envValues = loader_1.Loader.loadRoot(path_1.default.join(this.configDir, configEnvDir), configFolderOptions);
|
|
45
49
|
}
|
|
46
50
|
else {
|
|
47
51
|
console.log(`Cannot use environment deployment value of ${configEnvDir} because ${path_1.default.join(this.configDir, configEnvDir)} doesn't exist`);
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
|
-
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"), {});
|
|
51
55
|
(0, lodash_merge_1.default)(this.values, defaultValues, envValues, overrideValues);
|
|
52
56
|
// load the environment variables that are configured to be injected
|
|
53
57
|
// using config-env
|
|
@@ -55,7 +59,7 @@ class Config {
|
|
|
55
59
|
this.envVarConfig = {};
|
|
56
60
|
for (const file of dirContents) {
|
|
57
61
|
if (file.startsWith("environment.")) {
|
|
58
|
-
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), {});
|
|
59
63
|
break;
|
|
60
64
|
}
|
|
61
65
|
}
|
|
@@ -83,10 +87,14 @@ class Config {
|
|
|
83
87
|
}
|
|
84
88
|
let obj = this.values;
|
|
85
89
|
for (const part of keyParts) {
|
|
86
|
-
|
|
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") {
|
|
87
95
|
throw new Error(`Could not find value for key ${keyParts.join(".")}`);
|
|
88
96
|
}
|
|
89
|
-
obj = obj[
|
|
97
|
+
obj = obj[newPart];
|
|
90
98
|
}
|
|
91
99
|
const variableRegex = /\$\{[a-zA-Z\-_0-9./]+\}/g;
|
|
92
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,GAAW,EAAE,CAAC;IAEvB,MAAM,CAAM;IACZ,YAAY,CAAM;IAElB,YAAY,CAAM;IAE1B,YAAmB,OAAwB;QACzC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAEM,IAAI,CAAC,OAAwB;QAClC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,IAAI,gBAAgB,GAAG,QAAQ,CAAC;QAChC,IAAI,gBAAgB,GAAG,SAAS,CAAC;QACjC,IAAI,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,sBAAsB,CAAC,CAAC,EAAE;YACnE,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAC/B,YAAE,CAAC,YAAY,CACb,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,sBAAsB,CAAC,EAChD,OAAO,CACR,CACF,CAAC;YAEF,IAAI,cAAc,CAAC,QAAQ,EAAE;gBAC3B,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,EAAE;oBAC/B,gBAAgB,GAAG,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC;iBAChD;gBAED,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,EAAE;oBAC/B,gBAAgB,GAAG,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC;iBAChD;aACF;SACF;QAED,IAAI,CAAC,SAAS;YACZ,OAAO,EAAE,SAAS;gBAClB,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;oBAC7B,cAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC/D,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAE7C,MAAM,
|
|
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
|
+
variableCasing?: "original" | "camel" | "both";
|
|
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,cAAc;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;IAC/C,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;WAkEQ,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,54 @@ 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 = {};
|
|
36
|
+
const objectOptions = {
|
|
37
|
+
...options,
|
|
38
|
+
};
|
|
39
|
+
if (typeof obj.variableCasing === "string") {
|
|
40
|
+
objectOptions.variableCasing = obj.variableCasing;
|
|
41
|
+
}
|
|
17
42
|
for (const key of Object.keys(obj)) {
|
|
43
|
+
const newKey = key.replace(/-([a-zA-Z0-9])/g, function (_, match) {
|
|
44
|
+
return match.toUpperCase();
|
|
45
|
+
});
|
|
46
|
+
if (typeof obj[newKey] !== "undefined" && newKey !== key) {
|
|
47
|
+
console.error(`Key ${newKey} already exists in object, but ${key} was also defined, skipping ${key}`);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
let newSubObj = {};
|
|
18
51
|
if (typeof obj[key] === "object" &&
|
|
19
52
|
!Array.isArray(obj[key]) &&
|
|
20
53
|
obj[key] !== null) {
|
|
21
|
-
|
|
54
|
+
newSubObj = Loader.convertKebabToCamelCase(obj[key], objectOptions);
|
|
22
55
|
}
|
|
23
56
|
else if (Array.isArray(obj[key])) {
|
|
24
|
-
|
|
57
|
+
newSubObj = obj[key].map((item) => {
|
|
25
58
|
if (typeof item === "object" &&
|
|
26
59
|
!Array.isArray(item) &&
|
|
27
60
|
item !== null) {
|
|
28
|
-
return Loader.convertKebabToCamelCase(item);
|
|
61
|
+
return Loader.convertKebabToCamelCase(item, objectOptions);
|
|
29
62
|
}
|
|
30
63
|
else {
|
|
31
64
|
return item;
|
|
@@ -33,18 +66,23 @@ class Loader {
|
|
|
33
66
|
});
|
|
34
67
|
}
|
|
35
68
|
else {
|
|
36
|
-
|
|
69
|
+
newSubObj = obj[key];
|
|
37
70
|
}
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
71
|
+
const keepCamel = typeof objectOptions.variableCasing === "undefined" ||
|
|
72
|
+
objectOptions.variableCasing === "camel" ||
|
|
73
|
+
objectOptions.variableCasing === "both";
|
|
74
|
+
const keepOriginal = objectOptions.variableCasing === "original" ||
|
|
75
|
+
objectOptions.variableCasing === "both";
|
|
76
|
+
if (keepCamel) {
|
|
77
|
+
newObj[newKey] = newSubObj;
|
|
78
|
+
}
|
|
79
|
+
if (keepOriginal && ((keepCamel && newKey !== key) || !keepCamel)) {
|
|
80
|
+
newObj[key] = newSubObj;
|
|
43
81
|
}
|
|
44
82
|
}
|
|
45
83
|
return newObj;
|
|
46
84
|
}
|
|
47
|
-
static loadFile(filePath) {
|
|
85
|
+
static loadFile(filePath, options) {
|
|
48
86
|
if (!fs_1.default.existsSync(filePath)) {
|
|
49
87
|
return {};
|
|
50
88
|
}
|
|
@@ -75,39 +113,29 @@ class Loader {
|
|
|
75
113
|
obj = {};
|
|
76
114
|
}
|
|
77
115
|
if (typeof obj === "object" && obj !== null && !Array.isArray(obj)) {
|
|
78
|
-
obj = Loader.convertKebabToCamelCase(obj);
|
|
116
|
+
obj = Loader.convertKebabToCamelCase(obj, options);
|
|
79
117
|
}
|
|
80
118
|
return obj;
|
|
81
119
|
}
|
|
82
|
-
static
|
|
83
|
-
if (!fs_1.default.existsSync(folder)) {
|
|
84
|
-
return {};
|
|
85
|
-
}
|
|
120
|
+
static loadRoot(folder, options) {
|
|
86
121
|
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;
|
|
122
|
+
if (options.parentNames) {
|
|
123
|
+
for (const parentName of options.parentNames) {
|
|
124
|
+
if (parentName === "default") {
|
|
125
|
+
// skip explicitly stated default parents; they're already loaded
|
|
126
|
+
continue;
|
|
108
127
|
}
|
|
128
|
+
(0, lodash_merge_1.default)(baseObj, Loader.load(path_1.default.join(folder, "..", parentName), options));
|
|
109
129
|
}
|
|
110
130
|
}
|
|
131
|
+
(0, lodash_merge_1.default)(baseObj, Loader.load(folder, options));
|
|
132
|
+
return baseObj;
|
|
133
|
+
}
|
|
134
|
+
static load(folder, options) {
|
|
135
|
+
if (!fs_1.default.existsSync(folder)) {
|
|
136
|
+
return {};
|
|
137
|
+
}
|
|
138
|
+
const baseObj = {};
|
|
111
139
|
const contents = fs_1.default.readdirSync(folder, {
|
|
112
140
|
encoding: "utf-8",
|
|
113
141
|
withFileTypes: true,
|
|
@@ -115,7 +143,7 @@ class Loader {
|
|
|
115
143
|
// first load the index file
|
|
116
144
|
for (const content of contents) {
|
|
117
145
|
if (!content.isDirectory() && /^_?index\./.exec(content.name) !== null) {
|
|
118
|
-
(0, lodash_merge_1.default)(baseObj, Loader.loadFile(path_1.default.join(folder, content.name)));
|
|
146
|
+
(0, lodash_merge_1.default)(baseObj, Loader.loadFile(path_1.default.join(folder, content.name), options));
|
|
119
147
|
}
|
|
120
148
|
}
|
|
121
149
|
// then load other files
|
|
@@ -129,7 +157,7 @@ class Loader {
|
|
|
129
157
|
if (typeof baseObj[key] === "undefined") {
|
|
130
158
|
baseObj[key] = {};
|
|
131
159
|
}
|
|
132
|
-
const obj = Loader.load(path_1.default.join(folder, content.name));
|
|
160
|
+
const obj = Loader.load(path_1.default.join(folder, content.name), options);
|
|
133
161
|
(0, lodash_merge_1.default)(baseObj[key], obj);
|
|
134
162
|
}
|
|
135
163
|
else {
|
|
@@ -143,7 +171,7 @@ class Loader {
|
|
|
143
171
|
if (typeof baseObj[key] === "undefined") {
|
|
144
172
|
baseObj[key] = {};
|
|
145
173
|
}
|
|
146
|
-
const obj = Loader.loadFile(path_1.default.join(folder, content.name));
|
|
174
|
+
const obj = Loader.loadFile(path_1.default.join(folder, content.name), options);
|
|
147
175
|
(0, lodash_merge_1.default)(baseObj[key], obj);
|
|
148
176
|
}
|
|
149
177
|
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":"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"}
|
package/package.json
CHANGED
package/src/config.ts
CHANGED
|
@@ -51,14 +51,28 @@ export default class Config {
|
|
|
51
51
|
path.relative(process.cwd(), process.env["NODE_CONFIG_DIR"])) ||
|
|
52
52
|
path.join(process.cwd(), defaultConfigDir);
|
|
53
53
|
|
|
54
|
-
const defaultValues = Loader.load(path.join(this.configDir, "default"));
|
|
55
|
-
|
|
56
|
-
let envValues: any = {};
|
|
57
54
|
const configEnvDir =
|
|
58
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 = {};
|
|
59
70
|
if (configEnvDir) {
|
|
60
71
|
if (fs.existsSync(path.join(this.configDir, configEnvDir))) {
|
|
61
|
-
envValues = Loader.
|
|
72
|
+
envValues = Loader.loadRoot(
|
|
73
|
+
path.join(this.configDir, configEnvDir),
|
|
74
|
+
configFolderOptions
|
|
75
|
+
);
|
|
62
76
|
} else {
|
|
63
77
|
console.log(
|
|
64
78
|
`Cannot use environment deployment value of ${configEnvDir} because ${path.join(
|
|
@@ -70,7 +84,8 @@ export default class Config {
|
|
|
70
84
|
}
|
|
71
85
|
|
|
72
86
|
const overrideValues = Loader.loadFile(
|
|
73
|
-
path.join(this.configDir, "override.json")
|
|
87
|
+
path.join(this.configDir, "override.json"),
|
|
88
|
+
{}
|
|
74
89
|
);
|
|
75
90
|
|
|
76
91
|
merge(this.values, defaultValues, envValues, overrideValues);
|
|
@@ -81,7 +96,10 @@ export default class Config {
|
|
|
81
96
|
this.envVarConfig = {};
|
|
82
97
|
for (const file of dirContents) {
|
|
83
98
|
if (file.startsWith("environment.")) {
|
|
84
|
-
this.envVarConfig = Loader.loadFile(
|
|
99
|
+
this.envVarConfig = Loader.loadFile(
|
|
100
|
+
path.join(this.configDir, file),
|
|
101
|
+
{}
|
|
102
|
+
);
|
|
85
103
|
break;
|
|
86
104
|
}
|
|
87
105
|
}
|
|
@@ -119,11 +137,16 @@ export default class Config {
|
|
|
119
137
|
let obj = this.values;
|
|
120
138
|
|
|
121
139
|
for (const part of keyParts) {
|
|
122
|
-
|
|
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") {
|
|
123
146
|
throw new Error(`Could not find value for key ${keyParts.join(".")}`);
|
|
124
147
|
}
|
|
125
148
|
|
|
126
|
-
obj = obj[
|
|
149
|
+
obj = obj[newPart];
|
|
127
150
|
}
|
|
128
151
|
|
|
129
152
|
const variableRegex = /\$\{[a-zA-Z\-_0-9./]+\}/g;
|
package/src/loader.ts
CHANGED
|
@@ -5,51 +5,112 @@ 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
|
+
variableCasing?: "original" | "camel" | "both";
|
|
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
|
|
|
50
|
+
const objectOptions: IConfigFolderOptions = {
|
|
51
|
+
...options,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
if (typeof obj.variableCasing === "string") {
|
|
55
|
+
objectOptions.variableCasing = obj.variableCasing;
|
|
56
|
+
}
|
|
57
|
+
|
|
17
58
|
for (const key of Object.keys(obj)) {
|
|
59
|
+
const newKey = key.replace(/-([a-zA-Z0-9])/g, function (_, match) {
|
|
60
|
+
return match.toUpperCase();
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
if (typeof obj[newKey] !== "undefined" && newKey !== key) {
|
|
64
|
+
console.error(
|
|
65
|
+
`Key ${newKey} already exists in object, but ${key} was also defined, skipping ${key}`
|
|
66
|
+
);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
let newSubObj: any = {};
|
|
18
71
|
if (
|
|
19
72
|
typeof obj[key] === "object" &&
|
|
20
73
|
!Array.isArray(obj[key]) &&
|
|
21
74
|
obj[key] !== null
|
|
22
75
|
) {
|
|
23
|
-
|
|
76
|
+
newSubObj = Loader.convertKebabToCamelCase(obj[key], objectOptions);
|
|
24
77
|
} else if (Array.isArray(obj[key])) {
|
|
25
|
-
|
|
78
|
+
newSubObj = obj[key].map((item: any) => {
|
|
26
79
|
if (
|
|
27
80
|
typeof item === "object" &&
|
|
28
81
|
!Array.isArray(item) &&
|
|
29
82
|
item !== null
|
|
30
83
|
) {
|
|
31
|
-
return Loader.convertKebabToCamelCase(item);
|
|
84
|
+
return Loader.convertKebabToCamelCase(item, objectOptions);
|
|
32
85
|
} else {
|
|
33
86
|
return item;
|
|
34
87
|
}
|
|
35
88
|
});
|
|
36
89
|
} else {
|
|
37
|
-
|
|
90
|
+
newSubObj = obj[key];
|
|
38
91
|
}
|
|
39
92
|
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
93
|
+
const keepCamel =
|
|
94
|
+
typeof objectOptions.variableCasing === "undefined" ||
|
|
95
|
+
objectOptions.variableCasing === "camel" ||
|
|
96
|
+
objectOptions.variableCasing === "both";
|
|
97
|
+
const keepOriginal =
|
|
98
|
+
objectOptions.variableCasing === "original" ||
|
|
99
|
+
objectOptions.variableCasing === "both";
|
|
100
|
+
|
|
101
|
+
if (keepCamel) {
|
|
102
|
+
newObj[newKey] = newSubObj;
|
|
103
|
+
}
|
|
43
104
|
|
|
44
|
-
if (newKey !== key) {
|
|
45
|
-
newObj[
|
|
105
|
+
if (keepOriginal && ((keepCamel && newKey !== key) || !keepCamel)) {
|
|
106
|
+
newObj[key] = newSubObj;
|
|
46
107
|
}
|
|
47
108
|
}
|
|
48
109
|
|
|
49
110
|
return newObj;
|
|
50
111
|
}
|
|
51
112
|
|
|
52
|
-
public static loadFile(filePath: string): any {
|
|
113
|
+
public static loadFile(filePath: string, options: IConfigFolderOptions): any {
|
|
53
114
|
if (!fs.existsSync(filePath)) {
|
|
54
115
|
return {};
|
|
55
116
|
}
|
|
@@ -82,53 +143,40 @@ export class Loader {
|
|
|
82
143
|
}
|
|
83
144
|
|
|
84
145
|
if (typeof obj === "object" && obj !== null && !Array.isArray(obj)) {
|
|
85
|
-
obj = Loader.convertKebabToCamelCase(obj);
|
|
146
|
+
obj = Loader.convertKebabToCamelCase(obj, options);
|
|
86
147
|
}
|
|
87
148
|
|
|
88
149
|
return obj;
|
|
89
150
|
}
|
|
90
151
|
|
|
91
|
-
public static
|
|
92
|
-
if (!fs.existsSync(folder)) {
|
|
93
|
-
return {};
|
|
94
|
-
}
|
|
95
|
-
|
|
152
|
+
public static loadRoot(folder: string, options: IConfigFolderOptions): any {
|
|
96
153
|
const baseObj: any = {};
|
|
97
154
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
)
|
|
155
|
+
if (options.parentNames) {
|
|
156
|
+
for (const parentName of options.parentNames) {
|
|
157
|
+
if (parentName === "default") {
|
|
158
|
+
// skip explicitly stated default parents; they're already loaded
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
merge(
|
|
162
|
+
baseObj,
|
|
163
|
+
Loader.load(path.join(folder, "..", parentName), options)
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
107
167
|
|
|
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
|
-
}
|
|
168
|
+
merge(baseObj, Loader.load(folder, options));
|
|
117
169
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
console.error(
|
|
121
|
-
`Invalid JSON in ${path.join(
|
|
122
|
-
folder,
|
|
123
|
-
configFile
|
|
124
|
-
)} file; skipping configuration`
|
|
125
|
-
);
|
|
170
|
+
return baseObj;
|
|
171
|
+
}
|
|
126
172
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
173
|
+
public static load(folder: string, options: IConfigFolderOptions): any {
|
|
174
|
+
if (!fs.existsSync(folder)) {
|
|
175
|
+
return {};
|
|
130
176
|
}
|
|
131
177
|
|
|
178
|
+
const baseObj: any = {};
|
|
179
|
+
|
|
132
180
|
const contents = fs.readdirSync(folder, {
|
|
133
181
|
encoding: "utf-8",
|
|
134
182
|
withFileTypes: true,
|
|
@@ -137,7 +185,10 @@ export class Loader {
|
|
|
137
185
|
// first load the index file
|
|
138
186
|
for (const content of contents) {
|
|
139
187
|
if (!content.isDirectory() && /^_?index\./.exec(content.name) !== null) {
|
|
140
|
-
merge(
|
|
188
|
+
merge(
|
|
189
|
+
baseObj,
|
|
190
|
+
Loader.loadFile(path.join(folder, content.name), options)
|
|
191
|
+
);
|
|
141
192
|
}
|
|
142
193
|
}
|
|
143
194
|
|
|
@@ -155,7 +206,7 @@ export class Loader {
|
|
|
155
206
|
baseObj[key] = {};
|
|
156
207
|
}
|
|
157
208
|
|
|
158
|
-
const obj = Loader.load(path.join(folder, content.name));
|
|
209
|
+
const obj = Loader.load(path.join(folder, content.name), options);
|
|
159
210
|
|
|
160
211
|
merge(baseObj[key], obj);
|
|
161
212
|
} else {
|
|
@@ -172,7 +223,7 @@ export class Loader {
|
|
|
172
223
|
baseObj[key] = {};
|
|
173
224
|
}
|
|
174
225
|
|
|
175
|
-
const obj = Loader.loadFile(path.join(folder, content.name));
|
|
226
|
+
const obj = Loader.loadFile(path.join(folder, content.name), options);
|
|
176
227
|
|
|
177
228
|
merge(baseObj[key], obj);
|
|
178
229
|
} else {
|