@ya-modbus/driver-loader 0.4.1-refactor-scope-driver-packages.0
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/CHANGELOG.md +22 -0
- package/LICENSE +674 -0
- package/README.md +353 -0
- package/dist/config-validator.d.ts +53 -0
- package/dist/config-validator.d.ts.map +1 -0
- package/dist/config-validator.js +315 -0
- package/dist/config-validator.js.map +1 -0
- package/dist/errors.d.ts +69 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +89 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +122 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +242 -0
- package/dist/loader.js.map +1 -0
- package/dist/testing/index.d.ts +21 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +25 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing.d.ts +64 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +74 -0
- package/dist/testing.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Runtime validation for driver configuration exports
|
|
4
|
+
*
|
|
5
|
+
* Validates DEFAULT_CONFIG, SUPPORTED_CONFIG, and DEVICES from third-party drivers
|
|
6
|
+
* to ensure type safety at runtime.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.outputConfigWarnings = outputConfigWarnings;
|
|
10
|
+
exports.validateDefaultConfig = validateDefaultConfig;
|
|
11
|
+
exports.validateSupportedConfig = validateSupportedConfig;
|
|
12
|
+
exports.validateDevices = validateDevices;
|
|
13
|
+
exports.crossValidateConfigs = crossValidateConfigs;
|
|
14
|
+
const errors_js_1 = require("./errors.js");
|
|
15
|
+
/**
|
|
16
|
+
* Output configuration warnings to logger
|
|
17
|
+
*
|
|
18
|
+
* @param context - Context description (e.g., "Driver DEFAULT_CONFIG")
|
|
19
|
+
* @param warnings - Array of warning messages
|
|
20
|
+
* @param logger - Logger to output warnings to
|
|
21
|
+
*/
|
|
22
|
+
function outputConfigWarnings(context, warnings, logger = console) {
|
|
23
|
+
logger.warn(`\nWarning: ${context} has configuration inconsistencies:`);
|
|
24
|
+
for (const warning of warnings) {
|
|
25
|
+
logger.warn(` - ${warning}`);
|
|
26
|
+
}
|
|
27
|
+
logger.warn(' This may indicate a driver authoring error\n');
|
|
28
|
+
logger.warn('Run: ya-modbus show-defaults --driver <package> to inspect configuration\n');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Validate that a value is in an array constraint
|
|
32
|
+
*
|
|
33
|
+
* @param value - Value to validate
|
|
34
|
+
* @param validValues - Array of valid values
|
|
35
|
+
* @param fieldName - Field name for error message
|
|
36
|
+
* @param constraintName - Constraint array name for error message
|
|
37
|
+
* @returns Warning message if validation fails, undefined otherwise
|
|
38
|
+
*/
|
|
39
|
+
function validateArrayConstraint(value, validValues, fieldName, constraintName) {
|
|
40
|
+
if (!validValues.includes(value)) {
|
|
41
|
+
// TypeScript narrows the type in each branch, so no need for String() conversions
|
|
42
|
+
const formattedValues = typeof value === 'string'
|
|
43
|
+
? validValues.map((v) => `"${v}"`).join(', ')
|
|
44
|
+
: validValues.join(', ');
|
|
45
|
+
const formattedValue = typeof value === 'string' ? `"${value}"` : value;
|
|
46
|
+
return `${fieldName}: ${formattedValue} is not in ${constraintName}: [${formattedValues}]`;
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Validate DEFAULT_CONFIG export from a driver module
|
|
52
|
+
*
|
|
53
|
+
* @param config - The DEFAULT_CONFIG value to validate
|
|
54
|
+
* @returns Validated config
|
|
55
|
+
* @throws Error with helpful message if validation fails
|
|
56
|
+
*/
|
|
57
|
+
function validateDefaultConfig(config) {
|
|
58
|
+
if (config === null || config === undefined || typeof config !== 'object') {
|
|
59
|
+
throw new errors_js_1.ValidationError('Invalid DEFAULT_CONFIG: must be an object.\n' +
|
|
60
|
+
'Fix: export const DEFAULT_CONFIG = { baudRate: 9600, ... }', 'DEFAULT_CONFIG');
|
|
61
|
+
}
|
|
62
|
+
const configObj = config;
|
|
63
|
+
if ('baudRate' in configObj) {
|
|
64
|
+
validateSerialDefaultConfig(configObj);
|
|
65
|
+
}
|
|
66
|
+
else if ('defaultPort' in configObj) {
|
|
67
|
+
validateTcpDefaultConfig(configObj);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
throw new errors_js_1.ValidationError('Invalid DEFAULT_CONFIG: must have either "baudRate" (serial) or "defaultPort" (TCP).\n' +
|
|
71
|
+
'Fix: export const DEFAULT_CONFIG = { baudRate: 9600, ... } // for serial\n' +
|
|
72
|
+
'Or: export const DEFAULT_CONFIG = { defaultPort: 502, ... } // for TCP', 'DEFAULT_CONFIG');
|
|
73
|
+
}
|
|
74
|
+
return config;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Validate serial DEFAULT_CONFIG properties
|
|
78
|
+
*/
|
|
79
|
+
function validateSerialDefaultConfig(config) {
|
|
80
|
+
if (typeof config['baudRate'] !== 'number') {
|
|
81
|
+
throw new errors_js_1.ValidationError(`Invalid DEFAULT_CONFIG: baudRate must be a number, got ${typeof config['baudRate']}.\n` +
|
|
82
|
+
'Fix: export const DEFAULT_CONFIG = { baudRate: 9600, ... } // number, not string', 'baudRate');
|
|
83
|
+
}
|
|
84
|
+
if ('parity' in config && typeof config['parity'] !== 'string') {
|
|
85
|
+
throw new errors_js_1.ValidationError(`Invalid DEFAULT_CONFIG: parity must be a string, got ${typeof config['parity']}.\n` +
|
|
86
|
+
'Fix: export const DEFAULT_CONFIG = { parity: "even", ... } // string: "none", "even", or "odd"', 'parity');
|
|
87
|
+
}
|
|
88
|
+
if ('dataBits' in config && typeof config['dataBits'] !== 'number') {
|
|
89
|
+
throw new errors_js_1.ValidationError(`Invalid DEFAULT_CONFIG: dataBits must be a number, got ${typeof config['dataBits']}.\n` +
|
|
90
|
+
'Fix: export const DEFAULT_CONFIG = { dataBits: 8, ... } // number: 7 or 8', 'dataBits');
|
|
91
|
+
}
|
|
92
|
+
if ('stopBits' in config && typeof config['stopBits'] !== 'number') {
|
|
93
|
+
throw new errors_js_1.ValidationError(`Invalid DEFAULT_CONFIG: stopBits must be a number, got ${typeof config['stopBits']}.\n` +
|
|
94
|
+
'Fix: export const DEFAULT_CONFIG = { stopBits: 1, ... } // number: 1 or 2', 'stopBits');
|
|
95
|
+
}
|
|
96
|
+
if ('defaultAddress' in config && typeof config['defaultAddress'] !== 'number') {
|
|
97
|
+
throw new errors_js_1.ValidationError(`Invalid DEFAULT_CONFIG: defaultAddress must be a number, got ${typeof config['defaultAddress']}.\n` +
|
|
98
|
+
'Fix: export const DEFAULT_CONFIG = { defaultAddress: 1, ... } // number: 1-247', 'defaultAddress');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Validate TCP DEFAULT_CONFIG properties
|
|
103
|
+
*/
|
|
104
|
+
function validateTcpDefaultConfig(config) {
|
|
105
|
+
if (typeof config['defaultPort'] !== 'number') {
|
|
106
|
+
throw new errors_js_1.ValidationError(`Invalid DEFAULT_CONFIG: defaultPort must be a number, got ${typeof config['defaultPort']}.\n` +
|
|
107
|
+
'Fix: export const DEFAULT_CONFIG = { defaultPort: 502, ... } // number', 'defaultPort');
|
|
108
|
+
}
|
|
109
|
+
if ('defaultAddress' in config && typeof config['defaultAddress'] !== 'number') {
|
|
110
|
+
throw new errors_js_1.ValidationError(`Invalid DEFAULT_CONFIG: defaultAddress must be a number, got ${typeof config['defaultAddress']}.\n` +
|
|
111
|
+
'Fix: export const DEFAULT_CONFIG = { defaultAddress: 1, ... } // number: 1-247', 'defaultAddress');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Validate SUPPORTED_CONFIG export from a driver module
|
|
116
|
+
*
|
|
117
|
+
* @param config - The SUPPORTED_CONFIG value to validate
|
|
118
|
+
* @returns Validated config
|
|
119
|
+
* @throws Error with helpful message if validation fails
|
|
120
|
+
*/
|
|
121
|
+
function validateSupportedConfig(config) {
|
|
122
|
+
if (config === null || config === undefined || typeof config !== 'object') {
|
|
123
|
+
throw new errors_js_1.ValidationError('Invalid SUPPORTED_CONFIG: must be an object.\n' +
|
|
124
|
+
'Fix: export const SUPPORTED_CONFIG = { validBaudRates: [9600, 19200], ... }', 'SUPPORTED_CONFIG');
|
|
125
|
+
}
|
|
126
|
+
const configObj = config;
|
|
127
|
+
if ('validBaudRates' in configObj && !Array.isArray(configObj['validBaudRates'])) {
|
|
128
|
+
throw new errors_js_1.ValidationError(`Invalid SUPPORTED_CONFIG: validBaudRates must be an array, got ${typeof configObj['validBaudRates']}.\n` +
|
|
129
|
+
'Fix: export const SUPPORTED_CONFIG = { validBaudRates: [9600, 19200], ... }', 'validBaudRates');
|
|
130
|
+
}
|
|
131
|
+
if ('validParity' in configObj && !Array.isArray(configObj['validParity'])) {
|
|
132
|
+
throw new errors_js_1.ValidationError(`Invalid SUPPORTED_CONFIG: validParity must be an array, got ${typeof configObj['validParity']}.\n` +
|
|
133
|
+
'Fix: export const SUPPORTED_CONFIG = { validParity: ["none", "even", "odd"], ... }', 'validParity');
|
|
134
|
+
}
|
|
135
|
+
if ('validDataBits' in configObj && !Array.isArray(configObj['validDataBits'])) {
|
|
136
|
+
throw new errors_js_1.ValidationError(`Invalid SUPPORTED_CONFIG: validDataBits must be an array, got ${typeof configObj['validDataBits']}.\n` +
|
|
137
|
+
'Fix: export const SUPPORTED_CONFIG = { validDataBits: [7, 8], ... }', 'validDataBits');
|
|
138
|
+
}
|
|
139
|
+
if ('validStopBits' in configObj && !Array.isArray(configObj['validStopBits'])) {
|
|
140
|
+
throw new errors_js_1.ValidationError(`Invalid SUPPORTED_CONFIG: validStopBits must be an array, got ${typeof configObj['validStopBits']}.\n` +
|
|
141
|
+
'Fix: export const SUPPORTED_CONFIG = { validStopBits: [1, 2], ... }', 'validStopBits');
|
|
142
|
+
}
|
|
143
|
+
if ('validAddressRange' in configObj) {
|
|
144
|
+
if (!Array.isArray(configObj['validAddressRange'])) {
|
|
145
|
+
throw new errors_js_1.ValidationError(`Invalid SUPPORTED_CONFIG: validAddressRange must be an array, got ${typeof configObj['validAddressRange']}.\n` +
|
|
146
|
+
'Fix: export const SUPPORTED_CONFIG = { validAddressRange: [1, 247], ... }', 'validAddressRange');
|
|
147
|
+
}
|
|
148
|
+
const range = configObj['validAddressRange'];
|
|
149
|
+
if (range.length !== 2) {
|
|
150
|
+
throw new errors_js_1.ValidationError(`Invalid SUPPORTED_CONFIG: validAddressRange must be a 2-element array [min, max], got ${range.length} elements.\n` +
|
|
151
|
+
'Fix: export const SUPPORTED_CONFIG = { validAddressRange: [1, 247], ... }', 'validAddressRange');
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if ('validPorts' in configObj && !Array.isArray(configObj['validPorts'])) {
|
|
155
|
+
throw new errors_js_1.ValidationError(`Invalid SUPPORTED_CONFIG: validPorts must be an array, got ${typeof configObj['validPorts']}.\n` +
|
|
156
|
+
'Fix: export const SUPPORTED_CONFIG = { validPorts: [502], ... }', 'validPorts');
|
|
157
|
+
}
|
|
158
|
+
return config;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Validate DEVICES export from a driver module
|
|
162
|
+
*
|
|
163
|
+
* @param devices - The DEVICES value to validate
|
|
164
|
+
* @param logger - Optional logger for warnings (defaults to console)
|
|
165
|
+
* @returns Validated devices registry
|
|
166
|
+
* @throws Error with helpful message if validation fails
|
|
167
|
+
*/
|
|
168
|
+
function validateDevices(devices, logger = console) {
|
|
169
|
+
if (devices === null || devices === undefined || typeof devices !== 'object') {
|
|
170
|
+
throw new errors_js_1.ValidationError('Invalid DEVICES: must be an object.\n' +
|
|
171
|
+
"Fix: export const DEVICES = { 'device-key': { manufacturer: 'Acme', model: 'X1' } }", 'DEVICES');
|
|
172
|
+
}
|
|
173
|
+
if (Array.isArray(devices)) {
|
|
174
|
+
throw new errors_js_1.ValidationError('Invalid DEVICES: must be an object, not an array.\n' +
|
|
175
|
+
"Fix: export const DEVICES = { 'device-key': { manufacturer: 'Acme', model: 'X1' } }", 'DEVICES');
|
|
176
|
+
}
|
|
177
|
+
const devicesObj = devices;
|
|
178
|
+
const entries = Object.entries(devicesObj);
|
|
179
|
+
if (entries.length === 0) {
|
|
180
|
+
throw new errors_js_1.ValidationError('Invalid DEVICES: must contain at least one device.\n' +
|
|
181
|
+
"Fix: export const DEVICES = { 'device-key': { manufacturer: 'Acme', model: 'X1' } }", 'DEVICES');
|
|
182
|
+
}
|
|
183
|
+
for (const [key, device] of entries) {
|
|
184
|
+
if (device === null || device === undefined || typeof device !== 'object') {
|
|
185
|
+
throw new errors_js_1.ValidationError(`Invalid DEVICES["${key}"]: must be an object.\n` +
|
|
186
|
+
`Fix: DEVICES["${key}"] = { manufacturer: 'Acme', model: 'X1' }`, `DEVICES["${key}"]`);
|
|
187
|
+
}
|
|
188
|
+
const deviceObj = device;
|
|
189
|
+
if (typeof deviceObj['manufacturer'] !== 'string') {
|
|
190
|
+
throw new errors_js_1.ValidationError(`Invalid DEVICES["${key}"]: manufacturer must be a string.\n` +
|
|
191
|
+
`Fix: DEVICES["${key}"] = { manufacturer: 'Acme', ... }`, `DEVICES["${key}"].manufacturer`);
|
|
192
|
+
}
|
|
193
|
+
if (typeof deviceObj['model'] !== 'string') {
|
|
194
|
+
throw new errors_js_1.ValidationError(`Invalid DEVICES["${key}"]: model must be a string.\n` +
|
|
195
|
+
`Fix: DEVICES["${key}"] = { model: 'X1', ... }`, `DEVICES["${key}"].model`);
|
|
196
|
+
}
|
|
197
|
+
if ('description' in deviceObj && typeof deviceObj['description'] !== 'string') {
|
|
198
|
+
throw new errors_js_1.ValidationError(`Invalid DEVICES["${key}"]: description must be a string.\n` +
|
|
199
|
+
`Fix: DEVICES["${key}"] = { description: 'A device', ... }`, `DEVICES["${key}"].description`);
|
|
200
|
+
}
|
|
201
|
+
let validatedDefaultConfig;
|
|
202
|
+
if ('defaultConfig' in deviceObj && deviceObj['defaultConfig'] !== undefined) {
|
|
203
|
+
try {
|
|
204
|
+
validatedDefaultConfig = validateDefaultConfig(deviceObj['defaultConfig']);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
if (error instanceof errors_js_1.ValidationError) {
|
|
208
|
+
throw new errors_js_1.ValidationError(`Invalid DEVICES["${key}"].defaultConfig: ${error.message}`, `DEVICES["${key}"].defaultConfig${error.field ? `.${error.field}` : ''}`);
|
|
209
|
+
}
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
let validatedSupportedConfig;
|
|
214
|
+
if ('supportedConfig' in deviceObj && deviceObj['supportedConfig'] !== undefined) {
|
|
215
|
+
try {
|
|
216
|
+
validatedSupportedConfig = validateSupportedConfig(deviceObj['supportedConfig']);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
if (error instanceof errors_js_1.ValidationError) {
|
|
220
|
+
throw new errors_js_1.ValidationError(`Invalid DEVICES["${key}"].supportedConfig: ${error.message}`, `DEVICES["${key}"].supportedConfig${error.field ? `.${error.field}` : ''}`);
|
|
221
|
+
}
|
|
222
|
+
throw error;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (validatedDefaultConfig && validatedSupportedConfig) {
|
|
226
|
+
const warnings = crossValidateConfigs(validatedDefaultConfig, validatedSupportedConfig);
|
|
227
|
+
if (warnings.length > 0) {
|
|
228
|
+
outputConfigWarnings(`DEVICES["${key}"]`, warnings, logger);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return devices;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Helper function to validate if a value is within a numeric range
|
|
236
|
+
*/
|
|
237
|
+
function validateAddressRange(value, range, fieldName) {
|
|
238
|
+
const [min, max] = range;
|
|
239
|
+
if (value < min || value > max) {
|
|
240
|
+
return `${fieldName}: ${value} is not in validAddressRange: [${min}, ${max}]`;
|
|
241
|
+
}
|
|
242
|
+
return undefined;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Cross-validate DEFAULT_CONFIG against SUPPORTED_CONFIG constraints
|
|
246
|
+
*
|
|
247
|
+
* Checks that all DEFAULT_CONFIG values are within SUPPORTED_CONFIG constraints.
|
|
248
|
+
* This helps catch driver authoring errors where defaults don't match declared support.
|
|
249
|
+
*
|
|
250
|
+
* @param defaultConfig - The validated DEFAULT_CONFIG
|
|
251
|
+
* @param supportedConfig - The validated SUPPORTED_CONFIG
|
|
252
|
+
* @returns Array of warning messages for any inconsistencies found (empty if all valid)
|
|
253
|
+
*/
|
|
254
|
+
function crossValidateConfigs(defaultConfig, supportedConfig) {
|
|
255
|
+
const warnings = [];
|
|
256
|
+
const isSerial = 'baudRate' in defaultConfig;
|
|
257
|
+
const isTCP = 'defaultPort' in defaultConfig;
|
|
258
|
+
if (isSerial) {
|
|
259
|
+
const serialDefault = defaultConfig;
|
|
260
|
+
const serialSupported = supportedConfig;
|
|
261
|
+
if ('validBaudRates' in serialSupported && Array.isArray(serialSupported['validBaudRates'])) {
|
|
262
|
+
const warning = validateArrayConstraint(serialDefault.baudRate, serialSupported['validBaudRates'], 'baudRate', 'validBaudRates');
|
|
263
|
+
if (warning)
|
|
264
|
+
warnings.push(warning);
|
|
265
|
+
}
|
|
266
|
+
if ('parity' in serialDefault &&
|
|
267
|
+
'validParity' in serialSupported &&
|
|
268
|
+
Array.isArray(serialSupported['validParity'])) {
|
|
269
|
+
const warning = validateArrayConstraint(serialDefault.parity, serialSupported['validParity'], 'parity', 'validParity');
|
|
270
|
+
if (warning)
|
|
271
|
+
warnings.push(warning);
|
|
272
|
+
}
|
|
273
|
+
if ('dataBits' in serialDefault &&
|
|
274
|
+
'validDataBits' in serialSupported &&
|
|
275
|
+
Array.isArray(serialSupported['validDataBits'])) {
|
|
276
|
+
const warning = validateArrayConstraint(serialDefault.dataBits, serialSupported['validDataBits'], 'dataBits', 'validDataBits');
|
|
277
|
+
if (warning)
|
|
278
|
+
warnings.push(warning);
|
|
279
|
+
}
|
|
280
|
+
if ('stopBits' in serialDefault &&
|
|
281
|
+
'validStopBits' in serialSupported &&
|
|
282
|
+
Array.isArray(serialSupported['validStopBits'])) {
|
|
283
|
+
const warning = validateArrayConstraint(serialDefault.stopBits, serialSupported['validStopBits'], 'stopBits', 'validStopBits');
|
|
284
|
+
if (warning)
|
|
285
|
+
warnings.push(warning);
|
|
286
|
+
}
|
|
287
|
+
if ('defaultAddress' in serialDefault &&
|
|
288
|
+
'validAddressRange' in serialSupported &&
|
|
289
|
+
Array.isArray(serialSupported['validAddressRange'])) {
|
|
290
|
+
const warning = validateAddressRange(serialDefault.defaultAddress, serialSupported['validAddressRange'], 'defaultAddress');
|
|
291
|
+
if (warning) {
|
|
292
|
+
warnings.push(warning);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
else if (isTCP) {
|
|
297
|
+
const tcpDefault = defaultConfig;
|
|
298
|
+
const tcpSupported = supportedConfig;
|
|
299
|
+
if ('validPorts' in tcpSupported && Array.isArray(tcpSupported['validPorts'])) {
|
|
300
|
+
const warning = validateArrayConstraint(tcpDefault.defaultPort, tcpSupported['validPorts'], 'defaultPort', 'validPorts');
|
|
301
|
+
if (warning)
|
|
302
|
+
warnings.push(warning);
|
|
303
|
+
}
|
|
304
|
+
if ('defaultAddress' in tcpDefault &&
|
|
305
|
+
'validAddressRange' in tcpSupported &&
|
|
306
|
+
Array.isArray(tcpSupported['validAddressRange'])) {
|
|
307
|
+
const warning = validateAddressRange(tcpDefault.defaultAddress, tcpSupported['validAddressRange'], 'defaultAddress');
|
|
308
|
+
if (warning) {
|
|
309
|
+
warnings.push(warning);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return warnings;
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=config-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-validator.js","sourceRoot":"","sources":["../src/config-validator.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error classes for driver-loader
|
|
3
|
+
*
|
|
4
|
+
* These error classes provide better error handling and type safety
|
|
5
|
+
* compared to string-based error detection.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Error thrown when driver configuration validation fails
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { loadDriver, ValidationError } from '@ya-modbus/driver-loader'
|
|
13
|
+
*
|
|
14
|
+
* try {
|
|
15
|
+
* await loadDriver({ driverPackage: 'my-driver' })
|
|
16
|
+
* } catch (error) {
|
|
17
|
+
* if (error instanceof ValidationError) {
|
|
18
|
+
* console.error(`Validation failed for field: ${error.field}`)
|
|
19
|
+
* console.error(`Message: ${error.message}`)
|
|
20
|
+
* }
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare class ValidationError extends Error {
|
|
25
|
+
readonly field?: string | undefined;
|
|
26
|
+
constructor(message: string, field?: string | undefined);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Error thrown when a driver package cannot be found or loaded
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* import { loadDriver, DriverNotFoundError } from '@ya-modbus/driver-loader'
|
|
34
|
+
*
|
|
35
|
+
* try {
|
|
36
|
+
* await loadDriver({ driverPackage: 'missing-driver' })
|
|
37
|
+
* } catch (error) {
|
|
38
|
+
* if (error instanceof DriverNotFoundError) {
|
|
39
|
+
* console.error(`Package not found: ${error.packageName}`)
|
|
40
|
+
* console.error(`Install with: npm install ${error.packageName}`)
|
|
41
|
+
* }
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare class DriverNotFoundError extends Error {
|
|
46
|
+
readonly packageName: string;
|
|
47
|
+
constructor(message: string, packageName: string);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Error thrown when package.json is not found or invalid
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* import { loadDriver, PackageJsonError } from '@ya-modbus/driver-loader'
|
|
55
|
+
*
|
|
56
|
+
* try {
|
|
57
|
+
* await loadDriver({}) // Auto-detect from current directory
|
|
58
|
+
* } catch (error) {
|
|
59
|
+
* if (error instanceof PackageJsonError) {
|
|
60
|
+
* console.error('package.json issue:', error.message)
|
|
61
|
+
* // Examples: missing file, invalid JSON, missing keywords
|
|
62
|
+
* }
|
|
63
|
+
* }
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare class PackageJsonError extends Error {
|
|
67
|
+
constructor(message: string);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,KAAK,CAAC,EAAE,MAAM;gBAD9B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,MAAM,YAAA;CAMjC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,WAAW,EAAE,MAAM;gBADnC,OAAO,EAAE,MAAM,EACC,WAAW,EAAE,MAAM;CAMtC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAK5B"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Custom error classes for driver-loader
|
|
4
|
+
*
|
|
5
|
+
* These error classes provide better error handling and type safety
|
|
6
|
+
* compared to string-based error detection.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PackageJsonError = exports.DriverNotFoundError = exports.ValidationError = void 0;
|
|
10
|
+
/**
|
|
11
|
+
* Error thrown when driver configuration validation fails
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { loadDriver, ValidationError } from '@ya-modbus/driver-loader'
|
|
16
|
+
*
|
|
17
|
+
* try {
|
|
18
|
+
* await loadDriver({ driverPackage: 'my-driver' })
|
|
19
|
+
* } catch (error) {
|
|
20
|
+
* if (error instanceof ValidationError) {
|
|
21
|
+
* console.error(`Validation failed for field: ${error.field}`)
|
|
22
|
+
* console.error(`Message: ${error.message}`)
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
class ValidationError extends Error {
|
|
28
|
+
field;
|
|
29
|
+
constructor(message, field) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.field = field;
|
|
32
|
+
this.name = 'ValidationError';
|
|
33
|
+
Object.setPrototypeOf(this, ValidationError.prototype);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.ValidationError = ValidationError;
|
|
37
|
+
/**
|
|
38
|
+
* Error thrown when a driver package cannot be found or loaded
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* import { loadDriver, DriverNotFoundError } from '@ya-modbus/driver-loader'
|
|
43
|
+
*
|
|
44
|
+
* try {
|
|
45
|
+
* await loadDriver({ driverPackage: 'missing-driver' })
|
|
46
|
+
* } catch (error) {
|
|
47
|
+
* if (error instanceof DriverNotFoundError) {
|
|
48
|
+
* console.error(`Package not found: ${error.packageName}`)
|
|
49
|
+
* console.error(`Install with: npm install ${error.packageName}`)
|
|
50
|
+
* }
|
|
51
|
+
* }
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
class DriverNotFoundError extends Error {
|
|
55
|
+
packageName;
|
|
56
|
+
constructor(message, packageName) {
|
|
57
|
+
super(message);
|
|
58
|
+
this.packageName = packageName;
|
|
59
|
+
this.name = 'DriverNotFoundError';
|
|
60
|
+
Object.setPrototypeOf(this, DriverNotFoundError.prototype);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.DriverNotFoundError = DriverNotFoundError;
|
|
64
|
+
/**
|
|
65
|
+
* Error thrown when package.json is not found or invalid
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```typescript
|
|
69
|
+
* import { loadDriver, PackageJsonError } from '@ya-modbus/driver-loader'
|
|
70
|
+
*
|
|
71
|
+
* try {
|
|
72
|
+
* await loadDriver({}) // Auto-detect from current directory
|
|
73
|
+
* } catch (error) {
|
|
74
|
+
* if (error instanceof PackageJsonError) {
|
|
75
|
+
* console.error('package.json issue:', error.message)
|
|
76
|
+
* // Examples: missing file, invalid JSON, missing keywords
|
|
77
|
+
* }
|
|
78
|
+
* }
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
class PackageJsonError extends Error {
|
|
82
|
+
constructor(message) {
|
|
83
|
+
super(message);
|
|
84
|
+
this.name = 'PackageJsonError';
|
|
85
|
+
Object.setPrototypeOf(this, PackageJsonError.prototype);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.PackageJsonError = PackageJsonError;
|
|
89
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,eAAgB,SAAQ,KAAK;IAGtB;IAFlB,YACE,OAAe,EACC,KAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,UAAK,GAAL,KAAK,CAAS;QAG9B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACxD,CAAC;CACF;AATD,0CASC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,mBAAoB,SAAQ,KAAK;IAG1B;IAFlB,YACE,OAAe,EACC,WAAmB;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,gBAAW,GAAX,WAAW,CAAQ;QAGnC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAA;IAC5D,CAAC;CACF;AATD,kDASC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;QAC9B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAA;IACzD,CAAC;CACF;AAND,4CAMC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { loadDriver, clearDriverCache, getDriverCacheStats } from './loader.js';
|
|
2
|
+
export type { LoadedDriver, LoadDriverOptions, SystemDependencies, DriverCacheStats, Logger, } from './loader.js';
|
|
3
|
+
export { validateDefaultConfig, validateSupportedConfig, validateDevices, crossValidateConfigs, } from './config-validator.js';
|
|
4
|
+
export { ValidationError, DriverNotFoundError, PackageJsonError } from './errors.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAC/E,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,MAAM,GACP,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,oBAAoB,GACrB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PackageJsonError = exports.DriverNotFoundError = exports.ValidationError = exports.crossValidateConfigs = exports.validateDevices = exports.validateSupportedConfig = exports.validateDefaultConfig = exports.getDriverCacheStats = exports.clearDriverCache = exports.loadDriver = void 0;
|
|
4
|
+
var loader_js_1 = require("./loader.js");
|
|
5
|
+
Object.defineProperty(exports, "loadDriver", { enumerable: true, get: function () { return loader_js_1.loadDriver; } });
|
|
6
|
+
Object.defineProperty(exports, "clearDriverCache", { enumerable: true, get: function () { return loader_js_1.clearDriverCache; } });
|
|
7
|
+
Object.defineProperty(exports, "getDriverCacheStats", { enumerable: true, get: function () { return loader_js_1.getDriverCacheStats; } });
|
|
8
|
+
var config_validator_js_1 = require("./config-validator.js");
|
|
9
|
+
Object.defineProperty(exports, "validateDefaultConfig", { enumerable: true, get: function () { return config_validator_js_1.validateDefaultConfig; } });
|
|
10
|
+
Object.defineProperty(exports, "validateSupportedConfig", { enumerable: true, get: function () { return config_validator_js_1.validateSupportedConfig; } });
|
|
11
|
+
Object.defineProperty(exports, "validateDevices", { enumerable: true, get: function () { return config_validator_js_1.validateDevices; } });
|
|
12
|
+
Object.defineProperty(exports, "crossValidateConfigs", { enumerable: true, get: function () { return config_validator_js_1.crossValidateConfigs; } });
|
|
13
|
+
var errors_js_1 = require("./errors.js");
|
|
14
|
+
Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_js_1.ValidationError; } });
|
|
15
|
+
Object.defineProperty(exports, "DriverNotFoundError", { enumerable: true, get: function () { return errors_js_1.DriverNotFoundError; } });
|
|
16
|
+
Object.defineProperty(exports, "PackageJsonError", { enumerable: true, get: function () { return errors_js_1.PackageJsonError; } });
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA+E;AAAtE,uGAAA,UAAU,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAQ1D,6DAK8B;AAJ5B,4HAAA,qBAAqB,OAAA;AACrB,8HAAA,uBAAuB,OAAA;AACvB,sHAAA,eAAe,OAAA;AACf,2HAAA,oBAAoB,OAAA;AAEtB,yCAAoF;AAA3E,4GAAA,eAAe,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAAE,6GAAA,gBAAgB,OAAA"}
|
package/dist/loader.d.ts
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { CreateDriverFunction, DefaultConfig, DeviceRegistry, SupportedConfig } from '@ya-modbus/driver-types';
|
|
2
|
+
/**
|
|
3
|
+
* Loaded driver module with configuration metadata
|
|
4
|
+
*/
|
|
5
|
+
export interface LoadedDriver {
|
|
6
|
+
/** Driver factory function */
|
|
7
|
+
createDriver: CreateDriverFunction;
|
|
8
|
+
/** Registry of supported devices (for multi-device drivers) */
|
|
9
|
+
devices?: DeviceRegistry;
|
|
10
|
+
/** Factory-default device configuration (if provided by driver) */
|
|
11
|
+
defaultConfig?: DefaultConfig;
|
|
12
|
+
/** Supported configuration constraints (if provided by driver) */
|
|
13
|
+
supportedConfig?: SupportedConfig;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Logger interface for driver loading
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* import { loadDriver, type Logger } from '@ya-modbus/driver-loader'
|
|
21
|
+
*
|
|
22
|
+
* const logger: Logger = {
|
|
23
|
+
* warn: (msg) => console.warn('[DRIVER]', msg),
|
|
24
|
+
* debug: (msg) => console.debug('[DRIVER]', msg), // Optional
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* const driver = await loadDriver({ logger })
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export interface Logger {
|
|
31
|
+
/** Log warning messages */
|
|
32
|
+
warn: (message: string) => void;
|
|
33
|
+
/** Log debug messages (optional) */
|
|
34
|
+
debug?: (message: string) => void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Driver loading options
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* import { loadDriver } from '@ya-modbus/driver-loader'
|
|
42
|
+
*
|
|
43
|
+
* // Auto-detect from current directory
|
|
44
|
+
* const driver1 = await loadDriver({})
|
|
45
|
+
*
|
|
46
|
+
* // Load specific package
|
|
47
|
+
* const driver2 = await loadDriver({ driverPackage: 'ya-modbus-driver-xymd1' })
|
|
48
|
+
*
|
|
49
|
+
* // With custom logger
|
|
50
|
+
* const driver3 = await loadDriver({
|
|
51
|
+
* driverPackage: 'my-driver',
|
|
52
|
+
* logger: {
|
|
53
|
+
* warn: (msg) => console.warn('[WARN]', msg),
|
|
54
|
+
* debug: (msg) => console.debug('[DEBUG]', msg),
|
|
55
|
+
* }
|
|
56
|
+
* })
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export interface LoadDriverOptions {
|
|
60
|
+
/**
|
|
61
|
+
* Explicit driver package name
|
|
62
|
+
* e.g., 'ya-modbus-driver-xymd1' or '@org/driver-pkg'
|
|
63
|
+
*/
|
|
64
|
+
driverPackage?: string;
|
|
65
|
+
/**
|
|
66
|
+
* Custom logger for warnings and debug messages
|
|
67
|
+
* Defaults to console if not provided
|
|
68
|
+
*/
|
|
69
|
+
logger?: Logger;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* System dependencies for driver loading (for dependency injection)
|
|
73
|
+
*/
|
|
74
|
+
export interface SystemDependencies {
|
|
75
|
+
readFile: (path: string, encoding: 'utf-8') => Promise<string>;
|
|
76
|
+
importModule: (modulePath: string) => Promise<unknown>;
|
|
77
|
+
getCwd: () => string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Driver cache statistics
|
|
81
|
+
*/
|
|
82
|
+
export interface DriverCacheStats {
|
|
83
|
+
/** Number of cache hits */
|
|
84
|
+
hits: number;
|
|
85
|
+
/** Number of cache misses */
|
|
86
|
+
misses: number;
|
|
87
|
+
/** Number of cached drivers */
|
|
88
|
+
size: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Clear the driver cache
|
|
92
|
+
* Useful for testing or when you need to reload drivers
|
|
93
|
+
*/
|
|
94
|
+
export declare function clearDriverCache(): void;
|
|
95
|
+
/**
|
|
96
|
+
* Get cache statistics
|
|
97
|
+
* @returns Current cache statistics including hits, misses, and size
|
|
98
|
+
*/
|
|
99
|
+
export declare function getDriverCacheStats(): DriverCacheStats;
|
|
100
|
+
/**
|
|
101
|
+
* Load a driver package dynamically
|
|
102
|
+
*
|
|
103
|
+
* Supports two modes:
|
|
104
|
+
* 1. Explicit package: `loadDriver({ driverPackage: 'ya-modbus-driver-xymd1' })`
|
|
105
|
+
* 2. Auto-detect from cwd: `loadDriver({})` - reads package.json from current directory
|
|
106
|
+
*
|
|
107
|
+
* Auto-detection checks for `ya-modbus-driver` keyword in package.json keywords.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* // Auto-detect from current directory
|
|
111
|
+
* const driver = await loadDriver({})
|
|
112
|
+
*
|
|
113
|
+
* // Load explicit package
|
|
114
|
+
* const driver = await loadDriver({ driverPackage: 'ya-modbus-driver-xymd1' })
|
|
115
|
+
*
|
|
116
|
+
* @param options - Loading options (defaults to local package detection)
|
|
117
|
+
* @param deps - System dependencies (for testing, uses Node.js built-ins by default)
|
|
118
|
+
* @returns Loaded driver with createDriver function and optional configuration metadata
|
|
119
|
+
* @throws Error if driver cannot be loaded or is invalid
|
|
120
|
+
*/
|
|
121
|
+
export declare function loadDriver(options?: LoadDriverOptions, deps?: SystemDependencies): Promise<LoadedDriver>;
|
|
122
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,eAAe,EAChB,MAAM,yBAAyB,CAAA;AAWhC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,YAAY,EAAE,oBAAoB,CAAA;IAElC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,cAAc,CAAA;IAExB,mEAAmE;IACnE,aAAa,CAAC,EAAE,aAAa,CAAA;IAE7B,kEAAkE;IAClE,eAAe,CAAC,EAAE,eAAe,CAAA;CAClC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,MAAM;IACrB,2BAA2B;IAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,oCAAoC;IACpC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IAEtB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAC9D,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACtD,MAAM,EAAE,MAAM,MAAM,CAAA;CACrB;AAeD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAA;CACb;AAeD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAMtD;AAwED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,UAAU,CAC9B,OAAO,GAAE,iBAAsB,EAC/B,IAAI,GAAE,kBAAgC,GACrC,OAAO,CAAC,YAAY,CAAC,CAsHvB"}
|