@ya-modbus/driver-loader 0.9.0 → 0.11.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 (69) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +61 -11
  3. package/dist/cjs/src/driver-import.d.ts +32 -0
  4. package/dist/cjs/src/driver-import.d.ts.map +1 -0
  5. package/dist/cjs/src/driver-import.js +82 -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/entry-point.d.ts +20 -0
  12. package/dist/cjs/src/entry-point.d.ts.map +1 -0
  13. package/dist/cjs/src/entry-point.js +63 -0
  14. package/dist/cjs/src/entry-point.js.map +1 -0
  15. package/dist/cjs/src/errors.d.ts +32 -3
  16. package/dist/cjs/src/errors.d.ts.map +1 -1
  17. package/dist/cjs/src/errors.js +39 -5
  18. package/dist/cjs/src/errors.js.map +1 -1
  19. package/dist/cjs/src/index.d.ts +1 -1
  20. package/dist/cjs/src/index.d.ts.map +1 -1
  21. package/dist/cjs/src/index.js +2 -1
  22. package/dist/cjs/src/index.js.map +1 -1
  23. package/dist/cjs/src/loader.d.ts +9 -2
  24. package/dist/cjs/src/loader.d.ts.map +1 -1
  25. package/dist/cjs/src/loader.js +34 -78
  26. package/dist/cjs/src/loader.js.map +1 -1
  27. package/dist/cjs/src/local-package.d.ts +19 -0
  28. package/dist/cjs/src/local-package.d.ts.map +1 -0
  29. package/dist/cjs/src/local-package.js +50 -0
  30. package/dist/cjs/src/local-package.js.map +1 -0
  31. package/dist/cjs/src/module-errors.d.ts +33 -0
  32. package/dist/cjs/src/module-errors.d.ts.map +1 -0
  33. package/dist/cjs/src/module-errors.js +77 -0
  34. package/dist/cjs/src/module-errors.js.map +1 -0
  35. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  36. package/dist/esm/src/driver-import.d.ts +32 -0
  37. package/dist/esm/src/driver-import.d.ts.map +1 -0
  38. package/dist/esm/src/driver-import.js +78 -0
  39. package/dist/esm/src/driver-import.js.map +1 -0
  40. package/dist/esm/src/driver-name.d.ts +11 -0
  41. package/dist/esm/src/driver-name.d.ts.map +1 -0
  42. package/dist/esm/src/driver-name.js +18 -0
  43. package/dist/esm/src/driver-name.js.map +1 -0
  44. package/dist/esm/src/entry-point.d.ts +20 -0
  45. package/dist/esm/src/entry-point.d.ts.map +1 -0
  46. package/dist/esm/src/entry-point.js +59 -0
  47. package/dist/esm/src/entry-point.js.map +1 -0
  48. package/dist/esm/src/errors.d.ts +32 -3
  49. package/dist/esm/src/errors.d.ts.map +1 -1
  50. package/dist/esm/src/errors.js +37 -4
  51. package/dist/esm/src/errors.js.map +1 -1
  52. package/dist/esm/src/index.d.ts +1 -1
  53. package/dist/esm/src/index.d.ts.map +1 -1
  54. package/dist/esm/src/index.js +1 -1
  55. package/dist/esm/src/index.js.map +1 -1
  56. package/dist/esm/src/loader.d.ts +9 -2
  57. package/dist/esm/src/loader.d.ts.map +1 -1
  58. package/dist/esm/src/loader.js +35 -79
  59. package/dist/esm/src/loader.js.map +1 -1
  60. package/dist/esm/src/local-package.d.ts +19 -0
  61. package/dist/esm/src/local-package.d.ts.map +1 -0
  62. package/dist/esm/src/local-package.js +47 -0
  63. package/dist/esm/src/local-package.js.map +1 -0
  64. package/dist/esm/src/module-errors.d.ts +33 -0
  65. package/dist/esm/src/module-errors.d.ts.map +1 -0
  66. package/dist/esm/src/module-errors.js +73 -0
  67. package/dist/esm/src/module-errors.js.map +1 -0
  68. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  69. package/package.json +2 -2
