@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.
@@ -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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"}
@@ -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"}
@@ -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"}
@@ -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"}