@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
package/dist/package.json CHANGED
@@ -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
  }
@@ -16,7 +16,7 @@ export default _default;
16
16
  * @param {import("index.js").Options} [opts={}] - optional various options to pass along the application
17
17
  * @returns {Promise<import('@trustify-da/trustify-da-api-model/model/v5/AnalysisReport').AnalysisReport>}
18
18
  */
19
- declare function requestComponent(provider: import("./provider").Provider, manifest: string, url: string, opts?: import("index.js").Options): Promise<import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport>;
19
+ declare function requestComponent(provider: any, manifest: string, url: string, opts?: any): Promise<any>;
20
20
  /**
21
21
  * Send a stack analysis request and get the report as 'text/html' or 'application/json'.
22
22
  * @param {import('./provider').Provider} provider - the provided data for constructing the request
@@ -26,7 +26,7 @@ declare function requestComponent(provider: import("./provider").Provider, manif
26
26
  * @param {import("index.js").Options} [opts={}] - optional various options to pass along the application
27
27
  * @returns {Promise<string|import('@trustify-da/trustify-da-api-model/model/v5/AnalysisReport').AnalysisReport>}
28
28
  */
29
- declare function requestStack(provider: import("./provider").Provider, manifest: string, url: string, html?: boolean, opts?: import("index.js").Options): Promise<string | import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport>;
29
+ declare function requestStack(provider: any, manifest: string, url: string, html?: boolean, opts?: any): Promise<string | any>;
30
30
  /**
31
31
  * Send a batch stack analysis request for multiple manifests (SBOMs keyed by purl).
32
32
  * @param {Object.<string, object>} sbomByPurl - Map of root purl to CycloneDX SBOM object
@@ -36,9 +36,9 @@ declare function requestStack(provider: import("./provider").Provider, manifest:
36
36
  * @returns {Promise<string|Object.<string, import('@trustify-da/trustify-da-api-model/model/v5/AnalysisReport').AnalysisReport>>}
37
37
  */
38
38
  declare function requestStackBatch(sbomByPurl: {
39
+ [x: string]: object;
40
+ }, url: string, html?: boolean, opts?: any): Promise<string | {
39
41
  [x: string]: any;
40
- }, url: string, html?: boolean, opts?: import("index.js").Options): Promise<string | {
41
- [x: string]: import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport;
42
42
  }>;
43
43
  /**
44
44
  *
@@ -47,8 +47,8 @@ declare function requestStackBatch(sbomByPurl: {
47
47
  * @param {import("index.js").Options} [opts={}] - optional various options to pass along the application
48
48
  * @returns {Promise<string|Object.<string, import('@trustify-da/trustify-da-api-model/model/v5/AnalysisReport').AnalysisReport>>}
49
49
  */
