@incanta/config 0.4.0 → 0.4.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 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,8 @@ 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
+ normalizeObject(obj: any, currentPath: string[]): any;
16
19
  tryGet<T>(key: string): T | null;
17
20
  getJson(): any;
18
21
  set<T>(key: string, value: T): void;
@@ -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;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"}
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,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.values;
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,71 @@ 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 replaceValue = (value) => {
101
- const regexResult = value.matchAll(variableRegex);
102
- let result = value;
103
- for (const match of regexResult) {
104
- let keyToReplace = match[0].slice(2, match[0].length - 1);
105
- if (keyToReplace.startsWith("./")) {
106
- // convert relative path to absolute path
107
- keyToReplace = `${keyParts
108
- .slice(0, keyParts.length - 1)
109
- .join(".")}.${keyToReplace.slice(2)}`;
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
- const newValue = this.tryGet(keyToReplace);
112
- if (newValue !== null) {
113
- result = result.replace(match[0], `${newValue}`);
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
- else if (typeof obj === "object") {
123
- // walk the object and replace all strings with the value from the config
124
- const walkObject = (curObj) => {
125
- for (const property of Object.keys(curObj)) {
126
- const value = curObj[property];
127
- if (typeof value === "string") {
128
- curObj[property] = replaceValue(value);
129
- }
130
- else if (typeof value === "object") {
131
- if (value === null) {
132
- curObj[property] = null;
133
- }
134
- else {
135
- walkObject(value);
136
- }
137
- }
139
+ return result;
140
+ }
141
+ normalizeObject(obj, currentPath) {
142
+ if (typeof obj !== "object" || obj === null) {
143
+ return obj;
144
+ }
145
+ const newObj = (0, lodash_merge_1.default)({}, obj);
146
+ for (const property of Object.keys(newObj)) {
147
+ const value = newObj[property];
148
+ if (typeof value === "string") {
149
+ newObj[property] = this.normalizeString(value, currentPath);
150
+ }
151
+ else if (typeof value === "object") {
152
+ if (value === null) {
153
+ newObj[property] = null;
154
+ }
155
+ else if (Array.isArray(value)) {
156
+ continue;
157
+ }
158
+ else {
159
+ newObj[property] = this.normalizeObject(value, [
160
+ ...currentPath,
161
+ property,
162
+ ]);
138
163
  }
139
- };
140
- if (obj !== null) {
141
- walkObject(obj);
142
164
  }
143
165
  }
144
- return obj;
166
+ return newObj;
145
167
  }
146
168
  tryGet(key) {
147
169
  try {
@@ -153,7 +175,8 @@ class Config {
153
175
  }
154
176
  }
155
177
  getJson() {
156
- return this.values;
178
+ const values = (0, lodash_merge_1.default)({}, this.normalizedValues);
179
+ return values;
157
180
  }
158
181
  set(key, value) {
159
182
  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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@incanta/config",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "main": "lib/index.js",
5
5
  "exports": {
6
6
  ".": "./lib/index.js",
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.values;
140
+ let obj = merge({}, this.normalizedValues);
138
141
 
139
142
  for (const part of keyParts) {
140
143
  // convert to camelCase first
@@ -149,55 +152,81 @@ 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
+ }
153
175
 
154
- const replaceValue = (value: string): string => {
155
- const regexResult = value.matchAll(variableRegex);
156
- let result = value;
157
-
158
- for (const match of regexResult) {
159
- let keyToReplace = match[0].slice(2, match[0].length - 1);
160
- if (keyToReplace.startsWith("./")) {
161
- // convert relative path to absolute path
162
- keyToReplace = `${keyParts
163
- .slice(0, keyParts.length - 1)
164
- .join(".")}.${keyToReplace.slice(2)}`;
165
- }
166
- const newValue = this.tryGet<string | number | boolean>(keyToReplace);
167
- if (newValue !== null) {
168
- result = result.replace(match[0], `${newValue}`);
176
+ let obj = merge({}, this.values);
177
+
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(".")}`);
169
187
  }
188
+
189
+ obj = obj[newPart];
170
190
  }
171
191
 
172
- return result;
173
- };
174
-
175
- // replace all ${value} with the value from the config
176
- if (typeof obj === "string") {
177
- obj = replaceValue(obj);
178
- } else if (typeof obj === "object") {
179
- // walk the object and replace all strings with the value from the config
180
- const walkObject = (curObj: any): void => {
181
- for (const property of Object.keys(curObj)) {
182
- const value = curObj[property];
183
- if (typeof value === "string") {
184
- curObj[property] = replaceValue(value);
185
- } else if (typeof value === "object") {
186
- if (value === null) {
187
- curObj[property] = null;
188
- } else {
189
- walkObject(value);
190
- }
191
- }
192
+ if (obj !== null) {
193
+ if (typeof obj === "string" && obj.match(variableRegex) !== null) {
194
+ obj = this.normalizeString(obj, keyParts.slice(0, -1));
192
195
  }
193
- };
194
196
 
195
- if (obj !== null) {
196
- walkObject(obj);
197
+ result = result.replace(match[0], `${obj}`);
197
198
  }
198
199
  }
199
200
 
200
- return obj as T;
201
+ return result;
202
+ }
203
+
204
+ public normalizeObject(obj: any, currentPath: string[]): any {
205
+ if (typeof obj !== "object" || obj === null) {
206
+ return obj;
207
+ }
208
+
209
+ const newObj = merge({}, obj);
210
+
211
+ for (const property of Object.keys(newObj)) {
212
+ const value = newObj[property];
213
+ if (typeof value === "string") {
214
+ newObj[property] = this.normalizeString(value, currentPath);
215
+ } else if (typeof value === "object") {
216
+ if (value === null) {
217
+ newObj[property] = null;
218
+ } else if (Array.isArray(value)) {
219
+ continue;
220
+ } else {
221
+ newObj[property] = this.normalizeObject(value, [
222
+ ...currentPath,
223
+ property,
224
+ ]);
225
+ }
226
+ }
227
+ }
228
+
229
+ return newObj;
201
230
  }
202
231
 
203
232
  public tryGet<T>(key: string): T | null {
@@ -210,7 +239,9 @@ export default class Config {
210
239
  }
211
240
 
212
241
  public getJson(): any {
213
- return this.values;
242
+ const values = merge({}, this.normalizedValues);
243
+
244
+ return values;
214
245
  }
215
246
 
216
247
  public set<T>(key: string, value: T): void {