@@ -0,0 +1,78 @@
1
+ import { pathToFileURL } from 'node:url';
2
+ import { DriverNotBuiltError, DriverNotFoundError } from './errors.js';
3
+ import { getNotBuiltCause, isMissingPackageError } from './module-errors.js';
4
+ const NOT_BUILT_HINTS = {
5
+ 'missing-file': 'Drivers are loaded as built JavaScript. Build the driver first (npm run build).',
6
+ typescript: 'Drivers are loaded as built JavaScript. Build the driver first (npm run build), ' +
7
+ "or run with Node's built-in type stripping (Node 22.18+ or 24) to load TypeScript source.",
8
+ 'typescript-unsupported': 'Drivers are loaded as built JavaScript. Build the driver first (npm run build). ' +
9
+ "Node's type stripping needs erasable syntax (no enums) and imports that name files with their .ts extension.",
10
+ 'typescript-in-node-modules': 'Node does not run TypeScript from node_modules, so a package must ship built JavaScript.',
11
+ };
12
+ /**
13
+ * Error for a driver that cannot be loaded because it is not built
14
+ *
15
+ * Shows what Node reported. The "imported from" part is left out when `hideImporter` is set,
16
+ * because then it only names the loader.
17
+ */
18
+ function createNotBuiltError(packageName, cause, notBuilt, hideImporter = false) {
19
+ const firstLine = cause.message.replace(/\n[\s\S]*/, '');
20
+ const reason = hideImporter ? firstLine.replace(/ imported from .*$/, '') : firstLine;
21
+ return new DriverNotBuiltError(`Cannot load driver ${packageName}: ${reason}\n${NOT_BUILT_HINTS[notBuilt]}`, packageName, { cause });
22
+ }
23
+ /**
24
+ * Import the first installed package of a list of candidates
25
+ *
26
+ * Moves on to the next candidate only when the package is not installed. A package that
27
+ * is installed but fails to load stops the search, so its error is not replaced by a later one.
28
+ *
29
+ * @param name - Driver name as given by the user
30
+ * @param candidates - Package names to try, in order
31
+ * @param deps - System dependencies
32
+ * @returns The imported module and the name of the package it came from
33
+ * @throws DriverNotBuiltError if the installed package is not built
34
+ * @throws DriverNotFoundError if no candidate is installed or the installed one fails to load
35
+ */
36
+ export async function importDriverPackage(name, candidates, deps) {
37
+ for (const packageName of candidates) {
38
+ try {
39
+ return { packageName, driverModule: await deps.importModule(packageName) };
40
+ }
41
+ catch (error) {
42
+ const notBuilt = getNotBuiltCause(error);
43
+ if (notBuilt) {
44
+ throw createNotBuiltError(packageName, error, notBuilt);
45
+ }
46
+ if (!isMissingPackageError(error, packageName)) {
47
+ const reason = error instanceof Error ? error.message : String(error);
48
+ throw new DriverNotFoundError(`Failed to load driver package ${packageName}: ${reason}`, packageName, { cause: error });
49
+ }
50
+ }
51
+ }
52
+ const [preferred] = candidates;
53
+ const tried = candidates.length > 1 ? `\nTried: ${candidates.join(', ')}` : '';
54
+ throw new DriverNotFoundError(`Driver package not found: ${name}${tried}\nInstall it with: npm install ${preferred}`, preferred);
55
+ }
56
+ /**
57
+ * Import the entry file of the driver package in the current directory
58
+ *
59
+ * @param packageName - Name from package.json
60
+ * @param entryPoint - Absolute path of the entry file
61
+ * @param deps - System dependencies
62
+ * @returns The imported module
63
+ * @throws DriverNotBuiltError if the entry file is missing or is TypeScript that Node cannot run
64
+ */
65
+ export async function importLocalDriver(packageName, entryPoint, deps) {
66
+ try {
67
+ return await deps.importModule(pathToFileURL(entryPoint).href);
68
+ }
69
+ catch (error) {
70
+ const notBuilt = getNotBuiltCause(error, entryPoint);
71
+ if (notBuilt === undefined) {
72
+ throw error;
73
+ }
74
+ // The missing entry file is reported as imported by the loader, which is no help
75
+ throw createNotBuiltError(packageName, error, notBuilt, notBuilt === 'missing-file');
76
+ }
77
+ }
78
+ //# sourceMappingURL=driver-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-import.js","sourceRoot":"","sources":["../../../src/driver-import.ts"],"names":[],"mappings":"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"}
@@ -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,18 @@
1
+ const SCOPED_PREFIX = '@ya-modbus/driver-';
2
+ const UNSCOPED_PREFIX = 'ya-modbus-driver-';
3
+ /** An unscoped npm package name that is not already a full driver package name */
4
+ const SHORT_NAME = /^[a-z0-9][a-z0-9._-]*$/;
5
+ /**
6
+ * Packages to try, in order, for a driver name given by the user
7
+ *
8
+ * A short name such as `xymd1` stands for `@ya-modbus/driver-xymd1`, then
9
+ * `ya-modbus-driver-xymd1`, then a package called `xymd1`. Anything else is a full
10
+ * package name or a path and is used as given.
11
+ */
12
+ export function getDriverPackageCandidates(name) {
13
+ if (!SHORT_NAME.test(name) || name.startsWith(UNSCOPED_PREFIX)) {
14
+ return [name];
15
+ }
16
+ return [`${SCOPED_PREFIX}${name}`, `${UNSCOPED_PREFIX}${name}`, name];
17
+ }
18
+ //# sourceMappingURL=driver-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-name.js","sourceRoot":"","sources":["../../../src/driver-name.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,oBAAoB,CAAA;AAC1C,MAAM,eAAe,GAAG,mBAAmB,CAAA;AAE3C,kFAAkF;AAClF,MAAM,UAAU,GAAG,wBAAwB,CAAA;AAK3C;;;;;;GAMG;AACH,MAAM,UAAU,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,20 @@
1
+ /**
2
+ * Conditions Node uses for `import()` when it resolves package `exports`.
3
+ * Other runtimes use other conditions (for example `deno` or `bun`).
4
+ */
5
+ export declare const IMPORT_CONDITIONS: readonly string[];
6
+ /** The package.json fields that decide where a package is entered */
7
+ export interface PackageEntryFields {
8
+ main?: unknown;
9
+ exports?: unknown;
10
+ }
11
+ /**
12
+ * Find the file that `import('<package>')` loads, from a package.json
13
+ *
14
+ * Uses `exports["."]` when the package has `exports`, otherwise `main`, otherwise `index.js`,
15
+ * like Node does. Paths are relative to the package directory.
16
+ *
17
+ * @returns The relative path, or undefined if `exports` has no entry for these conditions
18
+ */
19
+ export declare function resolvePackageEntry(packageJson: PackageEntryFields, conditions?: readonly string[]): string | undefined;
20
+ //# sourceMappingURL=entry-point.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-point.d.ts","sourceRoot":"","sources":["../../../src/entry-point.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAAiD,CAAA;AAEhG,qEAAqE;AACrE,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAwCD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,kBAAkB,EAC/B,UAAU,GAAE,SAAS,MAAM,EAAsB,GAChD,MAAM,GAAG,SAAS,CAoBpB"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Conditions Node uses for `import()` when it resolves package `exports`.
3
+ * Other runtimes use other conditions (for example `deno` or `bun`).
4
+ */
5
+ export const IMPORT_CONDITIONS = ['node', 'import', 'module-sync', 'default'];
6
+ /**
7
+ * Resolve a conditional `exports` target to a file path
8
+ *
9
+ * Follows the Node rules: the first key that matches a condition and leads somewhere wins.
10
+ * A `null` condition blocks the path, so the search stops there. In an array, a `null`
11
+ * result is skipped and the next item is tried.
12
+ */
13
+ function resolveTarget(target, conditions) {
14
+ if (target === null) {
15
+ return null;
16
+ }
17
+ if (typeof target === 'string') {
18
+ return target.startsWith('./') ? target : undefined;
19
+ }
20
+ if (Array.isArray(target)) {
21
+ for (const item of target) {
22
+ const resolved = resolveTarget(item, conditions);
23
+ if (typeof resolved === 'string') {
24
+ return resolved;
25
+ }
26
+ }
27
+ return undefined;
28
+ }
29
+ if (typeof target === 'object') {
30
+ for (const [condition, value] of Object.entries(target)) {
31
+ const resolved = conditions.includes(condition) ? resolveTarget(value, conditions) : undefined;
32
+ if (resolved !== undefined) {
33
+ return resolved;
34
+ }
35
+ }
36
+ }
37
+ return undefined;
38
+ }
39
+ /**
40
+ * Find the file that `import('<package>')` loads, from a package.json
41
+ *
42
+ * Uses `exports["."]` when the package has `exports`, otherwise `main`, otherwise `index.js`,
43
+ * like Node does. Paths are relative to the package directory.
44
+ *
45
+ * @returns The relative path, or undefined if `exports` has no entry for these conditions
46
+ */
47
+ export function resolvePackageEntry(packageJson, conditions = IMPORT_CONDITIONS) {
48
+ // Not destructured as `exports`: in the CommonJS build that would shadow the module's own exports
49
+ const { main, exports: exportsField } = packageJson;
50
+ if (exportsField === undefined || exportsField === null) {
51
+ return typeof main === 'string' ? main : 'index.js';
52
+ }
53
+ // `exports` is either a map of subpaths ("." and "./x") or the target of "." itself
54
+ const isSubpathMap = typeof exportsField === 'object' &&
55
+ !Array.isArray(exportsField) &&
56
+ Object.keys(exportsField).some((key) => key.startsWith('.'));
57
+ return (resolveTarget(isSubpathMap ? exportsField['.'] : exportsField, conditions) ?? undefined);
58
+ }
59
+ //# sourceMappingURL=entry-point.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry-point.js","sourceRoot":"","sources":["../../../src/entry-point.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,CAAC,CAAA;AAQhG;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,MAAe,EAAE,UAA6B;IACnE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;IACrD,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,MAAmB,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;YAChD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,OAAO,QAAQ,CAAA;YACjB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAiC,CAAC,EAAE,CAAC;YACnF,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAC9F,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,QAAQ,CAAA;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,WAA+B,EAC/B,aAAgC,iBAAiB;IAEjD,kGAAkG;IAClG,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,WAAW,CAAA;IAEnD,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QACxD,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAA;IACrD,CAAC;IAED,oFAAoF;IACpF,MAAM,YAAY,GAChB,OAAO,YAAY,KAAK,QAAQ;QAChC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;IAE9D,OAAO,CACL,aAAa,CACX,YAAY,CAAC,CAAC,CAAE,YAAwC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,EAC5E,UAAU,CACX,IAAI,SAAS,CACf,CAAA;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,42 @@ 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);
54
+ }
55
+ /**
56
+ * Error thrown when a driver package is installed but cannot be loaded because it is not built
57
+ *
58
+ * Drivers are loaded as built JavaScript. This covers a missing entry file (for example
59
+ * no `dist` directory) and TypeScript source that Node cannot run.
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * import { loadDriver, DriverNotBuiltError } from '@ya-modbus/driver-loader'
64
+ *
65
+ * try {
66
+ * await loadDriver({}) // Auto-detect from current directory
67
+ * } catch (error) {
68
+ * if (error instanceof DriverNotBuiltError) {
69
+ * console.error(`Build ${error.packageName} first: npm run build`)
70
+ * }
71
+ * }
72
+ * ```
73
+ */
74
+ export declare class DriverNotBuiltError extends Error {
75
+ readonly packageName: string;
76
+ constructor(message: string, packageName: string, options?: ErrorOptions);
48
77
  }
