@cyclonedx/cdxgen 11.11.0 → 12.0.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.
package/README.md CHANGED
@@ -50,6 +50,12 @@ Sections include:
50
50
 
51
51
  ## Usage
52
52
 
53
+ ## For Contributors / Developers
54
+ ```shell
55
+ pnpm install
56
+ pnpm dlx cdxgen
57
+ ```
58
+
53
59
  ## Installing
54
60
 
55
61
  ```shell
@@ -339,6 +345,8 @@ cdxgen can retain the dependency tree under the `dependencies` attribute for a s
339
345
  - Ruby (Gemfile.lock)
340
346
  - Rust (Cargo.lock)
341
347
 
348
+
349
+
342
350
  ## Plugins
343
351
 
344
352
  cdxgen could be extended with external binary plugins to support more SBOM use cases. These are now installed as an optional dependency.
@@ -347,6 +355,17 @@ cdxgen could be extended with external binary plugins to support more SBOM use c
347
355
  sudo npm install -g @cyclonedx/cdxgen-plugins-bin
348
356
  ```
349
357
 
358
+
359
+ ## Plugins (pnpm)
360
+
361
+ `cdxgen` can be extended with external binary plugins to support more SBOM use cases.
362
+ These are now installed as optional dependencies and can be used without a global install.
363
+
364
+ ```shell
365
+ pnpm dlx @cyclonedx/cdxgen-plugins-bin
366
+ ```
367
+
368
+
350
369
  ## Docker / OCI container support
351
370
 
352
371
  `docker` type is automatically detected based on the presence of values such as `sha256` or `docker.io` prefix etc in the path.
@@ -428,6 +447,18 @@ npm install -g @cyclonedx/cdxgen
428
447
  cdx-verify -i bom.json --public-key public.key
429
448
  ```
430
449
 
450
+
451
+ ### Verifying the signature (pnpm)
452
+
453
+ Use the bundled `cdx-verify` command, which supports verifying a single signature added at the BOM level.
454
+
455
+ You can run it directly using pnpm (no global install needed):
456
+
457
+ ```shell
458
+ pnpm dlx @cyclonedx/cdxgen cdx-verify -i bom.json --public-key public.key
459
+ ```
460
+
461
+
431
462
  ### Custom verification tool (Node.js example)
432
463
 
433
464
  There are many [libraries][jwt-libraries] available to validate JSON Web Tokens. Below is a javascript example.
@@ -539,6 +570,18 @@ corepack pnpm add -g --allow-build @appthreat/sqlite3 https://github.com/Cyclone
539
570
  cdxgen --help
540
571
  ```
541
572
 
573
+
574
+ ### Testing main branch (No Global Install)
575
+
576
+ To quickly test the latest main branch without installing globally, you can use `pnpm` in a local or temporary environment.
577
+
578
+ ```shell
579
+ corepack enable
580
+ pnpm install --prefer-offline
581
+ pnpm dlx cdxgen --help
582
+ ```
583
+
584
+
542
585
  ## Sponsors
543
586
 
544
587
  <div style="display: flex; align-items: center; gap: 20px;">
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { readFileSync } from "node:fs";
4
+
5
+ import { parse as yaml } from "yaml";
6
+
7
+ const pkgJson = JSON.parse(readFileSync("./package.json", "utf8"));
8
+ const pnpmLockYaml = yaml(readFileSync("./pnpm-lock.yaml", "utf8"));
9
+
10
+ const installedPackages = [];
11
+
12
+ const incorrectNpmOverridesVersions = [];
13
+ const incorrectPnpmOverridesVersions = [];
14
+ const missingNpmOverrides = [];
15
+ const missingPnpmOverrides = [];
16
+
17
+ const obsoleteNpmOverrides = [];
18
+ const obsoletePnpmOverrides = [];
19
+
20
+ for (const _package in pnpmLockYaml.snapshots) {
21
+ const indexOfSeparator = _package.split("(")[0].lastIndexOf("@");
22
+ const packageName = _package.substring(0, indexOfSeparator);
23
+ const packageVersion = _package.substring(indexOfSeparator + 1);
24
+ if (!installedPackages.includes(packageName)) {
25
+ installedPackages.push(packageName);
26
+ checkOverride(packageName, packageVersion);
27
+ }
28
+ for (const dependency in pnpmLockYaml.snapshots[_package].dependencies) {
29
+ if (!installedPackages.includes(dependency)) {
30
+ installedPackages.push(dependency);
31
+ checkOverride(
32
+ dependency,
33
+ pnpmLockYaml.snapshots[_package].dependencies[dependency],
34
+ );
35
+ }
36
+ }
37
+ for (const dependency in pnpmLockYaml.snapshots[_package]
38
+ .optionalDependencies) {
39
+ if (!installedPackages.includes(dependency)) {
40
+ installedPackages.push(dependency);
41
+ checkOverride(
42
+ dependency,
43
+ pnpmLockYaml.snapshots[_package].optionalDependencies[dependency],
44
+ );
45
+ }
46
+ }
47
+ }
48
+ for (const override in pkgJson.overrides) {
49
+ checkObsolescence(override, obsoleteNpmOverrides);
50
+ }
51
+ for (const override in pkgJson.pnpm.overrides) {
52
+ checkObsolescence(override, obsoletePnpmOverrides);
53
+ }
54
+
55
+ export function checkDependencies() {
56
+ return (
57
+ incorrectNpmOverridesVersions.length +
58
+ incorrectPnpmOverridesVersions.length +
59
+ missingNpmOverrides.length +
60
+ missingPnpmOverrides.length +
61
+ obsoleteNpmOverrides.length +
62
+ obsoletePnpmOverrides.length
63
+ );
64
+ }
65
+
66
+ function checkOverride(packageName, packageVersion) {
67
+ packageVersion = packageVersion.split("(")[0];
68
+ if (packageVersion.includes("@")) {
69
+ packageVersion = `npm:${packageVersion}`;
70
+ }
71
+ if (!Object.hasOwn(pkgJson.overrides, packageName)) {
72
+ missingNpmOverrides.push(` "${packageName}": "${packageVersion}"`);
73
+ } else if (pkgJson.overrides[packageName] !== packageVersion) {
74
+ incorrectNpmOverridesVersions.push(
75
+ ` - ${packageName} (${pkgJson.overrides[packageName]} instead of ${packageVersion})`,
76
+ );
77
+ }
78
+ if (!Object.hasOwn(pkgJson.pnpm.overrides, packageName)) {
79
+ missingPnpmOverrides.push(` "${packageName}": "${packageVersion}"`);
80
+ } else if (pkgJson.pnpm.overrides[packageName] !== packageVersion) {
81
+ incorrectPnpmOverridesVersions.push(
82
+ ` - ${packageName} (${pkgJson.pnpm.overrides[packageName]} instead of ${packageVersion})`,
83
+ );
84
+ }
85
+ }
86
+
87
+ function checkObsolescence(override, obsoletionArray) {
88
+ if (!installedPackages.includes(override)) {
89
+ obsoletionArray.push(override);
90
+ }
91
+ }
92
+
93
+ if (missingNpmOverrides.length) {
94
+ console.log("The following dependencies are not in the 'overrides'-block:");
95
+ console.log(missingNpmOverrides.join(",\n"));
96
+ }
97
+ if (incorrectNpmOverridesVersions.length) {
98
+ console.log(
99
+ "The following dependencies have a different version in the 'overrides'-block:",
100
+ );
101
+ console.log(incorrectNpmOverridesVersions.join("\n"));
102
+ }
103
+ if (missingPnpmOverrides.length) {
104
+ console.log(
105
+ "The following dependencies are not in the 'pnpm.overrides'-block:",
106
+ );
107
+ console.log(missingPnpmOverrides.join(",\n"));
108
+ }
109
+ if (incorrectPnpmOverridesVersions.length) {
110
+ console.log(
111
+ "The following dependencies have a different version in the 'pnpm.overrides'-block:",
112
+ );
113
+ console.log(incorrectPnpmOverridesVersions.join("\n"));
114
+ }
115
+ if (obsoleteNpmOverrides.length) {
116
+ console.log("The following entries in 'overrides' are not used:");
117
+ console.log(obsoleteNpmOverrides.join("\n"));
118
+ }
119
+ if (obsoletePnpmOverrides.length) {
120
+ console.log("The following entries in 'pnpm.overrides' are not used:");
121
+ console.log(obsoletePnpmOverrides.join("\n"));
122
+ }
@@ -563,6 +563,7 @@
563
563
  "curator": "elasticsearch-curator",
