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