@trustify-da/trustify-da-javascript-client 0.3.0-ea.e645720 → 0.3.0-ea.ec6824b

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 (42) hide show
  1. package/dist/package.json +19 -19
  2. package/dist/src/analysis.d.ts +7 -7
  3. package/dist/src/cyclone_dx_sbom.js +11 -3
  4. package/dist/src/index.d.ts +9 -9
  5. package/dist/src/index.js +5 -2
  6. package/dist/src/license/index.d.ts +3 -3
  7. package/dist/src/license/index.js +4 -1
  8. package/dist/src/license/license_utils.js +4 -1
  9. package/dist/src/license/licenses_api.d.ts +2 -2
  10. package/dist/src/oci_image/images.d.ts +1 -1
  11. package/dist/src/oci_image/utils.d.ts +5 -5
  12. package/dist/src/provider.d.ts +4 -3
  13. package/dist/src/provider.js +3 -1
  14. package/dist/src/providers/base_java.d.ts +14 -3
  15. package/dist/src/providers/base_java.js +16 -6
  16. package/dist/src/providers/base_javascript.d.ts +20 -9
  17. package/dist/src/providers/base_javascript.js +10 -3
  18. package/dist/src/providers/base_pyproject.d.ts +10 -5
  19. package/dist/src/providers/base_pyproject.js +7 -0
  20. package/dist/src/providers/golang_gomodules.d.ts +2 -1
  21. package/dist/src/providers/golang_gomodules.js +1 -1
  22. package/dist/src/providers/java_gradle_groovy.d.ts +1 -1
  23. package/dist/src/providers/java_gradle_kotlin.d.ts +1 -1
  24. package/dist/src/providers/java_maven.d.ts +2 -2
  25. package/dist/src/providers/java_maven.js +72 -0
  26. package/dist/src/providers/javascript_bun.d.ts +10 -0
  27. package/dist/src/providers/javascript_bun.js +100 -0
  28. package/dist/src/providers/javascript_npm.d.ts +6 -1
  29. package/dist/src/providers/processors/yarn_berry_processor.d.ts +2 -2
  30. package/dist/src/providers/processors/yarn_classic_processor.d.ts +2 -2
  31. package/dist/src/providers/python_controller.js +57 -3
  32. package/dist/src/providers/python_pip.d.ts +1 -0
  33. package/dist/src/providers/python_pip.js +1 -1
  34. package/dist/src/providers/python_pip_pyproject.js +3 -1
  35. package/dist/src/providers/python_poetry.d.ts +31 -8
  36. package/dist/src/providers/python_poetry.js +62 -14
  37. package/dist/src/providers/python_uv.d.ts +5 -14
  38. package/dist/src/providers/python_uv.js +44 -2
  39. package/dist/src/providers/rust_cargo.d.ts +6 -2
  40. package/dist/src/providers/rust_cargo.js +31 -4
  41. package/dist/src/tools.d.ts +2 -2
  42. package/package.json +20 -20
