@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/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"}
@@ -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
+ }