49
78
  /**
50
79
  * 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;;;;;;;;;;;;;;;;;;GAkBG;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"}
@@ -32,6 +32,8 @@ export class ValidationError extends Error {
32
32
  /**
33
33
  * Error thrown when a driver package cannot be found or loaded
34
34
  *
35
+ * `cause` is set when the package is installed but fails to load.
36
+ *
35
37
  * @example
36
38
  * ```typescript
37
39
  * import { loadDriver, DriverNotFoundError } from '@ya-modbus/driver-loader'
@@ -40,20 +42,51 @@ export class ValidationError extends Error {
40
42
  * await loadDriver({ driverPackage: 'missing-driver' })
41
43
  * } catch (error) {
42
44
  * if (error instanceof DriverNotFoundError) {
43
- * console.error(`Package not found: ${error.packageName}`)
44
- * console.error(`Install with: npm install ${error.packageName}`)
45
+ * if (error.cause) {
46
+ * console.error(`Failed to load ${error.packageName}:`, error.cause)
47
+ * } else {
48
+ * console.error(`Package not found: ${error.packageName}`)
49
+ * console.error(`Install with: npm install ${error.packageName}`)
50
+ * }
45
51
  * }
46
52
  * }
47
53
  * ```
48
54
  */
49
55
  export class DriverNotFoundError extends Error {
50
- constructor(message, packageName) {
51
- super(message);
56
+ constructor(message, packageName, options) {
57
+ super(message, options);
52
58
  this.packageName = packageName;
53
59
  this.name = 'DriverNotFoundError';
54
60
  Object.setPrototypeOf(this, DriverNotFoundError.prototype);
55
61
  }
56
62
  }
63
+ /**
64
+ * Error thrown when a driver package is installed but cannot be loaded because it is not built
65
+ *
66
+ * Drivers are loaded as built JavaScript. This covers a missing entry file (for example
67
+ * no `dist` directory) and TypeScript source that Node cannot run.
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * import { loadDriver, DriverNotBuiltError } from '@ya-modbus/driver-loader'
72
+ *
73
+ * try {
74
+ * await loadDriver({}) // Auto-detect from current directory
75
+ * } catch (error) {
76
+ * if (error instanceof DriverNotBuiltError) {
77
+ * console.error(`Build ${error.packageName} first: npm run build`)
78
+ * }
79
+ * }
80
+ * ```
81
+ */
82
+ export class DriverNotBuiltError extends Error {
83
+ constructor(message, packageName, options) {
84
+ super(message, options);
85
+ this.packageName = packageName;
86
+ this.name = 'DriverNotBuiltError';
87
+ Object.setPrototypeOf(this, DriverNotBuiltError.prototype);
88
+ }
89
+ }
57
90
  /**
58
91
  * Error thrown when package.json is not found or invalid
59
92
  *
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,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;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,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;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,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;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,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;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,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;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,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"}
@@ -2,7 +2,7 @@ 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
4
  export { DRIVER_PACKAGE_NAME_RULE, assertValidDriverPackageName, isValidDriverPackageName, } from './driver-package-name.js';
5
- export { ValidationError, DriverNotFoundError, PackageJsonError } from './errors.js';
5
+ export { ValidationError, DriverNotFoundError, DriverNotBuiltError, PackageJsonError, } from './errors.js';
6
6
  export { getCallerPackageInfo } from './package-info.js';
7
7
  export type { PackageInfo } from './package-info.js';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -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,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
+ {"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,EACL,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
@@ -1,6 +1,6 @@
1
1
  export { loadDriver, clearDriverCache, getDriverCacheStats } from './loader.js';
2
2
  export { validateDefaultConfig, validateSupportedConfig, validateDevices, crossValidateConfigs, } from './config-validator.js';
3
3
  export { DRIVER_PACKAGE_NAME_RULE, assertValidDriverPackageName, isValidDriverPackageName, } from './driver-package-name.js';
4
- export { ValidationError, DriverNotFoundError, PackageJsonError } from './errors.js';
4
+ export { ValidationError, DriverNotFoundError, DriverNotBuiltError, PackageJsonError, } from './errors.js';
5
5
  export { getCallerPackageInfo } from './package-info.js';
6
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAQ/E,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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAQ/E,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,EACL,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA"}
@@ -60,6 +60,9 @@ export interface LoadDriverOptions {
60
60
  /**
61
61
  * Explicit driver package name
62
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
  /**
@@ -73,7 +76,8 @@ export interface LoadDriverOptions {
73
76
  */
74
77
  export interface SystemDependencies {
75
78
  readFile: (path: string, encoding: 'utf-8') => Promise<string>;
76
- importModule: (modulePath: string) => Promise<unknown>;
79
+ /** Import a module by package name, or by `file:` URL for the entry file of a local package */
80
+ importModule: (specifier: string) => Promise<unknown>;
77
81
  getCwd: () => string;
78
82
  }
79
83
  /**
@@ -104,7 +108,10 @@ export declare function getDriverCacheStats(): DriverCacheStats;
104
108
  * 1. Explicit package: `loadDriver({ driverPackage: 'ya-modbus-driver-xymd1' })`
105
109
  * 2. Auto-detect from cwd: `loadDriver({})` - reads package.json from current directory
106
110
  *
107
- * Auto-detection checks for `ya-modbus-driver` keyword in package.json keywords.
111
+ * Auto-detection checks for `ya-modbus-driver` keyword in package.json keywords and loads
112
+ * the entry file that `import` of the package resolves to (`exports["."]`, else `main`,
113
+ * else `index.js`). The driver must be built: the entry file is JavaScript, or TypeScript
114
+ * that Node can run itself.
108
115
  *
109
116
  * @example
110
117
  * // Auto-detect from current directory
@@ -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":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,eAAe,EAChB,MAAM,yBAAyB,CAAA;AAmBhC;;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,+FAA+F;IAC/F,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACrD,MAAM,EAAE,MAAM,MAAM,CAAA;CACrB;AA6BD;;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;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,UAAU,CAC9B,OAAO,GAAE,iBAAsB,EAC/B,IAAI,GAAE,kBAAgC,GACrC,OAAO,CAAC,YAAY,CAAC,CA4GvB"}
@@ -1,7 +1,21 @@
1
1
  import { readFile } from 'fs/promises';
2
- import { join } from 'path';
3
2
  import { crossValidateConfigs, outputConfigWarnings, validateDefaultConfig, validateDevices, validateSupportedConfig, } from './config-validator.js';
4
- import { DriverNotFoundError, PackageJsonError, ValidationError } from './errors.js';
3
+ import { importDriverPackage, importLocalDriver } from './driver-import.js';
4
+ import { getDriverPackageCandidates } from './driver-name.js';
5
+ import { DriverNotBuiltError, DriverNotFoundError, PackageJsonError, ValidationError, } from './errors.js';
6
+ import { detectLocalPackage } from './local-package.js';
7
+ /**
8
+ * Native `import()`, in the CommonJS build as well
9
+ *
10
+ * The CommonJS build compiles `import()` to `require()`, which cannot load a `file:` URL.
11
+ * Going through `Function` keeps the native `import()`, which also loads ES modules.
12
+ */
13
+ /* istanbul ignore next */
14
+ const nativeImport = (specifier) => {
15
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval -- keeps `import()` out of the CommonJS transform
16
+ const importFn = new Function('specifier', 'return import(specifier)');
17
+ return importFn(specifier);
18
+ };
5
19
  /**
6
20
  * Default system dependencies using Node.js built-ins
7
21
  */
@@ -10,7 +24,7 @@ const defaultDeps = {
10
24
  /* istanbul ignore next */
11
25
  readFile: (path, encoding) => readFile(path, encoding),
12
26
  /* istanbul ignore next */
13
- importModule: (modulePath) => import(modulePath),
27
+ importModule: (specifier) => specifier.startsWith('file:') ? nativeImport(specifier) : import(specifier),
14
28
  /* istanbul ignore next */
15
29
  getCwd: () => process.cwd(),
16
30
  };
@@ -45,61 +59,6 @@ export function getDriverCacheStats() {
45
59
  size: driverCache.size,
46
60
  };
47
61
  }
