@mayhem93/nexxus-core-lib 0.0.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/LICENSE +373 -0
- package/README.md +384 -0
- package/dist-cjs/common/BuiltinSchemas.js +26 -0
- package/dist-cjs/common/BuiltinSchemas.js.map +1 -0
- package/dist-cjs/common/FilterQuery.js +252 -0
- package/dist-cjs/common/FilterQuery.js.map +1 -0
- package/dist-cjs/common/JsonPatch.js +392 -0
- package/dist-cjs/common/JsonPatch.js.map +1 -0
- package/dist-cjs/common/ModelTypes.js +3 -0
- package/dist-cjs/common/ModelTypes.js.map +1 -0
- package/dist-cjs/common/QueuePayloads.js +3 -0
- package/dist-cjs/common/QueuePayloads.js.map +1 -0
- package/dist-cjs/common/SchemaValidator.js +41 -0
- package/dist-cjs/common/SchemaValidator.js.map +1 -0
- package/dist-cjs/index.js +20 -0
- package/dist-cjs/index.js.map +1 -0
- package/dist-cjs/lib/BaseService.js +83 -0
- package/dist-cjs/lib/BaseService.js.map +1 -0
- package/dist-cjs/lib/ConfigManager.js +138 -0
- package/dist-cjs/lib/ConfigManager.js.map +1 -0
- package/dist-cjs/lib/ConfigProvider.js +65 -0
- package/dist-cjs/lib/ConfigProvider.js.map +1 -0
- package/dist-cjs/lib/Exceptions.js +64 -0
- package/dist-cjs/lib/Exceptions.js.map +1 -0
- package/dist-cjs/lib/GlobalServices.js +29 -0
- package/dist-cjs/lib/GlobalServices.js.map +1 -0
- package/dist-cjs/lib/Logger.js +131 -0
- package/dist-cjs/lib/Logger.js.map +1 -0
- package/dist-cjs/models/AppModel.js +14 -0
- package/dist-cjs/models/AppModel.js.map +1 -0
- package/dist-cjs/models/Application.js +79 -0
- package/dist-cjs/models/Application.js.map +1 -0
- package/dist-cjs/models/BaseModel.js +33 -0
- package/dist-cjs/models/BaseModel.js.map +1 -0
- package/dist-cjs/models/User.js +39 -0
- package/dist-cjs/models/User.js.map +1 -0
- package/dist-cjs/types/QueuePayloads.js +3 -0
- package/dist-cjs/types/QueuePayloads.js.map +1 -0
- package/dist-esm/common/BuiltinSchemas.js +22 -0
- package/dist-esm/common/BuiltinSchemas.js.map +1 -0
- package/dist-esm/common/FilterQuery.js +247 -0
- package/dist-esm/common/FilterQuery.js.map +1 -0
- package/dist-esm/common/JsonPatch.js +387 -0
- package/dist-esm/common/JsonPatch.js.map +1 -0
- package/dist-esm/common/ModelTypes.js +2 -0
- package/dist-esm/common/ModelTypes.js.map +1 -0
- package/dist-esm/common/QueuePayloads.js +2 -0
- package/dist-esm/common/QueuePayloads.js.map +1 -0
- package/dist-esm/common/SchemaValidator.js +37 -0
- package/dist-esm/common/SchemaValidator.js.map +1 -0
- package/dist-esm/index.js +16 -0
- package/dist-esm/index.js.map +1 -0
- package/dist-esm/lib/BaseService.js +79 -0
- package/dist-esm/lib/BaseService.js.map +1 -0
- package/dist-esm/lib/ConfigManager.js +133 -0
- package/dist-esm/lib/ConfigManager.js.map +1 -0
- package/dist-esm/lib/ConfigProvider.js +56 -0
- package/dist-esm/lib/ConfigProvider.js.map +1 -0
- package/dist-esm/lib/Exceptions.js +53 -0
- package/dist-esm/lib/Exceptions.js.map +1 -0
- package/dist-esm/lib/GlobalServices.js +25 -0
- package/dist-esm/lib/GlobalServices.js.map +1 -0
- package/dist-esm/lib/Logger.js +125 -0
- package/dist-esm/lib/Logger.js.map +1 -0
- package/dist-esm/models/AppModel.js +10 -0
- package/dist-esm/models/AppModel.js.map +1 -0
- package/dist-esm/models/Application.js +74 -0
- package/dist-esm/models/Application.js.map +1 -0
- package/dist-esm/models/BaseModel.js +29 -0
- package/dist-esm/models/BaseModel.js.map +1 -0
- package/dist-esm/models/User.js +35 -0
- package/dist-esm/models/User.js.map +1 -0
- package/dist-esm/types/QueuePayloads.js +2 -0
- package/dist-esm/types/QueuePayloads.js.map +1 -0
- package/dist-types/common/BuiltinSchemas.d.ts +69 -0
- package/dist-types/common/FilterQuery.d.ts +58 -0
- package/dist-types/common/JsonPatch.d.ts +78 -0
- package/dist-types/common/ModelTypes.d.ts +24 -0
- package/dist-types/common/QueuePayloads.d.ts +78 -0
- package/dist-types/common/SchemaValidator.d.ts +4 -0
- package/dist-types/index.d.ts +15 -0
- package/dist-types/lib/BaseService.d.ts +28 -0
- package/dist-types/lib/ConfigManager.d.ts +48 -0
- package/dist-types/lib/ConfigProvider.d.ts +27 -0
- package/dist-types/lib/Exceptions.d.ts +33 -0
- package/dist-types/lib/GlobalServices.d.ts +19 -0
- package/dist-types/lib/Logger.d.ts +48 -0
- package/dist-types/models/AppModel.d.ts +9 -0
- package/dist-types/models/Application.d.ts +29 -0
- package/dist-types/models/BaseModel.d.ts +23 -0
- package/dist-types/models/User.d.ts +17 -0
- package/dist-types/types/QueuePayloads.d.ts +57 -0
- package/package.json +46 -0
- package/src/schemas/root.schema.json +8 -0
- package/src/schemas/winston-logger.schema.json +24 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { NEXXUS_BUILTIN_MODEL_SCHEMAS, NEXXUS_UNIVERSAL_FIELDS } from './BuiltinSchemas';
|
|
2
|
+
import { InvalidJsonPatchException } from '../lib/Exceptions';
|
|
3
|
+
import * as dot from 'dot-prop';
|
|
4
|
+
const JSON_OPS = [
|
|
5
|
+
'replace',
|
|
6
|
+
'append',
|
|
7
|
+
'prepend',
|
|
8
|
+
'incr',
|
|
9
|
+
'decr'
|
|
10
|
+
];
|
|
11
|
+
export class NexxusJsonPatch {
|
|
12
|
+
valid = false;
|
|
13
|
+
fullPatch;
|
|
14
|
+
static OPERATION_RULES = {
|
|
15
|
+
replace: {
|
|
16
|
+
allowedTypes: ['string', 'number', 'boolean', 'date', 'object', 'array'],
|
|
17
|
+
validateValue: (value, fieldDef, path) => {
|
|
18
|
+
NexxusJsonPatch.validateAgainstType(value, fieldDef, path);
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
append: {
|
|
22
|
+
allowedTypes: ['array', 'string'],
|
|
23
|
+
validateValue: (value, fieldDef, path) => {
|
|
24
|
+
if (fieldDef.type === 'array') {
|
|
25
|
+
const arrayFieldDef = fieldDef;
|
|
26
|
+
if (arrayFieldDef.arrayType === 'object') {
|
|
27
|
+
if (!arrayFieldDef.properties) {
|
|
28
|
+
throw new InvalidJsonPatchException(`Array of objects at "${path}" is missing properties definition`);
|
|
29
|
+
}
|
|
30
|
+
const objFieldDef = {
|
|
31
|
+
type: 'object',
|
|
32
|
+
properties: arrayFieldDef.properties,
|
|
33
|
+
required: false
|
|
34
|
+
};
|
|
35
|
+
NexxusJsonPatch.validateAgainstType(value, objFieldDef, path);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const primitiveFieldDef = {
|
|
39
|
+
type: arrayFieldDef.arrayType,
|
|
40
|
+
required: false
|
|
41
|
+
};
|
|
42
|
+
NexxusJsonPatch.validateAgainstType(value, primitiveFieldDef, path);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else if (fieldDef.type === 'string') {
|
|
46
|
+
if (typeof value !== 'string') {
|
|
47
|
+
throw new InvalidJsonPatchException(`Value for append at path "${path}" must be a string`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
prepend: {
|
|
53
|
+
allowedTypes: ['array', 'string'],
|
|
54
|
+
validateValue: (value, fieldDef, path) => {
|
|
55
|
+
if (fieldDef.type === 'array') {
|
|
56
|
+
const arrayFieldDef = fieldDef;
|
|
57
|
+
if (arrayFieldDef.arrayType === 'object') {
|
|
58
|
+
if (!arrayFieldDef.properties) {
|
|
59
|
+
throw new InvalidJsonPatchException(`Array of objects at "${path}" is missing properties definition`);
|
|
60
|
+
}
|
|
61
|
+
const objFieldDef = {
|
|
62
|
+
type: 'object',
|
|
63
|
+
properties: arrayFieldDef.properties,
|
|
64
|
+
required: false
|
|
65
|
+
};
|
|
66
|
+
NexxusJsonPatch.validateAgainstType(value, objFieldDef, path);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
const primitiveFieldDef = {
|
|
70
|
+
type: arrayFieldDef.arrayType,
|
|
71
|
+
required: false
|
|
72
|
+
};
|
|
73
|
+
NexxusJsonPatch.validateAgainstType(value, primitiveFieldDef, path);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else if (fieldDef.type === 'string') {
|
|
77
|
+
if (typeof value !== 'string') {
|
|
78
|
+
throw new InvalidJsonPatchException(`Value for prepend at path "${path}" must be a string`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
incr: {
|
|
84
|
+
allowedTypes: ['number', 'date'],
|
|
85
|
+
validateValue: (value, fieldDef, path) => {
|
|
86
|
+
NexxusJsonPatch.validateAgainstType(value, fieldDef, path);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
decr: {
|
|
90
|
+
allowedTypes: ['number', 'date'],
|
|
91
|
+
validateValue: (value, fieldDef, path) => {
|
|
92
|
+
NexxusJsonPatch.validateAgainstType(value, fieldDef, path);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
constructor(fullPatch) {
|
|
97
|
+
if (!fullPatch || typeof fullPatch !== 'object' || Array.isArray(fullPatch)) {
|
|
98
|
+
throw new InvalidJsonPatchException(`Invalid patch format`);
|
|
99
|
+
}
|
|
100
|
+
if (!JSON_OPS.includes(fullPatch.op)) {
|
|
101
|
+
throw new InvalidJsonPatchException(`Unsupported JSON Patch operation: ${fullPatch.op}`);
|
|
102
|
+
}
|
|
103
|
+
if (fullPatch.path.length !== fullPatch.value.length) {
|
|
104
|
+
throw new InvalidJsonPatchException(`Path and value arrays must have the same length`);
|
|
105
|
+
}
|
|
106
|
+
if (!fullPatch.metadata.type || typeof fullPatch.metadata.type !== 'string') {
|
|
107
|
+
throw new InvalidJsonPatchException(`Patch metadata must include type`);
|
|
108
|
+
}
|
|
109
|
+
if (!fullPatch.metadata.appId || typeof fullPatch.metadata.appId !== 'string') {
|
|
110
|
+
throw new InvalidJsonPatchException(`Patch metadata must include appId`);
|
|
111
|
+
}
|
|
112
|
+
if (!fullPatch.metadata.id || typeof fullPatch.metadata.id !== 'string') {
|
|
113
|
+
throw new InvalidJsonPatchException(`Patch metadata must include id`);
|
|
114
|
+
}
|
|
115
|
+
this.fullPatch = { ...fullPatch, metadata: { ...fullPatch.metadata, pathFieldTypes: [] } };
|
|
116
|
+
}
|
|
117
|
+
get() {
|
|
118
|
+
if (!this.valid) {
|
|
119
|
+
throw new InvalidJsonPatchException('Cannot get JSON Patch before validation');
|
|
120
|
+
}
|
|
121
|
+
return this.fullPatch;
|
|
122
|
+
}
|
|
123
|
+
isValid() {
|
|
124
|
+
return this.valid;
|
|
125
|
+
}
|
|
126
|
+
getPartialModel() {
|
|
127
|
+
const partialModel = {
|
|
128
|
+
id: this.fullPatch.metadata.id,
|
|
129
|
+
type: this.fullPatch.metadata.type,
|
|
130
|
+
appId: this.fullPatch.metadata.appId
|
|
131
|
+
};
|
|
132
|
+
for (let i = 0; i < this.fullPatch.path.length; i++) {
|
|
133
|
+
const path = this.fullPatch.path[i];
|
|
134
|
+
const value = this.fullPatch.value[i];
|
|
135
|
+
dot.setProperty(partialModel, path, value);
|
|
136
|
+
}
|
|
137
|
+
return partialModel;
|
|
138
|
+
}
|
|
139
|
+
validate(config) {
|
|
140
|
+
const modelType = this.fullPatch.metadata.type;
|
|
141
|
+
let modelSpec;
|
|
142
|
+
if ('appSchema' in config) {
|
|
143
|
+
const appModelSpec = config.appSchema[modelType];
|
|
144
|
+
if (!appModelSpec) {
|
|
145
|
+
throw new InvalidJsonPatchException(`Model type "${modelType}" not found in application schema`);
|
|
146
|
+
}
|
|
147
|
+
modelSpec = {
|
|
148
|
+
updatedAt: NEXXUS_UNIVERSAL_FIELDS.updatedAt,
|
|
149
|
+
...appModelSpec
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
const builtinSchema = NEXXUS_BUILTIN_MODEL_SCHEMAS[modelType];
|
|
154
|
+
modelSpec = {
|
|
155
|
+
updatedAt: NEXXUS_UNIVERSAL_FIELDS.updatedAt,
|
|
156
|
+
...builtinSchema
|
|
157
|
+
};
|
|
158
|
+
switch (config.modelType) {
|
|
159
|
+
case 'user':
|
|
160
|
+
if (config.modelType === 'user' && !config.userDetailsSchema) {
|
|
161
|
+
throw new InvalidJsonPatchException("User detail schema must be provided for 'user' model patches");
|
|
162
|
+
}
|
|
163
|
+
modelSpec.details = { type: 'object', properties: config.userDetailsSchema, required: false };
|
|
164
|
+
break;
|
|
165
|
+
case 'application':
|
|
166
|
+
break;
|
|
167
|
+
default:
|
|
168
|
+
throw new InvalidJsonPatchException(`Unsupported built-in model type: ${config.modelType}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const operationRule = NexxusJsonPatch.OPERATION_RULES[this.fullPatch.op];
|
|
172
|
+
for (let i = 0; i < this.fullPatch.path.length; i++) {
|
|
173
|
+
const currentPath = this.fullPatch.path[i];
|
|
174
|
+
const currentValue = this.fullPatch.value[i];
|
|
175
|
+
const fieldDef = NexxusJsonPatch.traverseSchema(modelSpec, currentPath);
|
|
176
|
+
if (!fieldDef) {
|
|
177
|
+
throw new InvalidJsonPatchException(`Path "${currentPath}" does not exist in model "${this.fullPatch.metadata.type}"`);
|
|
178
|
+
}
|
|
179
|
+
if (!operationRule.allowedTypes.includes(fieldDef.type)) {
|
|
180
|
+
throw new InvalidJsonPatchException(`Operation "${this.fullPatch.op}" not allowed on type "${fieldDef.type}" at path "${currentPath}"`);
|
|
181
|
+
}
|
|
182
|
+
operationRule.validateValue(currentValue, fieldDef, currentPath);
|
|
183
|
+
if (!this.fullPatch.metadata.pathFieldTypes) {
|
|
184
|
+
this.fullPatch.metadata.pathFieldTypes = [];
|
|
185
|
+
}
|
|
186
|
+
this.fullPatch.metadata.pathFieldTypes.push(fieldDef.type);
|
|
187
|
+
}
|
|
188
|
+
this.valid = true;
|
|
189
|
+
}
|
|
190
|
+
static validateAgainstType(value, fieldDef, path) {
|
|
191
|
+
switch (fieldDef.type) {
|
|
192
|
+
case 'string':
|
|
193
|
+
if (typeof value !== 'string') {
|
|
194
|
+
throw new InvalidJsonPatchException(`Expected string at path: ${path}`);
|
|
195
|
+
}
|
|
196
|
+
break;
|
|
197
|
+
case 'number':
|
|
198
|
+
if (typeof value !== 'number' || isNaN(value)) {
|
|
199
|
+
throw new InvalidJsonPatchException(`Expected number at path: ${path}`);
|
|
200
|
+
}
|
|
201
|
+
break;
|
|
202
|
+
case 'boolean':
|
|
203
|
+
if (typeof value !== 'boolean') {
|
|
204
|
+
throw new InvalidJsonPatchException(`Expected boolean at path: ${path}`);
|
|
205
|
+
}
|
|
206
|
+
break;
|
|
207
|
+
case 'date':
|
|
208
|
+
const date = new Date(value);
|
|
209
|
+
if (isNaN(date.getTime())) {
|
|
210
|
+
throw new InvalidJsonPatchException(`Expected valid date at path: ${path}`);
|
|
211
|
+
}
|
|
212
|
+
break;
|
|
213
|
+
case 'object':
|
|
214
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
215
|
+
throw new InvalidJsonPatchException(`Expected object at path: ${path}`);
|
|
216
|
+
}
|
|
217
|
+
if (NexxusJsonPatch.isObjectFieldDef(fieldDef)) {
|
|
218
|
+
for (const [key, propDef] of Object.entries(fieldDef.properties)) {
|
|
219
|
+
if (propDef.required && !(key in value)) {
|
|
220
|
+
throw new InvalidJsonPatchException(`Required field missing: ${path}.${key}`);
|
|
221
|
+
}
|
|
222
|
+
if (key in value) {
|
|
223
|
+
NexxusJsonPatch.validateAgainstType(value[key], propDef, `${path}.${key}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
break;
|
|
228
|
+
case 'array':
|
|
229
|
+
if (!Array.isArray(value)) {
|
|
230
|
+
throw new InvalidJsonPatchException(`Expected array at path: ${path}`);
|
|
231
|
+
}
|
|
232
|
+
if (NexxusJsonPatch.isArrayFieldDef(fieldDef)) {
|
|
233
|
+
value.forEach((element, index) => {
|
|
234
|
+
const elementPath = `${path}[${index}]`;
|
|
235
|
+
if (fieldDef.arrayType === 'object') {
|
|
236
|
+
if (!fieldDef.properties) {
|
|
237
|
+
throw new InvalidJsonPatchException(`Array of objects at "${path}" is missing properties definition`);
|
|
238
|
+
}
|
|
239
|
+
const objFieldDef = {
|
|
240
|
+
type: 'object',
|
|
241
|
+
properties: fieldDef.properties,
|
|
242
|
+
required: false
|
|
243
|
+
};
|
|
244
|
+
NexxusJsonPatch.validateAgainstType(element, objFieldDef, elementPath);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
const primitiveFieldDef = {
|
|
248
|
+
type: fieldDef.arrayType,
|
|
249
|
+
required: false
|
|
250
|
+
};
|
|
251
|
+
NexxusJsonPatch.validateAgainstType(element, primitiveFieldDef, elementPath);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
break;
|
|
256
|
+
default:
|
|
257
|
+
throw new InvalidJsonPatchException(`Unknown field type at path: ${path}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
static traverseSchema(schema, path) {
|
|
261
|
+
const parts = path.split('.');
|
|
262
|
+
let current = schema;
|
|
263
|
+
for (let i = 0; i < parts.length; i++) {
|
|
264
|
+
const part = parts[i];
|
|
265
|
+
if (!(part in current)) {
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
const fieldDef = current[part];
|
|
269
|
+
if (i === parts.length - 1) {
|
|
270
|
+
return fieldDef;
|
|
271
|
+
}
|
|
272
|
+
if (fieldDef.type === 'object') {
|
|
273
|
+
const objDef = fieldDef;
|
|
274
|
+
current = objDef.properties;
|
|
275
|
+
}
|
|
276
|
+
else if (fieldDef.type === 'array') {
|
|
277
|
+
const arrDef = fieldDef;
|
|
278
|
+
if (arrDef.arrayType === 'object' && 'properties' in arrDef) {
|
|
279
|
+
current = arrDef.properties;
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
static validateValueType(value, fieldDef, path) {
|
|
292
|
+
const { type } = fieldDef;
|
|
293
|
+
switch (type) {
|
|
294
|
+
case 'string':
|
|
295
|
+
return this.validateString(value, path);
|
|
296
|
+
case 'number':
|
|
297
|
+
return this.validateNumber(value, path);
|
|
298
|
+
case 'boolean':
|
|
299
|
+
return this.validateBoolean(value, path);
|
|
300
|
+
case 'date':
|
|
301
|
+
return this.validateDate(value, path);
|
|
302
|
+
case 'object':
|
|
303
|
+
return this.validateObject(value, fieldDef, path);
|
|
304
|
+
case 'array':
|
|
305
|
+
return this.validateArray(value, fieldDef, path);
|
|
306
|
+
default:
|
|
307
|
+
throw new InvalidJsonPatchException(`Unknown field type "${type}" at path "${path}"`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
static validateString(value, path) {
|
|
311
|
+
if (typeof value !== 'string') {
|
|
312
|
+
throw new InvalidJsonPatchException(`Value at path "${path}" must be a string`);
|
|
313
|
+
}
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
static validateNumber(value, path) {
|
|
317
|
+
if (typeof value !== 'number' || isNaN(value)) {
|
|
318
|
+
throw new InvalidJsonPatchException(`Value at path "${path}" must be a number`);
|
|
319
|
+
}
|
|
320
|
+
return true;
|
|
321
|
+
}
|
|
322
|
+
static validateBoolean(value, path) {
|
|
323
|
+
if (typeof value !== 'boolean') {
|
|
324
|
+
throw new InvalidJsonPatchException(`Value at path "${path}" must be a boolean`);
|
|
325
|
+
}
|
|
326
|
+
return true;
|
|
327
|
+
}
|
|
328
|
+
static validateDate(value, path) {
|
|
329
|
+
const isValid = typeof value === 'string' && !isNaN(Date.parse(value)) || typeof value === 'number' && !isNaN(new Date(value).getTime());
|
|
330
|
+
if (!isValid) {
|
|
331
|
+
throw new InvalidJsonPatchException(`Value at path "${path}" must be a valid date`);
|
|
332
|
+
}
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
static validateObject(value, fieldDef, path) {
|
|
336
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
337
|
+
throw new InvalidJsonPatchException(`Value at path "${path}" must be an object`);
|
|
338
|
+
}
|
|
339
|
+
for (const key in value) {
|
|
340
|
+
const nestedFieldDef = fieldDef.properties[key];
|
|
341
|
+
if (!nestedFieldDef) {
|
|
342
|
+
throw new InvalidJsonPatchException(`Unknown property "${key}" in object at path "${path}"`);
|
|
343
|
+
}
|
|
344
|
+
const nestedPath = path ? `${path}.${key}` : key;
|
|
345
|
+
this.validateValueType(value[key], nestedFieldDef, nestedPath);
|
|
346
|
+
}
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
static validateArray(value, fieldDef, path) {
|
|
350
|
+
if (!Array.isArray(value)) {
|
|
351
|
+
throw new InvalidJsonPatchException(`Value at path "${path}" must be an array`);
|
|
352
|
+
}
|
|
353
|
+
const { arrayType } = fieldDef;
|
|
354
|
+
value.forEach((item, index) => {
|
|
355
|
+
const itemPath = `${path}[${index}]`;
|
|
356
|
+
if (arrayType === 'object') {
|
|
357
|
+
const objDef = fieldDef;
|
|
358
|
+
this.validateObject(item, objDef, itemPath);
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
this.validatePrimitiveType(item, arrayType, itemPath);
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
return true;
|
|
365
|
+
}
|
|
366
|
+
static validatePrimitiveType(value, type, path) {
|
|
367
|
+
switch (type) {
|
|
368
|
+
case 'string':
|
|
369
|
+
return this.validateString(value, path);
|
|
370
|
+
case 'number':
|
|
371
|
+
return this.validateNumber(value, path);
|
|
372
|
+
case 'boolean':
|
|
373
|
+
return this.validateBoolean(value, path);
|
|
374
|
+
case 'date':
|
|
375
|
+
return this.validateDate(value, path);
|
|
376
|
+
default:
|
|
377
|
+
throw new InvalidJsonPatchException(`Unknown primitive type "${type}" at path "${path}"`);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
static isObjectFieldDef(fieldDef) {
|
|
381
|
+
return fieldDef.type === 'object';
|
|
382
|
+
}
|
|
383
|
+
static isArrayFieldDef(fieldDef) {
|
|
384
|
+
return fieldDef.type === 'array';
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
//# sourceMappingURL=JsonPatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonPatch.js","sourceRoot":"","sources":["../../src/common/JsonPatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelTypes.js","sourceRoot":"","sources":["../../src/common/ModelTypes.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueuePayloads.js","sourceRoot":"","sources":["../../src/common/QueuePayloads.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export class NexxusSchemaValidator {
|
|
2
|
+
static validateUserDetails(partialDetails, userDetailSchema) {
|
|
3
|
+
for (const field in partialDetails) {
|
|
4
|
+
const fieldDef = userDetailSchema[field];
|
|
5
|
+
const fieldValue = partialDetails[field];
|
|
6
|
+
if (!fieldDef) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
switch (fieldDef.type) {
|
|
10
|
+
case 'string':
|
|
11
|
+
if (typeof fieldValue !== 'string')
|
|
12
|
+
return false;
|
|
13
|
+
break;
|
|
14
|
+
case 'number':
|
|
15
|
+
if (typeof fieldValue !== 'number')
|
|
16
|
+
return false;
|
|
17
|
+
break;
|
|
18
|
+
case 'boolean':
|
|
19
|
+
if (typeof fieldValue !== 'boolean')
|
|
20
|
+
return false;
|
|
21
|
+
break;
|
|
22
|
+
case 'object':
|
|
23
|
+
if (typeof fieldValue !== 'object' || Array.isArray(fieldValue))
|
|
24
|
+
return false;
|
|
25
|
+
break;
|
|
26
|
+
case 'array':
|
|
27
|
+
if (!Array.isArray(fieldValue))
|
|
28
|
+
return false;
|
|
29
|
+
break;
|
|
30
|
+
default:
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=SchemaValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaValidator.js","sourceRoot":"","sources":["../../src/common/SchemaValidator.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,qBAAqB;IACzB,MAAM,CAAC,mBAAmB,CAAC,cAAmC,EAAE,gBAAwC;QAC7G,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YAEzC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,KAAK,CAAC;YACf,CAAC;YAED,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACtB,KAAK,QAAQ;oBACX,IAAI,OAAO,UAAU,KAAK,QAAQ;wBAAE,OAAO,KAAK,CAAC;oBACjD,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,OAAO,UAAU,KAAK,QAAQ;wBAAE,OAAO,KAAK,CAAC;oBACjD,MAAM;gBACR,KAAK,SAAS;oBACZ,IAAI,OAAO,UAAU,KAAK,SAAS;wBACjC,OAAO,KAAK,CAAC;oBACf,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;wBAAE,OAAO,KAAK,CAAC;oBAC9E,MAAM;gBACR,KAAK,OAAO;oBACV,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;wBAAE,OAAO,KAAK,CAAC;oBAC7C,MAAM;gBACR;oBACE,OAAO,KAAK,CAAC;YACjB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export * from "./lib/Exceptions";
|
|
2
|
+
export * from "./lib/ConfigProvider";
|
|
3
|
+
export * from "./lib/ConfigManager";
|
|
4
|
+
export * from "./lib/BaseService";
|
|
5
|
+
export * from "./lib/Logger";
|
|
6
|
+
export * from "./common/QueuePayloads";
|
|
7
|
+
export * from "./common/JsonPatch";
|
|
8
|
+
export * from "./common/FilterQuery";
|
|
9
|
+
export * from "./models/BaseModel";
|
|
10
|
+
export * from './common/BuiltinSchemas';
|
|
11
|
+
export * from "./models/AppModel";
|
|
12
|
+
export * from "./models/Application";
|
|
13
|
+
export * from "./models/User";
|
|
14
|
+
export const NEXXUS_PREFIX_LC = "nxx";
|
|
15
|
+
export const NEXXUS_PREFIX_UC = "NXX";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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;AAE7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { FatalErrorException } from "./Exceptions";
|
|
3
|
+
import * as fs from "node:fs";
|
|
4
|
+
import { EventEmitter } from 'node:events';
|
|
5
|
+
function frozen(target, propertyKey) {
|
|
6
|
+
Object.defineProperty(target, propertyKey, {
|
|
7
|
+
value: Object.freeze(target[propertyKey]),
|
|
8
|
+
writable: false,
|
|
9
|
+
configurable: false
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
class TypedEventEmitter {
|
|
13
|
+
emitter;
|
|
14
|
+
constructor() {
|
|
15
|
+
this.emitter = new EventEmitter();
|
|
16
|
+
}
|
|
17
|
+
on(event, listener) {
|
|
18
|
+
this.emitter.on(event, listener);
|
|
19
|
+
return this;
|
|
20
|
+
}
|
|
21
|
+
once(event, listener) {
|
|
22
|
+
this.emitter.once(event, listener);
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
off(event, listener) {
|
|
26
|
+
this.emitter.off(event, listener);
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
emit(event, ...payload) {
|
|
30
|
+
return this.emitter.emit(event, ...payload);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class NexxusBaseService extends TypedEventEmitter {
|
|
34
|
+
config;
|
|
35
|
+
static envVars;
|
|
36
|
+
static cliArgs;
|
|
37
|
+
static schemaPath;
|
|
38
|
+
static schemaContents;
|
|
39
|
+
constructor(config) {
|
|
40
|
+
super();
|
|
41
|
+
this.config = config;
|
|
42
|
+
}
|
|
43
|
+
static envVarConfig() {
|
|
44
|
+
if (!this.envVars) {
|
|
45
|
+
throw new FatalErrorException(`Env vars spec not set for ${this.name} class.`);
|
|
46
|
+
}
|
|
47
|
+
return this.envVars;
|
|
48
|
+
}
|
|
49
|
+
static cliArgConfig() {
|
|
50
|
+
if (!this.cliArgs) {
|
|
51
|
+
throw new FatalErrorException(`CLI args spec not set for ${this.name} class.`);
|
|
52
|
+
}
|
|
53
|
+
return this.cliArgs;
|
|
54
|
+
}
|
|
55
|
+
static schema() {
|
|
56
|
+
if (!this.schemaPath) {
|
|
57
|
+
throw new FatalErrorException(`Schema path not set for ${this.name} class.`);
|
|
58
|
+
}
|
|
59
|
+
if (!this.schemaContents) {
|
|
60
|
+
this.schemaContents = fs.readFileSync(this.schemaPath, 'utf-8');
|
|
61
|
+
}
|
|
62
|
+
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
|
+
return {
|
|
69
|
+
name: this.name,
|
|
70
|
+
where: definition.$comment,
|
|
71
|
+
definition,
|
|
72
|
+
required: true
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
__decorate([
|
|
77
|
+
frozen
|
|
78
|
+
], NexxusBaseService.prototype, "config", void 0);
|
|
79
|
+
//# sourceMappingURL=BaseService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseService.js","sourceRoot":"","sources":["../../src/lib/BaseService.ts"],"names":[],"mappings":"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"}
|