@@ -32,6 +32,17 @@ export default class Python_poetry extends Base_pyproject {
32
32
  _cmdName() {
33
33
  return 'poetry';
34
34
  }
35
+ _verifyPoetryAccessible(poetryBin) {
36
+ try {
37
+ invokeCommand(poetryBin, ['--version']);
38
+ }
39
+ catch (error) {
40
+ if (error.code === 'ENOENT') {
41
+ throw new Error(`poetry is not accessible at "${poetryBin}"`, { cause: error });
42
+ }
43
+ throw new Error('failed to check for poetry binary', { cause: error });
44
+ }
45
+ }
35
46
  /**
36
47
  * @param {string} manifestDir
37
48
  * @param {string} _workspaceDir - unused (poetry has no workspace support)
@@ -41,9 +52,15 @@ export default class Python_poetry extends Base_pyproject {
41
52
  */
42
53
  // eslint-disable-next-line no-unused-vars
43
54
  async _getDependencyData(manifestDir, _workspaceDir, parsed, opts) {
55
+ let poetryBin = getCustomPath('poetry', opts);
56
+ let envBypass = environmentVariableIsPopulated('TRUSTIFY_DA_POETRY_SHOW_TREE')
57
+ && environmentVariableIsPopulated('TRUSTIFY_DA_POETRY_SHOW_ALL');
58
+ if (!envBypass) {
59
+ this._verifyPoetryAccessible(poetryBin);
60
+ }
44
61
  let hasDevGroup = !!(parsed.tool?.poetry?.group?.dev || parsed.tool?.poetry?.['dev-dependencies']);
45
- let treeOutput = this._getPoetryShowTreeOutput(manifestDir, hasDevGroup, opts);
46
- let showAllOutput = this._getPoetryShowAllOutput(manifestDir, opts);
62
+ let treeOutput = this._getPoetryShowTreeOutput(manifestDir, hasDevGroup, poetryBin);
63
+ let showAllOutput = this._getPoetryShowAllOutput(manifestDir, poetryBin);
47
64
  let versionMap = this._parsePoetryShowAll(showAllOutput);
48
65
  let lockDir = this._findLockFileDir(manifestDir, opts);
49
66
  let markerData = this._extractMarkerData(lockDir, parsed);
@@ -53,14 +70,13 @@ export default class Python_poetry extends Base_pyproject {
53
70
  * Get poetry show --tree output.
54
71
  * @param {string} manifestDir
55
72
  * @param {boolean} hasDevGroup
56
- * @param {Object} opts
73
+ * @param {string} poetryBin
57
74
  * @returns {string}
58
75
  */
59
- _getPoetryShowTreeOutput(manifestDir, hasDevGroup, opts) {
76
+ _getPoetryShowTreeOutput(manifestDir, hasDevGroup, poetryBin) {
60
77
  if (environmentVariableIsPopulated('TRUSTIFY_DA_POETRY_SHOW_TREE')) {
61
78
  return Buffer.from(process.env['TRUSTIFY_DA_POETRY_SHOW_TREE'], 'base64').toString('utf-8');
62
79
  }
63
- let poetryBin = getCustomPath('poetry', opts);
64
80
  let args = ['show', '--tree', '--no-ansi'];
65
81
  if (hasDevGroup) {
66
82
  args.push('--without', 'dev');
@@ -70,14 +86,13 @@ export default class Python_poetry extends Base_pyproject {
70
86
  /**
71
87
  * Get poetry show --all output (flat list with resolved versions).
72
88
  * @param {string} manifestDir
73
- * @param {Object} opts
89
+ * @param {string} poetryBin
74
90
  * @returns {string}
75
91
  */
76
- _getPoetryShowAllOutput(manifestDir, opts) {
92
+ _getPoetryShowAllOutput(manifestDir, poetryBin) {
77
93
  if (environmentVariableIsPopulated('TRUSTIFY_DA_POETRY_SHOW_ALL')) {
78
94
  return Buffer.from(process.env['TRUSTIFY_DA_POETRY_SHOW_ALL'], 'base64').toString('utf-8');
79
95
  }
80
- let poetryBin = getCustomPath('poetry', opts);
81
96
  return invokeCommand(poetryBin, ['show', '--no-ansi', '--all'], { cwd: manifestDir }).toString();
82
97
  }
83
98
  /**
@@ -111,11 +126,12 @@ export default class Python_poetry extends Base_pyproject {
111
126
  * → transitiveMarkers['click']['colorama'] = "sys_platform == 'win32'"
112
127
  * @param {string|null} lockDir
113
128
  * @param {object} parsed - parsed pyproject.toml
114
- * @returns {{directMarkers: Map<string, string>, transitiveMarkers: Map<string, Map<string, string>>}}
129
+ * @returns {{directMarkers: Map<string, string>, transitiveMarkers: Map<string, Map<string, string>>, hashMap: Map<string, Array<{alg: string, content: string}>>}}
115
130
  */
116
131
  _extractMarkerData(lockDir, parsed) {
117
132
  let directMarkers = new Map();
118
133
  let transitiveMarkers = new Map();
134
+ let hashMap = new Map();
119
135
  // Extract markers from PEP 621 dependency strings: "name[extras]>=ver ; marker"
120
136
  let deps = parsed.project?.dependencies || [];
121
137
  for (let dep of deps) {
@@ -142,18 +158,40 @@ export default class Python_poetry extends Base_pyproject {
142
158
  transitiveMarkers.get(pkgKey).set(this._canonicalize(depName), markers);
143
159
  }
144
160
  }
161
+ let sha256Hex = this._extractSha256FromFiles(pkg.files);
162
+ if (sha256Hex) {
163
+ hashMap.set(pkgKey, [{ alg: "SHA-256", content: sha256Hex }]);
164
+ }
145
165
  }
146
166
  }
147
167
  }
148
- return { directMarkers, transitiveMarkers };
168
+ return { directMarkers, transitiveMarkers, hashMap };
169
+ }
170
+ /**
171
+ * Extract a SHA-256 hex digest from poetry.lock files array.
172
+ * Prefers the sdist (.tar.gz) hash; falls back to the first wheel hash.
173
+ * @param {Array<{file: string, hash: string}>} [files]
174
+ * @returns {string|null}
175
+ */
176
+ _extractSha256FromFiles(files) {
177
+ if (!Array.isArray(files) || files.length === 0) {
178
+ return null;
179
+ }
180
+ let sdist = files.find(f => f.file.endsWith('.tar.gz'));
181
+ let entry = sdist || files[0];
182
+ let hash = entry.hash;
183
+ if (hash && hash.startsWith('sha256:')) {
184
+ return hash.slice(7);
185
+ }
186
+ return null;
149
187
  }
150
188
  /**
151
189
  * Parse poetry show --tree output into a dependency graph structure.
152
190
  *
153
191
  * @param {string} treeOutput
154
192
  * @param {Map<string, string>} versionMap - canonical name -> resolved version
155
- * @param {{directMarkers: Map<string, string>, transitiveMarkers: Map<string, Map<string, string>>}} markerData
156
- * @returns {{directDeps: string[], graph: Map<string, {name: string, version: string, children: string[]}>}}
193
+ * @param {{directMarkers: Map<string, string>, transitiveMarkers: Map<string, Map<string, string>>, hashMap: Map<string, Array<{alg: string, content: string}>>}} markerData
194
+ * @returns {{directDeps: string[], graph: Map<string, {name: string, version: string, children: string[], hashes?: Array<{alg: string, content: string}>}>}}
157
195
  */
158
196
  _parsePoetryTree(treeOutput, versionMap, markerData) {
159
197
  let lines = treeOutput.split(/\r?\n/);
@@ -179,7 +217,12 @@ export default class Python_poetry extends Base_pyproject {
179
217
  }
180
218
  directDeps.push(key);
181
219
  if (!graph.has(key)) {
182
- graph.set(key, { name, version, children: [] });
220
+ let entry = { name, version, children: [] };
221
+ let hashes = markerData.hashMap.get(key);
222
+ if (hashes) {
223
+ entry.hashes = hashes;
224
+ }
225
+ graph.set(key, entry);
183
226
  }
184
227
  currentDirectDep = key;
185
228
  stack = [{ key, depth: -1 }];
@@ -223,7 +266,12 @@ export default class Python_poetry extends Base_pyproject {
223
266
  throw new Error(`poetry: package '${depName}' has no resolved version`);
224
267
  }
225
268
  if (!graph.has(depKey)) {
226
- graph.set(depKey, { name: depName, version, children: [] });
269
+ let entry = { name: depName, version, children: [] };
270
+ let hashes = markerData.hashMap.get(depKey);
271
+ if (hashes) {
272
+ entry.hashes = hashes;
273
+ }
274
+ graph.set(depKey, entry);
227
275
  }
228
276
  if (parentKey) {
229
277
  let parentEntry = graph.get(parentKey);
@@ -13,27 +13,18 @@ export function discoverUvWorkspaceMembers(workspaceRoot: string, opts?: {
13
13
  }): Promise<string[]>;
14
14
  export default class Python_uv extends Base_pyproject {
15
15
  /**
16
- * @param {string} manifestDir - directory containing the target pyproject.toml
17
- * @param {string} workspaceDir - workspace root (for resolving editable install paths)
18
- * @param {object} parsed - parsed pyproject.toml
19
- * @param {Object} opts
20
- * @returns {Promise<{directDeps: string[], graph: Map<string, {name: string, version: string, children: string[]}>}>}
16
+ * Parse uv.lock and attach SHA-256 hashes to graph entries.
17
+ * @param {string} lockFilePath - path to uv.lock
18
+ * @param {Map<string, import('./base_pyproject.js').GraphEntry>} graph
21
19
  */
22
- _getDependencyData(manifestDir: string, workspaceDir: string, parsed: object, opts: any): Promise<{
23
- directDeps: string[];
24
- graph: Map<string, {
25
- name: string;
26
- version: string;
27
- children: string[];
28
- }>;
29
- }>;
20
+ _attachHashesFromLockFile(lockFilePath: string, graph: Map<string, import("./base_pyproject.js").GraphEntry>): Promise<void>;
30
21
  /**
31
22
  * Get the uv export output, either from env var or by running the command.
32
23
  * @param {string} manifestDir
33
24
  * @param {Object} opts
34
25
  * @returns {string}
35
26
  */
36
- _getUvExportOutput(manifestDir: string, opts: any): string;
27
+ _getUvExportOutput(manifestDir: string, opts: Object): string;
37
28
  /**
38
29
  * Parse uv export output into a dependency graph using tree-sitter-requirements
39
30
  * for package/version extraction and string parsing for "# via" comments.
@@ -21,12 +21,54 @@ export default class Python_uv extends Base_pyproject {
21
21
  * @param {string} workspaceDir - workspace root (for resolving editable install paths)
22
22
  * @param {object} parsed - parsed pyproject.toml
23
23
  * @param {Object} opts
24
- * @returns {Promise<{directDeps: string[], graph: Map<string, {name: string, version: string, children: string[]}>}>}
24
+ * @returns {Promise<{directDeps: string[], graph: Map<string, import('./base_pyproject.js').GraphEntry>}>}
25
25
  */
26
26
  async _getDependencyData(manifestDir, workspaceDir, parsed, opts) {
27
27
  let projectName = this._getProjectName(parsed);
28
28
  let uvOutput = this._getUvExportOutput(manifestDir, opts);
29
- return this._parseUvExport(uvOutput, projectName, workspaceDir);
29
+ let { directDeps, graph } = await this._parseUvExport(uvOutput, projectName, workspaceDir);
30
+ await this._attachHashesFromLockFile(path.join(workspaceDir, 'uv.lock'), graph);
31
+ return { directDeps, graph };
32
+ }
33
+ /**
34
+ * Parse uv.lock and attach SHA-256 hashes to graph entries.
35
+ * @param {string} lockFilePath - path to uv.lock
36
+ * @param {Map<string, import('./base_pyproject.js').GraphEntry>} graph
37
+ */
38
+ async _attachHashesFromLockFile(lockFilePath, graph) {
39
+ let lockContent;
40
+ try {
41
+ lockContent = await fs.promises.readFile(lockFilePath, 'utf-8');
42
+ }
43
+ catch {
44
+ return;
45
+ }
46
+ let parsed;
47
+ try {
48
+ parsed = parseToml(lockContent);
49
+ }
50
+ catch {
51
+ return;
52
+ }
53
+ let packages = parsed.package;
54
+ if (!Array.isArray(packages)) {
55
+ return;
56
+ }
57
+ for (let pkg of packages) {
58
+ if (!pkg.name) {
59
+ continue;
60
+ }
61
+ let hashStr = pkg.sdist?.hash || pkg.wheels?.[0]?.hash;
62
+ if (!hashStr || !hashStr.startsWith('sha256:')) {
63
+ continue;
64
+ }
65
+ let key = this._canonicalize(pkg.name);
66
+ let entry = graph.get(key);
67
+ if (!entry || entry.hashes) {
68
+ continue;
69
+ }
70
+ entry.hashes = [{ alg: "SHA-256", content: hashStr.slice(7) }];
71
+ }
30
72
  }
31
73
  /**
32
74
  * Get the uv export output, either from env var or by running the command.
@@ -4,9 +4,10 @@ declare namespace _default {
4
4
  export { provideComponent };
5
5
  export { provideStack };
6
6
  export { readLicenseFromManifest };
7
+ export function packageManagerName(): string;
7
8
  }
8
9
  export default _default;
9
- export type Provided = import("../provider").Provided;
10
+ export type Provided = any;
10
11
  /**
11
12
  * @param {string} manifestName - the subject manifest name-type
12
13
  * @returns {boolean} - return true if `Cargo.toml` is the manifest name-type
@@ -46,7 +47,10 @@ declare function provideStack(manifest: string, opts?: {}): Provided;
46
47
  * Read project license from Cargo.toml, with fallback to LICENSE file.
47
48
  * Supports the `license` field under `[package]` (single crate / workspace
48
49
  * with root) and under `[workspace.package]` (virtual workspaces).
50
+ * When a member crate uses `license = { workspace = true }`, the actual
51
+ * license is resolved from the workspace root Cargo.toml.
49
52
  * @param {string} manifestPath - path to Cargo.toml
53
+ * @param {object} [metadata] - cargo metadata output (needed for workspace license resolution)
50
54
  * @returns {string|null} SPDX identifier or null
51
55
  */
52
- declare function readLicenseFromManifest(manifestPath: string): string | null;
56
+ declare function readLicenseFromManifest(manifestPath: string, metadata?: object): string | null;
@@ -5,7 +5,7 @@ import { parse as parseToml } from 'smol-toml';
5
5
  import { getLicense } from '../license/license_utils.js';
6
6
  import Sbom from '../sbom.js';
7
7
  import { getCustom, getCustomPath, invokeCommand } from '../tools.js';
8
- export default { isSupported, validateLockFile, provideComponent, provideStack, readLicenseFromManifest };
8
+ export default { isSupported, validateLockFile, provideComponent, provideStack, readLicenseFromManifest, packageManagerName() { return 'cargo'; } };
9
9
  /** @typedef {import('../provider').Provider} */
10
10
  /** @typedef {import('../provider').Provided} Provided */
11
11
  /**
@@ -71,15 +71,22 @@ function isSupported(manifestName) {
71
71
  * Read project license from Cargo.toml, with fallback to LICENSE file.
72
72
  * Supports the `license` field under `[package]` (single crate / workspace
73
73
  * with root) and under `[workspace.package]` (virtual workspaces).
74
+ * When a member crate uses `license = { workspace = true }`, the actual
75
+ * license is resolved from the workspace root Cargo.toml.
74
76
  * @param {string} manifestPath - path to Cargo.toml
77
+ * @param {object} [metadata] - cargo metadata output (needed for workspace license resolution)
75
78
  * @returns {string|null} SPDX identifier or null
76
79
  */
77
- function readLicenseFromManifest(manifestPath) {
80
+ function readLicenseFromManifest(manifestPath, metadata) {
78
81
  let fromManifest = null;
79
82
  try {
80
83
  let content = fs.readFileSync(manifestPath, 'utf-8');
81
84
  let parsed = parseToml(content);
82
- fromManifest = parsed.package?.license
85
+ let packageLicense = parsed.package?.license;
86
+ if (typeof packageLicense === 'object' && packageLicense?.workspace === true) {
87
+ packageLicense = resolveWorkspaceLicense(parsed, metadata);
88
+ }
89
+ fromManifest = packageLicense
83
90
  || parsed.workspace?.package?.license
84
91
  || null;
85
92
  }
@@ -88,6 +95,26 @@ function readLicenseFromManifest(manifestPath) {
88
95
  }
89
96
  return getLicense(fromManifest, manifestPath);
90
97
  }
98
+ /**
99
+ * Resolve a workspace-inherited license from the workspace root Cargo.toml.
100
+ * @param {object} parsed - the parsed member crate Cargo.toml
101
+ * @param {object} [metadata] - cargo metadata output with workspace_root
102
+ * @returns {string|null} resolved license string or null
103
+ */
104
+ function resolveWorkspaceLicense(parsed, metadata) {
105
+ if (metadata?.workspace_root) {
106
+ let cargoTomlPath = path.join(metadata.workspace_root, 'Cargo.toml');
107
+ try {
108
+ let content = fs.readFileSync(cargoTomlPath, 'utf-8');
109
+ let workspaceParsed = parseToml(content);
110
+ return workspaceParsed.workspace?.package?.license || null;
111
+ }
112
+ catch (_) {
113
+ // fall through
114
+ }
115
+ }
116
+ return parsed.workspace?.package?.license || null;
117
+ }
91
118
  /**
92
119
  * Validates that Cargo.lock exists in the manifest directory or in a parent
93
120
  * workspace root directory. In Cargo workspaces the lock file always lives at
@@ -173,7 +200,7 @@ function getSBOM(manifest, opts = {}, includeTransitive) {
173
200
  let metadata = executeCargoMetadata(cargoBin, manifestDir);
174
201
  let ignoredDeps = getIgnoredDeps(manifest, metadata);
175
202
  let crateType = detectCrateType(metadata);
176
- let license = readLicenseFromManifest(manifest);
203
+ let license = readLicenseFromManifest(manifest, metadata);
177
204
  let sbom;
178
205
  if (crateType === CrateType.WORKSPACE_VIRTUAL) {
179
206
  sbom = handleVirtualWorkspace(manifest, metadata, ignoredDeps, includeTransitive, opts, license);
@@ -100,13 +100,13 @@ export function invokeCommand(bin: string, args: Array<string>, opts?: import("c
100
100
  * @param {import("index.js").Options} opts - The trustify DA options that may contain proxy configuration
101
101
  * @returns {RequestInit} The fetch options with proxy agent if applicable
102
102
  */
103
- export function addProxyAgent(options: RequestInit, opts: import("index.js").Options): RequestInit;
103
+ export function addProxyAgent(options: RequestInit, opts: any): RequestInit;
104
104
  /**
105
105
  * Utility function for fetching vendor tokens
106
106
  * @param {import("index.js").Options} [opts={}] - optional various options to pass along the application
107
107
  * @returns {{}}
108
108
  */
109
- export function getTokenHeaders(opts?: import("index.js").Options): {};
109
+ export function getTokenHeaders(opts?: any): {};
110
110
  export const RegexNotToBeLogged: RegExp;
111
111
  export const TRUSTIFY_DA_TOKEN_HEADER: "trust-da-token";
112
112
  export const TRUSTIFY_DA_TELEMETRY_ID_HEADER: "telemetry-anonymous-id";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trustify-da/trustify-da-javascript-client",
3
- "version": "0.3.0-ea.e645720",
3
+ "version": "0.3.0-ea.ec6824b",
4
4
  "description": "Code-Ready Dependency Analytics JavaScript API.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/guacsec/trustify-da-javascript-client#README.md",
@@ -35,8 +35,8 @@
35
35
  "config/**/*"
36
36
  ],
37
37
  "scripts": {
38
- "lint": "eslint src test --ext js",
39
- "lint:fix": "eslint src test --ext js --fix",
38
+ "lint": "eslint src test",
39
+ "lint:fix": "eslint src test --fix",
40
40
  "test": "c8 npm run tests",
41
41
  "tests": "mocha --config .mocharc.json",
42
42
  "tests:rep": "mocha --reporter-option maxDiffSize=0 --reporter json > unit-tests-result.json",
@@ -48,16 +48,17 @@
48
48
  },
49
49
  "dependencies": {
50
50
  "@babel/core": "^7.23.2",
51
- "@cyclonedx/cyclonedx-library": "^6.13.0",
51
+ "@cyclonedx/cyclonedx-library": "^10.0.0",
52
52
  "eslint-import-resolver-typescript": "^4.4.4",
53
53
  "fast-glob": "^3.3.3",
54
54
  "fast-xml-parser": "^5.3.4",
55
55
  "help": "^3.0.2",
56
- "https-proxy-agent": "^7.0.6",
56
+ "https-proxy-agent": "^9.0.0",
57
57
  "js-yaml": "^4.1.1",
58
+ "jsonc-parser": "^3.3.1",
58
59
  "micromatch": "^4.0.8",
59
60
  "node-fetch": "^3.3.2",
60
- "p-limit": "^4.0.0",
61
+ "p-limit": "^7.3.0",
61
62
  "packageurl-js": "~1.0.2",
62
63
  "smol-toml": "^1.6.0",
63
64
  "tree-sitter-gomod": "github:strum355/tree-sitter-go-mod#56326f2ad478892ace58ff247a97d492a3cbcdda",
@@ -67,23 +68,24 @@
67
68
  },
68
69
  "devDependencies": {
69
70
  "@babel/core": "^7.23.2",
70
- "@trustify-da/trustify-da-api-model": "^2.0.7",
71
- "@types/node": "^20.17.30",
71
+ "@trustify-da/trustify-da-api-model": "^2.0.8",
72
+ "@types/node": "^25.9.1",
72
73
  "@types/which": "^3.0.4",
73
74
  "babel-plugin-rewire": "^1.2.0",
74
75
  "c8": "^11.0.0",
75
- "chai": "^4.3.7",
76
- "eslint": "^8.42.0",
76
+ "chai": "^6.2.2",
77
+ "@eslint/js": "^10.0.0",
78
+ "eslint": "^10.4.1",
77
79
  "eslint-import-resolver-typescript": "^4.4.4",
78
- "eslint-plugin-editorconfig": "^4.0.3",
79
- "eslint-plugin-import": "^2.29.1",
80
+ "eslint-plugin-import-x": "^4.16.2",
81
+ "globals": "^17.6.0",
80
82
  "esmock": "^2.6.2",
81
- "mocha": "^10.2.0",
83
+ "mocha": "^11.7.6",
82
84
  "msw": "^2.12.7",
83
- "sinon": "^15.1.2",
84
- "sinon-chai": "^3.7.0",
85
- "typescript": "^5.1.3",
86
- "which": "^5.0.0"
85
+ "sinon": "^22.0.0",
86
+ "sinon-chai": "^4.0.1",
87
+ "typescript": "^6.0.3",
88
+ "which": "^7.0.0"
87
89
  },
88
90
  "mocha": {
89
91
  "check-leaks": false,
@@ -111,12 +113,10 @@
111
113
  "reporter": [
112
114
  "html",
113
115
  "json",
116
+ "lcov",
114
117
  "text"
115
118
  ]
116
119
  },
117
- "eslintIgnore": [
118
- "index.js"
119
- ],
120
120
  "resolutions": {
121
121
  "@hapi/joi": "17.1.1"
122
122
  }