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.
Files changed (114) hide show
  1. package/.eslintrc.js +6 -0
  2. package/LICENSE +177 -0
  3. package/README.md +6 -0
  4. package/docs/RU-README.md +6 -0
  5. package/lib/Container.d.ts +30 -0
  6. package/lib/Container.js +236 -0
  7. package/lib/DeviceManager.d.ts +32 -0
  8. package/lib/DeviceManager.js +143 -0
  9. package/lib/IServiceStructure.d.ts +5 -0
  10. package/lib/IServiceStructure.js +2 -0
  11. package/lib/IStructureDevice.d.ts +7 -0
  12. package/lib/IStructureDevice.js +2 -0
  13. package/lib/ImportManager.d.ts +15 -0
  14. package/lib/ImportManager.js +145 -0
  15. package/lib/MainProcess.d.ts +9 -0
  16. package/lib/MainProcess.js +28 -0
  17. package/lib/Utility.d.ts +21 -0
  18. package/lib/Utility.js +48 -0
  19. package/lib/actions/Action.d.ts +4 -0
  20. package/lib/actions/Action.js +16 -0
  21. package/lib/actions/BasicAction.d.ts +15 -0
  22. package/lib/actions/BasicAction.js +44 -0
  23. package/lib/actions/GlobalAction.d.ts +4 -0
  24. package/lib/actions/GlobalAction.js +17 -0
  25. package/lib/actions/IAction.d.ts +11 -0
  26. package/lib/actions/IAction.js +2 -0
  27. package/lib/actions/ILocalAction.d.ts +11 -0
  28. package/lib/actions/ILocalAction.js +2 -0
  29. package/lib/errors/CoreError.d.ts +53 -0
  30. package/lib/errors/CoreError.js +81 -0
  31. package/lib/errors/ErrorManager.d.ts +47 -0
  32. package/lib/errors/ErrorManager.js +84 -0
  33. package/lib/index.d.ts +19 -0
  34. package/lib/index.js +55 -0
  35. package/lib/ports/BasicPort.d.ts +11 -0
  36. package/lib/ports/BasicPort.js +49 -0
  37. package/lib/ports/ILocalPort.d.ts +10 -0
  38. package/lib/ports/ILocalPort.js +2 -0
  39. package/lib/ports/IPort.d.ts +10 -0
  40. package/lib/ports/IPort.js +2 -0
  41. package/lib/ports/Port.d.ts +6 -0
  42. package/lib/ports/Port.js +20 -0
  43. package/lib/ports/ReturnPort.d.ts +6 -0
  44. package/lib/ports/ReturnPort.js +21 -0
  45. package/lib/ports/StandartPort.d.ts +4 -0
  46. package/lib/ports/StandartPort.js +17 -0
  47. package/lib/service/Device.d.ts +175 -0
  48. package/lib/service/Device.js +191 -0
  49. package/lib/service/DeviceConnect.d.ts +21 -0
  50. package/lib/service/DeviceConnect.js +32 -0
  51. package/lib/service/DevicePort.d.ts +24 -0
  52. package/lib/service/DevicePort.js +41 -0
  53. package/lib/service/IDeviceEvent.d.ts +5 -0
  54. package/lib/service/IDeviceEvent.js +2 -0
  55. package/lib/test.d.ts +1 -0
  56. package/lib/test.js +58 -0
  57. package/lib/validator/IValidationProblem.d.ts +8 -0
  58. package/lib/validator/IValidationProblem.js +2 -0
  59. package/lib/validator/IValidationRule.d.ts +9 -0
  60. package/lib/validator/IValidationRule.js +2 -0
  61. package/lib/validator/IValidationSubrule.d.ts +4 -0
  62. package/lib/validator/IValidationSubrule.js +2 -0
  63. package/lib/validator/Rule.d.ts +12 -0
  64. package/lib/validator/Rule.js +30 -0
  65. package/lib/validator/Validator.d.ts +14 -0
  66. package/lib/validator/Validator.js +57 -0
  67. package/lib/validator/types/ArrayType.d.ts +14 -0
  68. package/lib/validator/types/ArrayType.js +58 -0
  69. package/lib/validator/types/BasicType.d.ts +18 -0
  70. package/lib/validator/types/BasicType.js +54 -0
  71. package/lib/validator/types/NumberType.d.ts +19 -0
  72. package/lib/validator/types/NumberType.js +66 -0
  73. package/lib/validator/types/ObjectType.d.ts +18 -0
  74. package/lib/validator/types/ObjectType.js +51 -0
  75. package/lib/validator/types/StringType.d.ts +19 -0
  76. package/lib/validator/types/StringType.js +63 -0
  77. package/package.json +26 -0
  78. package/src/Container.ts +237 -0
  79. package/src/DeviceManager.ts +124 -0
  80. package/src/IServiceStructure.ts +6 -0
  81. package/src/IStructureDevice.ts +5 -0
  82. package/src/ImportManager.ts +112 -0
  83. package/src/MainProcess.ts +18 -0
  84. package/src/Utility.ts +44 -0
  85. package/src/actions/Action.ts +12 -0
  86. package/src/actions/BasicAction.ts +54 -0
  87. package/src/actions/GlobalAction.ts +14 -0
  88. package/src/actions/IAction.ts +8 -0
  89. package/src/actions/ILocalAction.ts +8 -0
  90. package/src/errors/CoreError.ts +87 -0
  91. package/src/errors/ErrorManager.ts +93 -0
  92. package/src/index.ts +30 -0
  93. package/src/ports/BasicPort.ts +53 -0
  94. package/src/ports/ILocalPort.ts +12 -0
  95. package/src/ports/IPort.ts +12 -0
  96. package/src/ports/Port.ts +17 -0
  97. package/src/ports/ReturnPort.ts +19 -0
  98. package/src/ports/StandartPort.ts +13 -0
  99. package/src/service/Device.ts +225 -0
  100. package/src/service/DeviceConnect.ts +36 -0
  101. package/src/service/DevicePort.ts +46 -0
  102. package/src/service/IDeviceEvent.ts +5 -0
  103. package/src/test.ts +82 -0
  104. package/src/validator/IValidationProblem.ts +9 -0
  105. package/src/validator/IValidationRule.ts +10 -0
  106. package/src/validator/IValidationSubrule.ts +5 -0
  107. package/src/validator/Rule.ts +30 -0
  108. package/src/validator/Validator.ts +67 -0
  109. package/src/validator/types/ArrayType.ts +67 -0
  110. package/src/validator/types/BasicType.ts +61 -0
  111. package/src/validator/types/NumberType.ts +86 -0
  112. package/src/validator/types/ObjectType.ts +58 -0
  113. package/src/validator/types/StringType.ts +79 -0
  114. 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;
@@ -0,0 +1,5 @@
1
+ export default interface IDeviceEvent {
2
+ id: string;
3
+ data: string;
4
+ trace: any;
5
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
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,8 @@
1
+ import IValidationRule from "./IValidationRule";
2
+ export default interface IValidationProblem {
3
+ type: string;
4
+ code: string;
5
+ description: string;
6
+ rule: IValidationRule;
7
+ arg: any;
8
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,9 @@
1
+ import IValidationSubrule from "./IValidationSubrule";
2
+ export default interface IValidationRule {
3
+ type: string;
4
+ require: boolean;
5
+ default: any;
6
+ rules: Array<IValidationSubrule>;
7
+ example: any;
8
+ description: string;
9
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ export default interface IValidationSubrule {
2
+ name: string;
3
+ args: any;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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
+ }