@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,19 @@
1
+ import type { SystemDependencies } from './loader.js';
2
+ /**
3
+ * A driver package found in the current directory
4
+ */
5
+ export interface LocalPackage {
6
+ /** Name from package.json */
7
+ name: string;
8
+ /** Absolute path of the file that importing the package loads */
9
+ entryPoint: string;
10
+ }
11
+ /**
12
+ * Auto-detect local driver package from package.json
13
+ *
14
+ * @param deps - System dependencies
15
+ * @returns Package name and entry file if valid driver package
16
+ * @throws Error if not a valid driver package
17
+ */
18
+ export declare function detectLocalPackage(deps: Pick<SystemDependencies, 'getCwd' | 'readFile'>): Promise<LocalPackage>;
19
+ //# sourceMappingURL=local-package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-package.d.ts","sourceRoot":"","sources":["../../../src/local-package.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAErD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,UAAU,CAAC,GACpD,OAAO,CAAC,YAAY,CAAC,CAkDvB"}
@@ -0,0 +1,47 @@
1
+ import { extname, join } from 'node:path';
2
+ import { resolvePackageEntry } from './entry-point.js';
3
+ import { PackageJsonError } from './errors.js';
4
+ /**
5
+ * Auto-detect local driver package from package.json
6
+ *
7
+ * @param deps - System dependencies
8
+ * @returns Package name and entry file if valid driver package
9
+ * @throws Error if not a valid driver package
10
+ */
11
+ export async function detectLocalPackage(deps) {
12
+ try {
13
+ const cwd = deps.getCwd();
14
+ const packageJsonContent = await deps.readFile(join(cwd, 'package.json'), 'utf-8');
15
+ const packageJson = JSON.parse(packageJsonContent);
16
+ const keywords = packageJson.keywords ?? [];
17
+ if (!keywords.includes('ya-modbus-driver')) {
18
+ throw new PackageJsonError('Current package is not a ya-modbus driver. ' +
19
+ 'Add "ya-modbus-driver" to keywords in package.json');
20
+ }
21
+ const name = packageJson.name;
22
+ if (!name) {
23
+ throw new PackageJsonError('package.json must have a "name" field');
24
+ }
25
+ const entry = resolvePackageEntry(packageJson);
26
+ if (entry === undefined) {
27
+ throw new PackageJsonError('package.json "exports" has no entry for "." that can be imported. ' +
28
+ 'Add an "import" or "default" condition to exports["."]');
29
+ }
30
+ if (extname(entry) === '') {
31
+ throw new PackageJsonError(`The entry point "${entry}" in package.json has no file extension. ` +
32
+ 'Name the built file, for example "./dist/index.js"');
33
+ }
34
+ return { name, entryPoint: join(cwd, entry) };
35
+ }
36
+ catch (error) {
37
+ if (error.code === 'ENOENT') {
38
+ throw new PackageJsonError('package.json not found in current directory. ' +
39
+ 'Run this command from a driver package directory or specify --driver');
40
+ }
41
+ if (error instanceof SyntaxError) {
42
+ throw new PackageJsonError('Failed to parse package.json: invalid JSON');
43
+ }
44
+ throw error;
45
+ }
46
+ }
47
+ //# sourceMappingURL=local-package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-package.js","sourceRoot":"","sources":["../../../src/local-package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEzC,OAAO,EAAE,mBAAmB,EAA2B,MAAM,kBAAkB,CAAA;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAa9C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAqD;IAErD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;QACzB,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAA;QAClF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAGhD,CAAA;QAED,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,IAAI,EAAE,CAAA;QAC3C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,gBAAgB,CACxB,6CAA6C;gBAC3C,oDAAoD,CACvD,CAAA;QACH,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAA;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,gBAAgB,CAAC,uCAAuC,CAAC,CAAA;QACrE,CAAC;QAED,MAAM,KAAK,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAA;QAC9C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,gBAAgB,CACxB,oEAAoE;gBAClE,wDAAwD,CAC3D,CAAA;QACH,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,gBAAgB,CACxB,oBAAoB,KAAK,2CAA2C;gBAClE,oDAAoD,CACvD,CAAA;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAA;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,gBAAgB,CACxB,+CAA+C;gBAC7C,sEAAsE,CACzE,CAAA;QACH,CAAC;QACD,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,gBAAgB,CAAC,4CAA4C,CAAC,CAAA;QAC1E,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
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
+ /** Why a driver cannot be loaded as built JavaScript */
10
+ export type NotBuiltCause =
11
+ /** A file of the driver is missing, such as the entry file when there is no `dist` directory */
12
+ 'missing-file'
13
+ /** The driver is TypeScript source and Node does not run it, because it is too old or has type stripping off */
14
+ | 'typescript'
15
+ /** Node strips types, but the TypeScript uses syntax or imports that type stripping cannot run */
16
+ | 'typescript-unsupported'
17
+ /** Node does not run TypeScript from `node_modules` */
18
+ | 'typescript-in-node-modules';
19
+ /**
20
+ * Find out if an import failed because the driver is not built
21
+ *
22
+ * A missing file counts when Node names it by its absolute path. A package that is not
23
+ * installed, or a missing dependency, is named by its package name, so neither matches.
24
+ * With `entryPoint` (a local driver) only the entry file itself counts. Another missing
25
+ * file of a built driver is a bug in the driver, which building does not fix, unless
26
+ * TypeScript source asks for it (importing `./x.js` when only `x.ts` exists).
27
+ *
28
+ * @param error - What the import threw
29
+ * @param entryPoint - Absolute path of the entry file, if it is known
30
+ * @returns The cause, or undefined if the error is about something else
31
+ */
32
+ export declare function getNotBuiltCause(error: unknown, entryPoint?: string): NotBuiltCause | undefined;
33
+ //# 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":"AAaA;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAYlF;AAED,wDAAwD;AACxD,MAAM,MAAM,aAAa;AACvB,gGAAgG;AAC9F,cAAc;AAChB,gHAAgH;GAC9G,YAAY;AACd,kGAAkG;GAChG,wBAAwB;AAC1B,uDAAuD;GACrD,4BAA4B,CAAA;AAEhC;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAiC/F"}
@@ -0,0 +1,73 @@
1
+ const NOT_FOUND_CODES = new Set(['ERR_MODULE_NOT_FOUND', 'MODULE_NOT_FOUND']);
2
+ /** Node does not know TypeScript files: too old, or type stripping is off */
3
+ const UNKNOWN_TYPESCRIPT = /Unknown file extension "\.[cm]?ts"/;
4
+ /**
5
+ * What Node could not find (a package name, or the absolute path of a file on POSIX or
6
+ * Windows), and the file that wanted it (not in the CommonJS wording)
7
+ */
8
+ const MISSING_TARGET = /Cannot find (?:module|package) '([^']+)'(?: imported from ([^\n]+))?/;
9
+ const ABSOLUTE_PATH = /^(?:[/\\]|[A-Za-z]:)/;
10
+ const TYPESCRIPT_FILE = /\.[cm]?tsx?$/;
11
+ /**
12
+ * Check if an import failed because the package itself is not installed
13
+ *
14
+ * A package that is installed but fails to load (syntax error, missing dependency)
15
+ * is not reported as missing, so the real problem is not hidden by a later candidate.
16
+ * Node names the package in quotes, in both the ESM and the CommonJS wording.
17
+ */
18
+ export function isMissingPackageError(error, packageName) {
19
+ if (typeof error !== 'object' || error === null) {
20
+ return false;
21
+ }
22
+ const { code, message } = error;
23
+ return (typeof code === 'string' &&
24
+ NOT_FOUND_CODES.has(code) &&
25
+ typeof message === 'string' &&
26
+ message.includes(`'${packageName}'`));
27
+ }
28
+ /**
29
+ * Find out if an import failed because the driver is not built
30
+ *
31
+ * A missing file counts when Node names it by its absolute path. A package that is not
32
+ * installed, or a missing dependency, is named by its package name, so neither matches.
33
+ * With `entryPoint` (a local driver) only the entry file itself counts. Another missing
34
+ * file of a built driver is a bug in the driver, which building does not fix, unless
35
+ * TypeScript source asks for it (importing `./x.js` when only `x.ts` exists).
36
+ *
37
+ * @param error - What the import threw
38
+ * @param entryPoint - Absolute path of the entry file, if it is known
39
+ * @returns The cause, or undefined if the error is about something else
40
+ */
41
+ export function getNotBuiltCause(error, entryPoint) {
42
+ if (typeof error !== 'object' || error === null) {
43
+ return undefined;
44
+ }
45
+ const { code, message } = error;
46
+ if (code === 'ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING') {
47
+ return 'typescript-in-node-modules';
48
+ }
49
+ if (code === 'ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX') {
50
+ return 'typescript-unsupported';
51
+ }
52
+ if (typeof code !== 'string' || typeof message !== 'string') {
53
+ return undefined;
54
+ }
55
+ if (code === 'ERR_UNKNOWN_FILE_EXTENSION') {
56
+ if (!UNKNOWN_TYPESCRIPT.test(message)) {
57
+ return undefined;
58
+ }
59
+ return message.includes('node_modules') ? 'typescript-in-node-modules' : 'typescript';
60
+ }
61
+ if (!NOT_FOUND_CODES.has(code)) {
62
+ return undefined;
63
+ }
64
+ const [, missing, importer = ''] = MISSING_TARGET.exec(message) ?? [];
65
+ if (missing === undefined || !ABSOLUTE_PATH.test(missing)) {
66
+ return undefined;
67
+ }
68
+ if (TYPESCRIPT_FILE.test(importer)) {
69
+ return 'typescript-unsupported';
70
+ }
71
+ return entryPoint === undefined || missing === entryPoint ? 'missing-file' : undefined;
72
+ }
73
+ //# sourceMappingURL=module-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-errors.js","sourceRoot":"","sources":["../../../src/module-errors.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAAC,CAAA;AAE7E,6EAA6E;AAC7E,MAAM,kBAAkB,GAAG,oCAAoC,CAAA;AAE/D;;;GAGG;AACH,MAAM,cAAc,GAAG,sEAAsE,CAAA;AAC7F,MAAM,aAAa,GAAG,sBAAsB,CAAA;AAC5C,MAAM,eAAe,GAAG,cAAc,CAAA;AAEtC;;;;;;GAMG;AACH,MAAM,UAAU,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;AAaD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,UAAmB;IAClE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAA8C,CAAA;IACxE,IAAI,IAAI,KAAK,6CAA6C,EAAE,CAAC;QAC3D,OAAO,4BAA4B,CAAA;IACrC,CAAC;IACD,IAAI,IAAI,KAAK,mCAAmC,EAAE,CAAC;QACjD,OAAO,wBAAwB,CAAA;IACjC,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,IAAI,KAAK,4BAA4B,EAAE,CAAC;QAC1C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,OAAO,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,YAAY,CAAA;IACvF,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;IACrE,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,wBAAwB,CAAA;IACjC,CAAC;IACD,OAAO,UAAU,KAAK,SAAS,IAAI,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAA;AACxF,CAAC"}