48
- /**
49
- * Auto-detect local driver package from package.json
50
- *
51
- * @param deps - System dependencies
52
- * @returns Package name if valid driver package
53
- * @throws Error if not a valid driver package
54
- */
55
- async function detectLocalPackage(deps) {
56
- try {
57
- const packageJsonPath = join(deps.getCwd(), 'package.json');
58
- const packageJsonContent = await deps.readFile(packageJsonPath, 'utf-8');
59
- const packageJson = JSON.parse(packageJsonContent);
60
- const keywords = packageJson.keywords ?? [];
61
- if (!keywords.includes('ya-modbus-driver')) {
62
- throw new PackageJsonError('Current package is not a ya-modbus driver. ' +
63
- 'Add "ya-modbus-driver" to keywords in package.json');
64
- }
65
- const name = packageJson.name;
66
- if (!name) {
67
- throw new PackageJsonError('package.json must have a "name" field');
68
- }
69
- return name;
70
- }
71
- catch (error) {
72
- if (error.code === 'ENOENT') {
73
- throw new PackageJsonError('package.json not found in current directory. ' +
74
- 'Run this command from a driver package directory or specify --driver');
75
- }
76
- if (error instanceof SyntaxError) {
77
- throw new PackageJsonError('Failed to parse package.json: invalid JSON');
78
- }
79
- throw error;
80
- }
81
- }
82
- /**
83
- * Try to import a module with multiple path attempts
84
- *
85
- * @param paths - Array of module paths to try
86
- * @param deps - System dependencies
87
- * @returns Imported module
88
- * @throws Error if all paths fail
89
- */
90
- async function tryImport(paths, deps) {
91
- const errors = [];
92
- for (const path of paths) {
93
- try {
94
- return await deps.importModule(path);
95
- }
96
- catch (error) {
97
- errors.push(error);
98
- }
99
- }
100
- const lastError = errors[errors.length - 1];
101
- throw new Error(`Failed to import module from any path. Tried: ${paths.join(', ')}\nLast error: ${lastError?.message}`, { cause: lastError });
102
- }
103
62
  /**
104
63
  * Load a driver package dynamically
105
64
  *
@@ -107,7 +66,10 @@ async function tryImport(paths, deps) {
107
66
  * 1. Explicit package: `loadDriver({ driverPackage: 'ya-modbus-driver-xymd1' })`
108
67
  * 2. Auto-detect from cwd: `loadDriver({})` - reads package.json from current directory
109
68
  *
110
- * Auto-detection checks for `ya-modbus-driver` keyword in package.json keywords.
69
+ * Auto-detection checks for `ya-modbus-driver` keyword in package.json keywords and loads
70
+ * the entry file that `import` of the package resolves to (`exports["."]`, else `main`,
71
+ * else `index.js`). The driver must be built: the entry file is JavaScript, or TypeScript
72
+ * that Node can run itself.
111
73
  *
112
74
  * @example
113
75
  * // Auto-detect from current directory
@@ -127,36 +89,29 @@ export async function loadDriver(options = {}, deps = defaultDeps) {
127
89
  let packageName;
128
90
  let driverModule;
129
91
  if (driverPackage) {
130
- packageName = driverPackage;
131
- const cached = driverCache.get(packageName);
132
- if (cached) {
133
- cacheStats.hits++;
134
- return cached;
92
+ const candidates = getDriverPackageCandidates(driverPackage);
93
+ for (const candidate of candidates) {
94
+ const cached = driverCache.get(candidate);
95
+ if (cached) {
96
+ cacheStats.hits++;
97
+ return cached;
98
+ }
135
99
  }
136
100
  cacheStats.misses++;
137
- try {
138
- driverModule = await deps.importModule(driverPackage);
139
- }
140
- catch {
141
- throw new DriverNotFoundError(`Driver package not found: ${driverPackage}\nInstall it with: npm install ${driverPackage}`, driverPackage);
142
- }
101
+ const imported = await importDriverPackage(driverPackage, candidates, deps);
102
+ packageName = imported.packageName;
103
+ driverModule = imported.driverModule;
143
104
  }
144
105
  else {
145
- packageName = await detectLocalPackage(deps);
106
+ const localPackage = await detectLocalPackage(deps);
107
+ packageName = localPackage.name;
146
108
  const cached = driverCache.get(packageName);
147
109
  if (cached) {
148
110
  cacheStats.hits++;
149
111
  return cached;
150
112
  }
151
113
  cacheStats.misses++;
152
- const cwd = deps.getCwd();
153
- const importPaths = [
154
- join(cwd, 'src', 'index.js'),
155
- join(cwd, 'src', 'index.ts'),
156
- join(cwd, 'dist', 'index.js'),
157
- packageName,
158
- ];
159
- driverModule = await tryImport(importPaths, deps);
114
+ driverModule = await importLocalDriver(packageName, localPackage.entryPoint, deps);
160
115
  }
161
116
  if (!driverModule || typeof driverModule !== 'object') {
162
117
  throw new ValidationError('Driver package must export a createDriver function', 'createDriver');
@@ -192,6 +147,7 @@ export async function loadDriver(options = {}, deps = defaultDeps) {
192
147
  catch (error) {
193
148
  if (error instanceof ValidationError ||
194
149
  error instanceof DriverNotFoundError ||
150
+ error instanceof DriverNotBuiltError ||
195
151
  error instanceof PackageJsonError) {
196
152
  throw error;
197
153
  }
@@ -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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"}