@ya-modbus/driver-loader 0.11.2 → 0.12.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.
Files changed (37) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +32 -2
  3. package/dist/cjs/src/driver-defaults.d.ts +63 -0
  4. package/dist/cjs/src/driver-defaults.d.ts.map +1 -0
  5. package/dist/cjs/src/driver-defaults.js +117 -0
  6. package/dist/cjs/src/driver-defaults.js.map +1 -0
  7. package/dist/cjs/src/errors.d.ts +8 -2
  8. package/dist/cjs/src/errors.d.ts.map +1 -1
  9. package/dist/cjs/src/errors.js +8 -2
  10. package/dist/cjs/src/errors.js.map +1 -1
  11. package/dist/cjs/src/index.d.ts +3 -0
  12. package/dist/cjs/src/index.d.ts.map +1 -1
  13. package/dist/cjs/src/index.js +6 -1
  14. package/dist/cjs/src/index.js.map +1 -1
  15. package/dist/cjs/src/serial-validation.d.ts +61 -0
  16. package/dist/cjs/src/serial-validation.d.ts.map +1 -0
  17. package/dist/cjs/src/serial-validation.js +152 -0
  18. package/dist/cjs/src/serial-validation.js.map +1 -0
  19. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  20. package/dist/esm/src/driver-defaults.d.ts +63 -0
  21. package/dist/esm/src/driver-defaults.d.ts.map +1 -0
  22. package/dist/esm/src/driver-defaults.js +111 -0
  23. package/dist/esm/src/driver-defaults.js.map +1 -0
  24. package/dist/esm/src/errors.d.ts +8 -2
  25. package/dist/esm/src/errors.d.ts.map +1 -1
  26. package/dist/esm/src/errors.js +8 -2
  27. package/dist/esm/src/errors.js.map +1 -1
  28. package/dist/esm/src/index.d.ts +3 -0
  29. package/dist/esm/src/index.d.ts.map +1 -1
  30. package/dist/esm/src/index.js +2 -0
  31. package/dist/esm/src/index.js.map +1 -1
  32. package/dist/esm/src/serial-validation.d.ts +61 -0
  33. package/dist/esm/src/serial-validation.d.ts.map +1 -0
  34. package/dist/esm/src/serial-validation.js +144 -0
  35. package/dist/esm/src/serial-validation.js.map +1 -0
  36. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  37. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -3,6 +3,16 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [0.12.0](https://github.com/groupsky/ya-modbus/compare/@ya-modbus/driver-loader@0.11.2...@ya-modbus/driver-loader@0.12.0) (2026-10-14)
7
+
8
+ ### Bug Fixes
9
+
10
+ - **mqtt-bridge:** use the driver's default serial settings and reject unsupported ones ([#627](https://github.com/groupsky/ya-modbus/issues/627)) ([](https://github.com/groupsky/ya-modbus/commit/)), closes [#609](https://github.com/groupsky/ya-modbus/issues/609)
11
+
12
+ ### BREAKING CHANGES
13
+
14
+ - **mqtt-bridge:** in mqtt-bridge, a device config without parity used to get "none" and now gets the driver default. Set "parity": "none" to keep the old behavior. A serial setting the driver does not support now stops startup.
15
+
6
16
  ## [0.11.2](https://github.com/groupsky/ya-modbus/compare/@ya-modbus/driver-loader@0.11.1...@ya-modbus/driver-loader@0.11.2) (2026-10-12)
7
17
 
8
18
  **Note:** Version bump only for package @ya-modbus/driver-loader
package/README.md CHANGED
@@ -85,9 +85,11 @@ try {
85
85
 
86
86
  **Error Types:**
87
87
 
88
- - **`ValidationError`**: Driver configuration validation failed
88
+ - **`ValidationError`**: Driver configuration validation failed, or a connection option is not in the driver's `SUPPORTED_CONFIG`
89
89
  - `field?: string` - The configuration field that failed validation
90
- - Example: Invalid DEFAULT_CONFIG, missing createDriver function
90
+ - `value?: unknown` - The rejected value, when it is known
91
+ - `validValues?: readonly unknown[]` - The values that the driver supports, when they are known
92
+ - Example: Invalid DEFAULT_CONFIG, missing createDriver function, parity `none` for a driver that supports only `odd`
91
93
 
92
94
  - **`DriverNotFoundError`**: Driver package not found or cannot be loaded
93
95
  - `packageName: string` - The package that could not be found or loaded. For a package that is not installed this is the package to install
@@ -249,6 +251,34 @@ assertValidDriverPackageName(config.driver)
249
251
  await loadDriver({ driverPackage: config.driver })
250
252
  ```
251
253
 
254
+ ### `validateSerialOptions(options, driver?: LoadedDriver): void`
255
+
256
+ Checks `baudRate`, `parity`, `dataBits`, `stopBits` and `slaveId` against the driver's `SUPPORTED_CONFIG`. An option that is not set, or that the driver does not limit, passes. A value that the driver does not support throws a `ValidationError` with `field`, `value`, `validValues` and a message such as `Invalid parity 'none'. This driver supports: odd (default: odd)`.
257
+
258
+ ### `applyDriverDefaults(options, driver?: LoadedDriver, device?: string)`
259
+
260
+ Returns a copy of `options` where each missing `baudRate`, `parity`, `dataBits`, `stopBits` and `slaveId` is taken from the driver's serial `DEFAULT_CONFIG` (`slaveId` from `defaultAddress`). With `device`, the device's `defaultConfig` from `DEVICES` is used when it has one. Options with a `host` (TCP), and options for a driver without a serial `DEFAULT_CONFIG`, are returned unchanged.
261
+
262
+ ### `getEffectiveDriverMetadata(driver: LoadedDriver, device?: string): LoadedDriver`
263
+
264
+ Returns the driver with `defaultConfig` and `supportedConfig` of the selected device from `DEVICES`, or of the driver when the device has none. Pass the result to `validateSerialOptions` to check the options of a device.
265
+
266
+ ```typescript
267
+ import {
268
+ applyDriverDefaults,
269
+ getEffectiveDriverMetadata,
270
+ loadDriver,
271
+ validateSerialOptions,
272
+ } from '@ya-modbus/driver-loader'
273
+
274
+ const driver = await loadDriver({ driverPackage: '@ya-modbus/driver-or-we-516' })
275
+ const effective = getEffectiveDriverMetadata(driver, device)
276
+
277
+ validateSerialOptions(options, effective) // the options the user set
278
+ const merged = applyDriverDefaults(options, driver, device)
279
+ validateSerialOptions(merged, effective) // catches defaults that the driver does not support
280
+ ```
281
+
252
282
  ## Testing Utilities
253
283
 
254
284
  The package provides testing utilities for applications using driver-loader.
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Driver defaults for connection options: DEFAULT_CONFIG and SUPPORTED_CONFIG of the driver,
3
+ * or of the selected device in its DEVICES registry
4
+ */
5
+ import type { DefaultSerialConfig } from '@ya-modbus/driver-types';
6
+ import type { LoadedDriver } from './loader.js';
7
+ /**
8
+ * Connection options that driver defaults apply to
9
+ *
10
+ * `host` marks a TCP connection, which serial defaults do not apply to.
11
+ */
12
+ export interface SerialOptions {
13
+ host?: string;
14
+ baudRate?: number;
15
+ dataBits?: number;
16
+ parity?: string;
17
+ stopBits?: number;
18
+ slaveId?: number;
19
+ }
20
+ /**
21
+ * Get the effective default config for a device
22
+ *
23
+ * Returns device-specific config if available, otherwise driver-level config.
24
+ *
25
+ * @param driverMetadata - Loaded driver metadata
26
+ * @param device - Optional device key
27
+ * @returns Effective default config or undefined
28
+ */
29
+ export declare function getEffectiveDefaultConfig(driverMetadata: LoadedDriver | undefined, device: string | undefined): DefaultSerialConfig | undefined;
30
+ /**
31
+ * Get the effective supported config for a device
32
+ *
33
+ * Returns device-specific constraints if available, otherwise driver-level constraints.
34
+ *
35
+ * @param driverMetadata - Loaded driver metadata
36
+ * @param device - Optional device key
37
+ * @returns Effective supported config or undefined
38
+ */
39
+ export declare function getEffectiveSupportedConfig(driverMetadata: LoadedDriver | undefined, device: string | undefined): LoadedDriver['supportedConfig'] | undefined;
40
+ /**
41
+ * Create an effective driver metadata with device-specific configs resolved
42
+ *
43
+ * This creates a view of the driver metadata where defaultConfig and supportedConfig
44
+ * are resolved based on the selected device. This allows validation and other
45
+ * functions to work with device-specific settings transparently.
46
+ *
47
+ * @param driverMetadata - Loaded driver metadata
48
+ * @param device - Optional device key
49
+ * @returns Driver metadata with effective configs for the selected device
50
+ */
51
+ export declare function getEffectiveDriverMetadata(driverMetadata: LoadedDriver, device?: string): LoadedDriver;
52
+ /**
53
+ * Apply driver defaults to transport options
54
+ *
55
+ * Uses device-specific defaults if a device is selected, otherwise driver-level defaults.
56
+ *
57
+ * @param options - Transport options (may be incomplete)
58
+ * @param driverMetadata - Loaded driver metadata with defaults
59
+ * @param device - Optional device key for multi-device drivers
60
+ * @returns Transport options with defaults applied
61
+ */
62
+ export declare function applyDriverDefaults<T extends SerialOptions>(options: T, driverMetadata?: LoadedDriver, device?: string): T;
63
+ //# sourceMappingURL=driver-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-defaults.d.ts","sourceRoot":"","sources":["../../../src/driver-defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAElE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,YAAY,GAAG,SAAS,EACxC,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,mBAAmB,GAAG,SAAS,CAoBjC;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,YAAY,GAAG,SAAS,EACxC,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,YAAY,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAY7C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,YAAY,EAC5B,MAAM,CAAC,EAAE,MAAM,GACd,YAAY,CAsBd;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,aAAa,EACzD,OAAO,EAAE,CAAC,EACV,cAAc,CAAC,EAAE,YAAY,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,CAAC,CAsBH"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ /**
3
+ * Driver defaults for connection options: DEFAULT_CONFIG and SUPPORTED_CONFIG of the driver,
4
+ * or of the selected device in its DEVICES registry
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getEffectiveDefaultConfig = getEffectiveDefaultConfig;
8
+ exports.getEffectiveSupportedConfig = getEffectiveSupportedConfig;
9
+ exports.getEffectiveDriverMetadata = getEffectiveDriverMetadata;
10
+ exports.applyDriverDefaults = applyDriverDefaults;
11
+ /**
12
+ * Get the effective default config for a device
13
+ *
14
+ * Returns device-specific config if available, otherwise driver-level config.
15
+ *
16
+ * @param driverMetadata - Loaded driver metadata
17
+ * @param device - Optional device key
18
+ * @returns Effective default config or undefined
19
+ */
20
+ function getEffectiveDefaultConfig(driverMetadata, device) {
21
+ if (!driverMetadata) {
22
+ return undefined;
23
+ }
24
+ // Check for device-specific config first
25
+ if (device && driverMetadata.devices?.[device]?.defaultConfig) {
26
+ const deviceConfig = driverMetadata.devices[device].defaultConfig;
27
+ if (deviceConfig && 'baudRate' in deviceConfig) {
28
+ return deviceConfig;
29
+ }
30
+ }
31
+ // Fall back to driver-level config
32
+ const driverConfig = driverMetadata.defaultConfig;
33
+ if (driverConfig && 'baudRate' in driverConfig) {
34
+ return driverConfig;
35
+ }
36
+ return undefined;
37
+ }
38
+ /**
39
+ * Get the effective supported config for a device
40
+ *
41
+ * Returns device-specific constraints if available, otherwise driver-level constraints.
42
+ *
43
+ * @param driverMetadata - Loaded driver metadata
44
+ * @param device - Optional device key
45
+ * @returns Effective supported config or undefined
46
+ */
47
+ function getEffectiveSupportedConfig(driverMetadata, device) {
48
+ if (!driverMetadata) {
49
+ return undefined;
50
+ }
51
+ // Check for device-specific config first
52
+ if (device && driverMetadata.devices?.[device]?.supportedConfig) {
53
+ return driverMetadata.devices[device].supportedConfig;
54
+ }
55
+ // Fall back to driver-level config
56
+ return driverMetadata.supportedConfig;
57
+ }
58
+ /**
59
+ * Create an effective driver metadata with device-specific configs resolved
60
+ *
61
+ * This creates a view of the driver metadata where defaultConfig and supportedConfig
62
+ * are resolved based on the selected device. This allows validation and other
63
+ * functions to work with device-specific settings transparently.
64
+ *
65
+ * @param driverMetadata - Loaded driver metadata
66
+ * @param device - Optional device key
67
+ * @returns Driver metadata with effective configs for the selected device
68
+ */
69
+ function getEffectiveDriverMetadata(driverMetadata, device) {
70
+ const effectiveDefaultConfig = getEffectiveDefaultConfig(driverMetadata, device);
71
+ const effectiveSupportedConfig = getEffectiveSupportedConfig(driverMetadata, device);
72
+ // Build result conditionally to satisfy exactOptionalPropertyTypes
73
+ const result = {
74
+ createDriver: driverMetadata.createDriver,
75
+ };
76
+ if (driverMetadata.devices) {
77
+ result.devices = driverMetadata.devices;
78
+ }
79
+ if (effectiveDefaultConfig) {
80
+ result.defaultConfig = effectiveDefaultConfig;
81
+ }
82
+ if (effectiveSupportedConfig) {
83
+ result.supportedConfig = effectiveSupportedConfig;
84
+ }
85
+ return result;
86
+ }
87
+ /**
88
+ * Apply driver defaults to transport options
89
+ *
90
+ * Uses device-specific defaults if a device is selected, otherwise driver-level defaults.
91
+ *
92
+ * @param options - Transport options (may be incomplete)
93
+ * @param driverMetadata - Loaded driver metadata with defaults
94
+ * @param device - Optional device key for multi-device drivers
95
+ * @returns Transport options with defaults applied
96
+ */
97
+ function applyDriverDefaults(options, driverMetadata, device) {
98
+ // For TCP connections, no serial defaults apply
99
+ if (options.host) {
100
+ return options;
101
+ }
102
+ // Get effective config (device-specific or driver-level)
103
+ const defaultConfig = getEffectiveDefaultConfig(driverMetadata, device);
104
+ if (!defaultConfig) {
105
+ return options;
106
+ }
107
+ // Apply defaults for unspecified options
108
+ return {
109
+ ...options,
110
+ baudRate: options.baudRate ?? defaultConfig.baudRate,
111
+ dataBits: options.dataBits ?? defaultConfig.dataBits,
112
+ stopBits: options.stopBits ?? defaultConfig.stopBits,
113
+ parity: options.parity ?? defaultConfig.parity,
114
+ slaveId: options.slaveId ?? defaultConfig.defaultAddress,
115
+ };
116
+ }
117
+ //# sourceMappingURL=driver-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-defaults.js","sourceRoot":"","sources":["../../../src/driver-defaults.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,11 @@
5
5
  * compared to string-based error detection.
6
6
  */
7
7
  /**
8
- * Error thrown when driver configuration validation fails
8
+ * Error thrown when driver configuration validation fails, or when a connection option is not
9
+ * in the driver's SUPPORTED_CONFIG
10
+ *
11
+ * `value` is the rejected value and `validValues` the values that the driver supports, when
12
+ * they are known.
9
13
  *
10
14
  * @example
11
15
  * ```typescript
@@ -23,7 +27,9 @@
23
27
  */
24
28
  export declare class ValidationError extends Error {
25
29
  readonly field?: string | undefined;
26
- constructor(message: string, field?: string | undefined);
30
+ readonly value?: unknown | undefined;
31
+ readonly validValues?: readonly unknown[] | undefined;
32
+ constructor(message: string, field?: string | undefined, value?: unknown | undefined, validValues?: readonly unknown[] | undefined);
27
33
  }
28
34
  /**
29
35
  * Error thrown when a driver package cannot be found or loaded
@@ -1 +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;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,WAAW,EAAE,MAAM;gBADnC,OAAO,EAAE,MAAM,EACC,WAAW,EAAE,MAAM,EACnC,OAAO,CAAC,EAAE,YAAY;CAMzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,WAAW,EAAE,MAAM;gBADnC,OAAO,EAAE,MAAM,EACC,WAAW,EAAE,MAAM,EACnC,OAAO,CAAC,EAAE,YAAY;CAMzB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAK5B"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,KAAK,CAAC,EAAE,MAAM;aACd,KAAK,CAAC,EAAE,OAAO;aACf,WAAW,CAAC,EAAE,SAAS,OAAO,EAAE;gBAHhD,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,MAAM,YAAA,EACd,KAAK,CAAC,EAAE,OAAO,YAAA,EACf,WAAW,CAAC,EAAE,SAAS,OAAO,EAAE,YAAA;CAMnD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,WAAW,EAAE,MAAM;gBADnC,OAAO,EAAE,MAAM,EACC,WAAW,EAAE,MAAM,EACnC,OAAO,CAAC,EAAE,YAAY;CAMzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,WAAW,EAAE,MAAM;gBADnC,OAAO,EAAE,MAAM,EACC,WAAW,EAAE,MAAM,EACnC,OAAO,CAAC,EAAE,YAAY;CAMzB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAK5B"}
@@ -8,7 +8,11 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.PackageJsonError = exports.DriverNotBuiltError = exports.DriverNotFoundError = exports.ValidationError = void 0;
10
10
  /**
11
- * Error thrown when driver configuration validation fails
11
+ * Error thrown when driver configuration validation fails, or when a connection option is not
12
+ * in the driver's SUPPORTED_CONFIG
13
+ *
14
+ * `value` is the rejected value and `validValues` the values that the driver supports, when
15
+ * they are known.
12
16
  *
13
17
  * @example
14
18
  * ```typescript
@@ -25,9 +29,11 @@ exports.PackageJsonError = exports.DriverNotBuiltError = exports.DriverNotFoundE
25
29
  * ```
26
30
  */
27
31
  class ValidationError extends Error {
28
- constructor(message, field) {
32
+ constructor(message, field, value, validValues) {
29
33
  super(message);
30
34
  this.field = field;
35
+ this.value = value;
36
+ this.validValues = validValues;
31
37
  this.name = 'ValidationError';
32
38
  Object.setPrototypeOf(this, ValidationError.prototype);
33
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/errors.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,eAAgB,SAAQ,KAAK;IACxC,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;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YACE,OAAe,EACC,WAAmB,EACnC,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAHP,gBAAW,GAAX,WAAW,CAAQ;QAInC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAA;IAC5D,CAAC;CACF;AAVD,kDAUC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YACE,OAAe,EACC,WAAmB,EACnC,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAHP,gBAAW,GAAX,WAAW,CAAQ;QAInC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAA;IAC5D,CAAC;CACF;AAVD,kDAUC;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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/errors.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAa,eAAgB,SAAQ,KAAK;IACxC,YACE,OAAe,EACC,KAAc,EACd,KAAe,EACf,WAAgC;QAEhD,KAAK,CAAC,OAAO,CAAC,CAAA;QAJE,UAAK,GAAL,KAAK,CAAS;QACd,UAAK,GAAL,KAAK,CAAU;QACf,gBAAW,GAAX,WAAW,CAAqB;QAGhD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACxD,CAAC;CACF;AAXD,0CAWC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YACE,OAAe,EACC,WAAmB,EACnC,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAHP,gBAAW,GAAX,WAAW,CAAQ;QAInC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAA;IAC5D,CAAC;CACF;AAVD,kDAUC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YACE,OAAe,EACC,WAAmB,EACnC,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAHP,gBAAW,GAAX,WAAW,CAAQ;QAInC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAA;IAC5D,CAAC;CACF;AAVD,kDAUC;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"}
@@ -1,6 +1,9 @@
1
1
  export { loadDriver, clearDriverCache, getDriverCacheStats } from './loader.js';
2
2
  export type { LoadedDriver, LoadDriverOptions, SystemDependencies, DriverCacheStats, Logger, } from './loader.js';
3
3
  export { validateDefaultConfig, validateSupportedConfig, validateDevices, crossValidateConfigs, } from './config-validator.js';
4
+ export { applyDriverDefaults, getEffectiveDriverMetadata } from './driver-defaults.js';
5
+ export type { SerialOptions } from './driver-defaults.js';
6
+ export { validateSerialOptions } from './serial-validation.js';
4
7
  export { DRIVER_PACKAGE_NAME_RULE, assertValidDriverPackageName, isValidDriverPackageName, } from './driver-package-name.js';
5
8
  export { ValidationError, DriverNotFoundError, DriverNotBuiltError, PackageJsonError, } from './errors.js';
6
9
  export { getCallerPackageInfo } from './package-info.js';
@@ -1 +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,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
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,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAA;AACtF,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getCallerPackageInfo = exports.PackageJsonError = exports.DriverNotBuiltError = exports.DriverNotFoundError = exports.ValidationError = exports.isValidDriverPackageName = exports.assertValidDriverPackageName = exports.DRIVER_PACKAGE_NAME_RULE = exports.crossValidateConfigs = exports.validateDevices = exports.validateSupportedConfig = exports.validateDefaultConfig = exports.getDriverCacheStats = exports.clearDriverCache = exports.loadDriver = void 0;
3
+ exports.getCallerPackageInfo = exports.PackageJsonError = exports.DriverNotBuiltError = exports.DriverNotFoundError = exports.ValidationError = exports.isValidDriverPackageName = exports.assertValidDriverPackageName = exports.DRIVER_PACKAGE_NAME_RULE = exports.validateSerialOptions = exports.getEffectiveDriverMetadata = exports.applyDriverDefaults = exports.crossValidateConfigs = exports.validateDevices = exports.validateSupportedConfig = exports.validateDefaultConfig = exports.getDriverCacheStats = exports.clearDriverCache = exports.loadDriver = void 0;
4
4
  var loader_js_1 = require("./loader.js");
5
5
  Object.defineProperty(exports, "loadDriver", { enumerable: true, get: function () { return loader_js_1.loadDriver; } });
6
6
  Object.defineProperty(exports, "clearDriverCache", { enumerable: true, get: function () { return loader_js_1.clearDriverCache; } });
@@ -10,6 +10,11 @@ Object.defineProperty(exports, "validateDefaultConfig", { enumerable: true, get:
10
10
  Object.defineProperty(exports, "validateSupportedConfig", { enumerable: true, get: function () { return config_validator_js_1.validateSupportedConfig; } });
11
11
  Object.defineProperty(exports, "validateDevices", { enumerable: true, get: function () { return config_validator_js_1.validateDevices; } });
12
12
  Object.defineProperty(exports, "crossValidateConfigs", { enumerable: true, get: function () { return config_validator_js_1.crossValidateConfigs; } });
13
+ var driver_defaults_js_1 = require("./driver-defaults.js");
14
+ Object.defineProperty(exports, "applyDriverDefaults", { enumerable: true, get: function () { return driver_defaults_js_1.applyDriverDefaults; } });
15
+ Object.defineProperty(exports, "getEffectiveDriverMetadata", { enumerable: true, get: function () { return driver_defaults_js_1.getEffectiveDriverMetadata; } });
16
+ var serial_validation_js_1 = require("./serial-validation.js");
17
+ Object.defineProperty(exports, "validateSerialOptions", { enumerable: true, get: function () { return serial_validation_js_1.validateSerialOptions; } });
13
18
  var driver_package_name_js_1 = require("./driver-package-name.js");
14
19
  Object.defineProperty(exports, "DRIVER_PACKAGE_NAME_RULE", { enumerable: true, get: function () { return driver_package_name_js_1.DRIVER_PACKAGE_NAME_RULE; } });
15
20
  Object.defineProperty(exports, "assertValidDriverPackageName", { enumerable: true, get: function () { return driver_package_name_js_1.assertValidDriverPackageName; } });
@@ -1 +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,mEAIiC;AAH/B,kIAAA,wBAAwB,OAAA;AACxB,sIAAA,4BAA4B,OAAA;AAC5B,kIAAA,wBAAwB,OAAA;AAE1B,yCAKoB;AAJlB,4GAAA,eAAe,OAAA;AACf,gHAAA,mBAAmB,OAAA;AACnB,gHAAA,mBAAmB,OAAA;AACnB,6GAAA,gBAAgB,OAAA;AAElB,qDAAwD;AAA/C,uHAAA,oBAAoB,OAAA"}
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,2DAAsF;AAA7E,yHAAA,mBAAmB,OAAA;AAAE,gIAAA,0BAA0B,OAAA;AAExD,+DAA8D;AAArD,6HAAA,qBAAqB,OAAA;AAC9B,mEAIiC;AAH/B,kIAAA,wBAAwB,OAAA;AACxB,sIAAA,4BAA4B,OAAA;AAC5B,kIAAA,wBAAwB,OAAA;AAE1B,yCAKoB;AAJlB,4GAAA,eAAe,OAAA;AACf,gHAAA,mBAAmB,OAAA;AACnB,gHAAA,mBAAmB,OAAA;AACnB,6GAAA,gBAAgB,OAAA;AAElB,qDAAwD;AAA/C,uHAAA,oBAAoB,OAAA"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Validation of serial connection options against a driver's SUPPORTED_CONFIG
3
+ */
4
+ import type { LoadedDriver } from './loader.js';
5
+ /**
6
+ * Validate baud rate against driver constraints
7
+ *
8
+ * @param baudRate - User-specified baud rate
9
+ * @param driverMetadata - Loaded driver metadata
10
+ * @throws ValidationError if invalid
11
+ */
12
+ export declare function validateBaudRate(baudRate: number | undefined, driverMetadata?: LoadedDriver): void;
13
+ /**
14
+ * Validate parity against driver constraints
15
+ *
16
+ * @param parity - User-specified parity
17
+ * @param driverMetadata - Loaded driver metadata
18
+ * @throws ValidationError if invalid
19
+ */
20
+ export declare function validateParity(parity: string | undefined, driverMetadata?: LoadedDriver): void;
21
+ /**
22
+ * Validate data bits against driver constraints
23
+ *
24
+ * @param dataBits - User-specified data bits
25
+ * @param driverMetadata - Loaded driver metadata
26
+ * @throws ValidationError if invalid
27
+ */
28
+ export declare function validateDataBits(dataBits: number | undefined, driverMetadata?: LoadedDriver): void;
29
+ /**
30
+ * Validate stop bits against driver constraints
31
+ *
32
+ * @param stopBits - User-specified stop bits
33
+ * @param driverMetadata - Loaded driver metadata
34
+ * @throws ValidationError if invalid
35
+ */
36
+ export declare function validateStopBits(stopBits: number | undefined, driverMetadata?: LoadedDriver): void;
37
+ /**
38
+ * Validate slave ID/address against driver constraints
39
+ *
40
+ * @param slaveId - User-specified slave ID
41
+ * @param driverMetadata - Loaded driver metadata
42
+ * @throws ValidationError if invalid
43
+ */
44
+ export declare function validateSlaveId(slaveId: number | undefined, driverMetadata?: LoadedDriver): void;
45
+ /**
46
+ * Validate all serial connection parameters
47
+ *
48
+ * Validates baudRate, parity, dataBits, stopBits, and slaveId against driver constraints.
49
+ *
50
+ * @param options - Connection options to validate
51
+ * @param driverMetadata - Loaded driver metadata
52
+ * @throws ValidationError if any parameter is invalid
53
+ */
54
+ export declare function validateSerialOptions(options: {
55
+ baudRate?: number;
56
+ parity?: string;
57
+ dataBits?: number;
58
+ stopBits?: number;
59
+ slaveId?: number;
60
+ }, driverMetadata?: LoadedDriver): void;
61
+ //# sourceMappingURL=serial-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serial-validation.d.ts","sourceRoot":"","sources":["../../../src/serial-validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAc/C;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,cAAc,CAAC,EAAE,YAAY,GAC5B,IAAI,CAwBN;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,CAAC,EAAE,YAAY,GAAG,IAAI,CAwB9F;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,cAAc,CAAC,EAAE,YAAY,GAC5B,IAAI,CAwBN;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,cAAc,CAAC,EAAE,YAAY,GAC5B,IAAI,CAwBN;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,cAAc,CAAC,EAAE,YAAY,GAAG,IAAI,CAuBhG;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,EACD,cAAc,CAAC,EAAE,YAAY,GAC5B,IAAI,CAMN"}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ /**
3
+ * Validation of serial connection options against a driver's SUPPORTED_CONFIG
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validateBaudRate = validateBaudRate;
7
+ exports.validateParity = validateParity;
8
+ exports.validateDataBits = validateDataBits;
9
+ exports.validateStopBits = validateStopBits;
10
+ exports.validateSlaveId = validateSlaveId;
11
+ exports.validateSerialOptions = validateSerialOptions;
12
+ const errors_js_1 = require("./errors.js");
13
+ /**
14
+ * Check if config is a serial config (has validBaudRates)
15
+ */
16
+ function isSerialConfig(config) {
17
+ return (config !== null &&
18
+ config !== undefined &&
19
+ typeof config === 'object' &&
20
+ 'validBaudRates' in config);
21
+ }
22
+ /**
23
+ * Validate baud rate against driver constraints
24
+ *
25
+ * @param baudRate - User-specified baud rate
26
+ * @param driverMetadata - Loaded driver metadata
27
+ * @throws ValidationError if invalid
28
+ */
29
+ function validateBaudRate(baudRate, driverMetadata) {
30
+ if (baudRate === undefined) {
31
+ return; // No validation needed if not specified
32
+ }
33
+ const supportedConfig = driverMetadata?.supportedConfig;
34
+ if (!isSerialConfig(supportedConfig) || !supportedConfig.validBaudRates) {
35
+ return; // No driver-specific constraints
36
+ }
37
+ const validRates = supportedConfig.validBaudRates;
38
+ if (!validRates.includes(baudRate)) {
39
+ const rateList = validRates.join(', ');
40
+ const defaultConfig = driverMetadata?.defaultConfig;
41
+ const defaultRate = defaultConfig && 'baudRate' in defaultConfig ? defaultConfig.baudRate : undefined;
42
+ throw new errors_js_1.ValidationError(`Invalid baud rate ${baudRate}. This driver supports: ${rateList}${defaultRate ? ` (default: ${defaultRate})` : ''}`, 'baudRate', baudRate, validRates);
43
+ }
44
+ }
45
+ /**
46
+ * Validate parity against driver constraints
47
+ *
48
+ * @param parity - User-specified parity
49
+ * @param driverMetadata - Loaded driver metadata
50
+ * @throws ValidationError if invalid
51
+ */
52
+ function validateParity(parity, driverMetadata) {
53
+ if (parity === undefined) {
54
+ return;
55
+ }
56
+ const supportedConfig = driverMetadata?.supportedConfig;
57
+ if (!isSerialConfig(supportedConfig) || !supportedConfig.validParity) {
58
+ return;
59
+ }
60
+ const validParity = supportedConfig.validParity;
61
+ if (!validParity.includes(parity)) {
62
+ const parityList = validParity.join(', ');
63
+ const defaultConfig = driverMetadata?.defaultConfig;
64
+ const defaultParity = defaultConfig && 'parity' in defaultConfig ? defaultConfig.parity : undefined;
65
+ throw new errors_js_1.ValidationError(`Invalid parity '${parity}'. This driver supports: ${parityList}${defaultParity ? ` (default: ${defaultParity})` : ''}`, 'parity', parity, validParity);
66
+ }
67
+ }
68
+ /**
69
+ * Validate data bits against driver constraints
70
+ *
71
+ * @param dataBits - User-specified data bits
72
+ * @param driverMetadata - Loaded driver metadata
73
+ * @throws ValidationError if invalid
74
+ */
75
+ function validateDataBits(dataBits, driverMetadata) {
76
+ if (dataBits === undefined) {
77
+ return;
78
+ }
79
+ const supportedConfig = driverMetadata?.supportedConfig;
80
+ if (!isSerialConfig(supportedConfig) || !supportedConfig.validDataBits) {
81
+ return;
82
+ }
83
+ const validDataBits = supportedConfig.validDataBits;
84
+ if (!validDataBits.includes(dataBits)) {
85
+ const bitsList = validDataBits.join(', ');
86
+ const defaultConfig = driverMetadata?.defaultConfig;
87
+ const defaultBits = defaultConfig && 'dataBits' in defaultConfig ? defaultConfig.dataBits : undefined;
88
+ throw new errors_js_1.ValidationError(`Invalid data bits ${dataBits}. This driver supports: ${bitsList}${defaultBits ? ` (default: ${defaultBits})` : ''}`, 'dataBits', dataBits, validDataBits);
89
+ }
90
+ }
91
+ /**
92
+ * Validate stop bits against driver constraints
93
+ *
94
+ * @param stopBits - User-specified stop bits
95
+ * @param driverMetadata - Loaded driver metadata
96
+ * @throws ValidationError if invalid
97
+ */
98
+ function validateStopBits(stopBits, driverMetadata) {
99
+ if (stopBits === undefined) {
100
+ return;
101
+ }
102
+ const supportedConfig = driverMetadata?.supportedConfig;
103
+ if (!isSerialConfig(supportedConfig) || !supportedConfig.validStopBits) {
104
+ return;
105
+ }
106
+ const validStopBits = supportedConfig.validStopBits;
107
+ if (!validStopBits.includes(stopBits)) {
108
+ const bitsList = validStopBits.join(', ');
109
+ const defaultConfig = driverMetadata?.defaultConfig;
110
+ const defaultBits = defaultConfig && 'stopBits' in defaultConfig ? defaultConfig.stopBits : undefined;
111
+ throw new errors_js_1.ValidationError(`Invalid stop bits ${stopBits}. This driver supports: ${bitsList}${defaultBits ? ` (default: ${defaultBits})` : ''}`, 'stopBits', stopBits, validStopBits);
112
+ }
113
+ }
114
+ /**
115
+ * Validate slave ID/address against driver constraints
116
+ *
117
+ * @param slaveId - User-specified slave ID
118
+ * @param driverMetadata - Loaded driver metadata
119
+ * @throws ValidationError if invalid
120
+ */
121
+ function validateSlaveId(slaveId, driverMetadata) {
122
+ if (slaveId === undefined) {
123
+ return;
124
+ }
125
+ const supportedConfig = driverMetadata?.supportedConfig;
126
+ if (!isSerialConfig(supportedConfig) || !supportedConfig.validAddressRange) {
127
+ return;
128
+ }
129
+ const [min, max] = supportedConfig.validAddressRange;
130
+ if (slaveId < min || slaveId > max) {
131
+ const defaultConfig = driverMetadata?.defaultConfig;
132
+ const defaultAddress = defaultConfig && 'defaultAddress' in defaultConfig ? defaultConfig.defaultAddress : undefined;
133
+ throw new errors_js_1.ValidationError(`Invalid slave ID ${slaveId}. This driver supports: ${min}-${max}${defaultAddress ? ` (default: ${defaultAddress})` : ''}`, 'slaveId', slaveId, [min, max]);
134
+ }
135
+ }
136
+ /**
137
+ * Validate all serial connection parameters
138
+ *
139
+ * Validates baudRate, parity, dataBits, stopBits, and slaveId against driver constraints.
140
+ *
141
+ * @param options - Connection options to validate
142
+ * @param driverMetadata - Loaded driver metadata
143
+ * @throws ValidationError if any parameter is invalid
144
+ */
145
+ function validateSerialOptions(options, driverMetadata) {
146
+ validateBaudRate(options.baudRate, driverMetadata);
147
+ validateParity(options.parity, driverMetadata);
148
+ validateDataBits(options.dataBits, driverMetadata);
149
+ validateStopBits(options.stopBits, driverMetadata);
150
+ validateSlaveId(options.slaveId, driverMetadata);
151
+ }
152
+ //# sourceMappingURL=serial-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serial-validation.js","sourceRoot":"","sources":["../../../src/serial-validation.ts"],"names":[],"mappings":"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"}