50
- declare function requestImages(imageRefs: Array<string>, url: string, html?: boolean, opts?: import("index.js").Options): Promise<string | {
51
- [x: string]: import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport;
50
+ declare function requestImages(imageRefs: Array<string>, url: string, html?: boolean, opts?: any): Promise<string | {
51
+ [x: string]: any;
52
52
  }>;
53
53
  /**
54
54
  *
@@ -56,4 +56,4 @@ declare function requestImages(imageRefs: Array<string>, url: string, html?: boo
56
56
  * @param {import("index.js").Options} [opts={}] - optional various options to pass headers for t he validateToken Request
57
57
  * @return {Promise<number>} return the HTTP status Code of the response from the validate token request.
58
58
  */
59
- declare function validateToken(url: any, opts?: import("index.js").Options): Promise<number>;
59
+ declare function validateToken(url: any, opts?: any): Promise<number>;
@@ -41,12 +41,20 @@ function getComponent(component, type, scope, licenses, hashes) {
41
41
  // Add licenses if provided (CycloneDX format). Callers must provide valid SPDX identifiers.
42
42
  if (licenses) {
43
43
  const licenseArray = Array.isArray(licenses) ? licenses : [licenses];
44
- componentObject.licenses = licenseArray.map(lic => {
44
+ const validLicenses = licenseArray
45
+ .map(lic => {
45
46
  if (typeof lic === 'string') {
46
47
  return { license: { id: lic } };
47
48
  }
48
- return lic;
49
- });
49
+ if (typeof lic === 'object' && lic !== null && ('license' in lic || 'expression' in lic)) {
50
+ return lic;
51
+ }
52
+ return null;
53
+ })
54
+ .filter(Boolean);
55
+ if (validLicenses.length > 0) {
56
+ componentObject.licenses = validLicenses;
57
+ }
50
58
  }
51
59
  // Add hashes if provided (CycloneDX 1.4 format).
52
60
  if (hashes && hashes.length > 0) {
@@ -106,7 +106,7 @@ export type SbomResult = {
106
106
  * @returns {Promise<import('@trustify-da/trustify-da-api-model/model/v5/AnalysisReport').AnalysisReport>}
107
107
  * @throws {Error} if no matching provider, failed to get create content, or backend request failed
108
108
  */
109
- declare function componentAnalysis(manifest: string, opts?: Options): Promise<import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport>;
109
+ declare function componentAnalysis(manifest: string, opts?: Options): Promise<any>;
110
110
  /**
111
111
  * @overload
112
112
  * @param {string} manifest
@@ -124,7 +124,7 @@ declare function stackAnalysis(manifest: string, html: true, opts?: Options | un
124
124
  * @returns {Promise<import('@trustify-da/trustify-da-api-model/model/v5/AnalysisReport').AnalysisReport>}
125
125
  * @throws {Error}
126
126
  */
127
- declare function stackAnalysis(manifest: string, html: false, opts?: Options | undefined): Promise<import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport>;
127
+ declare function stackAnalysis(manifest: string, html: false, opts?: Options | undefined): Promise<any>;
128
128
  /**
129
129
  * Get stack analysis report for a manifest file.
130
130
  * @overload
@@ -135,7 +135,7 @@ declare function stackAnalysis(manifest: string, html: false, opts?: Options | u
135
135
  * @throws {Error} if manifest inaccessible, no matching provider, failed to get create content,
136
136
  * or backend request failed
137
137
  */
138
- declare function stackAnalysis(manifest: string, html?: boolean | undefined, opts?: Options | undefined): Promise<string | import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport>;
138
+ declare function stackAnalysis(manifest: string, html?: boolean | undefined, opts?: Options | undefined): Promise<string | any>;
139
139
  /**
140
140
  * @overload
141
141
  * @param {string} workspaceRoot
@@ -173,7 +173,7 @@ declare function stackAnalysisBatch(workspaceRoot: string, html: false, opts: Op
173
173
  batchMetadata: true;
174
174
  }): Promise<{
175
175
  analysis: {
176
- [x: string]: import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport;
176
+ [x: string]: any;
177
177
  };
178
178
  metadata: BatchAnalysisMetadata;
179
179
  }>;
@@ -188,7 +188,7 @@ declare function stackAnalysisBatch(workspaceRoot: string, html: false, opts: Op
188
188
  declare function stackAnalysisBatch(workspaceRoot: string, html: false, opts?: (Options & {
189
189
  batchMetadata?: false;
190
190
  }) | undefined): Promise<{
191
- [x: string]: import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport;
191
+ [x: string]: any;
192
192
  }>;
193
193
  /**
194
194
  * Get stack analysis for all workspace packages/crates (batch).
@@ -204,10 +204,10 @@ declare function stackAnalysisBatch(workspaceRoot: string, html: false, opts?: (
204
204
  * @throws {Error} if workspace root invalid, no manifests found, no packages pass validation, no SBOMs produced, or backend request failed. When `opts.batchMetadata` is set, `error.batchMetadata` may be set on thrown errors.
205
205
  */
206
206
  declare function stackAnalysisBatch(workspaceRoot: string, html?: boolean | undefined, opts?: Options | undefined): Promise<string | {
207
- [x: string]: import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport;
207
+ [x: string]: any;
208
208
  } | {
209
209
  analysis: string | {
210
- [x: string]: import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport;
210
+ [x: string]: any;
211
211
  };
212
212
  metadata: BatchAnalysisMetadata;
213
213
  }>;
@@ -229,7 +229,7 @@ declare function imageAnalysis(imageRefs: Array<string>, html: true, opts?: Opti
229
229
  * @throws {Error}
230
230
  */
231
231
  declare function imageAnalysis(imageRefs: Array<string>, html: false, opts?: Options | undefined): Promise<{
232
- [x: string]: import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport;
232
+ [x: string]: any;
233
233
  }>;
234
234
  /**
235
235
  * Get image analysis report for a set of OCI image references.
@@ -242,7 +242,7 @@ declare function imageAnalysis(imageRefs: Array<string>, html: false, opts?: Opt
242
242
  * or backend request failed
243
243
  */
244
244
  declare function imageAnalysis(imageRefs: Array<string>, html?: boolean | undefined, opts?: Options | undefined): Promise<string | {
245
- [x: string]: import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport;
245
+ [x: string]: any;
246
246
  }>;
247
247
  /**
248
248
  * Validates the Exhort token.
package/dist/src/index.js CHANGED
@@ -175,7 +175,9 @@ async function componentAnalysis(manifest, opts = {}) {
175
175
  fs.accessSync(manifest, fs.constants.R_OK);
176
176
  opts["manifest-type"] = path.basename(manifest);
177
177
  let provider = match(manifest, availableProviders, opts); // throws error if no matching provider
178
- return await analysis.requestComponent(provider, manifest, theUrl, opts); // throws error request sending failed
178
+ const result = await analysis.requestComponent(provider, manifest, theUrl, opts); // throws error request sending failed
179
+ result.packageManager = provider.packageManagerName();
180
+ return result;
179
181
  }
180
182
  /**
181
183
  * @overload
@@ -320,7 +322,8 @@ async function detectWorkspaceManifests(root, opts) {
320
322
  return { ecosystem: 'pyproject', manifestPaths };
321
323
  }
322
324
  }
323
- const hasJsLock = fs.existsSync(path.join(root, 'pnpm-lock.yaml'))
325
+ const hasJsLock = fs.existsSync(path.join(root, 'bun.lock'))
326
+ || fs.existsSync(path.join(root, 'pnpm-lock.yaml'))
324
327
  || fs.existsSync(path.join(root, 'yarn.lock'))
325
328
  || fs.existsSync(path.join(root, 'package-lock.json'));
326
329
  if (fs.existsSync(packageJson) && hasJsLock) {
@@ -9,10 +9,10 @@
9
9
  * @param {import('@trustify-da/trustify-da-api-model/model/v5/AnalysisReport').AnalysisReport} [analysisResult] - analysis result that includes licenses array from backend
10
10
  * @returns {Promise<{ projectLicense: { manifest: Object|null, file: Object|null, mismatch: boolean }, incompatibleDependencies: Array<{ purl: string, licenses: string[], category?: string, reason: string }>, error?: string }>}
11
11
  */
12
- export function runLicenseCheck(sbomContent: string, manifestPath: string, url: string, opts?: import("../index.js").Options, analysisResult?: import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport): Promise<{
12
+ export function runLicenseCheck(sbomContent: string, manifestPath: string, url: string, opts?: import("../index.js").Options, analysisResult?: any): Promise<{
13
13
  projectLicense: {
14
- manifest: any | null;
15
- file: any | null;
14
+ manifest: Object | null;
15
+ file: Object | null;
16
16
  mismatch: boolean;
17
17
  };
18
18
  incompatibleDependencies: Array<{
@@ -85,11 +85,14 @@ export async function runLicenseCheck(sbomContent, manifestPath, url, opts = {},
85
85
  continue;
86
86
  const status = getCompatibility(projectCategory, entry.category);
87
87
  if (status === 'incompatible') {
88
+ const reason = entry.category?.toUpperCase() === 'UNKNOWN'
89
+ ? 'License not recognized as a standard SPDX identifier. Manual review recommended to verify compatibility.'
90
+ : 'Dependency license(s) are incompatible with the project license.';
88
91
  incompatibleDependencies.push({
89
92
  purl,
90
93
  licenses: entry.licenses,
91
94
  category: entry.category,
92
- reason: 'Dependency license(s) are incompatible with the project license.'
95
+ reason
93
96
  });
94
97
  }
95
98
  }
@@ -114,9 +114,12 @@ export function getCompatibility(projectCategory, dependencyCategory) {
114
114
  }
115
115
  const proj = projectCategory.toUpperCase();
116
116
  const dep = dependencyCategory.toUpperCase();
117
- if (proj === 'UNKNOWN' || dep === 'UNKNOWN') {
117
+ if (proj === 'UNKNOWN') {
118
118
  return 'unknown';
119
119
  }
120
+ if (dep === 'UNKNOWN') {
121
+ return 'incompatible';
122
+ }
120
123
  const restrictiveness = {
121
124
  'PERMISSIVE': 1,
122
125
  'WEAK_COPYLEFT': 2,
@@ -6,7 +6,7 @@
6
6
  * @param {import('../index.js').Options} [opts={}] - options (proxy, token, TRUSTIFY_DA_BACKEND_URL, etc.)
7
7
  * @returns {Promise<Object|null>} License details or null if not found
8
8
  */
9
- export function getLicenseDetails(spdxId: string, opts?: import("../index.js").Options): Promise<any | null>;
9
+ export function getLicenseDetails(spdxId: string, opts?: import("../index.js").Options): Promise<Object | null>;
10
10
  /**
11
11
  * Normalize the LicensesResponse shape (array of LicenseProviderResult) into a map of purl -> license info.
12
12
  * Each provider result has { status, summary, packages } where packages is { [purl]: { concluded, evidence } }.
@@ -28,7 +28,7 @@ export function normalizeLicensesResponse(data: unknown, purls?: string[]): Map<
28
28
  * @param {string[]} [purls] - optional list of purls to restrict to
29
29
  * @returns {Map<string, { licenses: string[], category?: string }>}
30
30
  */
31
- export function licensesFromReport(analysisReport: import("@trustify-da/trustify-da-api-model/model/v5/AnalysisReport").AnalysisReport, purls?: string[]): Map<string, {
31
+ export function licensesFromReport(analysisReport: any, purls?: string[]): Map<string, {
32
32
  licenses: string[];
33
33
  category?: string;
34
34
  }>;
@@ -78,7 +78,7 @@ export class ImageRef {
78
78
  * @param {string} [platform]
79
79
  * @param {import("index.js").Options} [opts={}]
80
80
  */
81
- constructor(image: string, platform?: string, opts?: import("index.js").Options);
81
+ constructor(image: string, platform?: string, opts?: any);
82
82
  /** @type {Image} */
83
83
  image: Image;
84
84
  /** @type {Platform} */
@@ -4,7 +4,7 @@
4
4
  * @param {import("../index.js").Options} [opts={}] - optional various options to pass along the application
5
5
  * @returns {{}}
6
6
  */
7
- export function generateImageSBOM(imageRef: import("./images").ImageRef, opts?: import("../index.js").Options): {};
7
+ export function generateImageSBOM(imageRef: any, opts?: import("../index.js").Options): {};
8
8
  /**
9
9
  *
10
10
  * @param {string} image
@@ -25,7 +25,7 @@ export function getImagePlatform(opts?: import("../index.js").Options): Platform
25
25
  * @returns {Object.<string, string>} - The image digests
26
26
  * @throws {Error} If the image info is invalid
27
27
  */
28
- export function getImageDigests(imageRef: import("./images").ImageRef, opts?: import("../index.js").Options): {
28
+ export function getImageDigests(imageRef: any, opts?: import("../index.js").Options): {
29
29
  [x: string]: string;
30
30
  };
31
31
  export type SyftImageSource = {
@@ -34,9 +34,9 @@ export type SyftImageSource = {
34
34
  getVariant: () => string;
35
35
  };
36
36
  export type SyftImageSourceType = {
37
- getOs: (arg0: any) => string;
38
- getArch: (arg0: any) => string;
39
- getVariant: (arg0: any) => string;
37
+ getOs: (arg0: Object) => string;
38
+ getArch: (arg0: Object) => string;
39
+ getVariant: (arg0: Object) => string;
40
40
  };
41
41
  import { ImageRef } from './images.js';
42
42
  import { Platform } from './platform.js';
@@ -21,7 +21,7 @@ export function match(manifest: string, providers: [Provider], opts?: {
21
21
  TRUSTIFY_DA_WORKSPACE_DIR?: string;
22
22
  }): Provider;
23
23
  /** @typedef {{ecosystem: string, contentType: string, content: string}} Provided */
24
- /** @typedef {{isSupported: function(string): boolean, validateLockFile: function(string, Object): void, provideComponent: function(string, {}): Provided | Promise<Provided>, provideStack: function(string, {}): Provided | Promise<Provided>, readLicenseFromManifest: function(string): string | null}} Provider */
24
+ /** @typedef {{isSupported: function(string): boolean, validateLockFile: function(string, Object): void, provideComponent: function(string, {}): Provided | Promise<Provided>, provideStack: function(string, {}): Provided | Promise<Provided>, readLicenseFromManifest: function(string, Object=): string | null, packageManagerName: function(): string}} Provider */
25
25
  /**
26
26
  * MUST include all providers here.
27
27
  * @type {[Provider]}
@@ -34,8 +34,9 @@ export type Provided = {
34
34
  };
35
35
  export type Provider = {
36
36
  isSupported: (arg0: string) => boolean;
37
- validateLockFile: (arg0: string, arg1: any) => void;
37
+ validateLockFile: (arg0: string, arg1: Object) => void;
38
38
  provideComponent: (arg0: string, arg1: {}) => Provided | Promise<Provided>;
39
39
  provideStack: (arg0: string, arg1: {}) => Provided | Promise<Provided>;
40
- readLicenseFromManifest: (arg0: string) => string | null;
40
+ readLicenseFromManifest: (arg0: string, arg1: Object | undefined) => string | null;
41
+ packageManagerName: () => string;
41
42
  };
@@ -3,6 +3,7 @@ import golangGomodulesProvider from './providers/golang_gomodules.js';
3
3
  import Java_gradle_groovy from "./providers/java_gradle_groovy.js";
4
4
  import Java_gradle_kotlin from "./providers/java_gradle_kotlin.js";
5
5
  import Java_maven from "./providers/java_maven.js";
6
+ import Javascript_bun from './providers/javascript_bun.js';
6
7
  import Javascript_npm from './providers/javascript_npm.js';
7
8
  import Javascript_pnpm from './providers/javascript_pnpm.js';
8
9
  import Javascript_yarn from './providers/javascript_yarn.js';
@@ -12,7 +13,7 @@ import Python_poetry from './providers/python_poetry.js';
12
13
  import Python_uv from './providers/python_uv.js';
13
14
  import rustCargoProvider from './providers/rust_cargo.js';
14
15
  /** @typedef {{ecosystem: string, contentType: string, content: string}} Provided */
15
- /** @typedef {{isSupported: function(string): boolean, validateLockFile: function(string, Object): void, provideComponent: function(string, {}): Provided | Promise<Provided>, provideStack: function(string, {}): Provided | Promise<Provided>, readLicenseFromManifest: function(string): string | null}} Provider */
16
+ /** @typedef {{isSupported: function(string): boolean, validateLockFile: function(string, Object): void, provideComponent: function(string, {}): Provided | Promise<Provided>, provideStack: function(string, {}): Provided | Promise<Provided>, readLicenseFromManifest: function(string, Object=): string | null, packageManagerName: function(): string}} Provider */
16
17
  /**
17
18
  * MUST include all providers here.
18
19
  * @type {[Provider]}
@@ -21,6 +22,7 @@ export const availableProviders = [
21
22
  new Java_maven(),
22
23
  new Java_gradle_groovy(),
23
24
  new Java_gradle_kotlin(),
25
+ new Javascript_bun(),
24
26
  new Javascript_pnpm(),
25
27
  new Javascript_yarn(),
26
28
  new Javascript_npm(),
@@ -1,4 +1,4 @@
1
- export type ecosystem_maven = import("../provider").Provider;
1
+ export type ecosystem_maven = any;
2
2
  /** @typedef {import('../provider').Provider} */
3
3
  /** @typedef {import('../provider').Provided} Provided */
4
4
  /** @typedef {{name: string, version: string}} Package */
@@ -20,6 +20,11 @@ export default class Base_Java {
20
20
  CONFLICT_REGEX: RegExp;
21
21
  globalBinary: string;
22
22
  localWrapper: string;
23
+ /**
24
+ * Returns the package manager name (e.g. mvn, gradle)
25
+ * @returns {string}
26
+ */
27
+ packageManagerName(): string;
23
28
  /**
24
29
  * Recursively populates the SBOM instance with the parsed graph
25
30
  * @param {string} src - Source dependency to start the calculations from
@@ -28,6 +33,13 @@ export default class Base_Java {
28
33
  * @param {Sbom} sbom - The SBOM where the dependencies are being added
29
34
  */
30
35
  parseDependencyTree(src: string, srcDepth: number, lines: any[], sbom: Sbom): void;
36
+ /**
37
+ * Calculates how deep in the graph is the given line
38
+ * @param {string} line - line to calculate the depth from
39
+ * @returns {number} The calculated depth
40
+ * @protected
41
+ */
42
+ protected _getDepth(line: string): number;
31
43
  /**
32
44
  * Create a PackageURL from any line in a Text Graph dependency tree for a manifest path.
33
45
  * @param {string} line - line to parse from a dependencies.txt file
@@ -57,9 +69,8 @@ export default class Base_Java {
57
69
  * @returns string
58
70
  */
59
71
  selectToolBinary(manifestPath: string, opts: {}): string | null;
60
- #private;
61
72
  }
62
- export type Provided = import("../provider").Provided;
73
+ export type Provided = any;
63
74
  export type Package = {
64
75
  name: string;
65
76
  version: string;
@@ -25,6 +25,13 @@ export default class Base_Java {
25
25
  this.globalBinary = globalBinary;
26
26
  this.localWrapper = localWrapper;
27
27
  }
28
+ /**
29
+ * Returns the package manager name (e.g. mvn, gradle)
30
+ * @returns {string}
31
+ */
32
+ packageManagerName() {
33
+ return this.globalBinary;
34
+ }
28
35
  /**
29
36
  * Recursively populates the SBOM instance with the parsed graph
30
37
  * @param {string} src - Source dependency to start the calculations from
@@ -41,7 +48,7 @@ export default class Base_Java {
41
48
  }
42
49
  let index = 0;
43
50
  let target = lines[index];
44
- let targetDepth = this.#getDepth(target);
51
+ let targetDepth = this._getDepth(target);
45
52
  while (targetDepth > srcDepth && index < lines.length) {
46
53
  if (targetDepth === srcDepth + 1) {
47
54
  let from = this.parseDep(src);
@@ -54,22 +61,25 @@ export default class Base_Java {
54
61
  }
55
62
  }
56
63
  else {
57
- this.parseDependencyTree(lines[index - 1], this.#getDepth(lines[index - 1]), lines.slice(index), sbom);
64
+ this.parseDependencyTree(lines[index - 1], this._getDepth(lines[index - 1]), lines.slice(index), sbom);
58
65
  }
59
66
  target = lines[++index];
60
- targetDepth = this.#getDepth(target);
67
+ targetDepth = this._getDepth(target);
61
68
  }
62
69
  }
63
70
  /**
64
71
  * Calculates how deep in the graph is the given line
65
72
  * @param {string} line - line to calculate the depth from
66
73
  * @returns {number} The calculated depth
67
- * @private
74
+ * @protected
68
75
  */
69
- #getDepth(line) {
70
- if (line === undefined) {
76
+ _getDepth(line) {
77
+ if (!line || line.trim() === '') {
71
78
  return -1;
72
79
  }
80
+ if (line.match(/^\w/)) {
81
+ return 0;
82
+ }
73
83
  return ((line.indexOf('-') - 1) / 3) + 1;
74
84
  }
75
85
  /**
@@ -1,4 +1,4 @@
1
- export type purlType = import("../provider").Provider;
1
+ export type purlType = any;
2
2
  /** @typedef {import('../provider').Provider} */
3
3
  /** @typedef {import('../provider').Provided} Provided */
4
4
  /**
@@ -19,7 +19,7 @@ export default class Base_javascript {
19
19
  * @param {Object} opts - Configuration options for the provider
20
20
  * @protected
21
21
  */
22
- protected _setUp(manifestPath: string, opts: any): void;
22
+ protected _setUp(manifestPath: string, opts: Object): void;
23
23
  /**
24
24
  * Gets the current manifest object
25
25
  * @returns {Manifest} The manifest object
@@ -47,6 +47,11 @@ export default class Base_javascript {
47
47
  */
48
48
  protected _cmdName(): string;
49
49
  /**
50
+ * Returns the package manager name (e.g. npm, yarn, pnpm, bun)
51
+ * @returns {string} The package manager name
52
+ */
53
+ packageManagerName(): string;
54
+ /**
50
55
  * Returns the command arguments for listing dependencies
51
56
  * @returns {Array<string>} The command arguments
52
57
  * @abstract
@@ -86,21 +91,21 @@ export default class Base_javascript {
86
91
  * @param {Object} [opts={}] - optional; may contain TRUSTIFY_DA_WORKSPACE_DIR
87
92
  * @returns {boolean} True if the lock file exists
88
93
  */
89
- validateLockFile(manifestDir: string, opts?: any): boolean;
94
+ validateLockFile(manifestDir: string, opts?: Object): boolean;
90
95
  /**
91
96
  * Provides content and content type for stack analysis
92
97
  * @param {string} manifestPath - The manifest path or name
93
98
  * @param {Object} [opts={}] - Optional configuration options
94
99
  * @returns {Provided} The provided data for stack analysis
95
100
  */
96
- provideStack(manifestPath: string, opts?: any): Provided;
101
+ provideStack(manifestPath: string, opts?: Object): Provided;
97
102
  /**
98
103
  * Provides content and content type for component analysis
99
104
  * @param {string} manifestPath - Path to package.json for component report
100
105
  * @param {Object} [opts={}] - Optional configuration options
101
106
  * @returns {Provided} The provided data for component analysis
102
107
  */
103
- provideComponent(manifestPath: string, opts?: any): Provided;
108
+ provideComponent(manifestPath: string, opts?: Object): Provided;
104
109
  /**
105
110
  * Read license from manifest (package.json). Reused by npm, pnpm, yarn.
106
111
  * @param {string} manifestPath - path to package.json
@@ -114,21 +119,21 @@ export default class Base_javascript {
114
119
  * @returns {Object} The dependency tree
115
120
  * @protected
116
121
  */
117
- protected _buildDependencyTree(includeTransitive: boolean, opts?: any): any;
122
+ protected _buildDependencyTree(includeTransitive: boolean, opts?: Object): Object;
118
123
  /**
119
124
  * Recursively builds the Sbom from the JSON that npm listing returns
120
125
  * @param {Sbom} sbom - The SBOM object to add dependencies to
121
126
  * @param {Object} depTree - The current dependency tree
122
127
  * @protected
123
128
  */
124
- protected _addDependenciesToSbom(sbom: Sbom, depTree: any): void;
129
+ protected _addDependenciesToSbom(sbom: Sbom, depTree: Object): void;
125
130
  /**
126
131
  * Extracts root dependencies from the dependency tree
127
132
  * @param {Object} depTree - The dependency tree object
128
133
  * @returns {Map<string, PackageURL>} Map of dependency names to their PackageURL objects
129
134
  * @protected
130
135
  */
131
- protected _getRootDependencies(depTree: any): Map<string, PackageURL>;
136
+ protected _getRootDependencies(depTree: Object): Map<string, PackageURL>;
132
137
  /**
133
138
  * Gets the version of the package manager
134
139
  * @returns {string} The version string of the package manager
@@ -136,6 +141,12 @@ export default class Base_javascript {
136
141
  */
137
142
  protected _version(): string;
138
143
  /**
144
+ * Creates or updates the lock file for the package manager
145
+ * @param {string} manifestDir - Directory containing the manifest file
146
+ * @protected
147
+ */
148
+ protected _createLockFile(manifestDir: string): void;
149
+ /**
139
150
  * Parses the dependency tree output
140
151
  * @param {string} output - The output to parse
141
152
  * @returns {string} The parsed output
@@ -144,6 +155,6 @@ export default class Base_javascript {
144
155
  protected _parseDepTreeOutput(output: string): string;
145
156
  #private;
146
157
  }
147
- export type Provided = import("../provider").Provided;
158
+ export type Provided = any;
148
159
  import Manifest from './manifest.js';
149
160
  import Sbom from '../sbom.js';
@@ -71,6 +71,13 @@ export default class Base_javascript {
71
71
  throw new TypeError("_cmdName must be implemented");
72
72
  }
73
73
  /**
74
+ * Returns the package manager name (e.g. npm, yarn, pnpm, bun)
75
+ * @returns {string} The package manager name
76
+ */
77
+ packageManagerName() {
78
+ return this._cmdName();
79
+ }
80
+ /**
74
81
  * Returns the command arguments for listing dependencies
75
82
  * @returns {Array<string>} The command arguments
76
83
  * @abstract
@@ -217,7 +224,7 @@ export default class Base_javascript {
217
224
  this._version();
218
225
  const manifestDir = path.dirname(this.#manifest.manifestPath);
219
226
  const cmdDir = this._findLockFileDir(manifestDir, opts) || manifestDir;
220
- this.#createLockFile(cmdDir);
227
+ this._createLockFile(cmdDir);
221
228
  let output = this.#executeListCmd(includeTransitive, cmdDir);
222
229
  output = this._parseDepTreeOutput(output);
223
230
  return JSON.parse(output);
@@ -363,9 +370,9 @@ export default class Base_javascript {
363
370
  /**
364
371
  * Creates or updates the lock file for the package manager
365
372
  * @param {string} manifestDir - Directory containing the manifest file
366
- * @private
373
+ * @protected
367
374
  */
368
- #createLockFile(manifestDir) {
375
+ _createLockFile(manifestDir) {
369
376
  const originalDir = process.cwd();
370
377
  const isWindows = os.platform() === 'win32';
371
378
  if (isWindows) {