@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 +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-esm/index.js
CHANGED
|
@@ -3,10 +3,14 @@ export * from "./lib/ConfigProvider";
|
|
|
3
3
|
export * from "./lib/ConfigManager";
|
|
4
4
|
export * from "./lib/BaseService";
|
|
5
5
|
export * from "./lib/Logger";
|
|
6
|
+
export * from "./lib/ServiceResolver";
|
|
6
7
|
export * from "./common/QueuePayloads";
|
|
7
8
|
export * from "./common/JsonPatch";
|
|
8
9
|
export * from "./common/FilterQuery";
|
|
10
|
+
export * from "./common/InferModel";
|
|
11
|
+
export * from "./common/SchemaValidator";
|
|
9
12
|
export * from "./models/BaseModel";
|
|
13
|
+
export * from "./models/BuiltinModel";
|
|
10
14
|
export * from './common/BuiltinSchemas';
|
|
11
15
|
export * from "./models/AppModel";
|
|
12
16
|
export * from "./models/Application";
|
package/dist-esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AAEtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAE9B,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { FatalErrorException } from
|
|
3
|
-
import * as fs from
|
|
2
|
+
import { FatalErrorException } from './Exceptions';
|
|
3
|
+
import * as fs from 'node:fs';
|
|
4
4
|
import { EventEmitter } from 'node:events';
|
|
5
5
|
function frozen(target, propertyKey) {
|
|
6
6
|
Object.defineProperty(target, propertyKey, {
|
|
@@ -34,6 +34,7 @@ export class NexxusBaseService extends TypedEventEmitter {
|
|
|
34
34
|
config;
|
|
35
35
|
static envVars;
|
|
36
36
|
static cliArgs;
|
|
37
|
+
static configRootKey;
|
|
37
38
|
static schemaPath;
|
|
38
39
|
static schemaContents;
|
|
39
40
|
constructor(config) {
|
|
@@ -56,18 +57,17 @@ export class NexxusBaseService extends TypedEventEmitter {
|
|
|
56
57
|
if (!this.schemaPath) {
|
|
57
58
|
throw new FatalErrorException(`Schema path not set for ${this.name} class.`);
|
|
58
59
|
}
|
|
60
|
+
if (!this.configRootKey) {
|
|
61
|
+
throw new FatalErrorException(`configRootKey not set for ${this.name} class. ` +
|
|
62
|
+
'This static must declare the top-level key under which this service\'s config sits in the merged root config.');
|
|
63
|
+
}
|
|
59
64
|
if (!this.schemaContents) {
|
|
60
65
|
this.schemaContents = fs.readFileSync(this.schemaPath, 'utf-8');
|
|
61
66
|
}
|
|
62
67
|
const definition = JSON.parse(this.schemaContents);
|
|
63
|
-
if (!definition.$comment) {
|
|
64
|
-
throw new FatalErrorException(`Schema for ${this.name} is missing $comment field. ` +
|
|
65
|
-
'This field is required to specify where in the main config this specific configuration ' +
|
|
66
|
-
'should be placed.');
|
|
67
|
-
}
|
|
68
68
|
return {
|
|
69
69
|
name: this.name,
|
|
70
|
-
where:
|
|
70
|
+
where: this.configRootKey,
|
|
71
71
|
definition,
|
|
72
72
|
required: true
|
|
73
73
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseService.js","sourceRoot":"","sources":["../../src/lib/BaseService.ts"],"names":[],"mappings":";AAOA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAKnD,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"BaseService.js","sourceRoot":"","sources":["../../src/lib/BaseService.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,17 +6,22 @@ import deepMerge from "deepmerge";
|
|
|
6
6
|
import * as fs from "node:fs";
|
|
7
7
|
import * as path from "node:path";
|
|
8
8
|
export class NexxusConfigManager {
|
|
9
|
-
static CONF_FILE_NAME =
|
|
9
|
+
static CONF_FILE_NAME = 'nexxus.conf.json';
|
|
10
|
+
static DEFAULT_CONF_PATH = '/etc/nexxus';
|
|
10
11
|
jsonSchema;
|
|
11
12
|
envVarsSpecs = [];
|
|
12
13
|
cliArgsSpecs = [];
|
|
13
14
|
data = {};
|
|
14
15
|
configProviders = [];
|
|
15
16
|
customProviders = [];
|
|
16
|
-
|
|
17
|
+
registeredServices = new Set();
|
|
18
|
+
dataInitialized = false;
|
|
19
|
+
hasNewRegistrations = false;
|
|
20
|
+
constructor(configFilePath) {
|
|
17
21
|
const schemaPath = path.join(__dirname, "../../src/schemas/root.schema.json");
|
|
22
|
+
const resolvedConfPath = path.resolve(configFilePath || process.env.NXX_CONF_PATH || path.join(NexxusConfigManager.DEFAULT_CONF_PATH, NexxusConfigManager.CONF_FILE_NAME));
|
|
18
23
|
this.jsonSchema = JSON.parse(fs.readFileSync(schemaPath, 'utf-8'));
|
|
19
|
-
this.configProviders.push(new NexxusFileConfigProvider(
|
|
24
|
+
this.configProviders.push(new NexxusFileConfigProvider(resolvedConfPath));
|
|
20
25
|
this.configProviders.push(new NexxusEnvVarsConfigProvider());
|
|
21
26
|
this.configProviders.push(new NexxusCliArgConfigProvider());
|
|
22
27
|
}
|
|
@@ -37,19 +42,30 @@ export class NexxusConfigManager {
|
|
|
37
42
|
this.jsonSchema.required.push(def.where);
|
|
38
43
|
}
|
|
39
44
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
this.addEnvVarsToSpec(NxxSvc.envVarConfig());
|
|
44
|
-
this.addJsonSchemaDef(NxxSvc.schema());
|
|
45
|
+
registerService(svc) {
|
|
46
|
+
if (this.registeredServices.has(svc.name)) {
|
|
47
|
+
return;
|
|
45
48
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
this.cliArgsSpecs.push(
|
|
49
|
+
const schemaDef = svc.schema();
|
|
50
|
+
const className = svc.name;
|
|
51
|
+
const configRootKey = schemaDef.where;
|
|
52
|
+
this.cliArgsSpecs.push({ className, configRootKey, specs: svc.cliArgConfig() });
|
|
53
|
+
this.envVarsSpecs.push({ className, configRootKey, specs: svc.envVarConfig() });
|
|
54
|
+
this.addJsonSchemaDef(schemaDef);
|
|
55
|
+
this.registeredServices.add(className);
|
|
56
|
+
this.hasNewRegistrations = true;
|
|
50
57
|
}
|
|
51
|
-
|
|
52
|
-
|
|
58
|
+
async validateServices(svcs) {
|
|
59
|
+
if (svcs) {
|
|
60
|
+
for (const svc of svcs) {
|
|
61
|
+
this.registerService(svc);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (!this.hasNewRegistrations) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
await this.validate();
|
|
68
|
+
this.hasNewRegistrations = false;
|
|
53
69
|
}
|
|
54
70
|
populateFromCliArgs() {
|
|
55
71
|
if (this.cliArgsSpecs.length === 0) {
|
|
@@ -61,9 +77,9 @@ export class NexxusConfigManager {
|
|
|
61
77
|
spec.specs.forEach((arg) => {
|
|
62
78
|
if (collectedNames.has(arg.name)) {
|
|
63
79
|
throw new InvalidConfigException(`Duplicate CLI argument name: "${arg.name}".
|
|
64
|
-
Defined first by
|
|
80
|
+
Defined first by class "${collectedNames.get(arg.name)}" and now by class "${spec.className}"`);
|
|
65
81
|
}
|
|
66
|
-
collectedNames.set(arg.name, spec.
|
|
82
|
+
collectedNames.set(arg.name, spec.className);
|
|
67
83
|
cliArgProvider.addArgument(arg.name, arg.type);
|
|
68
84
|
});
|
|
69
85
|
});
|
|
@@ -71,7 +87,7 @@ export class NexxusConfigManager {
|
|
|
71
87
|
this.cliArgsSpecs.forEach(spec => {
|
|
72
88
|
spec.specs.forEach(arg => {
|
|
73
89
|
if (parsed[arg.name] !== undefined && parsed[arg.name] !== null) {
|
|
74
|
-
Dot.setProperty(this.data, arg.location
|
|
90
|
+
Dot.setProperty(this.data, `${spec.configRootKey}.${arg.location}`, parsed[arg.name]);
|
|
75
91
|
}
|
|
76
92
|
});
|
|
77
93
|
});
|
|
@@ -87,14 +103,14 @@ export class NexxusConfigManager {
|
|
|
87
103
|
this.envVarsSpecs.forEach(spec => {
|
|
88
104
|
spec.specs.forEach(envVar => {
|
|
89
105
|
if (collectedNames.has(envVar.name)) {
|
|
90
|
-
throw new InvalidConfigException(`Duplicate Env var: "${prefix}
|
|
91
|
-
Defined first by
|
|
106
|
+
throw new InvalidConfigException(`Duplicate Env var: "${prefix}${envVar.name}".
|
|
107
|
+
Defined first by class "${collectedNames.get(envVar.name)}" and now by class "${spec.className}"`);
|
|
92
108
|
}
|
|
93
109
|
const value = envResult?.[`${prefix}${envVar.name}`];
|
|
94
110
|
if (value !== undefined) {
|
|
95
|
-
Dot.setProperty(this.data, envVar.location
|
|
111
|
+
Dot.setProperty(this.data, `${spec.configRootKey}.${envVar.location}`, value);
|
|
96
112
|
}
|
|
97
|
-
collectedNames.set(envVar.name, spec.
|
|
113
|
+
collectedNames.set(envVar.name, spec.className);
|
|
98
114
|
});
|
|
99
115
|
});
|
|
100
116
|
}
|
|
@@ -110,12 +126,27 @@ export class NexxusConfigManager {
|
|
|
110
126
|
}).join('\n');
|
|
111
127
|
}
|
|
112
128
|
async validate() {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
129
|
+
if (!this.dataInitialized) {
|
|
130
|
+
const fileConfigProvider = this.configProviders[0];
|
|
131
|
+
try {
|
|
132
|
+
this.data = fileConfigProvider.getConfig();
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
if (e instanceof FatalErrorException) {
|
|
136
|
+
if (e.subcode === FatalErrorException.SUBCODES.CONFIG_FILE_NOT_FOUND) {
|
|
137
|
+
this.data = {};
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
throw e;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
await this.populateFromCustomProviders();
|
|
145
|
+
this.dataInitialized = true;
|
|
146
|
+
}
|
|
116
147
|
this.populateFromCliArgs();
|
|
117
148
|
this.populateFromEnvVars();
|
|
118
|
-
const ajv = new Ajv();
|
|
149
|
+
const ajv = new Ajv({ useDefaults: true });
|
|
119
150
|
const validator = ajv.compile(this.jsonSchema);
|
|
120
151
|
const result = validator(this.data);
|
|
121
152
|
if (!result) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigManager.js","sourceRoot":"","sources":["../../src/lib/ConfigManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE3E,OAAO,EAIL,wBAAwB,EACxB,2BAA2B,EAC3B,0BAA0B,EAC3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,GAAG,EAAe,MAAM,KAAK,CAAC;AACvC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,SAAS,MAAM,WAAW,CAAC;AAGlC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfigManager.js","sourceRoot":"","sources":["../../src/lib/ConfigManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,15 @@ export class NexxusFileConfigProvider extends NexxusConfigProvider {
|
|
|
16
16
|
fs.accessSync(this.filePath);
|
|
17
17
|
}
|
|
18
18
|
catch (e) {
|
|
19
|
-
|
|
19
|
+
if (e.code === 'ENOENT') {
|
|
20
|
+
throw new FatalErrorException(`Cannot access config file "${this.filePath}": ${e.message}`, FatalErrorException.SUBCODES.CONFIG_FILE_NOT_FOUND);
|
|
21
|
+
}
|
|
22
|
+
else if (e.code === 'EACCES') {
|
|
23
|
+
throw new FatalErrorException(`Cannot access config file "${this.filePath}": ${e.message}`, FatalErrorException.SUBCODES.CONFIG_FILE_UNREADABLE);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
throw new FatalErrorException(`Failed reading config file "${this.filePath}": ${e.message}`);
|
|
27
|
+
}
|
|
20
28
|
}
|
|
21
29
|
return JSON.parse(fs.readFileSync(this.filePath, 'utf-8'));
|
|
22
30
|
}
|
|
@@ -36,6 +44,7 @@ export class NexxusEnvVarsConfigProvider extends NexxusConfigProvider {
|
|
|
36
44
|
export class NexxusCliArgConfigProvider extends NexxusConfigProvider {
|
|
37
45
|
argParser;
|
|
38
46
|
originalExit;
|
|
47
|
+
addedArgs = new Set();
|
|
39
48
|
constructor() {
|
|
40
49
|
super();
|
|
41
50
|
this.argParser = new ArgumentParser({ add_help: false, usage: SUPPRESS });
|
|
@@ -47,7 +56,11 @@ export class NexxusCliArgConfigProvider extends NexxusConfigProvider {
|
|
|
47
56
|
};
|
|
48
57
|
}
|
|
49
58
|
addArgument(name, type) {
|
|
59
|
+
if (this.addedArgs.has(name)) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
50
62
|
this.argParser.add_argument(`--${name}`, { type: type, dest: name, required: false });
|
|
63
|
+
this.addedArgs.add(name);
|
|
51
64
|
}
|
|
52
65
|
getConfig() {
|
|
53
66
|
return this.argParser.parse_args();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigProvider.js","sourceRoot":"","sources":["../../src/lib/ConfigProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AASpD,MAAM,OAAgB,oBAAoB;CAEzC;AAED,MAAM,OAAgB,yBAAyB;CAE9C;AAED,MAAM,OAAO,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,mBAAmB,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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"}
|
|
@@ -6,18 +6,30 @@ export var NexxusExceptions;
|
|
|
6
6
|
NexxusExceptions["INVALID_CONFIG"] = "InvalidConfigException";
|
|
7
7
|
NexxusExceptions["INVALID_JSON_PATCH"] = "InvalidJsonPatchException";
|
|
8
8
|
NexxusExceptions["INVALID_QUERY_FILTER"] = "InvalidQueryFilterException";
|
|
9
|
+
NexxusExceptions["INVALID_SCHEMA_DATA"] = "InvalidSchemaDataException";
|
|
9
10
|
NexxusExceptions["INVALID_USER_MODEL"] = "InvalidUserModelException";
|
|
10
11
|
})(NexxusExceptions || (NexxusExceptions = {}));
|
|
11
12
|
;
|
|
12
13
|
export class NexxusException extends Error {
|
|
13
|
-
|
|
14
|
+
subcode;
|
|
15
|
+
constructor(type, message, subcode) {
|
|
14
16
|
super(message);
|
|
15
17
|
this.name = type;
|
|
18
|
+
this.subcode = subcode;
|
|
16
19
|
}
|
|
17
20
|
}
|
|
21
|
+
var FatalErrorSubcodes;
|
|
22
|
+
(function (FatalErrorSubcodes) {
|
|
23
|
+
FatalErrorSubcodes["CONFIG_FILE_NOT_FOUND"] = "CONFIG_FILE_NOT_FOUND";
|
|
24
|
+
FatalErrorSubcodes["CONFIG_FILE_INVALID_JSON"] = "CONFIG_FILE_INVALID_JSON";
|
|
25
|
+
FatalErrorSubcodes["CONFIG_FILE_INVALID_SCHEMA"] = "CONFIG_FILE_INVALID_SCHEMA";
|
|
26
|
+
FatalErrorSubcodes["CONFIG_FILE_UNREADABLE"] = "CONFIG_FILE_UNREADABLE";
|
|
27
|
+
})(FatalErrorSubcodes || (FatalErrorSubcodes = {}));
|
|
28
|
+
;
|
|
18
29
|
export class FatalErrorException extends NexxusException {
|
|
19
|
-
|
|
20
|
-
|
|
30
|
+
static SUBCODES = FatalErrorSubcodes;
|
|
31
|
+
constructor(message, subcode) {
|
|
32
|
+
super(NexxusExceptions.FATAL_ERROR, message, subcode);
|
|
21
33
|
}
|
|
22
34
|
}
|
|
23
35
|
export class BadRequestException extends NexxusException {
|
|
@@ -45,6 +57,11 @@ export class InvalidQueryFilterException extends NexxusException {
|
|
|
45
57
|
super(NexxusExceptions.INVALID_QUERY_FILTER, message);
|
|
46
58
|
}
|
|
47
59
|
}
|
|
60
|
+
export class InvalidSchemaDataException extends NexxusException {
|
|
61
|
+
constructor(message) {
|
|
62
|
+
super(NexxusExceptions.INVALID_SCHEMA_DATA, message);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
48
65
|
export class InvalidUserModelException extends NexxusException {
|
|
49
66
|
constructor(message) {
|
|
50
67
|
super(NexxusExceptions.INVALID_USER_MODEL, message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Exceptions.js","sourceRoot":"","sources":["../../src/lib/Exceptions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,
|
|
1
|
+
{"version":3,"file":"Exceptions.js","sourceRoot":"","sources":["../../src/lib/Exceptions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,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,KAAhB,gBAAgB,QAS3B;AAAA,CAAC;AAEF,MAAM,OAAO,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;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,MAAM,OAAO,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;;AAGH,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IACtD,YAAY,OAAe;QACzB,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IACtD,YAAY,OAAe;QACzB,KAAK,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,eAAe;IACzD,YAAY,OAAe;QACzB,KAAK,CAAC,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;CACF;AAED,MAAM,OAAO,yBAA0B,SAAQ,eAAe;IAC5D,YAAY,OAAe;QACzB,KAAK,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,eAAe;IAC9D,YAAY,OAAe;QACzB,KAAK,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;CACF;AAED,MAAM,OAAO,0BAA2B,SAAQ,eAAe;IAC7D,YAAY,OAAe;QACzB,KAAK,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;CACF;AAED,MAAM,OAAO,yBAA0B,SAAQ,eAAe;IAC5D,YAAY,OAAe;QACzB,KAAK,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;CACF"}
|
package/dist-esm/lib/Logger.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { NexxusBaseService } from './BaseService';
|
|
2
|
+
import { InvalidConfigException } from './Exceptions';
|
|
2
3
|
import * as Winston from 'winston';
|
|
3
|
-
import * as path from
|
|
4
|
+
import * as path from 'node:path';
|
|
4
5
|
export var NexxusLoggerLevels;
|
|
5
6
|
(function (NexxusLoggerLevels) {
|
|
6
7
|
NexxusLoggerLevels["EMERGENCY"] = "emerg";
|
|
@@ -13,90 +14,113 @@ export var NexxusLoggerLevels;
|
|
|
13
14
|
NexxusLoggerLevels["DEBUG"] = "debug";
|
|
14
15
|
})(NexxusLoggerLevels || (NexxusLoggerLevels = {}));
|
|
15
16
|
export class NexxusBaseLogger extends NexxusBaseService {
|
|
17
|
+
static configRootKey = "logger";
|
|
16
18
|
constructor(services) {
|
|
17
19
|
super(services.configManager.getConfig('logger'));
|
|
18
20
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
+
static serializeError(err) {
|
|
22
|
+
const out = {
|
|
23
|
+
name: err.name,
|
|
24
|
+
message: err.message,
|
|
25
|
+
stack: err.stack,
|
|
26
|
+
};
|
|
27
|
+
if (err.cause !== undefined) {
|
|
28
|
+
out.cause = err.cause;
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
static makeSafeReplacer() {
|
|
33
|
+
const seen = new WeakSet();
|
|
34
|
+
return (_key, value) => {
|
|
35
|
+
if (value instanceof Error) {
|
|
36
|
+
return NexxusBaseLogger.serializeError(value);
|
|
37
|
+
}
|
|
38
|
+
if (value !== null && typeof value === 'object') {
|
|
39
|
+
if (seen.has(value)) {
|
|
40
|
+
return '[circular]';
|
|
41
|
+
}
|
|
42
|
+
seen.add(value);
|
|
43
|
+
}
|
|
44
|
+
return value;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
static safeStringify(value) {
|
|
48
|
+
return JSON.stringify(value, NexxusBaseLogger.makeSafeReplacer());
|
|
21
49
|
}
|
|
22
|
-
|
|
23
|
-
this.
|
|
50
|
+
debug(message, attributesOrLabel, label) {
|
|
51
|
+
this.dispatch("debug", message, attributesOrLabel, label);
|
|
24
52
|
}
|
|
25
|
-
|
|
26
|
-
this.
|
|
53
|
+
info(message, attributesOrLabel, label) {
|
|
54
|
+
this.dispatch("info", message, attributesOrLabel, label);
|
|
27
55
|
}
|
|
28
|
-
|
|
29
|
-
this.
|
|
56
|
+
warn(message, attributesOrLabel, label) {
|
|
57
|
+
this.dispatch("warn", message, attributesOrLabel, label);
|
|
30
58
|
}
|
|
31
|
-
|
|
32
|
-
this.
|
|
59
|
+
error(message, attributesOrLabel, label) {
|
|
60
|
+
this.dispatch("error", message, attributesOrLabel, label);
|
|
33
61
|
}
|
|
34
|
-
|
|
35
|
-
this.
|
|
62
|
+
critical(message, attributesOrLabel, label) {
|
|
63
|
+
this.dispatch("crit", message, attributesOrLabel, label);
|
|
36
64
|
}
|
|
37
|
-
|
|
38
|
-
this.
|
|
65
|
+
alert(message, attributesOrLabel, label) {
|
|
66
|
+
this.dispatch("alert", message, attributesOrLabel, label);
|
|
67
|
+
}
|
|
68
|
+
emerg(message, attributesOrLabel, label) {
|
|
69
|
+
this.dispatch("emerg", message, attributesOrLabel, label);
|
|
70
|
+
}
|
|
71
|
+
dispatch(level, message, attributesOrLabel, label) {
|
|
72
|
+
if (typeof attributesOrLabel === 'string') {
|
|
73
|
+
this.log(level, message, undefined, attributesOrLabel);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
this.log(level, message, attributesOrLabel, label);
|
|
77
|
+
}
|
|
39
78
|
}
|
|
40
79
|
}
|
|
41
80
|
export class WinstonNexxusLogger extends NexxusBaseLogger {
|
|
42
81
|
winston;
|
|
43
82
|
static schemaPath = path.join(__dirname, "../../src/schemas/winston-logger.schema.json");
|
|
44
|
-
static envVars =
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
location: "logger.level"
|
|
50
|
-
}
|
|
51
|
-
]
|
|
52
|
-
};
|
|
53
|
-
static cliArgs = {
|
|
54
|
-
source: this.name,
|
|
55
|
-
specs: []
|
|
56
|
-
};
|
|
57
|
-
constructor(services) {
|
|
83
|
+
static envVars = [
|
|
84
|
+
{ name: "LOG_LEVEL", location: "level" }
|
|
85
|
+
];
|
|
86
|
+
static cliArgs = [];
|
|
87
|
+
constructor(services, resolvedTransports) {
|
|
58
88
|
super(services);
|
|
59
89
|
let format;
|
|
60
90
|
if (this.config.logType === "json") {
|
|
61
|
-
format = Winston.format.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
info.message = msg;
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
throw e;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
91
|
+
format = Winston.format.printf(info => {
|
|
92
|
+
const record = {};
|
|
93
|
+
if (info.timestamp) {
|
|
94
|
+
record.time = info.timestamp;
|
|
95
|
+
}
|
|
96
|
+
record.level = info.level;
|
|
97
|
+
record.label = info.label ?? "default-label";
|
|
98
|
+
record.msg = info.message;
|
|
99
|
+
const attrs = info.attrs;
|
|
100
|
+
if (attrs && typeof attrs === 'object' && Object.keys(attrs).length > 0) {
|
|
101
|
+
record.attrs = attrs;
|
|
78
102
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}), format);
|
|
103
|
+
return WinstonNexxusLogger.safeStringify(record);
|
|
104
|
+
});
|
|
82
105
|
if (this.config.timestamps) {
|
|
83
106
|
format = Winston.format.combine(Winston.format.timestamp(), format);
|
|
84
107
|
}
|
|
85
108
|
}
|
|
86
109
|
else {
|
|
87
110
|
format = Winston.format.printf(info => {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
111
|
+
const label = info.label ?? "default-label";
|
|
112
|
+
const timestampPrefix = info.timestamp ? `[${info.timestamp}] ` : '';
|
|
113
|
+
const header = `${timestampPrefix}${info.level.toLocaleUpperCase()} [${label}]: ${info.message}`;
|
|
114
|
+
const attrs = info.attrs;
|
|
115
|
+
if (!attrs || typeof attrs !== 'object' || Object.keys(attrs).length === 0) {
|
|
116
|
+
return header;
|
|
92
117
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
118
|
+
const lines = [header];
|
|
119
|
+
for (const [k, v] of Object.entries(attrs)) {
|
|
120
|
+
lines.push(` ${k}: ${WinstonNexxusLogger.safeStringify(v)}`);
|
|
96
121
|
}
|
|
97
|
-
return
|
|
122
|
+
return lines.join('\n');
|
|
98
123
|
});
|
|
99
|
-
format = Winston.format.combine(Winston.format.metadata({ fillExcept: ['message', 'level', 'timestamp', 'label'] }), format);
|
|
100
124
|
if (this.config.timestamps) {
|
|
101
125
|
format = Winston.format.combine(Winston.format.timestamp(), format);
|
|
102
126
|
}
|
|
@@ -107,19 +131,68 @@ export class WinstonNexxusLogger extends NexxusBaseLogger {
|
|
|
107
131
|
this.winston = Winston.createLogger({
|
|
108
132
|
level: this.config.level,
|
|
109
133
|
format,
|
|
110
|
-
transports:
|
|
111
|
-
new Winston.transports.Console()
|
|
112
|
-
]
|
|
134
|
+
transports: resolvedTransports
|
|
113
135
|
});
|
|
114
136
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
137
|
+
static async create(services) {
|
|
138
|
+
const config = services.configManager.getConfig('logger');
|
|
139
|
+
const resolvedTransports = await WinstonNexxusLogger.resolveTransports(config);
|
|
140
|
+
return new WinstonNexxusLogger(services, resolvedTransports);
|
|
141
|
+
}
|
|
142
|
+
static async resolveTransports(config) {
|
|
143
|
+
const entries = config.transports?.length
|
|
144
|
+
? config.transports
|
|
145
|
+
: [{ type: 'stdout' }];
|
|
146
|
+
const resolved = [];
|
|
147
|
+
for (const entry of entries) {
|
|
148
|
+
switch (entry.type) {
|
|
149
|
+
case 'stdout':
|
|
150
|
+
resolved.push(new Winston.transports.Console());
|
|
151
|
+
break;
|
|
152
|
+
case 'file': {
|
|
153
|
+
const fileEntry = entry;
|
|
154
|
+
resolved.push(new Winston.transports.File({
|
|
155
|
+
filename: fileEntry.filename,
|
|
156
|
+
maxsize: fileEntry.maxSize || 10485760,
|
|
157
|
+
maxFiles: fileEntry.maxFiles || 5,
|
|
158
|
+
zippedArchive: true
|
|
159
|
+
}));
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
default:
|
|
163
|
+
resolved.push(await WinstonNexxusLogger.loadCustomTransport(entry));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return resolved;
|
|
167
|
+
}
|
|
168
|
+
static async loadCustomTransport(transport) {
|
|
169
|
+
let mod;
|
|
170
|
+
try {
|
|
171
|
+
mod = await import(transport.type);
|
|
172
|
+
}
|
|
173
|
+
catch (e) {
|
|
174
|
+
throw new InvalidConfigException(`Transport package "${transport.type}" could not be loaded — make sure it's installed in your deployment. Underlying error: ${e.message}`);
|
|
175
|
+
}
|
|
176
|
+
let TransportCtor;
|
|
177
|
+
if (transport.export) {
|
|
178
|
+
TransportCtor = mod[transport.export];
|
|
179
|
+
if (typeof TransportCtor !== 'function') {
|
|
180
|
+
throw new InvalidConfigException(`Transport package "${transport.type}" has no export named "${transport.export}" (or it isn't a class/function)`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else if (typeof mod.default === 'function') {
|
|
184
|
+
TransportCtor = mod.default;
|
|
185
|
+
}
|
|
186
|
+
else if (typeof mod === 'function') {
|
|
187
|
+
TransportCtor = mod;
|
|
118
188
|
}
|
|
119
189
|
else {
|
|
120
|
-
|
|
190
|
+
throw new InvalidConfigException(`Could not find a transport class in package "${transport.type}". Specify "export" in the transport config to name the class.`);
|
|
121
191
|
}
|
|
122
|
-
|
|
192
|
+
return new TransportCtor(transport.options ?? {});
|
|
193
|
+
}
|
|
194
|
+
log(level, message, attributes, label) {
|
|
195
|
+
this.winston.log(level, message, { label, attrs: attributes });
|
|
123
196
|
}
|
|
124
197
|
}
|
|
125
198
|
//# sourceMappingURL=Logger.js.map
|