vrack2-core 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/.eslintrc.js +6 -0
- package/LICENSE +177 -0
- package/README.md +6 -0
- package/docs/RU-README.md +6 -0
- package/lib/Container.d.ts +30 -0
- package/lib/Container.js +236 -0
- package/lib/DeviceManager.d.ts +32 -0
- package/lib/DeviceManager.js +143 -0
- package/lib/IServiceStructure.d.ts +5 -0
- package/lib/IServiceStructure.js +2 -0
- package/lib/IStructureDevice.d.ts +7 -0
- package/lib/IStructureDevice.js +2 -0
- package/lib/ImportManager.d.ts +15 -0
- package/lib/ImportManager.js +145 -0
- package/lib/MainProcess.d.ts +9 -0
- package/lib/MainProcess.js +28 -0
- package/lib/Utility.d.ts +21 -0
- package/lib/Utility.js +48 -0
- package/lib/actions/Action.d.ts +4 -0
- package/lib/actions/Action.js +16 -0
- package/lib/actions/BasicAction.d.ts +15 -0
- package/lib/actions/BasicAction.js +44 -0
- package/lib/actions/GlobalAction.d.ts +4 -0
- package/lib/actions/GlobalAction.js +17 -0
- package/lib/actions/IAction.d.ts +11 -0
- package/lib/actions/IAction.js +2 -0
- package/lib/actions/ILocalAction.d.ts +11 -0
- package/lib/actions/ILocalAction.js +2 -0
- package/lib/errors/CoreError.d.ts +53 -0
- package/lib/errors/CoreError.js +81 -0
- package/lib/errors/ErrorManager.d.ts +47 -0
- package/lib/errors/ErrorManager.js +84 -0
- package/lib/index.d.ts +19 -0
- package/lib/index.js +55 -0
- package/lib/ports/BasicPort.d.ts +11 -0
- package/lib/ports/BasicPort.js +49 -0
- package/lib/ports/ILocalPort.d.ts +10 -0
- package/lib/ports/ILocalPort.js +2 -0
- package/lib/ports/IPort.d.ts +10 -0
- package/lib/ports/IPort.js +2 -0
- package/lib/ports/Port.d.ts +6 -0
- package/lib/ports/Port.js +20 -0
- package/lib/ports/ReturnPort.d.ts +6 -0
- package/lib/ports/ReturnPort.js +21 -0
- package/lib/ports/StandartPort.d.ts +4 -0
- package/lib/ports/StandartPort.js +17 -0
- package/lib/service/Device.d.ts +175 -0
- package/lib/service/Device.js +191 -0
- package/lib/service/DeviceConnect.d.ts +21 -0
- package/lib/service/DeviceConnect.js +32 -0
- package/lib/service/DevicePort.d.ts +24 -0
- package/lib/service/DevicePort.js +41 -0
- package/lib/service/IDeviceEvent.d.ts +5 -0
- package/lib/service/IDeviceEvent.js +2 -0
- package/lib/test.d.ts +1 -0
- package/lib/test.js +58 -0
- package/lib/validator/IValidationProblem.d.ts +8 -0
- package/lib/validator/IValidationProblem.js +2 -0
- package/lib/validator/IValidationRule.d.ts +9 -0
- package/lib/validator/IValidationRule.js +2 -0
- package/lib/validator/IValidationSubrule.d.ts +4 -0
- package/lib/validator/IValidationSubrule.js +2 -0
- package/lib/validator/Rule.d.ts +12 -0
- package/lib/validator/Rule.js +30 -0
- package/lib/validator/Validator.d.ts +14 -0
- package/lib/validator/Validator.js +57 -0
- package/lib/validator/types/ArrayType.d.ts +14 -0
- package/lib/validator/types/ArrayType.js +58 -0
- package/lib/validator/types/BasicType.d.ts +18 -0
- package/lib/validator/types/BasicType.js +54 -0
- package/lib/validator/types/NumberType.d.ts +19 -0
- package/lib/validator/types/NumberType.js +66 -0
- package/lib/validator/types/ObjectType.d.ts +18 -0
- package/lib/validator/types/ObjectType.js +51 -0
- package/lib/validator/types/StringType.d.ts +19 -0
- package/lib/validator/types/StringType.js +63 -0
- package/package.json +26 -0
- package/src/Container.ts +237 -0
- package/src/DeviceManager.ts +124 -0
- package/src/IServiceStructure.ts +6 -0
- package/src/IStructureDevice.ts +5 -0
- package/src/ImportManager.ts +112 -0
- package/src/MainProcess.ts +18 -0
- package/src/Utility.ts +44 -0
- package/src/actions/Action.ts +12 -0
- package/src/actions/BasicAction.ts +54 -0
- package/src/actions/GlobalAction.ts +14 -0
- package/src/actions/IAction.ts +8 -0
- package/src/actions/ILocalAction.ts +8 -0
- package/src/errors/CoreError.ts +87 -0
- package/src/errors/ErrorManager.ts +93 -0
- package/src/index.ts +30 -0
- package/src/ports/BasicPort.ts +53 -0
- package/src/ports/ILocalPort.ts +12 -0
- package/src/ports/IPort.ts +12 -0
- package/src/ports/Port.ts +17 -0
- package/src/ports/ReturnPort.ts +19 -0
- package/src/ports/StandartPort.ts +13 -0
- package/src/service/Device.ts +225 -0
- package/src/service/DeviceConnect.ts +36 -0
- package/src/service/DevicePort.ts +46 -0
- package/src/service/IDeviceEvent.ts +5 -0
- package/src/test.ts +82 -0
- package/src/validator/IValidationProblem.ts +9 -0
- package/src/validator/IValidationRule.ts +10 -0
- package/src/validator/IValidationSubrule.ts +5 -0
- package/src/validator/Rule.ts +30 -0
- package/src/validator/Validator.ts +67 -0
- package/src/validator/types/ArrayType.ts +67 -0
- package/src/validator/types/BasicType.ts +61 -0
- package/src/validator/types/NumberType.ts +86 -0
- package/src/validator/types/ObjectType.ts +58 -0
- package/src/validator/types/StringType.ts +79 -0
- package/tsconfig.json +103 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright © 2022 Boris Bobylev. All rights reserved.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0
|
|
5
|
+
*/
|
|
6
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
7
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
8
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
9
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
10
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
11
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
12
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.EDeviceMessageTypes = void 0;
|
|
17
|
+
/**
|
|
18
|
+
* Интерфейс списка исходящих портов устройства
|
|
19
|
+
// */
|
|
20
|
+
// export interface IDeviceOutputList {
|
|
21
|
+
// [index: string]: OutputPort;
|
|
22
|
+
// }
|
|
23
|
+
// /**
|
|
24
|
+
// * Интерфейс списка входящих портов устройства
|
|
25
|
+
// */
|
|
26
|
+
// export interface IDeviceInputList {
|
|
27
|
+
// [index: string]: InputPort;
|
|
28
|
+
// }
|
|
29
|
+
var EDeviceMessageTypes;
|
|
30
|
+
(function (EDeviceMessageTypes) {
|
|
31
|
+
EDeviceMessageTypes["terminal"] = "terminal";
|
|
32
|
+
EDeviceMessageTypes["info"] = "info";
|
|
33
|
+
EDeviceMessageTypes["error"] = "error";
|
|
34
|
+
EDeviceMessageTypes["event"] = "event";
|
|
35
|
+
EDeviceMessageTypes["action"] = "action";
|
|
36
|
+
EDeviceMessageTypes["alert"] = "alert";
|
|
37
|
+
})(EDeviceMessageTypes = exports.EDeviceMessageTypes || (exports.EDeviceMessageTypes = {}));
|
|
38
|
+
class Device {
|
|
39
|
+
constructor(id, type, Container) {
|
|
40
|
+
/** Входящие (назначаемые сверху) параметры устройства */
|
|
41
|
+
this.options = {};
|
|
42
|
+
/**
|
|
43
|
+
* Shares данные устройства (обновляемые данные)
|
|
44
|
+
* используется с методом `this.render`
|
|
45
|
+
*
|
|
46
|
+
* @see render()
|
|
47
|
+
* */
|
|
48
|
+
this.shares = {};
|
|
49
|
+
/**
|
|
50
|
+
*
|
|
51
|
+
*/
|
|
52
|
+
this.storage = {};
|
|
53
|
+
this.id = id;
|
|
54
|
+
this.type = type;
|
|
55
|
+
this.Container = Container;
|
|
56
|
+
this.ports = {
|
|
57
|
+
input: {},
|
|
58
|
+
output: {}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Short device description
|
|
63
|
+
*
|
|
64
|
+
* @return {string} Device description
|
|
65
|
+
* */
|
|
66
|
+
description() {
|
|
67
|
+
return '';
|
|
68
|
+
}
|
|
69
|
+
/** Список Action-методов устройства */
|
|
70
|
+
actions() { return {}; }
|
|
71
|
+
/**
|
|
72
|
+
* Определение списка параметров устройства
|
|
73
|
+
*
|
|
74
|
+
* @returns {Array<Rule>}
|
|
75
|
+
* */
|
|
76
|
+
checkOptions() { return {}; }
|
|
77
|
+
/**
|
|
78
|
+
* Prepare options
|
|
79
|
+
*
|
|
80
|
+
* this method call before validating options
|
|
81
|
+
*/
|
|
82
|
+
prepareOptions() { return; }
|
|
83
|
+
inputs() { return {}; }
|
|
84
|
+
outputs() { return {}; }
|
|
85
|
+
/**
|
|
86
|
+
* Метод является входной точкой для начала инициализации устройства
|
|
87
|
+
*
|
|
88
|
+
* Устройство пройдет только следующие этапы создания устройства:
|
|
89
|
+
*
|
|
90
|
+
* - Создания класса
|
|
91
|
+
* - Назначение праметров устройства
|
|
92
|
+
*
|
|
93
|
+
* Необходимо использовать для назначения функций вызова динамических портов
|
|
94
|
+
* устройства.
|
|
95
|
+
*/
|
|
96
|
+
preProcess() { return; }
|
|
97
|
+
/**
|
|
98
|
+
* Метод является входной точкой для начала работы устройства
|
|
99
|
+
*
|
|
100
|
+
* Устройство пройдет следующие этапы создания устройства:
|
|
101
|
+
*
|
|
102
|
+
* - Создания класса
|
|
103
|
+
* - Назначение праметров устройства
|
|
104
|
+
* - Создание портов
|
|
105
|
+
* - Назначение функций вызова
|
|
106
|
+
* - Создание соединений между устройствами
|
|
107
|
+
* - Линковка Shares устройства
|
|
108
|
+
*
|
|
109
|
+
* Необходимо использовать для осуществления начала основной работы устройства
|
|
110
|
+
* например, инициализация подключений, создание таймеров и тп.
|
|
111
|
+
*/
|
|
112
|
+
process() { return; }
|
|
113
|
+
/**
|
|
114
|
+
* По аналогии с `process` но асинхронный, загрузчик будет ждать выполнения всех
|
|
115
|
+
* методов `processPromise` всех устройств.
|
|
116
|
+
*
|
|
117
|
+
* Используется, когда есть необходимость перед запуском стойки выполнить
|
|
118
|
+
* и дождаться выполнения асинхронного кода (инициализация некоторых файловых баз данных и тп)
|
|
119
|
+
*/
|
|
120
|
+
processPromise() {
|
|
121
|
+
return __awaiter(this, void 0, void 0, function* () { return; });
|
|
122
|
+
}
|
|
123
|
+
stop() { return; }
|
|
124
|
+
stopPromise() {
|
|
125
|
+
return __awaiter(this, void 0, void 0, function* () { return; });
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Метод заменяется загрузчиком стойки, после чего, вызов этого метода приводит
|
|
129
|
+
* к постановке в очередь устройства на обновление данных `Shares`
|
|
130
|
+
*/
|
|
131
|
+
render() { return this.event('device.render', 'shares', this.shares); }
|
|
132
|
+
/**
|
|
133
|
+
* Метод заменяется загрузчиком стойки, после чего, вызов этого метода приводит
|
|
134
|
+
* к сохранение в локальное файловое хранилище данных `Storage`
|
|
135
|
+
*/
|
|
136
|
+
save() { return this.event('device.save', 'storage', this.storage); }
|
|
137
|
+
/**
|
|
138
|
+
* Метод заменяется загрузчиком стойки, после чего, вызов этого метода приводит
|
|
139
|
+
* к отправке сообщению об ошибке
|
|
140
|
+
*
|
|
141
|
+
* @param {string} data Сообщение об ошибке
|
|
142
|
+
* @param {any} trace Непосредственно объект ошибки, или объект который поможет разобратся в случившейся ситуации
|
|
143
|
+
*/
|
|
144
|
+
error(data, trace) { return this.event('device.error', data, trace); }
|
|
145
|
+
/**
|
|
146
|
+
* Метод заменяется загрузчиком стойки, после чего, вызов этого метода приводит
|
|
147
|
+
* к отправке информационного сообщения
|
|
148
|
+
*
|
|
149
|
+
* @param {string} data Сообщение об ошибке
|
|
150
|
+
* @param {any} trace Дополнительная информация
|
|
151
|
+
*/
|
|
152
|
+
notify(data, trace) { return this.event('device.notify', data, trace); }
|
|
153
|
+
/**
|
|
154
|
+
* Метод заменяется загрузчиком стойки, после чего, вызов этого метода приводит
|
|
155
|
+
* к отправке оповещения
|
|
156
|
+
*
|
|
157
|
+
* @param {string} data Сообщение об ошибке
|
|
158
|
+
* @param {any} trace Дополнительная информация
|
|
159
|
+
*/
|
|
160
|
+
alert(data, trace) { return this.event('device.alert', data, trace); }
|
|
161
|
+
/**
|
|
162
|
+
* Метод заменяется загрузчиком стойки, после чего, вызов этого метода приводит
|
|
163
|
+
* к отправке отладочной информации
|
|
164
|
+
*
|
|
165
|
+
* @param {string} data Сообщение об ошибке
|
|
166
|
+
* @param {any} trace Дополнительная информация
|
|
167
|
+
*/
|
|
168
|
+
terminal(data, trace) { return this.event('device.terminal', data, trace); }
|
|
169
|
+
/**
|
|
170
|
+
* Метод заменяется загрузчиком стойки, после чего, вызов этого метода приводит
|
|
171
|
+
* к отправке сообщения о событии
|
|
172
|
+
*
|
|
173
|
+
* @param {string} data Сообщение об ошибке
|
|
174
|
+
* @param {any} trace Дополнительная информация
|
|
175
|
+
*/
|
|
176
|
+
event(type, data, trace) {
|
|
177
|
+
const nEvent = { id: this.id, data, trace };
|
|
178
|
+
return this.Container.emit(type, nEvent);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Сообщает стойке, о том, что устройство не может дальше работать
|
|
182
|
+
* и произошла критическая ошибка
|
|
183
|
+
*
|
|
184
|
+
* Требует создание ошибки устройства DeviceError
|
|
185
|
+
*
|
|
186
|
+
*/
|
|
187
|
+
terminate(error, action) {
|
|
188
|
+
return this.event('device.terminate', action, error);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
exports.default = Device;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import DevicePort from "./DevicePort";
|
|
2
|
+
/**
|
|
3
|
+
* Класс для соедиения портов устройств
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
export default class {
|
|
7
|
+
outputLink: DevicePort;
|
|
8
|
+
inputLink: DevicePort;
|
|
9
|
+
/**
|
|
10
|
+
* Инициализация соединения, требует 2 порта которые привязаны
|
|
11
|
+
* к устройствам
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
14
|
+
constructor(output: DevicePort, input: DevicePort);
|
|
15
|
+
/**
|
|
16
|
+
* Вызов входящего порта при вызове соединения
|
|
17
|
+
*
|
|
18
|
+
* @param {any} data Данные
|
|
19
|
+
*/
|
|
20
|
+
push(data: any): any;
|
|
21
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright © 2022 Boris Bobylev. All rights reserved.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
/**
|
|
8
|
+
* Класс для соедиения портов устройств
|
|
9
|
+
*
|
|
10
|
+
*/
|
|
11
|
+
class default_1 {
|
|
12
|
+
/**
|
|
13
|
+
* Инициализация соединения, требует 2 порта которые привязаны
|
|
14
|
+
* к устройствам
|
|
15
|
+
*
|
|
16
|
+
*/
|
|
17
|
+
constructor(output, input) {
|
|
18
|
+
this.outputLink = output;
|
|
19
|
+
this.inputLink = input;
|
|
20
|
+
this.outputLink.addConnection(this);
|
|
21
|
+
this.inputLink.addConnection(this);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Вызов входящего порта при вызове соединения
|
|
25
|
+
*
|
|
26
|
+
* @param {any} data Данные
|
|
27
|
+
*/
|
|
28
|
+
push(data) {
|
|
29
|
+
return this.inputLink.push(data);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.default = default_1;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import IPort from "../ports/IPort";
|
|
2
|
+
import DeviceConnect from "./DeviceConnect";
|
|
3
|
+
/**
|
|
4
|
+
* Класс для реализации порта устройства
|
|
5
|
+
* Порт может быть как входящий так и исходящий
|
|
6
|
+
*/
|
|
7
|
+
export default class DevicePort {
|
|
8
|
+
connected: boolean;
|
|
9
|
+
connections: Array<DeviceConnect>;
|
|
10
|
+
id: string;
|
|
11
|
+
type: string;
|
|
12
|
+
required: boolean;
|
|
13
|
+
constructor(id: string, port: IPort);
|
|
14
|
+
/**
|
|
15
|
+
* Добавление связи в порт
|
|
16
|
+
*/
|
|
17
|
+
addConnection(connection: DeviceConnect): void;
|
|
18
|
+
/**
|
|
19
|
+
* Вызов входящего порта при вызове соединения
|
|
20
|
+
*
|
|
21
|
+
* @param {any} data Данные
|
|
22
|
+
*/
|
|
23
|
+
push(data: any): any;
|
|
24
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright © 2022 Boris Bobylev. All rights reserved.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
/**
|
|
8
|
+
* Класс для реализации порта устройства
|
|
9
|
+
* Порт может быть как входящий так и исходящий
|
|
10
|
+
*/
|
|
11
|
+
class DevicePort {
|
|
12
|
+
constructor(id, port) {
|
|
13
|
+
this.connected = false;
|
|
14
|
+
this.connections = [];
|
|
15
|
+
this.id = id;
|
|
16
|
+
this.type = port.type;
|
|
17
|
+
this.required = port.required;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Добавление связи в порт
|
|
21
|
+
*/
|
|
22
|
+
addConnection(connection) {
|
|
23
|
+
this.connected = true;
|
|
24
|
+
this.connections.push(connection);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Вызов входящего порта при вызове соединения
|
|
28
|
+
*
|
|
29
|
+
* @param {any} data Данные
|
|
30
|
+
*/
|
|
31
|
+
push(data) {
|
|
32
|
+
if (this.connected) {
|
|
33
|
+
if (this.connections.length === 1)
|
|
34
|
+
return this.connections[0].push(data);
|
|
35
|
+
for (const conn of this.connections) {
|
|
36
|
+
conn.push(data);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.default = DevicePort;
|
package/lib/test.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/lib/test.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// import Action from "./rack/Action";
|
|
3
|
+
// import Port from "./rack/Port";
|
|
4
|
+
// import Rule from "./validator/Rule";
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const Rule_1 = __importDefault(require("./validator/Rule"));
|
|
10
|
+
const Validator_1 = __importDefault(require("./validator/Validator"));
|
|
11
|
+
Rule_1.default.array().require();
|
|
12
|
+
// class Device {
|
|
13
|
+
// options (){
|
|
14
|
+
// return {
|
|
15
|
+
// test: Rule.string().default('Default string').description('Test string'),
|
|
16
|
+
// list: Rule.Array().objects({
|
|
17
|
+
// name: Rule.string(),
|
|
18
|
+
// value: Rule.number()
|
|
19
|
+
// })
|
|
20
|
+
// }
|
|
21
|
+
// }
|
|
22
|
+
// outputs(){
|
|
23
|
+
// return {
|
|
24
|
+
// 'test.output%d': Port.standart().dynamic(5),
|
|
25
|
+
// }
|
|
26
|
+
// }
|
|
27
|
+
// inputs(){
|
|
28
|
+
// return {
|
|
29
|
+
// 'test.output%d': Port.return().dynamic(5),
|
|
30
|
+
// }
|
|
31
|
+
// }
|
|
32
|
+
// actions(){
|
|
33
|
+
// return {
|
|
34
|
+
// 'test.action': Action.global().rules({
|
|
35
|
+
// test: Rule.string().default('Default string').description('Test string'),
|
|
36
|
+
// }).description('Test action for call global')
|
|
37
|
+
// }
|
|
38
|
+
// }
|
|
39
|
+
// init(){
|
|
40
|
+
// }
|
|
41
|
+
// process(){
|
|
42
|
+
// }
|
|
43
|
+
// async processPromise(){
|
|
44
|
+
// }
|
|
45
|
+
// }
|
|
46
|
+
const rules = {
|
|
47
|
+
obj: Rule_1.default.object().require().description('Test validation object'),
|
|
48
|
+
str: Rule_1.default.string().require().minLength(5),
|
|
49
|
+
arr: Rule_1.default.array().require(),
|
|
50
|
+
num: Rule_1.default.number().require().integer().description('integer test')
|
|
51
|
+
};
|
|
52
|
+
const data = {
|
|
53
|
+
obj: {},
|
|
54
|
+
str: 'qwe4',
|
|
55
|
+
arr: [],
|
|
56
|
+
num: 1.23
|
|
57
|
+
};
|
|
58
|
+
Validator_1.default.validate(rules, data);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import ArrayType from "./types/ArrayType";
|
|
2
|
+
import NumberType from "./types/NumberType";
|
|
3
|
+
import ObjectType from "./types/ObjectType";
|
|
4
|
+
import StringType from "./types/StringType";
|
|
5
|
+
/**
|
|
6
|
+
*/
|
|
7
|
+
export default class Rule {
|
|
8
|
+
static number(): NumberType;
|
|
9
|
+
static string(): StringType;
|
|
10
|
+
static object(): ObjectType;
|
|
11
|
+
static array(): ArrayType;
|
|
12
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright © 2022 Boris Bobylev. All rights reserved.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
const ArrayType_1 = __importDefault(require("./types/ArrayType"));
|
|
11
|
+
const NumberType_1 = __importDefault(require("./types/NumberType"));
|
|
12
|
+
const ObjectType_1 = __importDefault(require("./types/ObjectType"));
|
|
13
|
+
const StringType_1 = __importDefault(require("./types/StringType"));
|
|
14
|
+
/**
|
|
15
|
+
*/
|
|
16
|
+
class Rule {
|
|
17
|
+
static number() {
|
|
18
|
+
return new NumberType_1.default();
|
|
19
|
+
}
|
|
20
|
+
static string() {
|
|
21
|
+
return new StringType_1.default();
|
|
22
|
+
}
|
|
23
|
+
static object() {
|
|
24
|
+
return new ObjectType_1.default();
|
|
25
|
+
}
|
|
26
|
+
static array() {
|
|
27
|
+
return new ArrayType_1.default();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.default = Rule;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import BasicType from "./types/BasicType";
|
|
2
|
+
import CoreError from "../errors/CoreError";
|
|
3
|
+
import IValidationProblem from './IValidationProblem';
|
|
4
|
+
import IValidationRule from "./IValidationRule";
|
|
5
|
+
export default class Validator {
|
|
6
|
+
static validate(rules: {
|
|
7
|
+
[key: string]: BasicType;
|
|
8
|
+
}, data: {
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}): boolean;
|
|
11
|
+
private static makeError;
|
|
12
|
+
protected static makeProblem(err: CoreError, key: string, rule: IValidationRule): IValidationProblem;
|
|
13
|
+
private static getClass;
|
|
14
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright © 2022 Boris Bobylev. All rights reserved.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
const ErrorManager_1 = __importDefault(require("../errors/ErrorManager"));
|
|
11
|
+
const ArrayType_1 = __importDefault(require("./types/ArrayType"));
|
|
12
|
+
const NumberType_1 = __importDefault(require("./types/NumberType"));
|
|
13
|
+
const ObjectType_1 = __importDefault(require("./types/ObjectType"));
|
|
14
|
+
const StringType_1 = __importDefault(require("./types/StringType"));
|
|
15
|
+
const CoreError_1 = __importDefault(require("../errors/CoreError"));
|
|
16
|
+
ErrorManager_1.default.register('Validator', 'VXLeMLVnIXGf', 'VR_TYPE_NOT_EXISTS', 'Type not exists', {});
|
|
17
|
+
ErrorManager_1.default.register('Validator', 'X1UP4P2HRHWd', 'VR_NOT_PASS', 'Validation error - data not pass', {});
|
|
18
|
+
class Validator {
|
|
19
|
+
static validate(rules, data) {
|
|
20
|
+
const problems = [];
|
|
21
|
+
for (const key of Object.keys(rules)) {
|
|
22
|
+
const rule = rules[key];
|
|
23
|
+
const ruleRaw = rule.export();
|
|
24
|
+
const cs = Validator.getClass(ruleRaw.type);
|
|
25
|
+
try {
|
|
26
|
+
cs.validate(data, key, ruleRaw);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
if (err instanceof CoreError_1.default)
|
|
30
|
+
problems.push(Validator.makeProblem(err, key, ruleRaw));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (problems.length)
|
|
34
|
+
Validator.makeError(problems);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
static makeError(eList) {
|
|
38
|
+
throw ErrorManager_1.default.make('VR_NOT_PASS', {
|
|
39
|
+
problems: eList
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
static makeProblem(err, key, rule) {
|
|
43
|
+
return {
|
|
44
|
+
type: err.vShort, code: err.vCode, description: err.message, rule, arg: err.vAdd
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
static getClass(cn) {
|
|
48
|
+
switch (cn) {
|
|
49
|
+
case 'string': return StringType_1.default;
|
|
50
|
+
case 'number': return NumberType_1.default;
|
|
51
|
+
case 'object': return ObjectType_1.default;
|
|
52
|
+
case 'array': return ArrayType_1.default;
|
|
53
|
+
}
|
|
54
|
+
throw ErrorManager_1.default.make('VR_TYPE_NOT_EXISTS', { type: cn });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.default = Validator;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import IValidationRule from "../IValidationRule";
|
|
2
|
+
import BasicType from "./BasicType";
|
|
3
|
+
import IValidationSubrule from "../IValidationSubrule";
|
|
4
|
+
export default class ArrayType extends BasicType {
|
|
5
|
+
constructor();
|
|
6
|
+
default(def: Array<any>): this;
|
|
7
|
+
content(t: BasicType): this;
|
|
8
|
+
static validate(obj: {
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
}, key: string, rule: IValidationRule): boolean;
|
|
11
|
+
protected static checkContent(obj: {
|
|
12
|
+
[key: string]: any;
|
|
13
|
+
}, key: string, sub: IValidationSubrule): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright © 2022 Boris Bobylev. All rights reserved.
|
|
4
|
+
* Licensed under the Apache License, Version 2.0
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
const BasicType_1 = __importDefault(require("./BasicType"));
|
|
11
|
+
const ErrorManager_1 = __importDefault(require("../../errors/ErrorManager"));
|
|
12
|
+
const Validator_1 = __importDefault(require("../Validator"));
|
|
13
|
+
const CoreError_1 = __importDefault(require("../../errors/CoreError"));
|
|
14
|
+
class ArrayType extends BasicType_1.default {
|
|
15
|
+
constructor() {
|
|
16
|
+
super();
|
|
17
|
+
this.rule.type = 'array';
|
|
18
|
+
}
|
|
19
|
+
default(def) {
|
|
20
|
+
this.rule.default = def;
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
content(t) {
|
|
24
|
+
this.rule.rules.push({ name: 'contain', args: t });
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
static validate(obj, key, rule) {
|
|
28
|
+
BasicType_1.default.validate(obj, key, rule);
|
|
29
|
+
if (!Array.isArray(obj[key]))
|
|
30
|
+
throw ErrorManager_1.default.make('VR_IS_NOT_ARRAY', {});
|
|
31
|
+
for (const subrule of rule.rules) {
|
|
32
|
+
switch (subrule.name) {
|
|
33
|
+
case 'fields':
|
|
34
|
+
ArrayType.checkContent(obj, key, subrule);
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
static checkContent(obj, key, sub) {
|
|
41
|
+
const sw = { value: undefined };
|
|
42
|
+
const tr = { value: sub.args };
|
|
43
|
+
for (const index of obj[key]) {
|
|
44
|
+
sw.value = obj[key][index];
|
|
45
|
+
try {
|
|
46
|
+
Validator_1.default.validate(tr, sw);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error instanceof CoreError_1.default) {
|
|
50
|
+
throw ErrorManager_1.default.make('VR_ARRAY_CONTENT_ERROR', { index }).add(error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.default = ArrayType;
|
|
57
|
+
ErrorManager_1.default.register('Validator', '3U9s3ZsTH6FA', 'VR_IS_NOT_ARRAY', 'Value must be a array', {});
|
|
58
|
+
ErrorManager_1.default.register('Validator', 'Eg9cIXlxi1yP', 'VR_ARRAY_CONTENT_ERROR', 'Validation error inside the array data', {});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import IValidationRule from "../IValidationRule";
|
|
2
|
+
export default class BasicType {
|
|
3
|
+
protected rule: IValidationRule;
|
|
4
|
+
constructor();
|
|
5
|
+
require(): this;
|
|
6
|
+
example(ex: any): this;
|
|
7
|
+
description(desc: string): this;
|
|
8
|
+
export(): IValidationRule;
|
|
9
|
+
static validate(obj: {
|
|
10
|
+
[key: string]: any;
|
|
11
|
+
}, key: string, rule: IValidationRule): boolean;
|
|
12
|
+
protected static checkDefault(obj: {
|
|
13
|
+
[key: string]: any;
|
|
14
|
+
}, key: string, rule: IValidationRule): void;
|
|
15
|
+
protected static checkRequire(obj: {
|
|
16
|
+
[key: string]: any;
|
|
17
|
+
}, key: string, rule: IValidationRule): void;
|
|
18
|
+
}
|