564
564
  "curl": "pycurl",
565
565
  "cv2": "opencv-python",
566
+ "cyclonedx": "cyclonedx-python-lib",
566
567
  "daemon": "python-daemon",
567
568
  "dare": "dare",
568
569
  "database-locks": "django-database-locks",
@@ -1064,6 +1065,8 @@
1064
1065
  "slugify": "unicode-slugify",
1065
1066
  "smarkets": "smk-python-sdk",
1066
1067
  "snappy": "ctypes-snappy",
1068
+ "snsql": "smartnoise-sql",
1069
+ "snsynth": "smartnoise-synth",
1067
1070
  "social-core": "social-auth-core",
1068
1071
  "social-django": "social-auth-app-django",
1069
1072
  "socketio": "python-socketio",
package/lib/cli/index.js CHANGED
@@ -1721,9 +1721,8 @@ export async function createJavaBom(path, options) {
1721
1721
  result?.status !== 0 ||
1722
1722
  result?.error
1723
1723
  ) {
1724
- const tempDir = mkdtempSync(join(getTmpDir(), "cdxmvn-"));
1725
- const tempMvnTree = join(tempDir, "mvn-tree.txt");
1726
- const tempMvnParentTree = join(tempDir, "mvn-parent-tree.txt");
1724
+ const tempMvnTree = join("target", "cdxgen-mvn-tree.txt");
1725
+ const tempMvnParentTree = join("target", "cdxgen-mvn-parent-tree.txt");
1727
1726
  let mvnTreeArgs = ["dependency:tree", `-DoutputFile=${tempMvnTree}`];
1728
1727
  let addArgs = "";
1729
1728
  if (process.env.MVN_ARGS) {
@@ -1828,7 +1827,7 @@ export async function createJavaBom(path, options) {
1828
1827
  );
1829
1828
  } else {
1830
1829
  console.log(
1831
- "1. Java version requirement: cdxgen container image bundles Java 24 with maven 3.9 which might be incompatible. Try running cdxgen with the custom JDK11-based image `ghcr.io/cyclonedx/cdxgen-java11:v11`.",
1830
+ "1. Java version requirement: cdxgen container image bundles Java 24 with maven 3.9 which might be incompatible. Try running cdxgen with the custom JDK11-based image `ghcr.io/cyclonedx/cdxgen-java11:v12`.",
1832
1831
  );
1833
1832
  }
1834
1833
  console.log(
@@ -1889,7 +1888,9 @@ export async function createJavaBom(path, options) {
1889
1888
  );
1890
1889
  }
1891
1890
  }
1892
- unlinkSync(tempMvnTree);
1891
+ if (!DEBUG_MODE) {
1892
+ unlinkSync(tempMvnTree);
1893
+ }
1893
1894
  }
1894
1895
  }
1895
1896
  }
@@ -2972,7 +2973,7 @@ export async function createNodejsBom(path, options) {
2972
2973
  if (DEBUG_MODE && result.stdout) {
2973
2974
  if (result.stdout.includes("EBADENGINE Unsupported engine")) {
2974
2975
  console.log(
2975
- "TIP: Try using the custom `ghcr.io/cyclonedx/cdxgen-node20:v11` container image, which bundles node.js 20. The current version of node.js is incompatible for this project.",
2976
+ "TIP: Try using the custom `ghcr.io/cyclonedx/cdxgen-node20:v12` container image, which bundles node.js 20. The current version of node.js is incompatible for this project.",
2976
2977
  );
2977
2978
  console.log(
2978
2979
  "Alternatively, run cdxgen with the custom node with version types. Eg: `-t node20`",
@@ -3002,12 +3003,12 @@ export async function createNodejsBom(path, options) {
3002
3003
  );
3003
3004
  } else {
3004
3005
  console.log(
3005
- "TIP: Try using the custom `ghcr.io/cyclonedx/cdxgen-node20:v11` container image, which bundles node.js 20. The default image bundles node >= 23, which might be incompatible.",
3006
+ "TIP: Try using the custom `ghcr.io/cyclonedx/cdxgen-node20:v12` container image, which bundles node.js 20. The default image bundles node >= 23, which might be incompatible.",
3006
3007
  );
3007
3008
  }
3008
3009
  } else {
3009
3010
  console.log(
3010
- "TIP: Try using the custom `ghcr.io/cyclonedx/cdxgen-node20:v11` container image with --platform=linux/amd64, which bundles node.js 20.",
3011
+ "TIP: Try using the custom `ghcr.io/cyclonedx/cdxgen-node20:v12` container image with --platform=linux/amd64, which bundles node.js 20.",
3011
3012
  );
3012
3013
  }
3013
3014
  }
@@ -6670,7 +6671,7 @@ export async function createCsharpBom(path, options) {
6670
6671
  "This project requires a specific version of dotnet sdk to be installed. The cdxgen container image bundles dotnet SDK 8.0, which might be incompatible.",
6671
6672
  );
6672
6673
  console.log(
6673
- "TIP: Try using the custom `ghcr.io/cyclonedx/cdxgen-debian-dotnet6:v11` or `ghcr.io/cyclonedx/cdxgen-debian-dotnet8:v11` container images.",
6674
+ "TIP: Try using the custom `ghcr.io/cyclonedx/cdxgen-debian-dotnet6:v12` or `ghcr.io/cyclonedx/cdxgen-debian-dotnet8:v12` container images.",
6674
6675
  );
6675
6676
  } else if (
6676
6677
  result?.stderr?.includes("is not found on source") ||
@@ -6701,7 +6702,7 @@ export async function createCsharpBom(path, options) {
6701
6702
  );
6702
6703
  if (process.env?.CDXGEN_IN_CONTAINER !== "true") {
6703
6704
  console.log(
6704
- "Alternatively, try using the custom `ghcr.io/cyclonedx/cdxgen-debian-dotnet6:v11` container image, which bundles nuget (mono) and a range of dotnet SDKs.",
6705
+ "Alternatively, try using the custom `ghcr.io/cyclonedx/cdxgen-debian-dotnet6:v12` container image, which bundles nuget (mono) and a range of dotnet SDKs.",
6705
6706
  );
6706
6707
  }
6707
6708
  }
