@ya-modbus/cli 0.6.0 → 0.7.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 (207) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/bin/ya-modbus.d.ts.map +1 -0
  3. package/dist/cjs/bin/ya-modbus.js +12 -0
  4. package/dist/cjs/bin/ya-modbus.js.map +1 -0
  5. package/dist/cjs/package.json +1 -0
  6. package/dist/cjs/src/commands/discover.d.ts.map +1 -0
  7. package/dist/cjs/src/commands/discover.js +196 -0
  8. package/dist/cjs/src/commands/discover.js.map +1 -0
  9. package/dist/cjs/src/commands/list-devices.d.ts.map +1 -0
  10. package/dist/cjs/src/commands/list-devices.js +79 -0
  11. package/dist/cjs/src/commands/list-devices.js.map +1 -0
  12. package/dist/cjs/src/commands/read.d.ts.map +1 -0
  13. package/dist/cjs/src/commands/read.js +79 -0
  14. package/dist/cjs/src/commands/read.js.map +1 -0
  15. package/dist/cjs/src/commands/show-defaults.d.ts.map +1 -0
  16. package/dist/cjs/src/commands/show-defaults.js +51 -0
  17. package/dist/cjs/src/commands/show-defaults.js.map +1 -0
  18. package/dist/cjs/src/commands/write.d.ts.map +1 -0
  19. package/dist/cjs/src/commands/write.js +65 -0
  20. package/dist/cjs/src/commands/write.js.map +1 -0
  21. package/dist/cjs/src/discovery/constants.d.ts.map +1 -0
  22. package/dist/cjs/src/discovery/constants.js +48 -0
  23. package/dist/cjs/src/discovery/constants.js.map +1 -0
  24. package/dist/cjs/src/discovery/device-identifier.d.ts.map +1 -0
  25. package/dist/cjs/src/discovery/device-identifier.js +196 -0
  26. package/dist/cjs/src/discovery/device-identifier.js.map +1 -0
  27. package/dist/cjs/src/discovery/parameter-generator-utils.d.ts.map +1 -0
  28. package/dist/cjs/src/discovery/parameter-generator-utils.js +63 -0
  29. package/dist/cjs/src/discovery/parameter-generator-utils.js.map +1 -0
  30. package/dist/cjs/src/discovery/parameter-generator.d.ts.map +1 -0
  31. package/dist/cjs/src/discovery/parameter-generator.js +188 -0
  32. package/dist/cjs/src/discovery/parameter-generator.js.map +1 -0
  33. package/dist/cjs/src/discovery/progress.d.ts.map +1 -0
  34. package/dist/cjs/src/discovery/progress.js +59 -0
  35. package/dist/cjs/src/discovery/progress.js.map +1 -0
  36. package/dist/cjs/src/discovery/scanner.d.ts.map +1 -0
  37. package/dist/cjs/src/discovery/scanner.js +147 -0
  38. package/dist/cjs/src/discovery/scanner.js.map +1 -0
  39. package/dist/cjs/src/formatters/discovery-results.d.ts.map +1 -0
  40. package/dist/cjs/src/formatters/discovery-results.js +62 -0
  41. package/dist/cjs/src/formatters/discovery-results.js.map +1 -0
  42. package/dist/cjs/src/formatters/json.d.ts.map +1 -0
  43. package/dist/cjs/src/formatters/json.js +36 -0
  44. package/dist/cjs/src/formatters/json.js.map +1 -0
  45. package/dist/cjs/src/formatters/performance.d.ts.map +1 -0
  46. package/dist/cjs/src/formatters/performance.js +28 -0
  47. package/dist/cjs/src/formatters/performance.js.map +1 -0
  48. package/dist/cjs/src/formatters/table.d.ts.map +1 -0
  49. package/dist/cjs/src/formatters/table.js +95 -0
  50. package/dist/cjs/src/formatters/table.js.map +1 -0
  51. package/dist/cjs/src/index.d.ts.map +1 -0
  52. package/dist/cjs/src/index.js +157 -0
  53. package/dist/cjs/src/index.js.map +1 -0
  54. package/dist/cjs/src/utils/commands.d.ts.map +1 -0
  55. package/dist/cjs/src/utils/commands.js +421 -0
  56. package/dist/cjs/src/utils/commands.js.map +1 -0
  57. package/dist/cjs/src/utils/object-utils.d.ts.map +1 -0
  58. package/dist/cjs/src/utils/object-utils.js +31 -0
  59. package/dist/cjs/src/utils/object-utils.js.map +1 -0
  60. package/dist/cjs/src/utils/validation.d.ts.map +1 -0
  61. package/dist/cjs/src/utils/validation.js +165 -0
  62. package/dist/cjs/src/utils/validation.js.map +1 -0
  63. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  64. package/dist/esm/bin/ya-modbus.d.ts +9 -0
  65. package/dist/esm/bin/ya-modbus.d.ts.map +1 -0
  66. package/dist/esm/bin/ya-modbus.js.map +1 -0
  67. package/dist/esm/package.json +1 -0
  68. package/dist/esm/src/commands/discover.d.ts +25 -0
  69. package/dist/esm/src/commands/discover.d.ts.map +1 -0
  70. package/dist/esm/src/commands/discover.js.map +1 -0
  71. package/dist/esm/src/commands/list-devices.d.ts +21 -0
  72. package/dist/esm/src/commands/list-devices.d.ts.map +1 -0
  73. package/dist/esm/src/commands/list-devices.js.map +1 -0
  74. package/dist/esm/src/commands/read.d.ts +25 -0
  75. package/dist/esm/src/commands/read.d.ts.map +1 -0
  76. package/dist/esm/src/commands/read.js.map +1 -0
  77. package/dist/esm/src/commands/show-defaults.d.ts +21 -0
  78. package/dist/esm/src/commands/show-defaults.d.ts.map +1 -0
  79. package/dist/esm/src/commands/show-defaults.js.map +1 -0
  80. package/dist/esm/src/commands/write.d.ts +26 -0
  81. package/dist/esm/src/commands/write.d.ts.map +1 -0
  82. package/dist/esm/src/commands/write.js.map +1 -0
  83. package/dist/esm/src/discovery/constants.d.ts +37 -0
  84. package/dist/esm/src/discovery/constants.d.ts.map +1 -0
  85. package/dist/esm/src/discovery/constants.js.map +1 -0
  86. package/dist/esm/src/discovery/device-identifier.d.ts +52 -0
  87. package/dist/esm/src/discovery/device-identifier.d.ts.map +1 -0
  88. package/dist/esm/src/discovery/device-identifier.js.map +1 -0
  89. package/dist/esm/src/discovery/parameter-generator-utils.d.ts +29 -0
  90. package/dist/esm/src/discovery/parameter-generator-utils.d.ts.map +1 -0
  91. package/dist/esm/src/discovery/parameter-generator-utils.js.map +1 -0
  92. package/dist/esm/src/discovery/parameter-generator.d.ts +97 -0
  93. package/dist/esm/src/discovery/parameter-generator.d.ts.map +1 -0
  94. package/dist/esm/src/discovery/parameter-generator.js.map +1 -0
  95. package/dist/esm/src/discovery/progress.d.ts +24 -0
  96. package/dist/esm/src/discovery/progress.d.ts.map +1 -0
  97. package/dist/{src → esm/src}/discovery/progress.js +2 -4
  98. package/dist/esm/src/discovery/progress.js.map +1 -0
  99. package/dist/esm/src/discovery/scanner.d.ts +46 -0
  100. package/dist/esm/src/discovery/scanner.d.ts.map +1 -0
  101. package/dist/esm/src/discovery/scanner.js.map +1 -0
  102. package/dist/esm/src/formatters/discovery-results.d.ts +10 -0
  103. package/dist/esm/src/formatters/discovery-results.d.ts.map +1 -0
  104. package/dist/esm/src/formatters/discovery-results.js.map +1 -0
  105. package/dist/esm/src/formatters/json.d.ts +30 -0
  106. package/dist/esm/src/formatters/json.d.ts.map +1 -0
  107. package/dist/esm/src/formatters/json.js.map +1 -0
  108. package/dist/esm/src/formatters/performance.d.ts +19 -0
  109. package/dist/esm/src/formatters/performance.d.ts.map +1 -0
  110. package/dist/esm/src/formatters/performance.js.map +1 -0
  111. package/dist/esm/src/formatters/table.d.ts +10 -0
  112. package/dist/esm/src/formatters/table.d.ts.map +1 -0
  113. package/dist/esm/src/formatters/table.js.map +1 -0
  114. package/dist/esm/src/index.d.ts +5 -0
  115. package/dist/esm/src/index.d.ts.map +1 -0
  116. package/dist/esm/src/index.js.map +1 -0
  117. package/dist/esm/src/utils/commands.d.ts +191 -0
  118. package/dist/esm/src/utils/commands.d.ts.map +1 -0
  119. package/dist/esm/src/utils/commands.js.map +1 -0
  120. package/dist/esm/src/utils/object-utils.d.ts +20 -0
  121. package/dist/esm/src/utils/object-utils.d.ts.map +1 -0
  122. package/dist/esm/src/utils/object-utils.js.map +1 -0
  123. package/dist/esm/src/utils/validation.d.ts +70 -0
  124. package/dist/esm/src/utils/validation.d.ts.map +1 -0
  125. package/dist/{src → esm/src}/utils/validation.js +0 -3
  126. package/dist/esm/src/utils/validation.js.map +1 -0
  127. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  128. package/package.json +26 -9
  129. package/dist/bin/ya-modbus.d.ts.map +0 -1
  130. package/dist/bin/ya-modbus.js.map +0 -1
  131. package/dist/src/commands/discover.d.ts.map +0 -1
  132. package/dist/src/commands/discover.js.map +0 -1
  133. package/dist/src/commands/list-devices.d.ts.map +0 -1
  134. package/dist/src/commands/list-devices.js.map +0 -1
  135. package/dist/src/commands/read.d.ts.map +0 -1
  136. package/dist/src/commands/read.js.map +0 -1
  137. package/dist/src/commands/show-defaults.d.ts.map +0 -1
  138. package/dist/src/commands/show-defaults.js.map +0 -1
  139. package/dist/src/commands/write.d.ts.map +0 -1
  140. package/dist/src/commands/write.js.map +0 -1
  141. package/dist/src/discovery/constants.d.ts.map +0 -1
  142. package/dist/src/discovery/constants.js.map +0 -1
  143. package/dist/src/discovery/device-identifier.d.ts.map +0 -1
  144. package/dist/src/discovery/device-identifier.js.map +0 -1
  145. package/dist/src/discovery/parameter-generator-utils.d.ts.map +0 -1
  146. package/dist/src/discovery/parameter-generator-utils.js.map +0 -1
  147. package/dist/src/discovery/parameter-generator.d.ts.map +0 -1
  148. package/dist/src/discovery/parameter-generator.js.map +0 -1
  149. package/dist/src/discovery/progress.d.ts.map +0 -1
  150. package/dist/src/discovery/progress.js.map +0 -1
  151. package/dist/src/discovery/scanner.d.ts.map +0 -1
  152. package/dist/src/discovery/scanner.js.map +0 -1
  153. package/dist/src/formatters/discovery-results.d.ts.map +0 -1
  154. package/dist/src/formatters/discovery-results.js.map +0 -1
  155. package/dist/src/formatters/json.d.ts.map +0 -1
  156. package/dist/src/formatters/json.js.map +0 -1
  157. package/dist/src/formatters/performance.d.ts.map +0 -1
  158. package/dist/src/formatters/performance.js.map +0 -1
  159. package/dist/src/formatters/table.d.ts.map +0 -1
  160. package/dist/src/formatters/table.js.map +0 -1
  161. package/dist/src/index.d.ts.map +0 -1
  162. package/dist/src/index.js.map +0 -1
  163. package/dist/src/utils/commands.d.ts.map +0 -1
  164. package/dist/src/utils/commands.js.map +0 -1
  165. package/dist/src/utils/object-utils.d.ts.map +0 -1
  166. package/dist/src/utils/object-utils.js.map +0 -1
  167. package/dist/src/utils/validation.d.ts.map +0 -1
  168. package/dist/src/utils/validation.js.map +0 -1
  169. package/dist/tsconfig.tsbuildinfo +0 -1
  170. /package/dist/{bin → cjs/bin}/ya-modbus.d.ts +0 -0
  171. /package/dist/{src → cjs/src}/commands/discover.d.ts +0 -0
  172. /package/dist/{src → cjs/src}/commands/list-devices.d.ts +0 -0
  173. /package/dist/{src → cjs/src}/commands/read.d.ts +0 -0
  174. /package/dist/{src → cjs/src}/commands/show-defaults.d.ts +0 -0
  175. /package/dist/{src → cjs/src}/commands/write.d.ts +0 -0
  176. /package/dist/{src → cjs/src}/discovery/constants.d.ts +0 -0
  177. /package/dist/{src → cjs/src}/discovery/device-identifier.d.ts +0 -0
  178. /package/dist/{src → cjs/src}/discovery/parameter-generator-utils.d.ts +0 -0
  179. /package/dist/{src → cjs/src}/discovery/parameter-generator.d.ts +0 -0
  180. /package/dist/{src → cjs/src}/discovery/progress.d.ts +0 -0
  181. /package/dist/{src → cjs/src}/discovery/scanner.d.ts +0 -0
  182. /package/dist/{src → cjs/src}/formatters/discovery-results.d.ts +0 -0
  183. /package/dist/{src → cjs/src}/formatters/json.d.ts +0 -0
  184. /package/dist/{src → cjs/src}/formatters/performance.d.ts +0 -0
  185. /package/dist/{src → cjs/src}/formatters/table.d.ts +0 -0
  186. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  187. /package/dist/{src → cjs/src}/utils/commands.d.ts +0 -0
  188. /package/dist/{src → cjs/src}/utils/object-utils.d.ts +0 -0
  189. /package/dist/{src → cjs/src}/utils/validation.d.ts +0 -0
  190. /package/dist/{bin → esm/bin}/ya-modbus.js +0 -0
  191. /package/dist/{src → esm/src}/commands/discover.js +0 -0
  192. /package/dist/{src → esm/src}/commands/list-devices.js +0 -0
  193. /package/dist/{src → esm/src}/commands/read.js +0 -0
  194. /package/dist/{src → esm/src}/commands/show-defaults.js +0 -0
  195. /package/dist/{src → esm/src}/commands/write.js +0 -0
  196. /package/dist/{src → esm/src}/discovery/constants.js +0 -0
  197. /package/dist/{src → esm/src}/discovery/device-identifier.js +0 -0
  198. /package/dist/{src → esm/src}/discovery/parameter-generator-utils.js +0 -0
  199. /package/dist/{src → esm/src}/discovery/parameter-generator.js +0 -0
  200. /package/dist/{src → esm/src}/discovery/scanner.js +0 -0
  201. /package/dist/{src → esm/src}/formatters/discovery-results.js +0 -0
  202. /package/dist/{src → esm/src}/formatters/json.js +0 -0
  203. /package/dist/{src → esm/src}/formatters/performance.js +0 -0
  204. /package/dist/{src → esm/src}/formatters/table.js +0 -0
  205. /package/dist/{src → esm/src}/index.js +0 -0
  206. /package/dist/{src → esm/src}/utils/commands.js +0 -0
  207. /package/dist/{src → esm/src}/utils/object-utils.js +0 -0
