@ya-modbus/driver-loader 0.4.1-refactor-scope-driver-packages.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/LICENSE +674 -0
- package/README.md +353 -0
- package/dist/config-validator.d.ts +53 -0
- package/dist/config-validator.d.ts.map +1 -0
- package/dist/config-validator.js +315 -0
- package/dist/config-validator.js.map +1 -0
- package/dist/errors.d.ts +69 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +89 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +122 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +242 -0
- package/dist/loader.js.map +1 -0
- package/dist/testing/index.d.ts +21 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +25 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing.d.ts +64 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +74 -0
- package/dist/testing.js.map +1 -0
- package/package.json +59 -0
package/dist/loader.js
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.clearDriverCache = clearDriverCache;
|
|
37
|
+
exports.getDriverCacheStats = getDriverCacheStats;
|
|
38
|
+
exports.loadDriver = loadDriver;
|
|
39
|
+
const promises_1 = require("fs/promises");
|
|
40
|
+
const path_1 = require("path");
|
|
41
|
+
const config_validator_js_1 = require("./config-validator.js");
|
|
42
|
+
const errors_js_1 = require("./errors.js");
|
|
43
|
+
/**
|
|
44
|
+
* Default system dependencies using Node.js built-ins
|
|
45
|
+
*/
|
|
46
|
+
/* istanbul ignore next */
|
|
47
|
+
const defaultDeps = {
|
|
48
|
+
/* istanbul ignore next */
|
|
49
|
+
readFile: (path, encoding) => (0, promises_1.readFile)(path, encoding),
|
|
50
|
+
/* istanbul ignore next */
|
|
51
|
+
importModule: (modulePath) => Promise.resolve(`${modulePath}`).then(s => __importStar(require(s))),
|
|
52
|
+
/* istanbul ignore next */
|
|
53
|
+
getCwd: () => process.cwd(),
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* LRU cache for loaded drivers
|
|
57
|
+
*/
|
|
58
|
+
const driverCache = new Map();
|
|
59
|
+
/**
|
|
60
|
+
* Cache statistics
|
|
61
|
+
*/
|
|
62
|
+
const cacheStats = {
|
|
63
|
+
hits: 0,
|
|
64
|
+
misses: 0,
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Clear the driver cache
|
|
68
|
+
* Useful for testing or when you need to reload drivers
|
|
69
|
+
*/
|
|
70
|
+
function clearDriverCache() {
|
|
71
|
+
driverCache.clear();
|
|
72
|
+
cacheStats.hits = 0;
|
|
73
|
+
cacheStats.misses = 0;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get cache statistics
|
|
77
|
+
* @returns Current cache statistics including hits, misses, and size
|
|
78
|
+
*/
|
|
79
|
+
function getDriverCacheStats() {
|
|
80
|
+
return {
|
|
81
|
+
hits: cacheStats.hits,
|
|
82
|
+
misses: cacheStats.misses,
|
|
83
|
+
size: driverCache.size,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Auto-detect local driver package from package.json
|
|
88
|
+
*
|
|
89
|
+
* @param deps - System dependencies
|
|
90
|
+
* @returns Package name if valid driver package
|
|
91
|
+
* @throws Error if not a valid driver package
|
|
92
|
+
*/
|
|
93
|
+
async function detectLocalPackage(deps) {
|
|
94
|
+
try {
|
|
95
|
+
const packageJsonPath = (0, path_1.join)(deps.getCwd(), 'package.json');
|
|
96
|
+
const packageJsonContent = await deps.readFile(packageJsonPath, 'utf-8');
|
|
97
|
+
const packageJson = JSON.parse(packageJsonContent);
|
|
98
|
+
const keywords = packageJson.keywords ?? [];
|
|
99
|
+
if (!keywords.includes('ya-modbus-driver')) {
|
|
100
|
+
throw new errors_js_1.PackageJsonError('Current package is not a ya-modbus driver. ' +
|
|
101
|
+
'Add "ya-modbus-driver" to keywords in package.json');
|
|
102
|
+
}
|
|
103
|
+
const name = packageJson.name;
|
|
104
|
+
if (!name) {
|
|
105
|
+
throw new errors_js_1.PackageJsonError('package.json must have a "name" field');
|
|
106
|
+
}
|
|
107
|
+
return name;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
if (error.code === 'ENOENT') {
|
|
111
|
+
throw new errors_js_1.PackageJsonError('package.json not found in current directory. ' +
|
|
112
|
+
'Run this command from a driver package directory or specify --driver');
|
|
113
|
+
}
|
|
114
|
+
if (error instanceof SyntaxError) {
|
|
115
|
+
throw new errors_js_1.PackageJsonError('Failed to parse package.json: invalid JSON');
|
|
116
|
+
}
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Try to import a module with multiple path attempts
|
|
122
|
+
*
|
|
123
|
+
* @param paths - Array of module paths to try
|
|
124
|
+
* @param deps - System dependencies
|
|
125
|
+
* @returns Imported module
|
|
126
|
+
* @throws Error if all paths fail
|
|
127
|
+
*/
|
|
128
|
+
async function tryImport(paths, deps) {
|
|
129
|
+
const errors = [];
|
|
130
|
+
for (const path of paths) {
|
|
131
|
+
try {
|
|
132
|
+
return await deps.importModule(path);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
errors.push(error);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const lastError = errors[errors.length - 1];
|
|
139
|
+
throw new Error(`Failed to import module from any path. Tried: ${paths.join(', ')}\nLast error: ${lastError?.message}`, { cause: lastError });
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Load a driver package dynamically
|
|
143
|
+
*
|
|
144
|
+
* Supports two modes:
|
|
145
|
+
* 1. Explicit package: `loadDriver({ driverPackage: 'ya-modbus-driver-xymd1' })`
|
|
146
|
+
* 2. Auto-detect from cwd: `loadDriver({})` - reads package.json from current directory
|
|
147
|
+
*
|
|
148
|
+
* Auto-detection checks for `ya-modbus-driver` keyword in package.json keywords.
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* // Auto-detect from current directory
|
|
152
|
+
* const driver = await loadDriver({})
|
|
153
|
+
*
|
|
154
|
+
* // Load explicit package
|
|
155
|
+
* const driver = await loadDriver({ driverPackage: 'ya-modbus-driver-xymd1' })
|
|
156
|
+
*
|
|
157
|
+
* @param options - Loading options (defaults to local package detection)
|
|
158
|
+
* @param deps - System dependencies (for testing, uses Node.js built-ins by default)
|
|
159
|
+
* @returns Loaded driver with createDriver function and optional configuration metadata
|
|
160
|
+
* @throws Error if driver cannot be loaded or is invalid
|
|
161
|
+
*/
|
|
162
|
+
async function loadDriver(options = {}, deps = defaultDeps) {
|
|
163
|
+
const { driverPackage, logger = console } = options;
|
|
164
|
+
try {
|
|
165
|
+
let packageName;
|
|
166
|
+
let driverModule;
|
|
167
|
+
if (driverPackage) {
|
|
168
|
+
packageName = driverPackage;
|
|
169
|
+
const cached = driverCache.get(packageName);
|
|
170
|
+
if (cached) {
|
|
171
|
+
cacheStats.hits++;
|
|
172
|
+
return cached;
|
|
173
|
+
}
|
|
174
|
+
cacheStats.misses++;
|
|
175
|
+
try {
|
|
176
|
+
driverModule = await deps.importModule(driverPackage);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
throw new errors_js_1.DriverNotFoundError(`Driver package not found: ${driverPackage}\nInstall it with: npm install ${driverPackage}`, driverPackage);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
packageName = await detectLocalPackage(deps);
|
|
184
|
+
const cached = driverCache.get(packageName);
|
|
185
|
+
if (cached) {
|
|
186
|
+
cacheStats.hits++;
|
|
187
|
+
return cached;
|
|
188
|
+
}
|
|
189
|
+
cacheStats.misses++;
|
|
190
|
+
const cwd = deps.getCwd();
|
|
191
|
+
const importPaths = [
|
|
192
|
+
(0, path_1.join)(cwd, 'src', 'index.js'),
|
|
193
|
+
(0, path_1.join)(cwd, 'src', 'index.ts'),
|
|
194
|
+
(0, path_1.join)(cwd, 'dist', 'index.js'),
|
|
195
|
+
packageName,
|
|
196
|
+
];
|
|
197
|
+
driverModule = await tryImport(importPaths, deps);
|
|
198
|
+
}
|
|
199
|
+
if (!driverModule || typeof driverModule !== 'object') {
|
|
200
|
+
throw new errors_js_1.ValidationError('Driver package must export a createDriver function', 'createDriver');
|
|
201
|
+
}
|
|
202
|
+
const { createDriver, DEVICES, DEFAULT_CONFIG, SUPPORTED_CONFIG } = driverModule;
|
|
203
|
+
if (!createDriver) {
|
|
204
|
+
throw new errors_js_1.ValidationError('Driver package must export a createDriver function', 'createDriver');
|
|
205
|
+
}
|
|
206
|
+
if (typeof createDriver !== 'function') {
|
|
207
|
+
throw new errors_js_1.ValidationError('Driver package must export a createDriver function', 'createDriver');
|
|
208
|
+
}
|
|
209
|
+
const result = {
|
|
210
|
+
createDriver: createDriver,
|
|
211
|
+
};
|
|
212
|
+
if (DEVICES !== null && DEVICES !== undefined) {
|
|
213
|
+
result.devices = (0, config_validator_js_1.validateDevices)(DEVICES, logger);
|
|
214
|
+
}
|
|
215
|
+
if (DEFAULT_CONFIG !== null && DEFAULT_CONFIG !== undefined) {
|
|
216
|
+
result.defaultConfig = (0, config_validator_js_1.validateDefaultConfig)(DEFAULT_CONFIG);
|
|
217
|
+
}
|
|
218
|
+
if (SUPPORTED_CONFIG !== null && SUPPORTED_CONFIG !== undefined) {
|
|
219
|
+
result.supportedConfig = (0, config_validator_js_1.validateSupportedConfig)(SUPPORTED_CONFIG);
|
|
220
|
+
}
|
|
221
|
+
if (result.defaultConfig && result.supportedConfig) {
|
|
222
|
+
const warnings = (0, config_validator_js_1.crossValidateConfigs)(result.defaultConfig, result.supportedConfig);
|
|
223
|
+
if (warnings.length > 0) {
|
|
224
|
+
(0, config_validator_js_1.outputConfigWarnings)('Driver DEFAULT_CONFIG', warnings, logger);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
driverCache.set(packageName, result);
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
if (error instanceof errors_js_1.ValidationError ||
|
|
232
|
+
error instanceof errors_js_1.DriverNotFoundError ||
|
|
233
|
+
error instanceof errors_js_1.PackageJsonError) {
|
|
234
|
+
throw error;
|
|
235
|
+
}
|
|
236
|
+
if (error instanceof Error) {
|
|
237
|
+
throw new Error(`Failed to load driver: ${error.message}`, { cause: error });
|
|
238
|
+
}
|
|
239
|
+
throw new Error('Failed to load driver: Unknown error');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test utilities for @ya-modbus/driver-loader
|
|
3
|
+
*
|
|
4
|
+
* Import from '@ya-modbus/driver-loader/testing' in your tests
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { createMockDriver, mockSystemDeps } from '@ya-modbus/driver-loader/testing'
|
|
9
|
+
*
|
|
10
|
+
* const mockDriver = createMockDriver({
|
|
11
|
+
* defaultConfig: { baudRate: 9600 }
|
|
12
|
+
* })
|
|
13
|
+
*
|
|
14
|
+
* const deps = mockSystemDeps({
|
|
15
|
+
* importModule: jest.fn().mockResolvedValue(mockDriver)
|
|
16
|
+
* })
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export { createMockDriver, mockSystemDeps } from '../testing.js';
|
|
20
|
+
export type { MockDriverOptions, MockSystemDepsOptions } from '../testing.js';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAChE,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Test utilities for @ya-modbus/driver-loader
|
|
4
|
+
*
|
|
5
|
+
* Import from '@ya-modbus/driver-loader/testing' in your tests
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createMockDriver, mockSystemDeps } from '@ya-modbus/driver-loader/testing'
|
|
10
|
+
*
|
|
11
|
+
* const mockDriver = createMockDriver({
|
|
12
|
+
* defaultConfig: { baudRate: 9600 }
|
|
13
|
+
* })
|
|
14
|
+
*
|
|
15
|
+
* const deps = mockSystemDeps({
|
|
16
|
+
* importModule: jest.fn().mockResolvedValue(mockDriver)
|
|
17
|
+
* })
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.mockSystemDeps = exports.createMockDriver = void 0;
|
|
22
|
+
var testing_js_1 = require("../testing.js");
|
|
23
|
+
Object.defineProperty(exports, "createMockDriver", { enumerable: true, get: function () { return testing_js_1.createMockDriver; } });
|
|
24
|
+
Object.defineProperty(exports, "mockSystemDeps", { enumerable: true, get: function () { return testing_js_1.mockSystemDeps; } });
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAEH,4CAAgE;AAAvD,8GAAA,gBAAgB,OAAA;AAAE,4GAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test utilities for driver-loader
|
|
3
|
+
*
|
|
4
|
+
* Provides mock drivers and system dependencies for testing applications
|
|
5
|
+
* that use driver-loader.
|
|
6
|
+
*/
|
|
7
|
+
import type { CreateDriverFunction, DefaultConfig, DeviceRegistry, SupportedConfig } from '@ya-modbus/driver-types';
|
|
8
|
+
import type { LoadedDriver, SystemDependencies } from './loader.js';
|
|
9
|
+
/**
|
|
10
|
+
* Options for creating a mock driver
|
|
11
|
+
*/
|
|
12
|
+
export interface MockDriverOptions {
|
|
13
|
+
/** Custom createDriver implementation */
|
|
14
|
+
createDriver?: CreateDriverFunction;
|
|
15
|
+
/** Mock default configuration */
|
|
16
|
+
defaultConfig?: DefaultConfig;
|
|
17
|
+
/** Mock supported configuration */
|
|
18
|
+
supportedConfig?: SupportedConfig;
|
|
19
|
+
/** Mock device registry */
|
|
20
|
+
devices?: DeviceRegistry;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Create a mock driver for testing
|
|
24
|
+
*
|
|
25
|
+
* @param options - Mock driver options
|
|
26
|
+
* @returns Mock driver that can be used with loadDriver
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const mockDriver = createMockDriver({
|
|
31
|
+
* defaultConfig: { baudRate: 9600 },
|
|
32
|
+
* devices: { 'test': { manufacturer: 'Test', model: 'Model' } }
|
|
33
|
+
* })
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare function createMockDriver(options?: MockDriverOptions): LoadedDriver;
|
|
37
|
+
/**
|
|
38
|
+
* Options for creating mock system dependencies
|
|
39
|
+
*/
|
|
40
|
+
export interface MockSystemDepsOptions {
|
|
41
|
+
/** Custom readFile implementation */
|
|
42
|
+
readFile?: SystemDependencies['readFile'];
|
|
43
|
+
/** Custom importModule implementation */
|
|
44
|
+
importModule?: SystemDependencies['importModule'];
|
|
45
|
+
/** Custom getCwd implementation */
|
|
46
|
+
getCwd?: SystemDependencies['getCwd'];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create mock system dependencies for testing
|
|
50
|
+
*
|
|
51
|
+
* @param options - Mock system dependencies options
|
|
52
|
+
* @returns Mock SystemDependencies that can be passed to loadDriver
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* const deps = mockSystemDeps({
|
|
57
|
+
* importModule: jest.fn().mockResolvedValue(mockDriver)
|
|
58
|
+
* })
|
|
59
|
+
*
|
|
60
|
+
* const driver = await loadDriver({ driverPackage: 'test' }, deps)
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare function mockSystemDeps(options?: MockSystemDepsOptions): SystemDependencies;
|
|
64
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,eAAe,EAChB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEnE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,yCAAyC;IACzC,YAAY,CAAC,EAAE,oBAAoB,CAAA;IACnC,iCAAiC;IACjC,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,mCAAmC;IACnC,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,2BAA2B;IAC3B,OAAO,CAAC,EAAE,cAAc,CAAA;CACzB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,YAAY,CAyB9E;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,qCAAqC;IACrC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAA;IACzC,yCAAyC;IACzC,YAAY,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAA;IACjD,mCAAmC;IACnC,MAAM,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAA;CACtC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,kBAAkB,CAoBtF"}
|
package/dist/testing.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Test utilities for driver-loader
|
|
4
|
+
*
|
|
5
|
+
* Provides mock drivers and system dependencies for testing applications
|
|
6
|
+
* that use driver-loader.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.createMockDriver = createMockDriver;
|
|
10
|
+
exports.mockSystemDeps = mockSystemDeps;
|
|
11
|
+
const globals_1 = require("@jest/globals");
|
|
12
|
+
/**
|
|
13
|
+
* Create a mock driver for testing
|
|
14
|
+
*
|
|
15
|
+
* @param options - Mock driver options
|
|
16
|
+
* @returns Mock driver that can be used with loadDriver
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const mockDriver = createMockDriver({
|
|
21
|
+
* defaultConfig: { baudRate: 9600 },
|
|
22
|
+
* devices: { 'test': { manufacturer: 'Test', model: 'Model' } }
|
|
23
|
+
* })
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
function createMockDriver(options = {}) {
|
|
27
|
+
const { createDriver = globals_1.jest.fn().mockReturnValue({}), defaultConfig, supportedConfig, devices, } = options;
|
|
28
|
+
const result = {
|
|
29
|
+
createDriver,
|
|
30
|
+
};
|
|
31
|
+
if (defaultConfig) {
|
|
32
|
+
result.defaultConfig = defaultConfig;
|
|
33
|
+
}
|
|
34
|
+
if (supportedConfig) {
|
|
35
|
+
result.supportedConfig = supportedConfig;
|
|
36
|
+
}
|
|
37
|
+
if (devices) {
|
|
38
|
+
result.devices = devices;
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create mock system dependencies for testing
|
|
44
|
+
*
|
|
45
|
+
* @param options - Mock system dependencies options
|
|
46
|
+
* @returns Mock SystemDependencies that can be passed to loadDriver
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const deps = mockSystemDeps({
|
|
51
|
+
* importModule: jest.fn().mockResolvedValue(mockDriver)
|
|
52
|
+
* })
|
|
53
|
+
*
|
|
54
|
+
* const driver = await loadDriver({ driverPackage: 'test' }, deps)
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
function mockSystemDeps(options = {}) {
|
|
58
|
+
const { readFile, importModule, getCwd } = options;
|
|
59
|
+
return {
|
|
60
|
+
readFile: readFile ??
|
|
61
|
+
globals_1.jest
|
|
62
|
+
.fn()
|
|
63
|
+
.mockResolvedValue('{}'),
|
|
64
|
+
importModule: importModule ??
|
|
65
|
+
globals_1.jest
|
|
66
|
+
.fn()
|
|
67
|
+
.mockResolvedValue(createMockDriver()),
|
|
68
|
+
getCwd: getCwd ??
|
|
69
|
+
globals_1.jest
|
|
70
|
+
.fn()
|
|
71
|
+
.mockReturnValue('/mock/cwd'),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAwCH,4CAyBC;AA6BD,wCAoBC;AAhHD,2CAAoC;AAwBpC;;;;;;;;;;;;;GAaG;AACH,SAAgB,gBAAgB,CAAC,UAA6B,EAAE;IAC9D,MAAM,EACJ,YAAY,GAAG,cAAI,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAoC,EAC/E,aAAa,EACb,eAAe,EACf,OAAO,GACR,GAAG,OAAO,CAAA;IAEX,MAAM,MAAM,GAAiB;QAC3B,YAAY;KACb,CAAA;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,CAAC,aAAa,GAAG,aAAa,CAAA;IACtC,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,CAAC,eAAe,GAAG,eAAe,CAAA;IAC1C,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAcD;;;;;;;;;;;;;;GAcG;AACH,SAAgB,cAAc,CAAC,UAAiC,EAAE;IAChE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAElD,OAAO;QACL,QAAQ,EACN,QAAQ;YACP,cAAI;iBACF,EAAE,EAAkC;iBACpC,iBAAiB,CAAC,IAAI,CAAoC;QAC/D,YAAY,EACV,YAAY;YACX,cAAI;iBACF,EAAE,EAAsC;iBACxC,iBAAiB,CAAC,gBAAgB,EAAE,CAAwC;QACjF,MAAM,EACJ,MAAM;YACL,cAAI;iBACF,EAAE,EAAgC;iBAClC,eAAe,CAAC,WAAW,CAAkC;KACnE,CAAA;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ya-modbus/driver-loader",
|
|
3
|
+
"version": "0.4.1-refactor-scope-driver-packages.0",
|
|
4
|
+
"description": "Dynamic driver loader for ya-modbus device drivers",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"modbus",
|
|
7
|
+
"driver",
|
|
8
|
+
"loader"
|
|
9
|
+
],
|
|
10
|
+
"author": "Geno Roupsky <geno@roupsky.name>",
|
|
11
|
+
"license": "GPL-3.0-or-later",
|
|
12
|
+
"main": "dist/index.js",
|
|
13
|
+
"types": "dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"default": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./testing": {
|
|
20
|
+
"types": "./dist/testing/index.d.ts",
|
|
21
|
+
"default": "./dist/testing/index.js"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist",
|
|
26
|
+
"README.md",
|
|
27
|
+
"CHANGELOG.md"
|
|
28
|
+
],
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "https://github.com/groupsky/ya-modbus.git",
|
|
32
|
+
"directory": "packages/driver-loader"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/groupsky/ya-modbus/tree/main/packages/driver-loader#readme",
|
|
35
|
+
"bugs": {
|
|
36
|
+
"url": "https://github.com/groupsky/ya-modbus/issues"
|
|
37
|
+
},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc --build",
|
|
43
|
+
"clean": "rm -rf dist",
|
|
44
|
+
"test": "jest",
|
|
45
|
+
"lint": "eslint ."
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@ya-modbus/driver-types": "^0.4.1-refactor-scope-driver-packages.0"
|
|
49
|
+
},
|
|
50
|
+
"peerDependencies": {
|
|
51
|
+
"jest": ">=29.0.0"
|
|
52
|
+
},
|
|
53
|
+
"peerDependenciesMeta": {
|
|
54
|
+
"jest": {
|
|
55
|
+
"optional": true
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"gitHead": "b55d909d67dfff46fb79951e68a2d47ac3fab267"
|
|
59
|
+
}
|