@ya-modbus/driver-loader 0.8.1 → 0.10.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 (61) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +55 -9
  3. package/dist/cjs/src/driver-import.d.ts +19 -0
  4. package/dist/cjs/src/driver-import.d.ts.map +1 -0
  5. package/dist/cjs/src/driver-import.js +34 -0
  6. package/dist/cjs/src/driver-import.js.map +1 -0
  7. package/dist/cjs/src/driver-name.d.ts +11 -0
  8. package/dist/cjs/src/driver-name.d.ts.map +1 -0
  9. package/dist/cjs/src/driver-name.js +21 -0
  10. package/dist/cjs/src/driver-name.js.map +1 -0
  11. package/dist/cjs/src/driver-package-name.d.ts +24 -0
  12. package/dist/cjs/src/driver-package-name.d.ts.map +1 -0
  13. package/dist/cjs/src/driver-package-name.js +42 -0
  14. package/dist/cjs/src/driver-package-name.js.map +1 -0
  15. package/dist/cjs/src/errors.d.ts +9 -3
  16. package/dist/cjs/src/errors.d.ts.map +1 -1
  17. package/dist/cjs/src/errors.js +10 -4
  18. package/dist/cjs/src/errors.js.map +1 -1
  19. package/dist/cjs/src/index.d.ts +1 -0
  20. package/dist/cjs/src/index.d.ts.map +1 -1
  21. package/dist/cjs/src/index.js +5 -1
  22. package/dist/cjs/src/index.js.map +1 -1
  23. package/dist/cjs/src/loader.d.ts +4 -1
  24. package/dist/cjs/src/loader.d.ts.map +1 -1
  25. package/dist/cjs/src/loader.js +12 -11
  26. package/dist/cjs/src/loader.js.map +1 -1
  27. package/dist/cjs/src/module-errors.d.ts +9 -0
  28. package/dist/cjs/src/module-errors.d.ts.map +1 -0
  29. package/dist/cjs/src/module-errors.js +22 -0
  30. package/dist/cjs/src/module-errors.js.map +1 -0
  31. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  32. package/dist/esm/src/driver-import.d.ts +19 -0
  33. package/dist/esm/src/driver-import.d.ts.map +1 -0
  34. package/dist/esm/src/driver-import.js +31 -0
  35. package/dist/esm/src/driver-import.js.map +1 -0
  36. package/dist/esm/src/driver-name.d.ts +11 -0
  37. package/dist/esm/src/driver-name.d.ts.map +1 -0
  38. package/dist/esm/src/driver-name.js +18 -0
  39. package/dist/esm/src/driver-name.js.map +1 -0
  40. package/dist/esm/src/driver-package-name.d.ts +24 -0
  41. package/dist/esm/src/driver-package-name.d.ts.map +1 -0
  42. package/dist/esm/src/driver-package-name.js +37 -0
  43. package/dist/esm/src/driver-package-name.js.map +1 -0
  44. package/dist/esm/src/errors.d.ts +9 -3
  45. package/dist/esm/src/errors.d.ts.map +1 -1
  46. package/dist/esm/src/errors.js +10 -4
  47. package/dist/esm/src/errors.js.map +1 -1
  48. package/dist/esm/src/index.d.ts +1 -0
  49. package/dist/esm/src/index.d.ts.map +1 -1
  50. package/dist/esm/src/index.js +1 -0
  51. package/dist/esm/src/index.js.map +1 -1
  52. package/dist/esm/src/loader.d.ts +4 -1
  53. package/dist/esm/src/loader.d.ts.map +1 -1
  54. package/dist/esm/src/loader.js +12 -11
  55. package/dist/esm/src/loader.js.map +1 -1
  56. package/dist/esm/src/module-errors.d.ts +9 -0
  57. package/dist/esm/src/module-errors.d.ts.map +1 -0
  58. package/dist/esm/src/module-errors.js +19 -0
  59. package/dist/esm/src/module-errors.js.map +1 -0
  60. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  61. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -3,6 +3,18 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [0.10.0](https://github.com/groupsky/ya-modbus/compare/@ya-modbus/driver-loader@0.9.0...@ya-modbus/driver-loader@0.10.0) (2026-10-12)
7
+
8
+ ### Features
9
+
10
+ - **driver-loader:** resolve short driver names ([#580](https://github.com/groupsky/ya-modbus/issues/580)) ([1050ab8](https://github.com/groupsky/ya-modbus/commit/1050ab8cb51d73826bf72eb2a10a31bffc98d8a7)), closes [#151](https://github.com/groupsky/ya-modbus/issues/151)
11
+
12
+ # [0.9.0](https://github.com/groupsky/ya-modbus/compare/@ya-modbus/driver-loader@0.8.1...@ya-modbus/driver-loader@0.9.0) (2026-10-12)
13
+
14
+ ### Features
15
+
16
+ - **driver-loader:** allow scoped third-party driver packages ([#573](https://github.com/groupsky/ya-modbus/issues/573)) ([63b2b83](https://github.com/groupsky/ya-modbus/commit/63b2b833dbb0b5198e8df7135f419793e32d95c3)), closes [#565](https://github.com/groupsky/ya-modbus/issues/565)
17
+
6
18
  ## [0.8.1](https://github.com/groupsky/ya-modbus/compare/@ya-modbus/driver-loader@0.8.0...@ya-modbus/driver-loader@0.8.1) (2026-10-12)
7
19
 
8
20
  ### Bug Fixes
package/README.md CHANGED
@@ -26,6 +26,21 @@ import { loadDriver } from '@ya-modbus/driver-loader'
26
26
  const driver = await loadDriver({ driverPackage: '@ya-modbus/driver-xymd1' })
27
27
  ```
28
28
 
29
+ ### Load a driver by short name
30
+
31
+ A plain lowercase name such as `xymd1` is a short name. The loader tries these packages in order and uses the first one that is installed:
32
+
33
+ 1. `@ya-modbus/driver-<name>`
34
+ 2. `ya-modbus-driver-<name>`
35
+ 3. `<name>`, the name as given
36
+
37
+ ```typescript
38
+ // Loads @ya-modbus/driver-xymd1
39
+ const driver = await loadDriver({ driverPackage: 'xymd1' })
40
+ ```
41
+
42
+ Anything else (scoped names, `ya-modbus-driver-*` names, paths) is used as given. If a candidate package is installed but fails to load, the search stops there and the `DriverNotFoundError` message shows the load error (the original error is its `cause`), so a later candidate does not hide it. If no candidate is installed, the message lists every package that was tried, and `packageName` is the preferred one (`@ya-modbus/driver-<name>`).
43
+
29
44
  ### Error Handling
30
45
 
31
46
  The driver-loader exports custom error classes for type-safe error handling:
@@ -43,8 +58,13 @@ try {
43
58
  } catch (error) {
44
59
  // Type-safe error handling with instanceof
45
60
  if (error instanceof DriverNotFoundError) {
46
- console.error(`Package not found: ${error.packageName}`)
47
- console.error(`Install with: npm install ${error.packageName}`)
61
+ if (error.cause) {
62
+ // The package is installed but failed to load
63
+ console.error(`Failed to load ${error.packageName}:`, error.cause)
64
+ } else {
65
+ console.error(`Package not found: ${error.packageName}`)
66
+ console.error(`Install with: npm install ${error.packageName}`)
67
+ }
48
68
  } else if (error instanceof ValidationError) {
49
69
  console.error(`Validation failed for field: ${error.field}`)
50
70
  console.error(`Error: ${error.message}`)
@@ -63,8 +83,9 @@ try {
63
83
  - Example: Invalid DEFAULT_CONFIG, missing createDriver function
64
84
 
65
85
  - **`DriverNotFoundError`**: Driver package not found or cannot be loaded
66
- - `packageName: string` - The package that couldn't be found
67
- - Example: Package not installed, wrong package name
86
+ - `packageName: string` - The package that could not be found or loaded. For a package that is not installed this is the package to install
87
+ - `cause?: unknown` - Set when the package is installed but fails to load: the original error
88
+ - Example: Package not installed, wrong package name, syntax error in the driver
68
89
 
69
90
  - **`PackageJsonError`**: package.json not found or invalid
70
91
  - Example: Missing package.json, invalid JSON, missing ya-modbus-driver keyword
@@ -95,7 +116,7 @@ Loads a ya-modbus driver package and validates its exports.
95
116
 
96
117
  **Options:**
97
118
 
98
- - `driverPackage` (optional): Name of the driver package to load. If omitted, auto-detects from current directory's package.json.
119
+ - `driverPackage` (optional): Name of the driver package to load, or a short name such as `xymd1`. If omitted, auto-detects from current directory's package.json.
99
120
 
100
121
  **Returns:**
101
122
 
@@ -148,7 +169,7 @@ Returns cache statistics including hits, misses, and current cache size.
148
169
  **Cache Behavior:**
149
170
 
150
171
  - **Automatic caching:** Drivers are cached by package name after first load
151
- - **Cache key:** Package name (e.g., '@ya-modbus/driver-xymd1')
172
+ - **Cache key:** Name of the package that was loaded (e.g., '@ya-modbus/driver-xymd1'). A short name and the full name share one entry. If two candidates of a short name are installed, a candidate that was loaded earlier in the process is returned
152
173
  - **Cache lifetime:** Persists for the lifetime of the Node.js process
153
174
  - **Auto-detect mode:** Even auto-detected drivers are cached by their package name
154
175
  - **No cache on errors:** Failed loads are not cached, allowing retry
@@ -192,6 +213,29 @@ import { getCallerPackageInfo } from '@ya-modbus/driver-loader'
192
213
  program.version(getCallerPackageInfo().version)
193
214
  ```
194
215
 
216
+ ### `isValidDriverPackageName(name: unknown): boolean`
217
+
218
+ Checks a driver package name against the shared naming rule for applications that read the driver name from a configuration, such as the MQTT bridge. Allowed forms:
219
+
220
+ - `@ya-modbus/driver-<name>`
221
+ - `ya-modbus-driver-<name>`
222
+ - `@<scope>/ya-modbus-driver-<name>`
223
+
224
+ `<name>` and `<scope>` use only lowercase letters, numbers and hyphens. Paths (`../x`, `/opt/x`), sub paths, backslashes and any other package name are rejected. `loadDriver` does not check this rule. If your tool reads the driver name from a config file, call `assertValidDriverPackageName` before `loadDriver`.
225
+
226
+ ### `assertValidDriverPackageName(name: string): void`
227
+
228
+ Same check as `isValidDriverPackageName`. Throws a `ValidationError` (field `driverPackage`) that shows the rejected name and lists the allowed forms.
229
+
230
+ `DRIVER_PACKAGE_NAME_RULE` is the text of the rule ("must be ..."), for applications that build their own error message.
231
+
232
+ ```typescript
233
+ import { assertValidDriverPackageName, loadDriver } from '@ya-modbus/driver-loader'
234
+
235
+ assertValidDriverPackageName(config.driver)
236
+ await loadDriver({ driverPackage: config.driver })
237
+ ```
238
+
195
239
  ## Testing Utilities
196
240
 
197
241
  The package provides testing utilities for applications using driver-loader.
@@ -244,18 +288,20 @@ If you encounter `Driver package not found` errors:
244
288
  1. **Verify the package is installed:**
245
289
 
246
290
  ```bash
247
- npm list ya-modbus-driver-<name>
291
+ npm list @ya-modbus/driver-<name>
248
292
  ```
249
293
 
250
294
  2. **Install the driver package:**
251
295
 
252
296
  ```bash
253
- npm install ya-modbus-driver-<name>
297
+ npm install @ya-modbus/driver-<name>
254
298
  ```
255
299
 
256
300
  3. **Check the package name:**
257
301
  - Ensure the package name in your code matches the actual npm package name
258
- - Driver packages typically follow the naming convention: `ya-modbus-driver-<device>`
302
+ - Driver packages follow the naming rule described under `isValidDriverPackageName` (for example `ya-modbus-driver-<device>` or `@<scope>/ya-modbus-driver-<device>`)
303
+
304
+ If the message starts with `Failed to load driver package`, the package is installed but its code failed to load. Read the reason in the message (or `error.cause`) instead of reinstalling.
259
305
 
260
306
  ### Module Resolution Issues
261
307
 
@@ -0,0 +1,19 @@
1
+ import type { DriverPackageCandidates } from './driver-name.js';
2
+ import type { SystemDependencies } from './loader.js';
3
+ /**
4
+ * Import the first installed package of a list of candidates
5
+ *
6
+ * Moves on to the next candidate only when the package is not installed. A package that
7
+ * is installed but fails to load stops the search, so its error is not replaced by a later one.
8
+ *
9
+ * @param name - Driver name as given by the user
10
+ * @param candidates - Package names to try, in order
11
+ * @param deps - System dependencies
12
+ * @returns The imported module and the name of the package it came from
13
+ * @throws DriverNotFoundError if no candidate is installed or the installed one fails to load
14
+ */
15
+ export declare function importDriverPackage(name: string, candidates: DriverPackageCandidates, deps: Pick<SystemDependencies, 'importModule'>): Promise<{
16
+ packageName: string;
17
+ driverModule: unknown;
18
+ }>;
19
+ //# sourceMappingURL=driver-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-import.d.ts","sourceRoot":"","sources":["../../../src/driver-import.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAE/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAGrD;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,uBAAuB,EACnC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,cAAc,CAAC,GAC7C,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAAC,CAsBzD"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.importDriverPackage = importDriverPackage;
4
+ const errors_js_1 = require("./errors.js");
5
+ const module_errors_js_1 = require("./module-errors.js");
6
+ /**
7
+ * Import the first installed package of a list of candidates
8
+ *
9
+ * Moves on to the next candidate only when the package is not installed. A package that
10
+ * is installed but fails to load stops the search, so its error is not replaced by a later one.
11
+ *
12
+ * @param name - Driver name as given by the user
13
+ * @param candidates - Package names to try, in order
14
+ * @param deps - System dependencies
15
+ * @returns The imported module and the name of the package it came from
16
+ * @throws DriverNotFoundError if no candidate is installed or the installed one fails to load
17
+ */
18
+ async function importDriverPackage(name, candidates, deps) {
19
+ for (const packageName of candidates) {
20
+ try {
21
+ return { packageName, driverModule: await deps.importModule(packageName) };
22
+ }
23
+ catch (error) {
24
+ if (!(0, module_errors_js_1.isMissingPackageError)(error, packageName)) {
25
+ const reason = error instanceof Error ? error.message : String(error);
26
+ throw new errors_js_1.DriverNotFoundError(`Failed to load driver package ${packageName}: ${reason}`, packageName, { cause: error });
27
+ }
28
+ }
29
+ }
30
+ const [preferred] = candidates;
31
+ const tried = candidates.length > 1 ? `\nTried: ${candidates.join(', ')}` : '';
32
+ throw new errors_js_1.DriverNotFoundError(`Driver package not found: ${name}${tried}\nInstall it with: npm install ${preferred}`, preferred);
33
+ }
34
+ //# sourceMappingURL=driver-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-import.js","sourceRoot":"","sources":["../../../src/driver-import.ts"],"names":[],"mappings":";;AAiBA,kDA0BC;AA1CD,2CAAiD;AAEjD,yDAA0D;AAE1D;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,mBAAmB,CACvC,IAAY,EACZ,UAAmC,EACnC,IAA8C;IAE9C,KAAK,MAAM,WAAW,IAAI,UAAU,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAA;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAA,wCAAqB,EAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;gBAC/C,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBACrE,MAAM,IAAI,+BAAmB,CAC3B,iCAAiC,WAAW,KAAK,MAAM,EAAE,EACzD,WAAW,EACX,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,GAAG,UAAU,CAAA;IAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9E,MAAM,IAAI,+BAAmB,CAC3B,6BAA6B,IAAI,GAAG,KAAK,kCAAkC,SAAS,EAAE,EACtF,SAAS,CACV,CAAA;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** Package names to try, in order; never empty */
2
+ export type DriverPackageCandidates = [string, ...string[]];
3
+ /**
4
+ * Packages to try, in order, for a driver name given by the user
5
+ *
6
+ * A short name such as `xymd1` stands for `@ya-modbus/driver-xymd1`, then
7
+ * `ya-modbus-driver-xymd1`, then a package called `xymd1`. Anything else is a full
8
+ * package name or a path and is used as given.
9
+ */
10
+ export declare function getDriverPackageCandidates(name: string): DriverPackageCandidates;
11
+ //# sourceMappingURL=driver-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-name.d.ts","sourceRoot":"","sources":["../../../src/driver-name.ts"],"names":[],"mappings":"AAMA,kDAAkD;AAClD,MAAM,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAE3D;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAMhF"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDriverPackageCandidates = getDriverPackageCandidates;
4
+ const SCOPED_PREFIX = '@ya-modbus/driver-';
5
+ const UNSCOPED_PREFIX = 'ya-modbus-driver-';
6
+ /** An unscoped npm package name that is not already a full driver package name */
7
+ const SHORT_NAME = /^[a-z0-9][a-z0-9._-]*$/;
8
+ /**
9
+ * Packages to try, in order, for a driver name given by the user
10
+ *
11
+ * A short name such as `xymd1` stands for `@ya-modbus/driver-xymd1`, then
12
+ * `ya-modbus-driver-xymd1`, then a package called `xymd1`. Anything else is a full
13
+ * package name or a path and is used as given.
14
+ */
15
+ function getDriverPackageCandidates(name) {
16
+ if (!SHORT_NAME.test(name) || name.startsWith(UNSCOPED_PREFIX)) {
17
+ return [name];
18
+ }
19
+ return [`${SCOPED_PREFIX}${name}`, `${UNSCOPED_PREFIX}${name}`, name];
20
+ }
21
+ //# sourceMappingURL=driver-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-name.js","sourceRoot":"","sources":["../../../src/driver-name.ts"],"names":[],"mappings":";;AAgBA,gEAMC;AAtBD,MAAM,aAAa,GAAG,oBAAoB,CAAA;AAC1C,MAAM,eAAe,GAAG,mBAAmB,CAAA;AAE3C,kFAAkF;AAClF,MAAM,UAAU,GAAG,wBAAwB,CAAA;AAK3C;;;;;;GAMG;AACH,SAAgB,0BAA0B,CAAC,IAAY;IACrD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAA;IACf,CAAC;IAED,OAAO,CAAC,GAAG,aAAa,GAAG,IAAI,EAAE,EAAE,GAAG,eAAe,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,CAAA;AACvE,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Describes the allowed driver package names, for error messages.
3
+ * Written to follow "name must be ...", so callers can put their own words in front.
4
+ */
5
+ export declare const DRIVER_PACKAGE_NAME_RULE: string;
6
+ /**
7
+ * Check a driver package name against the shared naming rule for drivers that are loaded
8
+ * from a configured name, such as in the MQTT bridge.
9
+ *
10
+ * Allowed forms: `@ya-modbus/driver-<name>`, `ya-modbus-driver-<name>` and
11
+ * `@<scope>/ya-modbus-driver-<name>`.
12
+ *
13
+ * @param name - Value to check
14
+ * @returns true if the value is an allowed driver package name
15
+ */
16
+ export declare function isValidDriverPackageName(name: unknown): boolean;
17
+ /**
18
+ * Throw if a driver package name does not follow the naming rule.
19
+ *
20
+ * @param name - Driver package name to check
21
+ * @throws ValidationError (field `driverPackage`) listing the allowed forms
22
+ */
23
+ export declare function assertValidDriverPackageName(name: string): void;
24
+ //# sourceMappingURL=driver-package-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-package-name.d.ts","sourceRoot":"","sources":["../../../src/driver-package-name.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAEuC,CAAA;AAS5E;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAO/D"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DRIVER_PACKAGE_NAME_RULE = void 0;
4
+ exports.isValidDriverPackageName = isValidDriverPackageName;
5
+ exports.assertValidDriverPackageName = assertValidDriverPackageName;
6
+ const errors_js_1 = require("./errors.js");
7
+ /**
8
+ * Describes the allowed driver package names, for error messages.
9
+ * Written to follow "name must be ...", so callers can put their own words in front.
10
+ */
11
+ exports.DRIVER_PACKAGE_NAME_RULE = 'must be @ya-modbus/driver-<name>, ya-modbus-driver-<name> or @<scope>/ya-modbus-driver-<name>, ' +
12
+ 'where <name> and <scope> use only lowercase letters, numbers and hyphens';
13
+ /**
14
+ * The three allowed forms. Only lowercase letters, numbers and hyphens can follow the prefix,
15
+ * so a name can never contain a path separator, a dot, a backslash or a whitespace.
16
+ */
17
+ const DRIVER_PACKAGE_NAME_PATTERN = /^(?:@ya-modbus\/driver-|(?:@[a-z0-9][a-z0-9-]*\/)?ya-modbus-driver-)[a-z0-9-]+$/;
18
+ /**
19
+ * Check a driver package name against the shared naming rule for drivers that are loaded
20
+ * from a configured name, such as in the MQTT bridge.
21
+ *
22
+ * Allowed forms: `@ya-modbus/driver-<name>`, `ya-modbus-driver-<name>` and
23
+ * `@<scope>/ya-modbus-driver-<name>`.
24
+ *
25
+ * @param name - Value to check
26
+ * @returns true if the value is an allowed driver package name
27
+ */
28
+ function isValidDriverPackageName(name) {
29
+ return typeof name === 'string' && DRIVER_PACKAGE_NAME_PATTERN.test(name);
30
+ }
31
+ /**
32
+ * Throw if a driver package name does not follow the naming rule.
33
+ *
34
+ * @param name - Driver package name to check
35
+ * @throws ValidationError (field `driverPackage`) listing the allowed forms
36
+ */
37
+ function assertValidDriverPackageName(name) {
38
+ if (!isValidDriverPackageName(name)) {
39
+ throw new errors_js_1.ValidationError(`Invalid driver package name ${JSON.stringify(name)}: ${exports.DRIVER_PACKAGE_NAME_RULE}`, 'driverPackage');
40
+ }
41
+ }
42
+ //# sourceMappingURL=driver-package-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-package-name.js","sourceRoot":"","sources":["../../../src/driver-package-name.ts"],"names":[],"mappings":";;;AA2BA,4DAEC;AAQD,oEAOC;AA5CD,2CAA6C;AAE7C;;;GAGG;AACU,QAAA,wBAAwB,GACnC,iGAAiG;IACjG,0EAA0E,CAAA;AAE5E;;;GAGG;AACH,MAAM,2BAA2B,GAC/B,iFAAiF,CAAA;AAEnF;;;;;;;;;GASG;AACH,SAAgB,wBAAwB,CAAC,IAAa;IACpD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC3E,CAAC;AAED;;;;;GAKG;AACH,SAAgB,4BAA4B,CAAC,IAAY;IACvD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,2BAAe,CACvB,+BAA+B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,gCAAwB,EAAE,EAClF,eAAe,CAChB,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -28,6 +28,8 @@ export declare class ValidationError extends Error {
28
28
  /**
29
29
  * Error thrown when a driver package cannot be found or loaded
30
30
  *
31
+ * `cause` is set when the package is installed but fails to load.
32
+ *
31
33
  * @example
32
34
  * ```typescript
33
35
  * import { loadDriver, DriverNotFoundError } from '@ya-modbus/driver-loader'
@@ -36,15 +38,19 @@ export declare class ValidationError extends Error {
36
38
  * await loadDriver({ driverPackage: 'missing-driver' })
37
39
  * } catch (error) {
38
40
  * if (error instanceof DriverNotFoundError) {
39
- * console.error(`Package not found: ${error.packageName}`)
40
- * console.error(`Install with: npm install ${error.packageName}`)
41
+ * if (error.cause) {
42
+ * console.error(`Failed to load ${error.packageName}:`, error.cause)
43
+ * } else {
44
+ * console.error(`Package not found: ${error.packageName}`)
45
+ * console.error(`Install with: npm install ${error.packageName}`)
46
+ * }
41
47
  * }
42
48
  * }
43
49
  * ```
44
50
  */
45
51
  export declare class DriverNotFoundError extends Error {
46
52
  readonly packageName: string;
47
- constructor(message: string, packageName: string);
53
+ constructor(message: string, packageName: string, options?: ErrorOptions);
48
54
  }
49
55
  /**
50
56
  * Error thrown when package.json is not found or invalid
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,KAAK,CAAC,EAAE,MAAM;gBAD9B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,MAAM,YAAA;CAMjC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,WAAW,EAAE,MAAM;gBADnC,OAAO,EAAE,MAAM,EACC,WAAW,EAAE,MAAM;CAMtC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAK5B"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,KAAK,CAAC,EAAE,MAAM;gBAD9B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,MAAM,YAAA;CAMjC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,WAAW,EAAE,MAAM;gBADnC,OAAO,EAAE,MAAM,EACC,WAAW,EAAE,MAAM,EACnC,OAAO,CAAC,EAAE,YAAY;CAMzB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAK5B"}
@@ -36,6 +36,8 @@ exports.ValidationError = ValidationError;
36
36
  /**
37
37
  * Error thrown when a driver package cannot be found or loaded
38
38
  *
39
+ * `cause` is set when the package is installed but fails to load.
40
+ *
39
41
  * @example
40
42
  * ```typescript
41
43
  * import { loadDriver, DriverNotFoundError } from '@ya-modbus/driver-loader'
@@ -44,15 +46,19 @@ exports.ValidationError = ValidationError;
44
46
  * await loadDriver({ driverPackage: 'missing-driver' })
45
47
  * } catch (error) {
46
48
  * if (error instanceof DriverNotFoundError) {
47
- * console.error(`Package not found: ${error.packageName}`)
48
- * console.error(`Install with: npm install ${error.packageName}`)
49
+ * if (error.cause) {
50
+ * console.error(`Failed to load ${error.packageName}:`, error.cause)
51
+ * } else {
52
+ * console.error(`Package not found: ${error.packageName}`)
53
+ * console.error(`Install with: npm install ${error.packageName}`)
54
+ * }
49
55
  * }
50
56
  * }
51
57
  * ```
52
58
  */
53
59
  class DriverNotFoundError extends Error {
54
- constructor(message, packageName) {
55
- super(message);
60
+ constructor(message, packageName, options) {
61
+ super(message, options);
56
62
  this.packageName = packageName;
57
63
  this.name = 'DriverNotFoundError';
58
64
  Object.setPrototypeOf(this, DriverNotFoundError.prototype);
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/errors.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,eAAgB,SAAQ,KAAK;IACxC,YACE,OAAe,EACC,KAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,UAAK,GAAL,KAAK,CAAS;QAG9B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACxD,CAAC;CACF;AATD,0CASC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YACE,OAAe,EACC,WAAmB;QAEnC,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,gBAAW,GAAX,WAAW,CAAQ;QAGnC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAA;IAC5D,CAAC;CACF;AATD,kDASC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;QAC9B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAA;IACzD,CAAC;CACF;AAND,4CAMC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/errors.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,eAAgB,SAAQ,KAAK;IACxC,YACE,OAAe,EACC,KAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,UAAK,GAAL,KAAK,CAAS;QAG9B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACxD,CAAC;CACF;AATD,0CASC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YACE,OAAe,EACC,WAAmB,EACnC,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAHP,gBAAW,GAAX,WAAW,CAAQ;QAInC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;QACjC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAA;IAC5D,CAAC;CACF;AAVD,kDAUC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAa,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;QAC9B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAA;IACzD,CAAC;CACF;AAND,4CAMC"}
@@ -1,6 +1,7 @@
1
1
  export { loadDriver, clearDriverCache, getDriverCacheStats } from './loader.js';
2
2
  export type { LoadedDriver, LoadDriverOptions, SystemDependencies, DriverCacheStats, Logger, } from './loader.js';
3
3
  export { validateDefaultConfig, validateSupportedConfig, validateDevices, crossValidateConfigs, } from './config-validator.js';
4
+ export { DRIVER_PACKAGE_NAME_RULE, assertValidDriverPackageName, isValidDriverPackageName, } from './driver-package-name.js';
4
5
  export { ValidationError, DriverNotFoundError, PackageJsonError } from './errors.js';
5
6
  export { getCallerPackageInfo } from './package-info.js';
6
7
  export type { PackageInfo } from './package-info.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAC/E,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,MAAM,GACP,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,oBAAoB,GACrB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAC/E,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,MAAM,GACP,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,oBAAoB,GACrB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getCallerPackageInfo = exports.PackageJsonError = exports.DriverNotFoundError = exports.ValidationError = exports.crossValidateConfigs = exports.validateDevices = exports.validateSupportedConfig = exports.validateDefaultConfig = exports.getDriverCacheStats = exports.clearDriverCache = exports.loadDriver = void 0;
3
+ exports.getCallerPackageInfo = exports.PackageJsonError = exports.DriverNotFoundError = exports.ValidationError = exports.isValidDriverPackageName = exports.assertValidDriverPackageName = exports.DRIVER_PACKAGE_NAME_RULE = exports.crossValidateConfigs = exports.validateDevices = exports.validateSupportedConfig = exports.validateDefaultConfig = exports.getDriverCacheStats = exports.clearDriverCache = exports.loadDriver = void 0;
4
4
  var loader_js_1 = require("./loader.js");
5
5
  Object.defineProperty(exports, "loadDriver", { enumerable: true, get: function () { return loader_js_1.loadDriver; } });
6
6
  Object.defineProperty(exports, "clearDriverCache", { enumerable: true, get: function () { return loader_js_1.clearDriverCache; } });
@@ -10,6 +10,10 @@ Object.defineProperty(exports, "validateDefaultConfig", { enumerable: true, get:
10
10
  Object.defineProperty(exports, "validateSupportedConfig", { enumerable: true, get: function () { return config_validator_js_1.validateSupportedConfig; } });
11
11
  Object.defineProperty(exports, "validateDevices", { enumerable: true, get: function () { return config_validator_js_1.validateDevices; } });
12
12
  Object.defineProperty(exports, "crossValidateConfigs", { enumerable: true, get: function () { return config_validator_js_1.crossValidateConfigs; } });
13
+ var driver_package_name_js_1 = require("./driver-package-name.js");
14
+ Object.defineProperty(exports, "DRIVER_PACKAGE_NAME_RULE", { enumerable: true, get: function () { return driver_package_name_js_1.DRIVER_PACKAGE_NAME_RULE; } });
15
+ Object.defineProperty(exports, "assertValidDriverPackageName", { enumerable: true, get: function () { return driver_package_name_js_1.assertValidDriverPackageName; } });
16
+ Object.defineProperty(exports, "isValidDriverPackageName", { enumerable: true, get: function () { return driver_package_name_js_1.isValidDriverPackageName; } });
13
17
  var errors_js_1 = require("./errors.js");
14
18
  Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_js_1.ValidationError; } });
15
19
  Object.defineProperty(exports, "DriverNotFoundError", { enumerable: true, get: function () { return errors_js_1.DriverNotFoundError; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA+E;AAAtE,uGAAA,UAAU,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAQ1D,6DAK8B;AAJ5B,4HAAA,qBAAqB,OAAA;AACrB,8HAAA,uBAAuB,OAAA;AACvB,sHAAA,eAAe,OAAA;AACf,2HAAA,oBAAoB,OAAA;AAEtB,yCAAoF;AAA3E,4GAAA,eAAe,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAC/D,qDAAwD;AAA/C,uHAAA,oBAAoB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA+E;AAAtE,uGAAA,UAAU,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAQ1D,6DAK8B;AAJ5B,4HAAA,qBAAqB,OAAA;AACrB,8HAAA,uBAAuB,OAAA;AACvB,sHAAA,eAAe,OAAA;AACf,2HAAA,oBAAoB,OAAA;AAEtB,mEAIiC;AAH/B,kIAAA,wBAAwB,OAAA;AACxB,sIAAA,4BAA4B,OAAA;AAC5B,kIAAA,wBAAwB,OAAA;AAE1B,yCAAoF;AAA3E,4GAAA,eAAe,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAC/D,qDAAwD;AAA/C,uHAAA,oBAAoB,OAAA"}
@@ -59,7 +59,10 @@ export interface Logger {
59
59
  export interface LoadDriverOptions {
60
60
  /**
61
61
  * Explicit driver package name
62
- * e.g., 'ya-modbus-driver-xymd1' or '@org/driver-pkg'
62
+ * e.g., 'ya-modbus-driver-xymd1' or '@org/ya-modbus-driver-xymd1'
63
+ *
64
+ * A short name such as 'xymd1' is tried as '@ya-modbus/driver-xymd1',
65
+ * then 'ya-modbus-driver-xymd1', then 'xymd1'.
63
66
  */
64
67
  driverPackage?: string;
65
68
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,eAAe,EAChB,MAAM,yBAAyB,CAAA;AAWhC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,YAAY,EAAE,oBAAoB,CAAA;IAElC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,cAAc,CAAA;IAExB,mEAAmE;IACnE,aAAa,CAAC,EAAE,aAAa,CAAA;IAE7B,kEAAkE;IAClE,eAAe,CAAC,EAAE,eAAe,CAAA;CAClC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,MAAM;IACrB,2BAA2B;IAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,oCAAoC;IACpC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IAEtB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAC9D,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACtD,MAAM,EAAE,MAAM,MAAM,CAAA;CACrB;AAeD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAA;CACb;AAeD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAMtD;AAwED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,UAAU,CAC9B,OAAO,GAAE,iBAAsB,EAC/B,IAAI,GAAE,kBAAgC,GACrC,OAAO,CAAC,YAAY,CAAC,CAsHvB"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,eAAe,EAChB,MAAM,yBAAyB,CAAA;AAahC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,YAAY,EAAE,oBAAoB,CAAA;IAElC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,cAAc,CAAA;IAExB,mEAAmE;IACnE,aAAa,CAAC,EAAE,aAAa,CAAA;IAE7B,kEAAkE;IAClE,eAAe,CAAC,EAAE,eAAe,CAAA;CAClC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,MAAM;IACrB,2BAA2B;IAC3B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,oCAAoC;IACpC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAClC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IAEtB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAC9D,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACtD,MAAM,EAAE,MAAM,MAAM,CAAA;CACrB;AAeD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAA;CACb;AAeD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAMtD;AAwED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,UAAU,CAC9B,OAAO,GAAE,iBAAsB,EAC/B,IAAI,GAAE,kBAAgC,GACrC,OAAO,CAAC,YAAY,CAAC,CAmHvB"}
@@ -39,6 +39,8 @@ exports.loadDriver = loadDriver;
39
39
  const promises_1 = require("fs/promises");
40
40
  const path_1 = require("path");
41
41
  const config_validator_js_1 = require("./config-validator.js");
42
+ const driver_import_js_1 = require("./driver-import.js");
43
+ const driver_name_js_1 = require("./driver-name.js");
42
44
  const errors_js_1 = require("./errors.js");
43
45
  /**
44
46
  * Default system dependencies using Node.js built-ins
@@ -165,19 +167,18 @@ async function loadDriver(options = {}, deps = defaultDeps) {
165
167
  let packageName;
166
168
  let driverModule;
167
169
  if (driverPackage) {
168
- packageName = driverPackage;
169
- const cached = driverCache.get(packageName);
170
- if (cached) {
171
- cacheStats.hits++;
172
- return cached;
170
+ const candidates = (0, driver_name_js_1.getDriverPackageCandidates)(driverPackage);
171
+ for (const candidate of candidates) {
172
+ const cached = driverCache.get(candidate);
173
+ if (cached) {
174
+ cacheStats.hits++;
175
+ return cached;
176
+ }
173
177
  }
174
178
  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
- }
179
+ const imported = await (0, driver_import_js_1.importDriverPackage)(driverPackage, candidates, deps);
180
+ packageName = imported.packageName;
181
+ driverModule = imported.driverModule;
181
182
  }
182
183
  else {
183
184
  packageName = await detectLocalPackage(deps);
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Check if an import failed because the package itself is not installed
3
+ *
4
+ * A package that is installed but fails to load (syntax error, missing dependency)
5
+ * is not reported as missing, so the real problem is not hidden by a later candidate.
6
+ * Node names the package in quotes, in both the ESM and the CommonJS wording.
7
+ */
8
+ export declare function isMissingPackageError(error: unknown, packageName: string): boolean;
9
+ //# sourceMappingURL=module-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-errors.d.ts","sourceRoot":"","sources":["../../../src/module-errors.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAYlF"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isMissingPackageError = isMissingPackageError;
4
+ const NOT_FOUND_CODES = new Set(['ERR_MODULE_NOT_FOUND', 'MODULE_NOT_FOUND']);
5
+ /**
6
+ * Check if an import failed because the package itself is not installed
7
+ *
8
+ * A package that is installed but fails to load (syntax error, missing dependency)
9
+ * is not reported as missing, so the real problem is not hidden by a later candidate.
10
+ * Node names the package in quotes, in both the ESM and the CommonJS wording.
11
+ */
12
+ function isMissingPackageError(error, packageName) {
13
+ if (typeof error !== 'object' || error === null) {
14
+ return false;
15
+ }
16
+ const { code, message } = error;
17
+ return (typeof code === 'string' &&
18
+ NOT_FOUND_CODES.has(code) &&
19
+ typeof message === 'string' &&
20
+ message.includes(`'${packageName}'`));
21
+ }
22
+ //# sourceMappingURL=module-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-errors.js","sourceRoot":"","sources":["../../../src/module-errors.ts"],"names":[],"mappings":";;AASA,sDAYC;AArBD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAAC,CAAA;AAE7E;;;;;;GAMG;AACH,SAAgB,qBAAqB,CAAC,KAAc,EAAE,WAAmB;IACvE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAA8C,CAAA;IACxE,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QACzB,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,WAAW,GAAG,CAAC,CACrC,CAAA;AACH,CAAC"}