@mayhem93/nexxus-core-lib 0.0.1 → 0.0.3
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/dist-cjs/common/BuiltinSchemas.js +24 -5
- package/dist-cjs/common/BuiltinSchemas.js.map +1 -1
- package/dist-cjs/common/FilterQuery.js +5 -18
- package/dist-cjs/common/FilterQuery.js.map +1 -1
- package/dist-cjs/common/InferModel.js +3 -0
- package/dist-cjs/common/InferModel.js.map +1 -0
- package/dist-cjs/common/JsonPatch.js +42 -225
- package/dist-cjs/common/JsonPatch.js.map +1 -1
- package/dist-cjs/common/SchemaValidator.js +100 -29
- package/dist-cjs/common/SchemaValidator.js.map +1 -1
- package/dist-cjs/index.js +4 -0
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/lib/BaseService.js +6 -6
- package/dist-cjs/lib/BaseService.js.map +1 -1
- package/dist-cjs/lib/ConfigManager.js +56 -25
- package/dist-cjs/lib/ConfigManager.js.map +1 -1
- package/dist-cjs/lib/ConfigProvider.js +14 -1
- package/dist-cjs/lib/ConfigProvider.js.map +1 -1
- package/dist-cjs/lib/Exceptions.js +22 -4
- package/dist-cjs/lib/Exceptions.js.map +1 -1
- package/dist-cjs/lib/Logger.js +138 -65
- package/dist-cjs/lib/Logger.js.map +1 -1
- package/dist-cjs/lib/ServiceResolver.js +57 -0
- package/dist-cjs/lib/ServiceResolver.js.map +1 -0
- package/dist-cjs/models/AppModel.js +17 -3
- package/dist-cjs/models/AppModel.js.map +1 -1
- package/dist-cjs/models/Application.js +51 -12
- package/dist-cjs/models/Application.js.map +1 -1
- package/dist-cjs/models/BaseModel.js.map +1 -1
- package/dist-cjs/models/BuiltinModel.js +8 -0
- package/dist-cjs/models/BuiltinModel.js.map +1 -0
- package/dist-cjs/models/User.js +12 -3
- package/dist-cjs/models/User.js.map +1 -1
- package/dist-esm/common/BuiltinSchemas.js +23 -4
- package/dist-esm/common/BuiltinSchemas.js.map +1 -1
- package/dist-esm/common/FilterQuery.js +6 -19
- package/dist-esm/common/FilterQuery.js.map +1 -1
- package/dist-esm/common/InferModel.js +2 -0
- package/dist-esm/common/InferModel.js.map +1 -0
- package/dist-esm/common/JsonPatch.js +44 -227
- package/dist-esm/common/JsonPatch.js.map +1 -1
- package/dist-esm/common/SchemaValidator.js +100 -29
- package/dist-esm/common/SchemaValidator.js.map +1 -1
- package/dist-esm/index.js +4 -0
- package/dist-esm/index.js.map +1 -1
- package/dist-esm/lib/BaseService.js +8 -8
- package/dist-esm/lib/BaseService.js.map +1 -1
- package/dist-esm/lib/ConfigManager.js +56 -25
- package/dist-esm/lib/ConfigManager.js.map +1 -1
- package/dist-esm/lib/ConfigProvider.js +14 -1
- package/dist-esm/lib/ConfigProvider.js.map +1 -1
- package/dist-esm/lib/Exceptions.js +20 -3
- package/dist-esm/lib/Exceptions.js.map +1 -1
- package/dist-esm/lib/Logger.js +139 -66
- package/dist-esm/lib/Logger.js.map +1 -1
- package/dist-esm/lib/ServiceResolver.js +52 -0
- package/dist-esm/lib/ServiceResolver.js.map +1 -0
- package/dist-esm/models/AppModel.js +17 -3
- package/dist-esm/models/AppModel.js.map +1 -1
- package/dist-esm/models/Application.js +52 -13
- package/dist-esm/models/Application.js.map +1 -1
- package/dist-esm/models/BaseModel.js.map +1 -1
- package/dist-esm/models/BuiltinModel.js +4 -0
- package/dist-esm/models/BuiltinModel.js.map +1 -0
- package/dist-esm/models/User.js +11 -2
- package/dist-esm/models/User.js.map +1 -1
- package/dist-types/common/BuiltinSchemas.d.ts +59 -5
- package/dist-types/common/FilterQuery.d.ts +3 -11
- package/dist-types/common/InferModel.d.ts +29 -0
- package/dist-types/common/JsonPatch.d.ts +4 -45
- package/dist-types/common/ModelTypes.d.ts +1 -0
- package/dist-types/common/QueuePayloads.d.ts +48 -26
- package/dist-types/common/SchemaValidator.d.ts +42 -2
- package/dist-types/index.d.ts +4 -0
- package/dist-types/lib/BaseService.d.ts +51 -1
- package/dist-types/lib/ConfigManager.d.ts +50 -13
- package/dist-types/lib/ConfigProvider.d.ts +6 -0
- package/dist-types/lib/Exceptions.d.ts +15 -2
- package/dist-types/lib/Logger.d.ts +84 -14
- package/dist-types/lib/ServiceResolver.d.ts +23 -0
- package/dist-types/models/AppModel.d.ts +31 -5
- package/dist-types/models/Application.d.ts +36 -8
- package/dist-types/models/BaseModel.d.ts +14 -12
- package/dist-types/models/BuiltinModel.d.ts +3 -0
- package/dist-types/models/User.d.ts +15 -13
- package/package.json +4 -4
- package/src/schemas/winston-logger.schema.json +51 -6
|
@@ -1,40 +1,111 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.NexxusSchemaValidator = void 0;
|
|
4
|
+
const Exceptions_1 = require("../lib/Exceptions");
|
|
4
5
|
class NexxusSchemaValidator {
|
|
5
|
-
static
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
static validateAgainstSchema(data, modelDef) {
|
|
7
|
+
if (!data || typeof data !== 'object' || Array.isArray(data)) {
|
|
8
|
+
throw new Exceptions_1.InvalidSchemaDataException(`Schema validation: input must be a non-null object`);
|
|
9
|
+
}
|
|
10
|
+
const result = { ...data };
|
|
11
|
+
for (const [fieldName, value] of Object.entries(data)) {
|
|
12
|
+
if (fieldName === 'version') {
|
|
13
|
+
throw new Exceptions_1.InvalidSchemaDataException(`Field "version" is a system-managed Nexxus field and cannot be set by user input`);
|
|
14
|
+
}
|
|
15
|
+
const fieldDef = modelDef[fieldName];
|
|
9
16
|
if (!fieldDef) {
|
|
10
|
-
|
|
17
|
+
continue;
|
|
11
18
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
19
|
+
result[fieldName] = NexxusSchemaValidator.validateValue(value, fieldDef, fieldName);
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
static validateValue(value, fieldDef, path) {
|
|
24
|
+
switch (fieldDef.type) {
|
|
25
|
+
case 'string':
|
|
26
|
+
return NexxusSchemaValidator.validateString(value, path);
|
|
27
|
+
case 'number':
|
|
28
|
+
return NexxusSchemaValidator.validateNumber(value, path);
|
|
29
|
+
case 'boolean':
|
|
30
|
+
return NexxusSchemaValidator.validateBoolean(value, path);
|
|
31
|
+
case 'date':
|
|
32
|
+
return NexxusSchemaValidator.validateDate(value, path);
|
|
33
|
+
case 'object':
|
|
34
|
+
return NexxusSchemaValidator.validateObject(value, fieldDef, path);
|
|
35
|
+
case 'array':
|
|
36
|
+
return NexxusSchemaValidator.validateArray(value, fieldDef, path);
|
|
37
|
+
default:
|
|
38
|
+
throw new Exceptions_1.InvalidSchemaDataException(`Unknown field type at path "${path}"`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
static validateString(value, path) {
|
|
42
|
+
if (typeof value !== 'string') {
|
|
43
|
+
throw new Exceptions_1.InvalidSchemaDataException(`Expected string at path "${path}", got ${typeof value}`);
|
|
44
|
+
}
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
static validateNumber(value, path) {
|
|
48
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
49
|
+
throw new Exceptions_1.InvalidSchemaDataException(`Expected number at path "${path}", got ${typeof value}`);
|
|
50
|
+
}
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
static validateBoolean(value, path) {
|
|
54
|
+
if (typeof value !== 'boolean') {
|
|
55
|
+
throw new Exceptions_1.InvalidSchemaDataException(`Expected boolean at path "${path}", got ${typeof value}`);
|
|
56
|
+
}
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
static validateDate(value, path) {
|
|
60
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
if (typeof value === 'string') {
|
|
64
|
+
const asNum = Number(value);
|
|
65
|
+
if (Number.isFinite(asNum)) {
|
|
66
|
+
return asNum;
|
|
67
|
+
}
|
|
68
|
+
const ts = new Date(value).getTime();
|
|
69
|
+
if (Number.isFinite(ts)) {
|
|
70
|
+
return Math.floor(ts);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
throw new Exceptions_1.InvalidSchemaDataException(`Expected valid date at path "${path}", got "${String(value)}"`);
|
|
74
|
+
}
|
|
75
|
+
static validateObject(value, fieldDef, path) {
|
|
76
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
77
|
+
throw new Exceptions_1.InvalidSchemaDataException(`Expected object at path "${path}"`);
|
|
78
|
+
}
|
|
79
|
+
const input = value;
|
|
80
|
+
const result = { ...input };
|
|
81
|
+
for (const [key, propDef] of Object.entries(fieldDef.properties)) {
|
|
82
|
+
if (key in input) {
|
|
83
|
+
result[key] = NexxusSchemaValidator.validateValue(input[key], propDef, `${path}.${key}`);
|
|
35
84
|
}
|
|
36
85
|
}
|
|
37
|
-
return
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
static validateArray(value, fieldDef, path) {
|
|
89
|
+
if (!Array.isArray(value)) {
|
|
90
|
+
throw new Exceptions_1.InvalidSchemaDataException(`Expected array at path "${path}"`);
|
|
91
|
+
}
|
|
92
|
+
return value.map((element, index) => {
|
|
93
|
+
const elementPath = `${path}[${index}]`;
|
|
94
|
+
if (fieldDef.arrayType === 'object') {
|
|
95
|
+
if (!fieldDef.properties) {
|
|
96
|
+
throw new Exceptions_1.InvalidSchemaDataException(`Array of objects at "${path}" is missing properties definition`);
|
|
97
|
+
}
|
|
98
|
+
const objFieldDef = {
|
|
99
|
+
type: 'object',
|
|
100
|
+
properties: fieldDef.properties,
|
|
101
|
+
};
|
|
102
|
+
return NexxusSchemaValidator.validateObject(element, objFieldDef, elementPath);
|
|
103
|
+
}
|
|
104
|
+
const primitiveFieldDef = {
|
|
105
|
+
type: fieldDef.arrayType,
|
|
106
|
+
};
|
|
107
|
+
return NexxusSchemaValidator.validateValue(element, primitiveFieldDef, elementPath);
|
|
108
|
+
});
|
|
38
109
|
}
|
|
39
110
|
}
|
|
40
111
|
exports.NexxusSchemaValidator = NexxusSchemaValidator;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaValidator.js","sourceRoot":"","sources":["../../src/common/SchemaValidator.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"SchemaValidator.js","sourceRoot":"","sources":["../../src/common/SchemaValidator.ts"],"names":[],"mappings":"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"}
|
package/dist-cjs/index.js
CHANGED
|
@@ -7,10 +7,14 @@ tslib_1.__exportStar(require("./lib/ConfigProvider"), exports);
|
|
|
7
7
|
tslib_1.__exportStar(require("./lib/ConfigManager"), exports);
|
|
8
8
|
tslib_1.__exportStar(require("./lib/BaseService"), exports);
|
|
9
9
|
tslib_1.__exportStar(require("./lib/Logger"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./lib/ServiceResolver"), exports);
|
|
10
11
|
tslib_1.__exportStar(require("./common/QueuePayloads"), exports);
|
|
11
12
|
tslib_1.__exportStar(require("./common/JsonPatch"), exports);
|
|
12
13
|
tslib_1.__exportStar(require("./common/FilterQuery"), exports);
|
|
14
|
+
tslib_1.__exportStar(require("./common/InferModel"), exports);
|
|
15
|
+
tslib_1.__exportStar(require("./common/SchemaValidator"), exports);
|
|
13
16
|
tslib_1.__exportStar(require("./models/BaseModel"), exports);
|
|
17
|
+
tslib_1.__exportStar(require("./models/BuiltinModel"), exports);
|
|
14
18
|
tslib_1.__exportStar(require("./common/BuiltinSchemas"), exports);
|
|
15
19
|
tslib_1.__exportStar(require("./models/AppModel"), exports);
|
|
16
20
|
tslib_1.__exportStar(require("./models/Application"), exports);
|
package/dist-cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,2DAAiC;AACjC,+DAAqC;AACrC,8DAAoC;AACpC,4DAAkC;AAClC,uDAA6B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAAA,2DAAiC;AACjC,+DAAqC;AACrC,8DAAoC;AACpC,4DAAkC;AAClC,uDAA6B;AAC7B,gEAAsC;AAEtC,iEAAuC;AACvC,6DAAmC;AACnC,+DAAqC;AACrC,8DAAoC;AACpC,mEAAyC;AACzC,6DAAmC;AACnC,gEAAsC;AACtC,kEAAwC;AACxC,4DAAkC;AAClC,+DAAqC;AACrC,wDAA8B;AAEjB,QAAA,gBAAgB,GAAG,KAAK,CAAC;AACzB,QAAA,gBAAgB,GAAG,KAAK,CAAC"}
|
|
@@ -37,6 +37,7 @@ class NexxusBaseService extends TypedEventEmitter {
|
|
|
37
37
|
config;
|
|
38
38
|
static envVars;
|
|
39
39
|
static cliArgs;
|
|
40
|
+
static configRootKey;
|
|
40
41
|
static schemaPath;
|
|
41
42
|
static schemaContents;
|
|
42
43
|
constructor(config) {
|
|
@@ -59,18 +60,17 @@ class NexxusBaseService extends TypedEventEmitter {
|
|
|
59
60
|
if (!this.schemaPath) {
|
|
60
61
|
throw new Exceptions_1.FatalErrorException(`Schema path not set for ${this.name} class.`);
|
|
61
62
|
}
|
|
63
|
+
if (!this.configRootKey) {
|
|
64
|
+
throw new Exceptions_1.FatalErrorException(`configRootKey not set for ${this.name} class. ` +
|
|
65
|
+
'This static must declare the top-level key under which this service\'s config sits in the merged root config.');
|
|
66
|
+
}
|
|
62
67
|
if (!this.schemaContents) {
|
|
63
68
|
this.schemaContents = fs.readFileSync(this.schemaPath, 'utf-8');
|
|
64
69
|
}
|
|
65
70
|
const definition = JSON.parse(this.schemaContents);
|
|
66
|
-
if (!definition.$comment) {
|
|
67
|
-
throw new Exceptions_1.FatalErrorException(`Schema for ${this.name} is missing $comment field. ` +
|
|
68
|
-
'This field is required to specify where in the main config this specific configuration ' +
|
|
69
|
-
'should be placed.');
|
|
70
|
-
}
|
|
71
71
|
return {
|
|
72
72
|
name: this.name,
|
|
73
|
-
where:
|
|
73
|
+
where: this.configRootKey,
|
|
74
74
|
definition,
|
|
75
75
|
required: true
|
|
76
76
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseService.js","sourceRoot":"","sources":["../../src/lib/BaseService.ts"],"names":[],"mappings":";;;;AAOA,6CAAmD;AAKnD,oDAA8B;AAC9B,6CAA2C;
|
|
1
|
+
{"version":3,"file":"BaseService.js","sourceRoot":"","sources":["../../src/lib/BaseService.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,17 +10,22 @@ const deepmerge_1 = tslib_1.__importDefault(require("deepmerge"));
|
|
|
10
10
|
const fs = tslib_1.__importStar(require("node:fs"));
|
|
11
11
|
const path = tslib_1.__importStar(require("node:path"));
|
|
12
12
|
class NexxusConfigManager {
|
|
13
|
-
static CONF_FILE_NAME =
|
|
13
|
+
static CONF_FILE_NAME = 'nexxus.conf.json';
|
|
14
|
+
static DEFAULT_CONF_PATH = '/etc/nexxus';
|
|
14
15
|
jsonSchema;
|
|
15
16
|
envVarsSpecs = [];
|
|
16
17
|
cliArgsSpecs = [];
|
|
17
18
|
data = {};
|
|
18
19
|
configProviders = [];
|
|
19
20
|
customProviders = [];
|
|
20
|
-
|
|
21
|
+
registeredServices = new Set();
|
|
22
|
+
dataInitialized = false;
|
|
23
|
+
hasNewRegistrations = false;
|
|
24
|
+
constructor(configFilePath) {
|
|
21
25
|
const schemaPath = path.join(__dirname, "../../src/schemas/root.schema.json");
|
|
26
|
+
const resolvedConfPath = path.resolve(configFilePath || process.env.NXX_CONF_PATH || path.join(NexxusConfigManager.DEFAULT_CONF_PATH, NexxusConfigManager.CONF_FILE_NAME));
|
|
22
27
|
this.jsonSchema = JSON.parse(fs.readFileSync(schemaPath, 'utf-8'));
|
|
23
|
-
this.configProviders.push(new ConfigProvider_1.NexxusFileConfigProvider(
|
|
28
|
+
this.configProviders.push(new ConfigProvider_1.NexxusFileConfigProvider(resolvedConfPath));
|
|
24
29
|
this.configProviders.push(new ConfigProvider_1.NexxusEnvVarsConfigProvider());
|
|
25
30
|
this.configProviders.push(new ConfigProvider_1.NexxusCliArgConfigProvider());
|
|
26
31
|
}
|
|
@@ -41,19 +46,30 @@ class NexxusConfigManager {
|
|
|
41
46
|
this.jsonSchema.required.push(def.where);
|
|
42
47
|
}
|
|
43
48
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
this.addEnvVarsToSpec(NxxSvc.envVarConfig());
|
|
48
|
-
this.addJsonSchemaDef(NxxSvc.schema());
|
|
49
|
+
registerService(svc) {
|
|
50
|
+
if (this.registeredServices.has(svc.name)) {
|
|
51
|
+
return;
|
|
49
52
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
this.cliArgsSpecs.push(
|
|
53
|
+
const schemaDef = svc.schema();
|
|
54
|
+
const className = svc.name;
|
|
55
|
+
const configRootKey = schemaDef.where;
|
|
56
|
+
this.cliArgsSpecs.push({ className, configRootKey, specs: svc.cliArgConfig() });
|
|
57
|
+
this.envVarsSpecs.push({ className, configRootKey, specs: svc.envVarConfig() });
|
|
58
|
+
this.addJsonSchemaDef(schemaDef);
|
|
59
|
+
this.registeredServices.add(className);
|
|
60
|
+
this.hasNewRegistrations = true;
|
|
54
61
|
}
|
|
55
|
-
|
|
56
|
-
|
|
62
|
+
async validateServices(svcs) {
|
|
63
|
+
if (svcs) {
|
|
64
|
+
for (const svc of svcs) {
|
|
65
|
+
this.registerService(svc);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (!this.hasNewRegistrations) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
await this.validate();
|
|
72
|
+
this.hasNewRegistrations = false;
|
|
57
73
|
}
|
|
58
74
|
populateFromCliArgs() {
|
|
59
75
|
if (this.cliArgsSpecs.length === 0) {
|
|
@@ -65,9 +81,9 @@ class NexxusConfigManager {
|
|
|
65
81
|
spec.specs.forEach((arg) => {
|
|
66
82
|
if (collectedNames.has(arg.name)) {
|
|
67
83
|
throw new Exceptions_1.InvalidConfigException(`Duplicate CLI argument name: "${arg.name}".
|
|
68
|
-
Defined first by
|
|
84
|
+
Defined first by class "${collectedNames.get(arg.name)}" and now by class "${spec.className}"`);
|
|
69
85
|
}
|
|
70
|
-
collectedNames.set(arg.name, spec.
|
|
86
|
+
collectedNames.set(arg.name, spec.className);
|
|
71
87
|
cliArgProvider.addArgument(arg.name, arg.type);
|
|
72
88
|
});
|
|
73
89
|
});
|
|
@@ -75,7 +91,7 @@ class NexxusConfigManager {
|
|
|
75
91
|
this.cliArgsSpecs.forEach(spec => {
|
|
76
92
|
spec.specs.forEach(arg => {
|
|
77
93
|
if (parsed[arg.name] !== undefined && parsed[arg.name] !== null) {
|
|
78
|
-
Dot.setProperty(this.data, arg.location
|
|
94
|
+
Dot.setProperty(this.data, `${spec.configRootKey}.${arg.location}`, parsed[arg.name]);
|
|
79
95
|
}
|
|
80
96
|
});
|
|
81
97
|
});
|
|
@@ -91,14 +107,14 @@ class NexxusConfigManager {
|
|
|
91
107
|
this.envVarsSpecs.forEach(spec => {
|
|
92
108
|
spec.specs.forEach(envVar => {
|
|
93
109
|
if (collectedNames.has(envVar.name)) {
|
|
94
|
-
throw new Exceptions_1.InvalidConfigException(`Duplicate Env var: "${prefix}
|
|
95
|
-
Defined first by
|
|
110
|
+
throw new Exceptions_1.InvalidConfigException(`Duplicate Env var: "${prefix}${envVar.name}".
|
|
111
|
+
Defined first by class "${collectedNames.get(envVar.name)}" and now by class "${spec.className}"`);
|
|
96
112
|
}
|
|
97
113
|
const value = envResult?.[`${prefix}${envVar.name}`];
|
|
98
114
|
if (value !== undefined) {
|
|
99
|
-
Dot.setProperty(this.data, envVar.location
|
|
115
|
+
Dot.setProperty(this.data, `${spec.configRootKey}.${envVar.location}`, value);
|
|
100
116
|
}
|
|
101
|
-
collectedNames.set(envVar.name, spec.
|
|
117
|
+
collectedNames.set(envVar.name, spec.className);
|
|
102
118
|
});
|
|
103
119
|
});
|
|
104
120
|
}
|
|
@@ -114,12 +130,27 @@ class NexxusConfigManager {
|
|
|
114
130
|
}).join('\n');
|
|
115
131
|
}
|
|
116
132
|
async validate() {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
133
|
+
if (!this.dataInitialized) {
|
|
134
|
+
const fileConfigProvider = this.configProviders[0];
|
|
135
|
+
try {
|
|
136
|
+
this.data = fileConfigProvider.getConfig();
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
if (e instanceof Exceptions_1.FatalErrorException) {
|
|
140
|
+
if (e.subcode === Exceptions_1.FatalErrorException.SUBCODES.CONFIG_FILE_NOT_FOUND) {
|
|
141
|
+
this.data = {};
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
throw e;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
await this.populateFromCustomProviders();
|
|
149
|
+
this.dataInitialized = true;
|
|
150
|
+
}
|
|
120
151
|
this.populateFromCliArgs();
|
|
121
152
|
this.populateFromEnvVars();
|
|
122
|
-
const ajv = new ajv_1.Ajv();
|
|
153
|
+
const ajv = new ajv_1.Ajv({ useDefaults: true });
|
|
123
154
|
const validator = ajv.compile(this.jsonSchema);
|
|
124
155
|
const result = validator(this.data);
|
|
125
156
|
if (!result) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigManager.js","sourceRoot":"","sources":["../../src/lib/ConfigManager.ts"],"names":[],"mappings":";;;;AAAA,6CAA2E;AAE3E,qDAO0B;AAE1B,6BAAuC;AACvC,sDAAgC;AAChC,kEAAkC;AAGlC,oDAA8B;AAC9B,wDAAkC;
|
|
1
|
+
{"version":3,"file":"ConfigManager.js","sourceRoot":"","sources":["../../src/lib/ConfigManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,15 @@ class NexxusFileConfigProvider extends NexxusConfigProvider {
|
|
|
22
22
|
fs.accessSync(this.filePath);
|
|
23
23
|
}
|
|
24
24
|
catch (e) {
|
|
25
|
-
|
|
25
|
+
if (e.code === 'ENOENT') {
|
|
26
|
+
throw new Exceptions_1.FatalErrorException(`Cannot access config file "${this.filePath}": ${e.message}`, Exceptions_1.FatalErrorException.SUBCODES.CONFIG_FILE_NOT_FOUND);
|
|
27
|
+
}
|
|
28
|
+
else if (e.code === 'EACCES') {
|
|
29
|
+
throw new Exceptions_1.FatalErrorException(`Cannot access config file "${this.filePath}": ${e.message}`, Exceptions_1.FatalErrorException.SUBCODES.CONFIG_FILE_UNREADABLE);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
throw new Exceptions_1.FatalErrorException(`Failed reading config file "${this.filePath}": ${e.message}`);
|
|
33
|
+
}
|
|
26
34
|
}
|
|
27
35
|
return JSON.parse(fs.readFileSync(this.filePath, 'utf-8'));
|
|
28
36
|
}
|
|
@@ -44,6 +52,7 @@ exports.NexxusEnvVarsConfigProvider = NexxusEnvVarsConfigProvider;
|
|
|
44
52
|
class NexxusCliArgConfigProvider extends NexxusConfigProvider {
|
|
45
53
|
argParser;
|
|
46
54
|
originalExit;
|
|
55
|
+
addedArgs = new Set();
|
|
47
56
|
constructor() {
|
|
48
57
|
super();
|
|
49
58
|
this.argParser = new argparse_1.ArgumentParser({ add_help: false, usage: argparse_1.SUPPRESS });
|
|
@@ -55,7 +64,11 @@ class NexxusCliArgConfigProvider extends NexxusConfigProvider {
|
|
|
55
64
|
};
|
|
56
65
|
}
|
|
57
66
|
addArgument(name, type) {
|
|
67
|
+
if (this.addedArgs.has(name)) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
58
70
|
this.argParser.add_argument(`--${name}`, { type: type, dest: name, required: false });
|
|
71
|
+
this.addedArgs.add(name);
|
|
59
72
|
}
|
|
60
73
|
getConfig() {
|
|
61
74
|
return this.argParser.parse_args();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigProvider.js","sourceRoot":"","sources":["../../src/lib/ConfigProvider.ts"],"names":[],"mappings":";;;;AAAA,6CAAmD;AAEnD,+CAAyB;AAEzB,uCAAoD;AASpD,MAAsB,oBAAoB;CAEzC;AAFD,oDAEC;AAED,MAAsB,yBAAyB;CAE9C;AAFD,8DAEC;AAED,MAAa,wBAAyB,SAAQ,oBAAoB;IAC5C;IAApB,YAAoB,QAAgB;QAClC,KAAK,EAAE,CAAC;QADU,aAAQ,GAAR,QAAQ,CAAQ;IAEpC,CAAC;IAEM,SAAS;QACd,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,gCAAmB,CAAC,8BAA8B,IAAI,CAAC,QAAQ,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfigProvider.js","sourceRoot":"","sources":["../../src/lib/ConfigProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.InvalidUserModelException = exports.InvalidQueryFilterException = exports.InvalidJsonPatchException = exports.InvalidConfigException = exports.ConnectionException = exports.BadRequestException = exports.FatalErrorException = exports.NexxusException = exports.NexxusExceptions = void 0;
|
|
3
|
+
exports.InvalidUserModelException = exports.InvalidSchemaDataException = exports.InvalidQueryFilterException = exports.InvalidJsonPatchException = exports.InvalidConfigException = exports.ConnectionException = exports.BadRequestException = exports.FatalErrorException = exports.NexxusException = exports.NexxusExceptions = void 0;
|
|
4
4
|
var NexxusExceptions;
|
|
5
5
|
(function (NexxusExceptions) {
|
|
6
6
|
NexxusExceptions["FATAL_ERROR"] = "FatalErrorException";
|
|
@@ -9,19 +9,31 @@ var NexxusExceptions;
|
|
|
9
9
|
NexxusExceptions["INVALID_CONFIG"] = "InvalidConfigException";
|
|
10
10
|
NexxusExceptions["INVALID_JSON_PATCH"] = "InvalidJsonPatchException";
|
|
11
11
|
NexxusExceptions["INVALID_QUERY_FILTER"] = "InvalidQueryFilterException";
|
|
12
|
+
NexxusExceptions["INVALID_SCHEMA_DATA"] = "InvalidSchemaDataException";
|
|
12
13
|
NexxusExceptions["INVALID_USER_MODEL"] = "InvalidUserModelException";
|
|
13
14
|
})(NexxusExceptions || (exports.NexxusExceptions = NexxusExceptions = {}));
|
|
14
15
|
;
|
|
15
16
|
class NexxusException extends Error {
|
|
16
|
-
|
|
17
|
+
subcode;
|
|
18
|
+
constructor(type, message, subcode) {
|
|
17
19
|
super(message);
|
|
18
20
|
this.name = type;
|
|
21
|
+
this.subcode = subcode;
|
|
19
22
|
}
|
|
20
23
|
}
|
|
21
24
|
exports.NexxusException = NexxusException;
|
|
25
|
+
var FatalErrorSubcodes;
|
|
26
|
+
(function (FatalErrorSubcodes) {
|
|
27
|
+
FatalErrorSubcodes["CONFIG_FILE_NOT_FOUND"] = "CONFIG_FILE_NOT_FOUND";
|
|
28
|
+
FatalErrorSubcodes["CONFIG_FILE_INVALID_JSON"] = "CONFIG_FILE_INVALID_JSON";
|
|
29
|
+
FatalErrorSubcodes["CONFIG_FILE_INVALID_SCHEMA"] = "CONFIG_FILE_INVALID_SCHEMA";
|
|
30
|
+
FatalErrorSubcodes["CONFIG_FILE_UNREADABLE"] = "CONFIG_FILE_UNREADABLE";
|
|
31
|
+
})(FatalErrorSubcodes || (FatalErrorSubcodes = {}));
|
|
32
|
+
;
|
|
22
33
|
class FatalErrorException extends NexxusException {
|
|
23
|
-
|
|
24
|
-
|
|
34
|
+
static SUBCODES = FatalErrorSubcodes;
|
|
35
|
+
constructor(message, subcode) {
|
|
36
|
+
super(NexxusExceptions.FATAL_ERROR, message, subcode);
|
|
25
37
|
}
|
|
26
38
|
}
|
|
27
39
|
exports.FatalErrorException = FatalErrorException;
|
|
@@ -55,6 +67,12 @@ class InvalidQueryFilterException extends NexxusException {
|
|
|
55
67
|
}
|
|
56
68
|
}
|
|
57
69
|
exports.InvalidQueryFilterException = InvalidQueryFilterException;
|
|
70
|
+
class InvalidSchemaDataException extends NexxusException {
|
|
71
|
+
constructor(message) {
|
|
72
|
+
super(NexxusExceptions.INVALID_SCHEMA_DATA, message);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.InvalidSchemaDataException = InvalidSchemaDataException;
|
|
58
76
|
class InvalidUserModelException extends NexxusException {
|
|
59
77
|
constructor(message) {
|
|
60
78
|
super(NexxusExceptions.INVALID_USER_MODEL, message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Exceptions.js","sourceRoot":"","sources":["../../src/lib/Exceptions.ts"],"names":[],"mappings":";;;AAAA,IAAY,
|
|
1
|
+
{"version":3,"file":"Exceptions.js","sourceRoot":"","sources":["../../src/lib/Exceptions.ts"],"names":[],"mappings":";;;AAAA,IAAY,gBASX;AATD,WAAY,gBAAgB;IAC1B,uDAAmC,CAAA;IACnC,uDAAmC,CAAA;IACnC,iEAA6C,CAAA;IAC7C,6DAAyC,CAAA;IACzC,oEAAgD,CAAA;IAChD,wEAAoD,CAAA;IACpD,sEAAkD,CAAA;IAClD,oEAAgD,CAAA;AAClD,CAAC,EATW,gBAAgB,gCAAhB,gBAAgB,QAS3B;AAAA,CAAC;AAEF,MAAa,eAAgB,SAAQ,KAAK;IACxB,OAAO,CAAU;IAEjC,YAAY,IAAY,EAAE,OAAe,EAAE,OAAgB;QACzD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AARD,0CAQC;AAED,IAAK,kBAKJ;AALD,WAAK,kBAAkB;IACrB,qEAA+C,CAAA;IAC/C,2EAAqD,CAAA;IACrD,+EAAyD,CAAA;IACzD,uEAAiD,CAAA;AACnD,CAAC,EALI,kBAAkB,KAAlB,kBAAkB,QAKtB;AAAA,CAAC;AAEF,MAAa,mBAAoB,SAAQ,eAAe;IAC/C,MAAM,CAAC,QAAQ,GAAyC,kBAAkB,CAAC;IAElF,YAAY,OAAe,EAAE,OAA4B;QACvD,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;;AALH,kDAMC;AAED,MAAa,mBAAoB,SAAQ,eAAe;IACtD,YAAY,OAAe;QACzB,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;CACF;AAJD,kDAIC;AAED,MAAa,mBAAoB,SAAQ,eAAe;IACtD,YAAY,OAAe;QACzB,KAAK,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;CACF;AAJD,kDAIC;AAED,MAAa,sBAAuB,SAAQ,eAAe;IACzD,YAAY,OAAe;QACzB,KAAK,CAAC,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;CACF;AAJD,wDAIC;AAED,MAAa,yBAA0B,SAAQ,eAAe;IAC5D,YAAY,OAAe;QACzB,KAAK,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;CACF;AAJD,8DAIC;AAED,MAAa,2BAA4B,SAAQ,eAAe;IAC9D,YAAY,OAAe;QACzB,KAAK,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;CACF;AAJD,kEAIC;AAED,MAAa,0BAA2B,SAAQ,eAAe;IAC7D,YAAY,OAAe;QACzB,KAAK,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;CACF;AAJD,gEAIC;AAED,MAAa,yBAA0B,SAAQ,eAAe;IAC5D,YAAY,OAAe;QACzB,KAAK,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;CACF;AAJD,8DAIC"}
|