@@ -6797,7 +6798,7 @@ export async function createCsharpBom(path, options) {
6797
6798
  "3. If the project uses the legacy .Net Framework 4.6/4.7/4.8, it might require execution on Windows.",
6798
6799
  );
6799
6800
  console.log(
6800
- "Alternatively, try using the custom `ghcr.io/cyclonedx/cdxgen-dotnet:v11` container image, which bundles a range of dotnet SDKs.",
6801
+ "Alternatively, try using the custom `ghcr.io/cyclonedx/cdxgen-dotnet:v12` container image, which bundles a range of dotnet SDKs.",
6801
6802
  );
6802
6803
  options.failOnError && process.exit(1);
6803
6804
  }
@@ -0,0 +1,11 @@
1
+ import { assert, it } from "poku";
2
+
3
+ import { checkDependencies } from "../../bin/dependencies.js";
4
+
5
+ it("checks dependency overrides in package.json vs installed in pnpm-lock.yaml", async () => {
6
+ assert.equal(
7
+ checkDependencies(),
8
+ 0,
9
+ "There shouldn't have been dependency discrepancies",
10
+ );
11
+ });
@@ -782,7 +782,7 @@ export function installRubyVersion(rubyVersion, filePath) {
782
782
  process.env?.CDXGEN_IN_CONTAINER !== "true"
783
783
  ) {
784
784
  console.log(
785
- `Installing Ruby version ${rubyVersion} requires specific development libraries. Consider using the custom container image "ghcr.io/cyclonedx/cdxgen-debian-ruby26:v11" instead.`,
785
+ `Installing Ruby version ${rubyVersion} requires specific development libraries. Consider using the custom container image "ghcr.io/cyclonedx/cdxgen-debian-ruby26:v12" instead.`,
786
786
  );
787
787
  console.log("The below install step is likely to fail.");
788
788
  }
@@ -35,6 +35,7 @@ import { parseEDNString } from "edn-data";
35
35
  import { globSync } from "glob";
36
36
  import got from "got";
37
37
  import iconv from "iconv-lite";
38
+ import Keyv from "keyv";
38
39
  import StreamZip from "node-stream-zip";
39
40
  import { PackageURL } from "packageurl-js";
40
41
  import propertiesReader from "properties-reader";
@@ -672,7 +673,9 @@ export function isPackageManagerAllowed(name, conflictingManagers, options) {
672
673
  }
673
674
 
674
675
  // HTTP cache
675
- const gotHttpCache = new Map();
676
+ const gotHttpCache = new Keyv();
677
+ // Don't complain when there's lots of parallel requests
678
+ gotHttpCache.setMaxListeners(10000);
676
679
 