@@ -0,0 +1,421 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_TCP_PORT = exports.DEFAULT_RTU_CONFIG = void 0;
4
+ exports.isReadable = isReadable;
5
+ exports.isWritable = isWritable;
6
+ exports.findDataPoint = findDataPoint;
7
+ exports.findReadableDataPoint = findReadableDataPoint;
8
+ exports.findWritableDataPoint = findWritableDataPoint;
9
+ exports.floatsEqual = floatsEqual;
10
+ exports.parseValue = parseValue;
11
+ exports.validateValue = validateValue;
12
+ exports.confirm = confirm;
13
+ exports.withTransport = withTransport;
14
+ exports.loadDriverMetadata = loadDriverMetadata;
15
+ exports.getEffectiveDefaultConfig = getEffectiveDefaultConfig;
16
+ exports.getEffectiveSupportedConfig = getEffectiveSupportedConfig;
17
+ exports.getEffectiveDriverMetadata = getEffectiveDriverMetadata;
18
+ exports.applyDriverDefaults = applyDriverDefaults;
19
+ exports.withDriverInstance = withDriverInstance;
20
+ exports.withDriver = withDriver;
21
+ const tslib_1 = require("tslib");
22
+ const promises_1 = tslib_1.__importDefault(require("readline/promises"));
23
+ const driver_loader_1 = require("@ya-modbus/driver-loader");
24
+ const transport_1 = require("@ya-modbus/transport");
25
+ const object_utils_js_1 = require("./object-utils.js");
26
+ const validation_js_1 = require("./validation.js");
27
+ /**
28
+ * Default RTU transport configuration values
29
+ */
30
+ exports.DEFAULT_RTU_CONFIG = {
31
+ port: '/dev/ttyUSB0',
32
+ baudRate: 9600,
33
+ dataBits: 8,
34
+ parity: 'even',
35
+ stopBits: 1,
36
+ };
37
+ /**
38
+ * Default TCP port for Modbus TCP
39
+ */
40
+ exports.DEFAULT_TCP_PORT = 502;
41
+ /**
42
+ * Check if a data point is readable
43
+ */
44
+ function isReadable(dataPoint) {
45
+ const access = dataPoint.access ?? 'r';
46
+ return access === 'r' || access === 'rw';
47
+ }
48
+ /**
49
+ * Check if a data point is writable
50
+ */
51
+ function isWritable(dataPoint) {
52
+ const access = dataPoint.access ?? 'r';
53
+ return access === 'w' || access === 'rw';
54
+ }
55
+ /**
56
+ * Find a data point by ID
57
+ *
58
+ * @param driver - Device driver instance
59
+ * @param id - Data point ID
60
+ * @returns Data point definition
61
+ * @throws Error if data point not found
62
+ */
63
+ function findDataPoint(driver, id) {
64
+ const dataPoint = driver.dataPoints.find((dp) => dp.id === id);
65
+ if (!dataPoint) {
66
+ throw new Error(`Data point not found: ${id}`);
67
+ }
68
+ return dataPoint;
69
+ }
70
+ /**
71
+ * Find and validate a readable data point
72
+ *
73
+ * @param driver - Device driver instance
74
+ * @param id - Data point ID
75
+ * @returns Data point definition
76
+ * @throws Error if data point not found or not readable
77
+ */
78
+ function findReadableDataPoint(driver, id) {
79
+ const dataPoint = findDataPoint(driver, id);
80
+ if (!isReadable(dataPoint)) {
81
+ throw new Error(`Data point is write-only: ${id}`);
82
+ }
83
+ return dataPoint;
84
+ }
85
+ /**
86
+ * Find and validate a writable data point
87
+ *
88
+ * @param driver - Device driver instance
89
+ * @param id - Data point ID
90
+ * @returns Data point definition
91
+ * @throws Error if data point not found or not writable
92
+ */
93
+ function findWritableDataPoint(driver, id) {
94
+ const dataPoint = findDataPoint(driver, id);
95
+ if (!isWritable(dataPoint)) {
96
+ throw new Error(`Data point is read-only: ${id}`);
97
+ }
98
+ return dataPoint;
99
+ }
100
+ /**
101
+ * Compare two floating point numbers for approximate equality
102
+ *
103
+ * Uses relative error to handle both very small and very large values correctly.
104
+ * Also checks absolute error to handle values near zero.
105
+ *
106
+ * @param a - First value
107
+ * @param b - Second value
108
+ * @param relativeEpsilon - Relative error tolerance (default: 1e-6, or 0.0001%)
109
+ * @param absoluteEpsilon - Absolute error tolerance for values near zero (default: 1e-9)
110
+ * @returns True if values are approximately equal
111
+ */
112
+ function floatsEqual(a, b, relativeEpsilon = 1e-6, absoluteEpsilon = 1e-9) {
113
+ const absoluteError = Math.abs(a - b);
114
+ // Check absolute error first (handles values near zero)
115
+ if (absoluteError < absoluteEpsilon) {
116
+ return true;
117
+ }
118
+ // Check relative error (handles large and small values)
119
+ const largestMagnitude = Math.max(Math.abs(a), Math.abs(b));
120
+ const relativeError = absoluteError / largestMagnitude;
121
+ return relativeError < relativeEpsilon;
122
+ }
123
+ /**
124
+ * Parse value string based on data point type
125
+ */
126
+ function parseValue(valueStr, dataPoint) {
127
+ switch (dataPoint.type) {
128
+ case 'float':
129
+ return parseFloat(valueStr);
130
+ case 'integer':
131
+ return parseInt(valueStr, 10);
132
+ case 'boolean':
133
+ return valueStr.toLowerCase() === 'true' || valueStr === '1';
134
+ case 'string':
135
+ return valueStr;
136
+ case 'enum': {
137
+ // Try to parse as number first, otherwise use string
138
+ const num = parseInt(valueStr, 10);
139
+ return isNaN(num) ? valueStr : num;
140
+ }
141
+ default:
142
+ return valueStr;
143
+ }
144
+ }
145
+ /**
146
+ * Validate value against data point constraints
147
+ */
148
+ function validateValue(value, dataPoint) {
149
+ // Check min/max for numeric types
150
+ if ((dataPoint.type === 'float' || dataPoint.type === 'integer') && typeof value === 'number') {
151
+ if (dataPoint.min !== undefined && value < dataPoint.min) {
152
+ throw new Error(`Value ${value} is outside valid range [${dataPoint.min}, ${dataPoint.max ?? '∞'}]`);
153
+ }
154
+ if (dataPoint.max !== undefined && value > dataPoint.max) {
155
+ throw new Error(`Value ${value} is outside valid range [${dataPoint.min ?? '-∞'}, ${dataPoint.max}]`);
156
+ }
157
+ }
158
+ // Validate enum values
159
+ if (dataPoint.type === 'enum' && dataPoint.enumValues) {
160
+ const validKeys = Object.keys(dataPoint.enumValues);
161
+ const valueStr = String(value);
162
+ if (!validKeys.includes(valueStr)) {
163
+ throw new Error(`Invalid enum value: ${String(value)}. Valid values: ${validKeys.join(', ')}`);
164
+ }
165
+ }
166
+ }
167
+ /**
168
+ * Prompt user for confirmation
169
+ */
170
+ async function confirm(message) {
171
+ const rl = promises_1.default.createInterface({
172
+ input: process.stdin,
173
+ output: process.stdout,
174
+ });
175
+ try {
176
+ const answer = await rl.question(`${message} (y/N): `);
177
+ return answer.toLowerCase() === 'y';
178
+ }
179
+ finally {
180
+ rl.close();
181
+ }
182
+ }
183
+ /**
184
+ * Execute a function with a transport, ensuring cleanup
185
+ *
186
+ * @param options - Transport configuration options
187
+ * @param fn - Function to execute with the transport
188
+ * @returns Result of the function
189
+ */
190
+ async function withTransport(options, fn) {
191
+ // Build transport configuration
192
+ const transportConfig = options.host
193
+ ? {
194
+ // TCP configuration
195
+ host: options.host,
196
+ port: typeof options.port === 'number' ? options.port : exports.DEFAULT_TCP_PORT,
197
+ slaveId: options.slaveId,
198
+ timeout: options.timeout,
199
+ }
200
+ : {
201
+ // RTU configuration
202
+ port: options.port ?? exports.DEFAULT_RTU_CONFIG.port,
203
+ baudRate: options.baudRate ?? exports.DEFAULT_RTU_CONFIG.baudRate,
204
+ dataBits: (options.dataBits ?? exports.DEFAULT_RTU_CONFIG.dataBits),
205
+ parity: (options.parity ?? exports.DEFAULT_RTU_CONFIG.parity),
206
+ stopBits: (options.stopBits ?? exports.DEFAULT_RTU_CONFIG.stopBits),
207
+ slaveId: options.slaveId,
208
+ timeout: options.timeout,
209
+ };
210
+ // Create transport
211
+ const transport = await (0, transport_1.createTransport)(transportConfig);
212
+ try {
213
+ return await fn(transport);
214
+ }
215
+ finally {
216
+ // Always close the transport to release resources and allow process to exit
217
+ await transport.close();
218
+ }
219
+ }
220
+ /**
221
+ * Load driver metadata without creating an instance
222
+ *
223
+ * When no driver name is provided, auto-detects from current working directory.
224
+ *
225
+ * @param driverName - Optional driver package name (auto-detects from cwd if not specified)
226
+ * @returns Loaded driver metadata
227
+ */
228
+ async function loadDriverMetadata(driverName) {
229
+ return await (0, driver_loader_1.loadDriver)(driverName ? { driverPackage: driverName } : {});
230
+ }
231
+ /**
232
+ * Get the effective default config for a device
233
+ *
234
+ * Returns device-specific config if available, otherwise driver-level config.
235
+ *
236
+ * @param driverMetadata - Loaded driver metadata
237
+ * @param device - Optional device key
238
+ * @returns Effective default config or undefined
239
+ */
240
+ function getEffectiveDefaultConfig(driverMetadata, device) {
241
+ if (!driverMetadata) {
242
+ return undefined;
243
+ }
244
+ // Check for device-specific config first
245
+ if (device && driverMetadata.devices?.[device]?.defaultConfig) {
246
+ const deviceConfig = driverMetadata.devices[device].defaultConfig;
247
+ if (deviceConfig && 'baudRate' in deviceConfig) {
248
+ return deviceConfig;
249
+ }
250
+ }
251
+ // Fall back to driver-level config
252
+ const driverConfig = driverMetadata.defaultConfig;
253
+ if (driverConfig && 'baudRate' in driverConfig) {
254
+ return driverConfig;
255
+ }
256
+ return undefined;
257
+ }
258
+ /**
259
+ * Get the effective supported config for a device
260
+ *
261
+ * Returns device-specific constraints if available, otherwise driver-level constraints.
262
+ *
263
+ * @param driverMetadata - Loaded driver metadata
264
+ * @param device - Optional device key
265
+ * @returns Effective supported config or undefined
266
+ */
267
+ function getEffectiveSupportedConfig(driverMetadata, device) {
268
+ if (!driverMetadata) {
269
+ return undefined;
270
+ }
271
+ // Check for device-specific config first
272
+ if (device && driverMetadata.devices?.[device]?.supportedConfig) {
273
+ return driverMetadata.devices[device].supportedConfig;
274
+ }
275
+ // Fall back to driver-level config
276
+ return driverMetadata.supportedConfig;
277
+ }
278
+ /**
279
+ * Create an effective driver metadata with device-specific configs resolved
280
+ *
281
+ * This creates a view of the driver metadata where defaultConfig and supportedConfig
282
+ * are resolved based on the selected device. This allows validation and other
283
+ * functions to work with device-specific settings transparently.
284
+ *
285
+ * @param driverMetadata - Loaded driver metadata
286
+ * @param device - Optional device key
287
+ * @returns Driver metadata with effective configs for the selected device
288
+ */
289
+ function getEffectiveDriverMetadata(driverMetadata, device) {
290
+ const effectiveDefaultConfig = getEffectiveDefaultConfig(driverMetadata, device);
291
+ const effectiveSupportedConfig = getEffectiveSupportedConfig(driverMetadata, device);
292
+ // Build result conditionally to satisfy exactOptionalPropertyTypes
293
+ const result = {
294
+ createDriver: driverMetadata.createDriver,
295
+ };
296
+ if (driverMetadata.devices) {
297
+ result.devices = driverMetadata.devices;
298
+ }
299
+ if (effectiveDefaultConfig) {
300
+ result.defaultConfig = effectiveDefaultConfig;
301
+ }
302
+ if (effectiveSupportedConfig) {
303
+ result.supportedConfig = effectiveSupportedConfig;
304
+ }
305
+ return result;
306
+ }
307
+ /**
308
+ * Apply driver defaults to transport options
309
+ *
310
+ * Uses device-specific defaults if a device is selected, otherwise driver-level defaults.
311
+ *
312
+ * @param options - Transport options (may be incomplete)
313
+ * @param driverMetadata - Loaded driver metadata with defaults
314
+ * @param device - Optional device key for multi-device drivers
315
+ * @returns Transport options with defaults applied
316
+ */
317
+ function applyDriverDefaults(options, driverMetadata, device) {
318
+ // For TCP connections, no serial defaults apply
319
+ if (options.host) {
320
+ return options;
321
+ }
322
+ // Get effective config (device-specific or driver-level)
323
+ const defaultConfig = getEffectiveDefaultConfig(driverMetadata, device);
324
+ if (!defaultConfig) {
325
+ return options;
326
+ }
327
+ // Apply defaults for unspecified options
328
+ return {
329
+ ...options,
330
+ baudRate: options.baudRate ?? defaultConfig.baudRate,
331
+ dataBits: options.dataBits ?? defaultConfig.dataBits,
332
+ stopBits: options.stopBits ?? defaultConfig.stopBits,
333
+ parity: options.parity ?? defaultConfig.parity,
334
+ slaveId: options.slaveId ?? defaultConfig.defaultAddress,
335
+ };
336
+ }
337
+ /**
338
+ * Execute a function with a driver instance, ensuring cleanup
339
+ *
340
+ * @param transport - Transport to use for driver communication
341
+ * @param driverMetadata - Loaded driver metadata
342
+ * @param slaveId - Modbus slave ID
343
+ * @param device - Optional device key for multi-device drivers
344
+ * @param fn - Function to execute with the driver
345
+ * @returns Result of the function
346
+ */
347
+ async function withDriverInstance(transport, driverMetadata, slaveId, device, fn) {
348
+ // Validate device key if DEVICES registry exists
349
+ if (driverMetadata.devices) {
350
+ const validDevices = Object.keys(driverMetadata.devices);
351
+ if (device && !validDevices.includes(device)) {
352
+ throw new Error(`Unknown device: ${device}. Valid devices: ${validDevices.join(', ')}`);
353
+ }
354
+ }
355
+ else if (device) {
356
+ // Warn user that --device is ignored for single-device drivers
357
+ console.warn(`Warning: --device '${device}' ignored (driver does not export a DEVICES registry)`);
358
+ }
359
+ // Create driver instance - only include device if defined
360
+ const driverConfig = device ? { transport, slaveId, device } : { transport, slaveId };
361
+ const driver = await driverMetadata.createDriver(driverConfig);
362
+ return await fn(driver);
363
+ }
364
+ /**
365
+ * Execute a function with a driver instance, handling the complete workflow
366
+ *
367
+ * This is a convenience function that:
368
+ * 1. Loads driver metadata (DEFAULT_CONFIG, SUPPORTED_CONFIG)
369
+ * 2. Validates user options against driver constraints (SUPPORTED_CONFIG)
370
+ * 3. Applies driver defaults to user options
371
+ * 4. Validates merged options (catches invalid third-party driver defaults)
372
+ * 5. Creates transport with merged configuration
373
+ * 6. Creates driver instance
374
+ * 7. Executes callback with driver and merged options
375
+ * 8. Ensures cleanup (closes transport)
376
+ *
377
+ * @param options - Combined transport and driver options
378
+ * @param fn - Function to execute with the driver (and optionally merged config)
379
+ * @returns Result of the function
380
+ * @throws ValidationError if user options or driver defaults violate constraints
381
+ */
382
+ async function withDriver(options, fn) {
383
+ // Load driver metadata first
384
+ const driverMetadata = await loadDriverMetadata(options.driver);
385
+ // Get effective metadata with device-specific configs resolved
386
+ const effectiveMetadata = getEffectiveDriverMetadata(driverMetadata, options.device);
387
+ // Validate user-specified options against device/driver constraints (only for RTU connections)
388
+ if (!options.host) {
389
+ const validationOptions = (0, object_utils_js_1.omitUndefined)({
390
+ baudRate: options.baudRate,
391
+ parity: options.parity,
392
+ dataBits: options.dataBits,
393
+ stopBits: options.stopBits,
394
+ slaveId: options.slaveId,
395
+ });
396
+ (0, validation_js_1.validateSerialOptions)(validationOptions, effectiveMetadata);
397
+ }
398
+ // Apply driver defaults to options (device-specific if selected)
399
+ const mergedOptions = applyDriverDefaults(options, driverMetadata, options.device);
400
+ // Validate merged options to catch invalid defaults from third-party drivers
401
+ // This ensures driver DEFAULT_CONFIG values are valid according to SUPPORTED_CONFIG
402
+ if (!mergedOptions.host) {
403
+ const mergedValidationOptions = (0, object_utils_js_1.omitUndefined)({
404
+ baudRate: mergedOptions.baudRate,
405
+ parity: mergedOptions.parity,
406
+ dataBits: mergedOptions.dataBits,
407
+ stopBits: mergedOptions.stopBits,
408
+ slaveId: mergedOptions.slaveId,
409
+ });
410
+ (0, validation_js_1.validateSerialOptions)(mergedValidationOptions, effectiveMetadata);
411
+ }
412
+ // Create transport with merged options
413
+ return await withTransport(mergedOptions, async (transport) => {
414
+ // Create driver instance
415
+ return await withDriverInstance(transport, driverMetadata, mergedOptions.slaveId, options.device, async (driver) => {
416
+ // Execute callback with driver and merged options
417
+ return await fn(driver, mergedOptions);
418
+ });
419
+ });
420
+ }
421
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../src/utils/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-utils.d.ts","sourceRoot":"","sources":["../../../../src/utils/object-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAUnF"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ /**
3
+ * Object utility functions
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.omitUndefined = omitUndefined;
7
+ /**
8
+ * Remove undefined properties from an object
9
+ *
10
+ * Creates a new object with all properties that are not undefined.
11
+ * Preserves null, false, 0, empty string, and other falsy values.
12
+ *
13
+ * @param obj - Source object
14
+ * @returns New object without undefined properties
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * omitUndefined({ a: 1, b: undefined, c: 'hello' })
19
+ * // Returns: { a: 1, c: 'hello' }
20
+ * ```
21
+ */
22
+ function omitUndefined(obj) {
23
+ const result = {};
24
+ for (const key in obj) {
25
+ if (obj[key] !== undefined) {
26
+ result[key] = obj[key];
27
+ }
28
+ }
29
+ return result;
30
+ }
31
+ //# sourceMappingURL=object-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-utils.js","sourceRoot":"","sources":["../../../../src/utils/object-utils.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAiBH,sCAUC;AAzBD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,aAAa,CAAoC,GAAM;IACrE,MAAM,MAAM,GAAe,EAAE,CAAA;IAE7B,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAG5D;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,KAAK,EAAE,MAAM;aACb,KAAK,EAAE,OAAO;aACd,WAAW,CAAC,EAAE,SAAS,OAAO,EAAE;gBAHhD,OAAO,EAAE,MAAM,EACC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,EACd,WAAW,CAAC,EAAE,SAAS,OAAO,EAAE,YAAA;CAKnD;AAcD;;;;;;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,165 @@
1
+ "use strict";
2
+ /**
3
+ * Validation utilities for CLI options using driver SUPPORTED_CONFIG
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ValidationError = void 0;
7
+ exports.validateBaudRate = validateBaudRate;
8
+ exports.validateParity = validateParity;
9
+ exports.validateDataBits = validateDataBits;
10
+ exports.validateStopBits = validateStopBits;
11
+ exports.validateSlaveId = validateSlaveId;
12
+ exports.validateSerialOptions = validateSerialOptions;
13
+ /**
14
+ * Validation error with helpful context
15
+ */
16
+ class ValidationError extends Error {
17
+ constructor(message, field, value, validValues) {
18
+ super(message);
19
+ this.field = field;
20
+ this.value = value;
21
+ this.validValues = validValues;
22
+ this.name = 'ValidationError';
23
+ }
24
+ }
25
+ exports.ValidationError = ValidationError;
26
+ /**
27
+ * Check if config is a serial config (has validBaudRates)
28
+ */
29
+ function isSerialConfig(config) {
30
+ return (config !== null &&
31
+ config !== undefined &&
32
+ typeof config === 'object' &&
33
+ 'validBaudRates' in config);
34
+ }
35
+ /**
36
+ * Validate baud rate against driver constraints
37
+ *
38
+ * @param baudRate - User-specified baud rate
39
+ * @param driverMetadata - Loaded driver metadata
40
+ * @throws ValidationError if invalid
41
+ */
42
+ function validateBaudRate(baudRate, driverMetadata) {
43
+ if (baudRate === undefined) {
44
+ return; // No validation needed if not specified
45
+ }
46
+ const supportedConfig = driverMetadata?.supportedConfig;
47
+ if (!isSerialConfig(supportedConfig) || !supportedConfig.validBaudRates) {
48
+ return; // No driver-specific constraints
49
+ }
50
+ const validRates = supportedConfig.validBaudRates;
51
+ if (!validRates.includes(baudRate)) {
52
+ const rateList = validRates.join(', ');
53
+ const defaultConfig = driverMetadata?.defaultConfig;
54
+ const defaultRate = defaultConfig && 'baudRate' in defaultConfig ? defaultConfig.baudRate : undefined;
55
+ throw new ValidationError(`Invalid baud rate ${baudRate}. This driver supports: ${rateList}${defaultRate ? ` (default: ${defaultRate})` : ''}`, 'baudRate', baudRate, validRates);
56
+ }
57
+ }
58
+ /**
59
+ * Validate parity against driver constraints
60
+ *
61
+ * @param parity - User-specified parity
62
+ * @param driverMetadata - Loaded driver metadata
63
+ * @throws ValidationError if invalid
64
+ */
65
+ function validateParity(parity, driverMetadata) {
66
+ if (parity === undefined) {
67
+ return;
68
+ }
69
+ const supportedConfig = driverMetadata?.supportedConfig;
70
+ if (!isSerialConfig(supportedConfig) || !supportedConfig.validParity) {
71
+ return;
72
+ }
73
+ const validParity = supportedConfig.validParity;
74
+ if (!validParity.includes(parity)) {
75
+ const parityList = validParity.join(', ');
76
+ const defaultConfig = driverMetadata?.defaultConfig;
77
+ const defaultParity = defaultConfig && 'parity' in defaultConfig ? defaultConfig.parity : undefined;
78
+ throw new ValidationError(`Invalid parity '${parity}'. This driver supports: ${parityList}${defaultParity ? ` (default: ${defaultParity})` : ''}`, 'parity', parity, validParity);
79
+ }
80
+ }
81
+ /**
82
+ * Validate data bits against driver constraints
83
+ *
84
+ * @param dataBits - User-specified data bits
85
+ * @param driverMetadata - Loaded driver metadata
86
+ * @throws ValidationError if invalid
87
+ */
88
+ function validateDataBits(dataBits, driverMetadata) {
89
+ if (dataBits === undefined) {
90
+ return;
91
+ }
92
+ const supportedConfig = driverMetadata?.supportedConfig;
93
+ if (!isSerialConfig(supportedConfig) || !supportedConfig.validDataBits) {
94
+ return;
95
+ }
96
+ const validDataBits = supportedConfig.validDataBits;
97
+ if (!validDataBits.includes(dataBits)) {
98
+ const bitsList = validDataBits.join(', ');
99
+ const defaultConfig = driverMetadata?.defaultConfig;
100
+ const defaultBits = defaultConfig && 'dataBits' in defaultConfig ? defaultConfig.dataBits : undefined;
101
+ throw new ValidationError(`Invalid data bits ${dataBits}. This driver supports: ${bitsList}${defaultBits ? ` (default: ${defaultBits})` : ''}`, 'dataBits', dataBits, validDataBits);
102
+ }
103
+ }
104
+ /**
105
+ * Validate stop bits against driver constraints
106
+ *
107
+ * @param stopBits - User-specified stop bits
108
+ * @param driverMetadata - Loaded driver metadata
109
+ * @throws ValidationError if invalid
110
+ */
111
+ function validateStopBits(stopBits, driverMetadata) {
112
+ if (stopBits === undefined) {
113
+ return;
114
+ }
115
+ const supportedConfig = driverMetadata?.supportedConfig;
116
+ if (!isSerialConfig(supportedConfig) || !supportedConfig.validStopBits) {
117
+ return;
118
+ }
119
+ const validStopBits = supportedConfig.validStopBits;
120
+ if (!validStopBits.includes(stopBits)) {
121
+ const bitsList = validStopBits.join(', ');
122
+ const defaultConfig = driverMetadata?.defaultConfig;
123
+ const defaultBits = defaultConfig && 'stopBits' in defaultConfig ? defaultConfig.stopBits : undefined;
124
+ throw new ValidationError(`Invalid stop bits ${stopBits}. This driver supports: ${bitsList}${defaultBits ? ` (default: ${defaultBits})` : ''}`, 'stopBits', stopBits, validStopBits);
125
+ }
126
+ }
127
+ /**
128
+ * Validate slave ID/address against driver constraints
129
+ *
130
+ * @param slaveId - User-specified slave ID
131
+ * @param driverMetadata - Loaded driver metadata
132
+ * @throws ValidationError if invalid
133
+ */
134
+ function validateSlaveId(slaveId, driverMetadata) {
135
+ if (slaveId === undefined) {
136
+ return;
137
+ }
138
+ const supportedConfig = driverMetadata?.supportedConfig;
139
+ if (!isSerialConfig(supportedConfig) || !supportedConfig.validAddressRange) {
140
+ return;
141
+ }
142
+ const [min, max] = supportedConfig.validAddressRange;
143
+ if (slaveId < min || slaveId > max) {
144
+ const defaultConfig = driverMetadata?.defaultConfig;
145
+ const defaultAddress = defaultConfig && 'defaultAddress' in defaultConfig ? defaultConfig.defaultAddress : undefined;
146
+ throw new ValidationError(`Invalid slave ID ${slaveId}. This driver supports: ${min}-${max}${defaultAddress ? ` (default: ${defaultAddress})` : ''}`, 'slaveId', slaveId, [min, max]);
147
+ }
148
+ }
149
+ /**
150
+ * Validate all serial connection parameters
151
+ *
152
+ * Validates baudRate, parity, dataBits, stopBits, and slaveId against driver constraints.
153
+ *
154
+ * @param options - Connection options to validate
155
+ * @param driverMetadata - Loaded driver metadata
156
+ * @throws ValidationError if any parameter is invalid
157
+ */
158
+ function validateSerialOptions(options, driverMetadata) {
159
+ validateBaudRate(options.baudRate, driverMetadata);
160
+ validateParity(options.parity, driverMetadata);
161
+ validateDataBits(options.dataBits, driverMetadata);
162
+ validateStopBits(options.stopBits, driverMetadata);
163
+ validateSlaveId(options.slaveId, driverMetadata);
164
+ }
165
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../src/utils/validation.ts"],"names":[],"mappings":"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"}