677
680
  function isCacheDisabled() {
678
681
  return (
@@ -3805,8 +3808,21 @@ export async function parseMinJs(minJsFile) {
3805
3808
  if (tmpB && tmpB.length > 1) {
3806
3809
  // Fix #223 - lowercase parsed package name
3807
3810
  const name = tmpB[0].replace(/ /g, "-").trim().toLowerCase();
3811
+ if (name === "@license" || name === "license") {
3812
+ return;
3813
+ }
3814
+ if (name.startsWith("@") && !name.includes("/")) {
3815
+ return;
3816
+ }
3808
3817
  if (
3809
- ["copyright", "author", "licensed"].includes(name.toLowerCase())
3818
+ [
3819
+ "copyright",
3820
+ "author",
3821
+ "licensed",
3822
+ "minified",
3823
+ "vendor",
3824
+ "build",
3825
+ ].includes(name.toLowerCase())
3810
3826
  ) {
3811
3827
  return;
3812
3828
  }
@@ -4792,7 +4808,7 @@ export function executeParallelGradleProperties(
4792
4808
  "1. Check if the correct version of java and gradle are installed and available in PATH. For example, some project might require Java 11 with gradle 7.\n cdxgen container image bundles Java 23 with gradle 8 which might be incompatible.",
4793
4809
  );
4794
4810
  console.log(
4795
- "2. Try running cdxgen with the custom JDK11-based image `ghcr.io/cyclonedx/cdxgen-java11:v11`.",
4811
+ "2. Try running cdxgen with the custom JDK11-based image `ghcr.io/cyclonedx/cdxgen-java11:v12`.",
4796
4812
  );
4797
4813
  if (result.stderr?.includes("not get unknown property")) {
4798
4814
  console.log(
@@ -12107,7 +12123,7 @@ export function convertOSQueryResults(
12107
12123
  return pkgList;
12108
12124
  }
12109
12125
 
12110
- function purlFromUrlString(type, repoUrl, version) {
12126
+ export function purlFromUrlString(type, repoUrl, version) {
12111
12127
  let namespace = "";
12112
12128
  let name;
12113
12129
  if (repoUrl?.startsWith("http")) {
@@ -12136,7 +12152,10 @@ function purlFromUrlString(type, repoUrl, version) {
12136
12152
  namespace = `${hostname}/${urlpath}`;
12137
12153
  } else if (repoUrl?.startsWith("/")) {
12138
12154
  const parts = repoUrl.split("/");
12139
- name = parts[parts.length - 1];
12155
+ name = parts[parts.length - 1] || "unknown";
12156
+ if (type === "swift") {
12157
+ namespace = "local";
12158
+ }
12140
12159
  } else {
12141
12160
  if (DEBUG_MODE) {
12142
12161
  console.warn("unsupported repo url for swift type");
@@ -14929,7 +14948,7 @@ export async function getPipFrozenTree(
14929
14948
  }
14930
14949
  }
14931
14950
  console.warn(
14932
- "This project does not support python with version types. Use an appropriate container image such as `ghcr.io/appthreat/cdxgen-python39:v11` or `ghcr.io/appthreat/cdxgen-python311:v11` and invoke cdxgen with `-t python` instead.\n",
14951
+ "This project does not support python with version types. Use an appropriate container image such as `ghcr.io/appthreat/cdxgen-python39:v12` or `ghcr.io/appthreat/cdxgen-python311:v12` and invoke cdxgen with `-t python` instead.\n",
14933
14952
  );
14934
14953
  } else if (
14935
14954
  result?.stderr?.includes(
@@ -14937,7 +14956,7 @@ export async function getPipFrozenTree(
14937
14956
  )
14938
14957
  ) {
14939
14958
  console.log(
14940
- "Installing build dependencies has failed. Use an appropriate container image such as `ghcr.io/appthreat/cdxgen-python39:v11` or `ghcr.io/appthreat/cdxgen-python311:v11` and invoke cdxgen with `-t python` instead.",
14959
+ "Installing build dependencies has failed. Use an appropriate container image such as `ghcr.io/appthreat/cdxgen-python39:v12` or `ghcr.io/appthreat/cdxgen-python311:v12` and invoke cdxgen with `-t python` instead.",
14941
14960
  );
14942
14961
  if (
14943
14962
  result?.stderr?.includes(
@@ -14995,7 +15014,7 @@ export async function getPipFrozenTree(
14995
15014
  "1. Try invoking cdxgen with a specific python version type. Example: `-t python36` or `-t python39`",
14996
15015
  );
14997
15016
  console.log(
14998
- "2. Alternatively, try using the custom container images `ghcr.io/cyclonedx/cdxgen-python39:v11` or `ghcr.io/cyclonedx/cdxgen-python311:v11`, which bundles a range of build tools and development libraries.",
15017
+ "2. Alternatively, try using the custom container images `ghcr.io/cyclonedx/cdxgen-python39:v12` or `ghcr.io/cyclonedx/cdxgen-python311:v12`, which bundles a range of build tools and development libraries.",
14999
15018
  );
15000
15019
  } else if (
15001
15020
  process.env?.PIP_INSTALL_ARGS?.includes("--python-version")
@@ -1,5 +1,5 @@
1
1
  import { Buffer } from "node:buffer";
2
- import { existsSync, readFileSync } from "node:fs";
2
+ import { existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
3
3
  import path from "node:path";
4
4
 
5
5
  import { PackageURL } from "packageurl-js";
@@ -75,6 +75,7 @@ import {
75
75
  parseMakeDFile,
76
76
  parseMavenTree,
77
77
  parseMillDependency,
78
+ parseMinJs,
78
79
  parseMixLockData,
79
80
  parseNodeShrinkwrap,
80
81
  parseNupkg,
@@ -105,6 +106,7 @@ import {
105
106
  parseSwiftResolved,
106
107
  parseYarnLock,
107
108
  pnpmMetadata,
109
+ purlFromUrlString,
108
110
  readZipEntry,
109
111
  splitOutputByGradleProjects,
110
112
  toGemModuleNames,
@@ -2095,7 +2097,7 @@ it("get crates metadata", async () => {
2095
2097
  homepage: { url: "https://github.com/iqlusioninc/abscissa/" },
2096
2098
  properties: [
2097
2099
  { name: "cdx:cargo:crate_id", value: "207912" },
2098
- { name: "cdx:cargo:latest_version", value: "0.8.2" },
2100
+ { name: "cdx:cargo:latest_version", value: "0.9.0" },
2099
2101
  {
2100
2102
  name: "cdx:cargo:features",
2101
2103
  value:
@@ -2471,12 +2473,12 @@ it("parse mix lock data", () => {
2471
2473
  it("parse github actions workflow data", () => {
2472
2474
  assert.deepStrictEqual(parseGitHubWorkflowData(null), []);
2473
2475
  let dep_list = parseGitHubWorkflowData("./.github/workflows/nodejs.yml");
2474
- assert.deepStrictEqual(dep_list.length, 9);
2476
+ assert.deepStrictEqual(dep_list.length, 7);
2475
2477
  assert.deepStrictEqual(dep_list[0], {
2476
2478
  group: "actions",
2477
2479
  name: "checkout",
2478
- version: "5.0.0",
2479
- purl: "pkg:github/actions/checkout@5.0.0?commit=08c6903cd8c0fde910a37f88322edcfb5dd907a8",
2480
+ version: "6.0.0",
2481
+ purl: "pkg:github/actions/checkout@6.0.0?commit=1af3b93b6815bc44a9784bd300feb67ff0d1eeb3",
2480
2482
  properties: [
2481
2483
  {
2482
2484
  name: "SrcFile",
@@ -3941,11 +3943,6 @@ it("parsePnpmLock", async () => {
3941
3943
  parsedList.pkgList.filter((pkg) => !pkg.scope).length,
3942
3944
  3,
3943
3945
  );
3944
- parsedList = await parsePnpmLock("./pnpm-lock.yaml");
3945
- assert.deepStrictEqual(parsedList.pkgList.length, 355);
3946
- assert.deepStrictEqual(parsedList.dependenciesList.length, 355);
3947
- assert.ok(parsedList.pkgList[0]);
3948
- assert.ok(parsedList.dependenciesList[0]);
3949
3946
  parsedList = await parsePnpmLock(
3950
3947
  "./test/data/pnpm_locks/bytemd-pnpm-lock.yaml",
3951
3948
  );
@@ -6956,6 +6953,13 @@ it("parse swift deps files", () => {
6956
6953
  });
6957
6954
  });
6958
6955
 
6956
+ it("assigns default namespace for local swift paths (#2781)", () => {
6957
+ const purl = purlFromUrlString("swift", "/Users/arsh/project", "1.0.0");
6958
+ assert.equal(purl.namespace, "local");
6959
+ assert.equal(purl.name, "project");
6960
+ assert.equal(purl.version, "1.0.0");
6961
+ });
6962
+
6959
6963
  it("pypi version solver tests", () => {
6960
6964
  const versionsList = [
6961
6965
  "1.0.0",
@@ -7916,3 +7920,35 @@ testCases.forEach(([url, expected], index) => {
7916
7920
  });
7917
7921
  // biome-ignore-end lint/suspicious/noTemplateCurlyInString: This is a unit test
7918
7922
  // biome-ignore-end lint/style/useTemplate: This is a unit test
7923
+ it("ignores license banners in minified js (#2717)", async () => {
7924
+ const file = "temp.min.js";
7925
+
7926
+ const content = `/*! @license DOMPurify 3.2.7 */
7927
+ (function(){console.log("test")})();
7928
+ `;
7929
+
7930
+ writeFileSync(file, content);
7931
+
7932
+ const result = await parseMinJs(file);
7933
+
7934
+ assert.ok(Array.isArray(result));
7935
+ assert.equal(result.length, 0);
7936
+
7937
+ if (existsSync(file)) unlinkSync(file);
7938
+ });
7939
+
7940
+ it("parses valid minified js with real package name (#2717)", async () => {
7941
+ const file = "temp.min.js";
7942
+ const content = `/*! jquery 3.6.0 */
7943
+ (function(){console.log("test")})();`;
7944
+
7945
+ writeFileSync(file, content);
7946
+
7947
+ const result = await parseMinJs(file);
7948
+
7949
+ assert.equal(result.length, 1);
7950
+ assert.equal(result[0].name, "jquery");
7951
+ assert.equal(result[0].version, "3.6.0");
7952
+
7953
+ if (existsSync(file)) unlinkSync(file);
7954
+ });
@@ -34,7 +34,6 @@ import util from "node:util";
34
34
  import nameFromFolder from "@npmcli/name-from-folder";
35
35
  import getPaths from "bin-links";
36
36
  import npa from "npm-package-arg";
37
- import log from "proc-log";
38
37
  import rpj from "read-package-json-fast";
39
38
  import semver from "semver";
40
39
  import { walkUp } from "walk-up-path";
@@ -1444,8 +1443,6 @@ class Node {
1444
1443
  }
1445
1444
  return false;
1446
1445
  }
1447
- // This is an error condition. We can only get here if the new override set is in conflict with the existing.
1448
- log.silly("Conflicting override sets", this.name);
1449
1446
  }
1450
1447
 
1451
1448
  deleteEdgeIn(edge) {
@@ -1,5 +1,4 @@
1
1
  import npa from "npm-package-arg";
2
- import log from "proc-log";
3
2
  import semver from "semver";
4
3
 
5
4
  class OverrideSet {
@@ -206,9 +205,6 @@ class OverrideSet {
206
205
  return first;
207
206
  }
208
207
  }
209
-
210
- // The override sets are incomparable. Neither one contains the other.
211
- log.silly("Conflicting override sets", first, second);
212
208
  }
213
209
 
214
210
  static doOverrideSetsConflict(first, second) {
@@ -8,7 +8,6 @@
8
8
  // a result.
9
9
 
10
10
  import localeCompare from "@isaacs/string-locale-compare";
11
- import { redact } from "@npmcli/redact";
12
11
  import log from "proc-log";
13
12
 
14
13
  import CanPlaceDep, { CONFLICT, KEEP } from "./can-place-dep.js";
@@ -183,15 +182,6 @@ class PlaceDep {
183
182
 
184
183
  const { target } = this.canPlace;
185
184
 
186
- log.silly(
187
- "placeDep",
188
- target.location || "ROOT",
189
- `${this.dep.name}@${this.dep.version}`,
190
- this.canPlace.description,
191
- `for: ${this.edge.from.package._id || this.edge.from.location}`,
192
- `want: ${redact(this.edge.spec || "*")}`,
193
- );
194
-
195
185
  const placementType =
196
186
  this.canPlace.canPlace === CONFLICT
197
187
  ? this.canPlace.canPlaceSelf
@@ -12,13 +12,11 @@ class Results {
12
12
  #initialItems;
13
13
  #inventory;
14
14
  #results = new Map();
15
- #targetNode;
16
15
 
17
16
  constructor(opts) {
18
17
  this.#currentAstSelector = opts.rootAstNode.nodes[0];
19
18
  this.#inventory = opts.inventory;
20
19
  this.#initialItems = opts.initialItems;
21
- this.#targetNode = opts.targetNode;
22
20
 
23
21
  this.currentResults = this.#initialItems;
24
22
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyclonedx/cdxgen",
3
- "version": "11.11.0",
3
+ "version": "12.0.0",
4
4
  "description": "Creates CycloneDX Software Bill of Materials (SBOM) from source or container image",
5
5
  "keywords": [
6
6
  "sbom",
@@ -98,12 +98,12 @@
98
98
  "types/",
99
99
  "index.cjs"
100
100
  ],
101
- "lint-staged": {
102
- "*": "biome check --fix --no-errors-on-unmatched"
103
- },
104
101
  "overrides": {
105
- "@appthreat/atom": "2.4.2",
102
+ "@appthreat/atom": "2.3.0",
103
+ "@appthreat/atom-common": "1.0.11",
104
+ "@appthreat/atom-parsetools": "1.0.11",
106
105
  "@appthreat/cdx-proto": "1.1.4",
106
+ "@appthreat/sqlite3": "6.0.9",
107
107
  "@babel/code-frame": "7.27.1",
108
108
  "@babel/generator": "7.28.5",
109
109
  "@babel/helper-globals": "7.28.0",
@@ -113,107 +113,324 @@
113
113
  "@babel/template": "7.27.2",
114
114
  "@babel/traverse": "7.28.5",
115
115
  "@babel/types": "7.28.5",
116
- "@biomejs/biome": "2.3.0",
117
- "@bufbuild/protobuf": "2.10.0",
118
- "@cyclonedx/cdxgen-plugins-bin": "1.7.0",
119
- "@cyclonedx/cdxgen-plugins-bin-darwin-amd64": "1.7.0",
120
- "@cyclonedx/cdxgen-plugins-bin-darwin-arm64": "1.7.0",
121
- "@cyclonedx/cdxgen-plugins-bin-linux-amd64": "1.7.0",
122
- "@cyclonedx/cdxgen-plugins-bin-linux-arm": "1.7.0",
123
- "@cyclonedx/cdxgen-plugins-bin-linux-arm64": "1.7.0",
124
- "@cyclonedx/cdxgen-plugins-bin-linux-ppc64": "1.7.0",
125
- "@cyclonedx/cdxgen-plugins-bin-linuxmusl-amd64": "1.7.0",
126
- "@cyclonedx/cdxgen-plugins-bin-linuxmusl-arm64": "1.7.0",
127
- "@cyclonedx/cdxgen-plugins-bin-windows-amd64": "1.7.0",
128
- "@cyclonedx/cdxgen-plugins-bin-windows-arm64": "1.7.0",
116
+ "@biomejs/biome": "2.3.7",
117
+ "@biomejs/cli-darwin-arm64": "2.3.7",
118
+ "@biomejs/cli-darwin-x64": "2.3.7",
119
+ "@biomejs/cli-linux-arm64": "2.3.7",
120
+ "@biomejs/cli-linux-arm64-musl": "2.3.7",
121
+ "@biomejs/cli-linux-x64": "2.3.7",
122
+ "@biomejs/cli-linux-x64-musl": "2.3.7",
123
+ "@biomejs/cli-win32-arm64": "2.3.7",
124
+ "@biomejs/cli-win32-x64": "2.3.7",
125
+ "@bufbuild/protobuf": "2.10.1",
126
+ "@cyclonedx/cdxgen-plugins-bin": "1.8.0",
127
+ "@cyclonedx/cdxgen-plugins-bin-darwin-amd64": "1.8.0",
128
+ "@cyclonedx/cdxgen-plugins-bin-darwin-arm64": "1.8.0",
129
+ "@cyclonedx/cdxgen-plugins-bin-linux-amd64": "1.8.0",
130
+ "@cyclonedx/cdxgen-plugins-bin-linux-arm": "1.8.0",
131
+ "@cyclonedx/cdxgen-plugins-bin-linux-arm64": "1.8.0",
132
+ "@cyclonedx/cdxgen-plugins-bin-linux-ppc64": "1.8.0",
133
+ "@cyclonedx/cdxgen-plugins-bin-linuxmusl-amd64": "1.8.0",
134
+ "@cyclonedx/cdxgen-plugins-bin-linuxmusl-arm64": "1.8.0",
135
+ "@cyclonedx/cdxgen-plugins-bin-windows-amd64": "1.8.0",
136
+ "@cyclonedx/cdxgen-plugins-bin-windows-arm64": "1.8.0",
129
137
  "@iarna/toml": "2.2.5",
138
+ "@isaacs/balanced-match": "4.0.1",
139
+ "@isaacs/brace-expansion": "5.0.0",
140
+ "@isaacs/fs-minipass": "4.0.1",
130
141
  "@isaacs/string-locale-compare": "1.1.0",
142
+ "@jridgewell/gen-mapping": "0.3.13",
143
+ "@jridgewell/resolve-uri": "3.1.2",
144
+ "@jridgewell/sourcemap-codec": "1.5.5",
145
+ "@jridgewell/trace-mapping": "0.3.31",
146
+ "@keyv/serialize": "1.1.1",
131
147
  "@npmcli/agent": "4.0.0",
132
148
  "@npmcli/fs": "5.0.0",
133
- "@npmcli/installed-package-contents": "4.0.0",
134
- "@npmcli/map-workspaces": "5.0.1",
149
+ "@npmcli/git": "7.0.1",
150
+ "@npmcli/map-workspaces": "5.0.3",
135
151
  "@npmcli/name-from-folder": "4.0.0",
136
- "@npmcli/package-json": "7.0.1",
152
+ "@npmcli/package-json": "7.0.4",
153
+ "@npmcli/promise-spawn": "9.0.1",
137
154
  "@npmcli/query": "5.0.0",
138
- "@npmcli/redact": "4.0.0",
155
+ "@sec-ant/readable-stream": "0.6.0",
156
+ "@sindresorhus/is": "7.1.1",
157
+ "@types/debug": "4.1.12",
158
+ "@types/http-cache-semantics": "4.0.4",
159
+ "@types/ms": "2.1.0",
160
+ "@types/node": "24.10.1",
161
+ "@types/validator": "13.15.10",
139
162
  "abbrev": "4.0.0",
163
+ "agent-base": "7.1.4",
140
164
  "ajv": "8.17.1",
141
165
  "ajv-formats": "3.0.1",
166
+ "ansi-regex": "6.2.2",
167
+ "ansi-styles": "6.2.3",
168
+ "b4a": "1.7.3",
169
+ "bare-events": "2.8.2",
170
+ "bare-fs": "4.5.1",
171
+ "bare-os": "3.6.2",
172
+ "bare-path": "3.0.0",
173
+ "bare-stream": "2.7.0",
174
+ "bare-url": "2.3.2",
142
175
  "bin-links": "6.0.0",
176
+ "bindings": "1.5.0",
143
177
  "body-parser": "2.2.0",
144
- "cacache": "20.0.0",
178
+ "boolbase": "1.0.0",
179
+ "boolean": "3.2.0",
180
+ "buffer-equal-constant-time": "1.0.1",
181
+ "byte-counter": "0.1.0",
182
+ "bytes": "3.1.2",
183
+ "cacache": "20.0.3",
184
+ "cacheable-lookup": "7.0.0",
185
+ "cacheable-request": "13.0.15",
186
+ "call-bind-apply-helpers": "1.0.2",
187
+ "call-bound": "1.0.4",
145
188
  "cheerio": "1.1.2",
189
+ "cheerio-select": "2.1.0",
146
190
  "chownr": "3.0.0",
191
+ "cliui": "9.0.1",
192
+ "cmd-shim": "8.0.0",
147
193
  "common-ancestor-path": "1.0.1",
194
+ "compressible": "2.0.18",
148
195
  "compression": "1.8.1",
149
196
  "connect": "3.7.0",
150
- "debug": "4.4.1",
151
- "decompress-response": "7.0.0",
197
+ "content-type": "1.0.5",
198
+ "css-select": "6.0.0",
199
+ "css-what": "7.0.0",
200
+ "cssesc": "3.0.0",
201
+ "debug": "4.4.3",
202
+ "decompress-response": "10.0.0",
203
+ "deep-extend": "0.6.0",
204
+ "define-data-property": "1.1.4",
205
+ "define-properties": "1.2.1",
206
+ "depd": "2.0.0",
207
+ "detect-libc": "2.1.2",
208
+ "detect-node": "2.1.0",
209
+ "dom-serializer": "2.0.0",
210
+ "domelementtype": "2.3.0",
211
+ "domhandler": "5.0.3",
212
+ "domutils": "3.2.2",
213
+ "dottie": "2.0.6",
214
+ "dunder-proto": "1.0.1",
215
+ "ecdsa-sig-formatter": "1.0.11",
152
216
  "edn-data": "1.1.2",
217
+ "ee-first": "1.1.1",
218
+ "encodeurl": "2.0.0",
153
219
  "encoding": "0.1.13",
154
- "escape-string-regexp": "4.0.0",
155
- "glob": "11.0.3",
220
+ "encoding-sniffer": "0.2.1",
221
+ "end-of-stream": "1.4.5",
222
+ "entities": "7.0.0",
223
+ "env-paths": "3.0.0",
224
+ "err-code": "3.0.1",
225
+ "es-define-property": "1.0.1",
226
+ "es-errors": "1.3.0",
227
+ "es-object-atoms": "1.1.1",
228
+ "es6-error": "4.1.1",
229
+ "escalade": "3.2.0",
230
+ "escape-html": "1.0.3",
231
+ "escape-string-regexp": "5.0.0",
232
+ "events-universal": "1.0.1",
233
+ "expand-template": "2.0.3",
234
+ "exponential-backoff": "3.1.3",
235
+ "fast-deep-equal": "3.1.3",
236
+ "fast-fifo": "1.3.2",
237
+ "fast-uri": "3.1.0",
238
+ "fdir": "6.5.0",
239
+ "file-uri-to-path": "2.0.0",
240
+ "finalhandler": "2.1.0",
241
+ "form-data-encoder": "4.1.0",
242
+ "fs-minipass": "3.0.3",
243
+ "function-bind": "1.1.2",
244
+ "get-caller-file": "2.0.5",
245
+ "get-east-asian-width": "1.4.0",
246
+ "get-intrinsic": "1.3.0",
247
+ "get-proto": "1.0.1",
248
+ "get-stream": "9.0.1",
249
+ "github-from-package": "0.0.0",
250
+ "glob": "13.0.0",
156
251
  "global-agent": "3.0.0",
157
- "got": "14.6.0",
252
+ "globalthis": "1.0.4",
253
+ "gopd": "1.2.0",
254
+ "got": "14.6.5",
255
+ "graceful-fs": "4.2.11",
256
+ "has-property-descriptors": "1.0.2",
257
+ "has-symbols": "1.1.0",
258
+ "hasown": "2.0.2",
158
259
  "hosted-git-info": "9.0.2",
260
+ "htmlparser2": "10.0.0",
261
+ "http-cache-semantics": "4.2.0",
262
+ "http-errors": "2.0.1",
263
+ "http-proxy-agent": "7.0.2",
264
+ "http2-wrapper": "2.2.1",
265
+ "https-proxy-agent": "7.0.6",
159
266
  "iconv-lite": "0.7.0",
267
+ "imurmurhash": "0.1.4",
268
+ "inflection": "3.0.2",
269
+ "inherits": "2.0.4",
160
270
  "ini": "6.0.0",
271
+ "ip-address": "10.1.0",
272
+ "is-fullwidth-code-point": "5.1.0",
161
273
  "is-stream": "4.0.1",
162
274
  "isexe": "3.1.1",
275
+ "js-tokens": "9.0.1",
276
+ "jsesc": "3.1.0",
163
277
  "json-parse-even-better-errors": "5.0.0",
278
+ "json-schema-traverse": "1.0.0",
164
279
  "json-stringify-nice": "1.1.4",
280
+ "json-stringify-safe": "5.0.1",
165
281
  "jsonata": "2.1.0",
282
+ "just-diff": "6.0.2",
283
+ "just-diff-apply": "5.5.0",
166
284
  "jwa": "2.0.1",
167
285
  "jws": "4.0.0",
286
+ "keyv": "5.5.4",
287
+ "lodash": "4.17.21",
288
+ "lodash.truncate": "4.4.2",
289
+ "lowercase-keys": "3.0.0",
168
290
  "lru-cache": "11.2.2",
169
- "make-fetch-happen": "15.0.2",
170
- "minimatch": "10.0.3",
291
+ "make-fetch-happen": "15.0.3",
292
+ "matcher": "6.0.0",
293
+ "math-intrinsics": "1.1.0",
294
+ "media-typer": "1.1.0",
295
+ "mime-db": "1.54.0",
296
+ "mime-types": "3.0.2",
297
+ "mimic-response": "4.0.0",
298
+ "minimatch": "10.1.1",
299
+ "minimist": "1.2.8",
300
+ "minipass": "7.1.2",
301
+ "minipass-collect": "2.0.1",
302
+ "minipass-fetch": "5.0.0",
303
+ "minipass-flush": "1.0.5",
304
+ "minipass-pipeline": "1.2.4",
305
+ "minipass-sized": "1.0.3",
171
306
  "minizlib": "3.1.0",
172
307
  "mkdirp": "3.0.1",
308
+ "mkdirp-classic": "0.5.3",
309
+ "moment": "2.30.1",
310
+ "moment-timezone": "0.6.0",
173
311
  "ms": "2.1.3",
174
- "negotiator": "0.6.4",
175
- "node-gyp": "11.5.0",
312
+ "napi-build-utils": "2.0.0",
313
+ "negotiator": "1.0.0",
314
+ "node-abi": "3.85.0",
315
+ "node-addon-api": "8.5.0",
316
+ "node-gyp": "12.1.0",
176
317
  "node-stream-zip": "1.15.0",
177
318
  "nopt": "9.0.0",
319
+ "normalize-url": "8.1.0",
178
320
  "npm-install-checks": "8.0.0",
179
321
  "npm-normalize-package-bin": "5.0.0",
180
- "npm-package-arg": "13.0.1",
322
+ "npm-package-arg": "13.0.2",
181
323
  "npm-pick-manifest": "11.0.3",
324
+ "nth-check": "2.1.1",
325
+ "object-inspect": "1.13.4",
326
+ "object-keys": "1.1.1",
182
327
  "on-finished": "2.4.1",
328
+ "on-headers": "1.1.0",
329
+ "once": "1.4.0",
330
+ "p-cancelable": "4.0.1",
331
+ "p-map": "7.0.4",
183
332
  "packageurl-js": "1.0.2",
184
333
  "parse-conflict-json": "5.0.1",
334
+ "parse5": "8.0.0",
335
+ "parse5-htmlparser2-tree-adapter": "8.0.0",
336
+ "parse5-parser-stream": "8.0.0",
337
+ "parseurl": "1.3.3",
338
+ "path-scurry": "2.0.1",
339
+ "pg-connection-string": "2.9.1",
340
+ "picocolors": "1.1.1",
341
+ "picomatch": "4.0.3",
185
342
  "poku": "3.0.2",
186
- "prettify-xml": "1.2.0",
343
+ "postcss-selector-parser": "7.1.0",
344
+ "prebuild-install": "7.1.3",
187
345
  "proc-log": "6.0.0",
188
346
  "proggy": "4.0.0",
189
- "promise-all-reject-late": "1.0.1",
190
- "promise-call-limit": "3.0.2",
347
+ "promise-retry": "2.0.1",
191
348
  "properties-reader": "2.3.0",
349
+ "pump": "3.0.3",
350
+ "qs": "6.14.0",
351
+ "quick-lru": "5.1.1",
352
+ "raw-body": "3.0.2",
353
+ "rc": "1.2.8",
354
+ "read-cmd-shim": "6.0.0",
192
355
  "read-package-json-fast": "5.0.0",
356
+ "require-from-string": "2.0.2",
357
+ "resolve-alpn": "1.2.1",
193
358
  "responselike": "4.0.2",
359
+ "retry": "0.13.1",
360
+ "retry-as-promised": "7.1.1",
361
+ "roarr": "2.15.4",
362
+ "safe-buffer": "5.2.1",
363
+ "safer-buffer": "2.1.2",
364
+ "sax": "1.4.3",
194
365
  "semver": "7.7.3",
366
+ "semver-compare": "1.0.0",
195
367
  "sequelize": "6.37.7",
368
+ "sequelize-pool": "8.0.1",
369
+ "serialize-error": "12.0.0",
370
+ "setprototypeof": "1.2.0",
371
+ "side-channel": "1.1.0",
372
+ "side-channel-list": "1.0.0",
373
+ "side-channel-map": "1.0.1",
374
+ "side-channel-weakmap": "1.0.2",
196
375
  "signal-exit": "4.1.0",
376
+ "simple-concat": "1.0.1",
377
+ "simple-get": "4.0.1",
378
+ "slice-ansi": "7.1.2",
379
+ "smart-buffer": "4.2.0",
380
+ "socks": "2.8.7",
381
+ "socks-proxy-agent": "8.0.5",
382
+ "spdx-correct": "3.2.0",
383
+ "spdx-exceptions": "2.5.0",
384
+ "spdx-expression-parse": "4.0.0",
385
+ "spdx-license-ids": "3.0.22",
197
386
  "sprintf-js": "1.1.3",
198
387
  "sqlite3": "npm:@appthreat/sqlite3@6.0.9",
199
388
  "ssri": "13.0.0",
200
389
  "statuses": "2.0.2",
201
- "strip-json-comments": "3.1.1",
390
+ "streamx": "2.23.0",
391
+ "string-width": "8.1.0",
392
+ "strip-ansi": "7.1.2",
393
+ "strip-json-comments": "5.0.3",
202
394
  "table": "6.9.0",
203
- "tar": "7.5.1",
395
+ "tagged-tag": "1.0.0",
396
+ "tar": "7.5.2",
397
+ "tar-fs": "3.1.1",
398
+ "tar-stream": "3.1.7",
399
+ "text-decoder": "1.2.3",
400
+ "tinyglobby": "0.2.15",
401
+ "toidentifier": "1.0.1",
402
+ "toposort-class": "1.0.1",
204
403
  "treeverse": "3.0.0",
205
- "type-fest": "4.41.0",
404
+ "tunnel-agent": "0.6.0",
405
+ "type-fest": "5.2.0",
406
+ "type-is": "2.0.1",
206
407
  "typescript": "5.9.3",
408
+ "undici": "7.16.0",
409
+ "undici-types": "7.16.0",
207
410
  "unique-filename": "5.0.0",
208
411
  "unique-slug": "6.0.0",
209
- "uuid": "11.1.0",
412
+ "unpipe": "1.0.0",
413
+ "util-deprecate": "1.0.2",
414
+ "utils-merge": "1.0.1",
415
+ "uuid": "13.0.0",
416
+ "validate-npm-package-license": "3.0.4",
417
+ "validate-npm-package-name": "7.0.0",
418
+ "validator": "13.15.23",
419
+ "vary": "1.1.2",
210
420
  "walk-up-path": "4.0.0",
211
- "which": "5.0.0",
421
+ "whatwg-encoding": "3.1.1",
422
+ "whatwg-mimetype": "4.0.0",
423
+ "which": "6.0.0",
424
+ "wkx": "0.5.0",
425
+ "wrap-ansi": "9.0.2",
426
+ "wrappy": "1.0.2",
212
427
  "write-file-atomic": "7.0.0",
213
428
  "xml-js": "1.6.11",
429
+ "y18n": "5.0.8",
214
430
  "yallist": "5.0.0",
215
431
  "yaml": "2.8.1",
216
- "yargs": "17.7.2",
432
+ "yargs": "18.0.0",
433
+ "yargs-parser": "22.0.0",
217
434
  "yoctocolors": "2.1.2"
218
435
  },
219
436
  "dependencies": {
@@ -222,73 +439,63 @@
222
439
  "@iarna/toml": "2.2.5",
223
440
  "@isaacs/string-locale-compare": "1.1.0",
224
441
  "@npmcli/fs": "5.0.0",
225
- "@npmcli/installed-package-contents": "4.0.0",
226
- "@npmcli/map-workspaces": "5.0.1",
442
+ "@npmcli/map-workspaces": "5.0.3",
227
443
  "@npmcli/name-from-folder": "4.0.0",
228
- "@npmcli/package-json": "7.0.1",
444
+ "@npmcli/package-json": "7.0.4",
229
445
  "@npmcli/query": "5.0.0",
230
- "@npmcli/redact": "4.0.0",
231
446
  "ajv": "8.17.1",
232
447
  "ajv-formats": "3.0.1",
233
448
  "bin-links": "6.0.0",
234
449
  "cheerio": "1.1.2",
235
450
  "common-ancestor-path": "1.0.1",
236
451
  "edn-data": "1.1.2",
237
- "encoding": "0.1.13",
238
- "glob": "11.0.3",
452
+ "glob": "13.0.0",
239
453
  "global-agent": "3.0.0",
240
- "got": "14.6.0",
241
- "hosted-git-info": "9.0.2",
454
+ "got": "14.6.5",
242
455
  "iconv-lite": "0.7.0",
243
456
  "json-stringify-nice": "1.1.4",
244
457
  "jws": "4.0.0",
245
- "minimatch": "10.0.3",
458
+ "keyv": "5.5.4",
246
459
  "node-stream-zip": "1.15.0",
247
- "npm-install-checks": "8.0.0",
248
- "npm-normalize-package-bin": "5.0.0",
249
- "npm-package-arg": "13.0.1",
250
- "npm-pick-manifest": "11.0.3",
460
+ "npm-package-arg": "13.0.2",
251
461
  "packageurl-js": "1.0.2",
252
462
  "parse-conflict-json": "5.0.1",
253
- "prettify-xml": "1.2.0",
254
463
  "proc-log": "6.0.0",
255
464
  "proggy": "4.0.0",
256
- "promise-all-reject-late": "1.0.1",
257
- "promise-call-limit": "3.0.2",
258
465
  "properties-reader": "2.3.0",
259
466
  "read-package-json-fast": "5.0.0",
260
467
  "semver": "7.7.3",
261
468
  "ssri": "13.0.0",
262
469
  "table": "6.9.0",
263
- "tar": "7.5.1",
470
+ "tar": "7.5.2",
264
471
  "treeverse": "3.0.0",
265
- "uuid": "11.1.0",
472
+ "uuid": "13.0.0",
266
473
  "walk-up-path": "4.0.0",
267
474
  "xml-js": "1.6.11",
268
475
  "yaml": "2.8.1",
269
- "yargs": "17.7.2",
476
+ "yargs": "18.0.0",
270
477
  "yoctocolors": "2.1.2"
271
478
  },
272
479
  "devDependencies": {
273
- "@biomejs/biome": "2.3.0",
480
+ "@biomejs/biome": "2.3.7",
274
481
  "poku": "3.0.2",
275
482
  "typescript": "5.9.3"
276
483
  },
277
484
  "optionalDependencies": {
278
- "@appthreat/atom": "2.4.2",
485
+ "@appthreat/atom": "2.3.0",
279
486
  "@appthreat/cdx-proto": "1.1.4",
280
- "@bufbuild/protobuf": "2.10.0",
281
- "@cyclonedx/cdxgen-plugins-bin": "1.7.0",
282
- "@cyclonedx/cdxgen-plugins-bin-darwin-amd64": "1.7.0",
283
- "@cyclonedx/cdxgen-plugins-bin-darwin-arm64": "1.7.0",
284
- "@cyclonedx/cdxgen-plugins-bin-linux-amd64": "1.7.0",
285
- "@cyclonedx/cdxgen-plugins-bin-linux-arm": "1.7.0",
286
- "@cyclonedx/cdxgen-plugins-bin-linux-arm64": "1.7.0",
287
- "@cyclonedx/cdxgen-plugins-bin-linux-ppc64": "1.7.0",
288
- "@cyclonedx/cdxgen-plugins-bin-linuxmusl-amd64": "1.7.0",
289
- "@cyclonedx/cdxgen-plugins-bin-linuxmusl-arm64": "1.7.0",
290
- "@cyclonedx/cdxgen-plugins-bin-windows-amd64": "1.7.0",
291
- "@cyclonedx/cdxgen-plugins-bin-windows-arm64": "1.7.0",
487
+ "@bufbuild/protobuf": "2.10.1",
488
+ "@cyclonedx/cdxgen-plugins-bin": "1.8.0",
489
+ "@cyclonedx/cdxgen-plugins-bin-darwin-amd64": "1.8.0",
490
+ "@cyclonedx/cdxgen-plugins-bin-darwin-arm64": "1.8.0",
491
+ "@cyclonedx/cdxgen-plugins-bin-linux-amd64": "1.8.0",
492
+ "@cyclonedx/cdxgen-plugins-bin-linux-arm": "1.8.0",
493
+ "@cyclonedx/cdxgen-plugins-bin-linux-arm64": "1.8.0",
494
+ "@cyclonedx/cdxgen-plugins-bin-linux-ppc64": "1.8.0",
495
+ "@cyclonedx/cdxgen-plugins-bin-linuxmusl-amd64": "1.8.0",
496
+ "@cyclonedx/cdxgen-plugins-bin-linuxmusl-arm64": "1.8.0",
497
+ "@cyclonedx/cdxgen-plugins-bin-windows-amd64": "1.8.0",
498
+ "@cyclonedx/cdxgen-plugins-bin-windows-arm64": "1.8.0",
292
499
  "body-parser": "2.2.0",
293
500
  "compression": "1.8.1",
294
501
  "connect": "3.7.0",
@@ -297,29 +504,30 @@
297
504
  "sqlite3": "npm:@appthreat/sqlite3@6.0.9"
298
505
  },
299
506
  "engines": {
300
- "node": ">=20",
507
+ "node": "^20 || ^22 || ^24",
301
508
  "pnpm": ">=10"
302
509
  },
303
510
  "devEngines": {
304
511
  "runtime": [
305
512
  {
306
513
  "name": "node",
307
- "version": "24.10.0",
514
+ "version": ">=24",
308
515
  "onFail": "ignore"
309
516
  },
310
517
  {
311
518
  "name": "bun",
312
- "version": "1.3.1",
519
+ "version": "1.3.3",
313
520
  "onFail": "ignore"
314
521
  },
315
522
  {
316
523
  "name": "deno",
317
- "version": "2.5.4",
524
+ "version": "2.5.6",
318
525
  "onFail": "ignore"
319
526
  }
320
527
  ]
321
528
  },
322
529
  "scripts": {
530
+ "dependencies": "node bin/dependencies.js",
323
531
  "gen-types": "npx -p typescript tsc",
324
532
  "install:frozen": "pnpm install --config.strict-dep-builds=true --frozen-lockfile --package-import-method copy",
325
533
  "install:prod": "pnpm install --config.strict-dep-builds=true --frozen-lockfile --package-import-method copy --prod",