@cdxgen/cdxgen 0.0.1 → 13.0.1

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 (722) hide show
  1. package/README.md +921 -87
  2. package/bin/audit.js +239 -0
  3. package/bin/cdxgen.js +2335 -0
  4. package/bin/convert.js +220 -0
  5. package/bin/evinse.js +353 -0
  6. package/bin/hbom.js +504 -0
  7. package/bin/repl.js +2224 -0
  8. package/bin/sign.js +195 -0
  9. package/bin/tracebom.js +303 -0
  10. package/bin/validate.js +268 -0
  11. package/bin/verify.js +189 -0
  12. package/data/README.md +307 -0
  13. package/data/bom-1.4.schema.json +1605 -0
  14. package/data/bom-1.5.schema.json +3660 -0
  15. package/data/bom-1.6.schema.json +5511 -0
  16. package/data/bom-1.7.schema.json +6700 -0
  17. package/data/cbomosdb-queries.json +68 -0
  18. package/data/component-tags.json +339 -0
  19. package/data/container-knowledge-index.json +125 -0
  20. package/data/cosdb-queries.json +17 -0
  21. package/data/crypto-oid.json +1998 -0
  22. package/data/cryptography-defs.json +3793 -0
  23. package/data/cryptography-defs.schema.json +576 -0
  24. package/data/cyclonedx-2.0-bundled.schema.json +7182 -0
  25. package/data/frameworks-list.json +219 -0
  26. package/data/glibc-stdlib.json +117 -0
  27. package/data/gtfobins-index.json +6296 -0
  28. package/data/helpers/init.gradle +71 -0
  29. package/data/jsf-0.82.schema.json +211 -0
  30. package/data/known-licenses.json +82 -0
  31. package/data/lic-mapping.json +338 -0
  32. package/data/license-aliases.json +6624 -0
  33. package/data/license-db.json +39059 -0
  34. package/data/license-deprecations.json +302 -0
  35. package/data/lolbas-index.json +150 -0
  36. package/data/predictive-audit-allowlist.json +11 -0
  37. package/data/pypi-pkg-aliases.json +1199 -0
  38. package/data/python-stdlib.json +308 -0
  39. package/data/queries-darwin.json +193 -0
  40. package/data/queries-win.json +257 -0
  41. package/data/queries.json +268 -0
  42. package/data/ruby-known-modules.json +281 -0
  43. package/data/rules/ai-agent-governance.yaml +323 -0
  44. package/data/rules/ai-bom.yaml +268 -0
  45. package/data/rules/ai-oversight.yaml +186 -0
  46. package/data/rules/ai-provenance.yaml +92 -0
  47. package/data/rules/asar-archives.yaml +150 -0
  48. package/data/rules/cbom-security.yaml +165 -0
  49. package/data/rules/chrome-extensions.yaml +248 -0
  50. package/data/rules/ci-permissions.yaml +802 -0
  51. package/data/rules/container-risk.yaml +353 -0
  52. package/data/rules/dependency-sources.yaml +236 -0
  53. package/data/rules/golem-go.yaml +229 -0
  54. package/data/rules/hbom-compliance.yaml +325 -0
  55. package/data/rules/hbom-performance.yaml +307 -0
  56. package/data/rules/hbom-security.yaml +248 -0
  57. package/data/rules/host-topology.yaml +165 -0
  58. package/data/rules/mcp-servers.yaml +388 -0
  59. package/data/rules/obom-runtime.yaml +1776 -0
  60. package/data/rules/package-integrity.yaml +364 -0
  61. package/data/rules/rootfs-hardening.yaml +179 -0
  62. package/data/rules/vscode-extensions.yaml +237 -0
  63. package/data/spdx-export.schema.json +6794 -0
  64. package/data/spdx-license-list.json +7449 -0
  65. package/data/spdx-licenses.json +759 -0
  66. package/data/spdx.schema.json +819 -0
  67. package/data/templates/README.md +3 -0
  68. package/data/templates/asvs-4.0.3.cdx.json +2943 -0
  69. package/data/templates/asvs-5.0.cdx.json +3046 -0
  70. package/data/templates/bsimm-v13.cdx.json +1008 -0
  71. package/data/templates/masvs-2.0.0.cdx.json +225 -0
  72. package/data/templates/nist-ssdf-1.1.cdx.json +828 -0
  73. package/data/templates/pcissc-secure-slc-1.1.cdx.json +1027 -0
  74. package/data/templates/scvs-1.0.0.cdx.json +813 -0
  75. package/data/templates/ssaf-DRAFT-2023-11.cdx.json +127 -0
  76. package/data/vendor-alias.json +41967 -0
  77. package/data/wrapdb-releases.json +4227 -0
  78. package/index.cjs +15 -0
  79. package/lib/audit/index.js +2800 -0
  80. package/lib/audit/progress.js +114 -0
  81. package/lib/audit/reporters.js +937 -0
  82. package/lib/audit/scoring.js +560 -0
  83. package/lib/audit/targets.js +798 -0
  84. package/lib/cli/bomAssembly.js +1882 -0
  85. package/lib/cli/cliOptions.js +543 -0
  86. package/lib/cli/index.js +2759 -0
  87. package/lib/cli/jsBom.js +2087 -0
  88. package/lib/cli/jvmBom.js +1858 -0
  89. package/lib/cli/managedBom.js +2083 -0
  90. package/lib/cli/nativeBom.js +2125 -0
  91. package/lib/core/activity.js +1087 -0
  92. package/lib/core/env.js +719 -0
  93. package/lib/core/fs.js +1058 -0
  94. package/lib/core/httpClient.js +730 -0
  95. package/lib/core/logger.js +280 -0
  96. package/lib/core/parallel.js +323 -0
  97. package/lib/core/paths.js +70 -0
  98. package/lib/core/projectConfig.js +122 -0
  99. package/lib/core/propertySanitizer.js +174 -0
  100. package/lib/core/spdx.js +5 -0
  101. package/lib/core/state.js +59 -0
  102. package/lib/core/text.js +207 -0
  103. package/lib/core/ui.js +920 -0
  104. package/lib/core/urls.js +84 -0
  105. package/lib/ecosystems/asarutils.js +1636 -0
  106. package/lib/ecosystems/bunutils.js +402 -0
  107. package/lib/ecosystems/caxa.js +77 -0
  108. package/lib/ecosystems/chromextutils.js +1174 -0
  109. package/lib/ecosystems/cmakeResolver.js +587 -0
  110. package/lib/ecosystems/cppEvidence.js +305 -0
  111. package/lib/ecosystems/denoutils.js +1094 -0
  112. package/lib/ecosystems/dotnetutils.js +132 -0
  113. package/lib/ecosystems/ecosystems.js +2772 -0
  114. package/lib/ecosystems/golem.js +1807 -0
  115. package/lib/ecosystems/gradleutils.js +1048 -0
  116. package/lib/ecosystems/jsEvidence.js +317 -0
  117. package/lib/ecosystems/npmutils.js +586 -0
  118. package/lib/ecosystems/parsers-bazel.js +875 -0
  119. package/lib/ecosystems/parsers-dotnet.js +1430 -0
  120. package/lib/ecosystems/parsers-gleam.js +302 -0
  121. package/lib/ecosystems/parsers-go.js +818 -0
  122. package/lib/ecosystems/parsers-js.js +4222 -0
  123. package/lib/ecosystems/parsers-jvm.js +948 -0
  124. package/lib/ecosystems/parsers-misc.js +3191 -0
  125. package/lib/ecosystems/parsers-python.js +2070 -0
  126. package/lib/ecosystems/parsers-rust.js +1294 -0
  127. package/lib/ecosystems/parsers-zig.js +861 -0
  128. package/lib/ecosystems/pep770.js +341 -0
  129. package/lib/ecosystems/pylockutils.js +427 -0
  130. package/lib/ecosystems/pythonutils.js +1281 -0
  131. package/lib/ecosystems/registryProvenance.js +1003 -0
  132. package/lib/ecosystems/remote/huggingface.js +1343 -0
  133. package/lib/ecosystems/rubyutils.js +1629 -0
  134. package/lib/ecosystems/rusi.js +820 -0
  135. package/lib/ecosystems/sbtutils.js +972 -0
  136. package/lib/ecosystems/tea.js +607 -0
  137. package/lib/ecosystems/utils.js +583 -0
  138. package/lib/ecosystems/zigResolver.js +410 -0
  139. package/lib/evinser/db.js +145 -0
  140. package/lib/evinser/evinser.js +2362 -0
  141. package/lib/evinser/scalasem.js +65 -0
  142. package/lib/evinser/swiftsem.js +767 -0
  143. package/lib/helpers/annotationFormatter.js +84 -0
  144. package/lib/helpers/bomSigner.js +312 -0
  145. package/lib/helpers/exportUtils.js +160 -0
  146. package/lib/helpers/remote/dependency-track.js +117 -0
  147. package/lib/helpers/versutils.js +202 -0
  148. package/lib/helpers/vsixutils.js +1069 -0
  149. package/lib/inventory/agentFormulationParser.js +322 -0
  150. package/lib/inventory/aiCollector.js +2140 -0
  151. package/lib/inventory/aiInventory.js +414 -0
  152. package/lib/inventory/aiModelVariants.js +121 -0
  153. package/lib/inventory/aiOversightCollector.js +661 -0
  154. package/lib/inventory/aiProvenanceCollector.js +822 -0
  155. package/lib/inventory/analyzer.js +6089 -0
  156. package/lib/inventory/analyzerScope.js +807 -0
  157. package/lib/inventory/astWorker.js +20 -0
  158. package/lib/inventory/atomUtils.js +1092 -0
  159. package/lib/inventory/auditCategories.js +192 -0
  160. package/lib/inventory/bomUtils.js +369 -0
  161. package/lib/inventory/cacheCommands.js +182 -0
  162. package/lib/inventory/cacheDir.js +104 -0
  163. package/lib/inventory/cbomutils.js +590 -0
  164. package/lib/inventory/cdxrs.js +434 -0
  165. package/lib/inventory/ciParsers/azurePipelines.js +295 -0
  166. package/lib/inventory/ciParsers/circleCi.js +286 -0
  167. package/lib/inventory/ciParsers/common.js +24 -0
  168. package/lib/inventory/ciParsers/githubActions.js +2434 -0
  169. package/lib/inventory/ciParsers/gitlabCi.js +213 -0
  170. package/lib/inventory/ciParsers/jenkins.js +180 -0
  171. package/lib/inventory/citations.js +234 -0
  172. package/lib/inventory/communityAiConfigParser.js +756 -0
  173. package/lib/inventory/containerRisk.js +204 -0
  174. package/lib/inventory/cryptoAlgorithmFamily.js +258 -0
  175. package/lib/inventory/deps.js +807 -0
  176. package/lib/inventory/depsUtils.js +588 -0
  177. package/lib/inventory/display.js +2128 -0
  178. package/lib/inventory/dosai.js +601 -0
  179. package/lib/inventory/dosaiParsers.js +154 -0
  180. package/lib/inventory/dynamic.js +145 -0
  181. package/lib/inventory/envcontext.js +1793 -0
  182. package/lib/inventory/evidenceUtils.js +774 -0
  183. package/lib/inventory/fetchBatch.js +779 -0
  184. package/lib/inventory/fetchRate.js +255 -0
  185. package/lib/inventory/forgeEnricher.js +300 -0
  186. package/lib/inventory/formulationParsers.js +422 -0
  187. package/lib/inventory/gtfobins.js +339 -0
  188. package/lib/inventory/hbom.js +719 -0
  189. package/lib/inventory/hbomAnalysis.js +310 -0
  190. package/lib/inventory/hbomLoader.js +35 -0
  191. package/lib/inventory/hostTopology.js +835 -0
  192. package/lib/inventory/inventoryStats.js +100 -0
  193. package/lib/inventory/jsonLike.js +121 -0
  194. package/lib/inventory/licenseEnhancer.js +918 -0
  195. package/lib/inventory/lolbas.js +285 -0
  196. package/lib/inventory/mcp.js +253 -0
  197. package/lib/inventory/mcpConfigParser.js +683 -0
  198. package/lib/inventory/mcpDiscovery.js +112 -0
  199. package/lib/inventory/mcpPinning.js +209 -0
  200. package/lib/inventory/osPackageResolver.js +493 -0
  201. package/lib/inventory/osinfo.js +383 -0
  202. package/lib/inventory/osqueryTransform.js +274 -0
  203. package/lib/inventory/plugins.js +466 -0
  204. package/lib/inventory/protobom.js +231 -0
  205. package/lib/inventory/protobomLoader.js +43 -0
  206. package/lib/inventory/provenanceUtils.js +224 -0
  207. package/lib/inventory/purl.js +749 -0
  208. package/lib/inventory/rustFormulationParser.js +339 -0
  209. package/lib/inventory/sbomDocument.js +340 -0
  210. package/lib/inventory/source.js +1488 -0
  211. package/lib/inventory/spdx.js +361 -0
  212. package/lib/inventory/spdxExpression.js +512 -0
  213. package/lib/inventory/spdxUtils.js +107 -0
  214. package/lib/inventory/table.js +267 -0
  215. package/lib/inventory/traceRunner.js +439 -0
  216. package/lib/inventory/unicodeScan.js +147 -0
  217. package/lib/managers/binary.js +3459 -0
  218. package/lib/managers/containerutils.js +125 -0
  219. package/lib/managers/docker.js +2145 -0
  220. package/lib/managers/dockerConnection.js +162 -0
  221. package/lib/managers/oci.js +704 -0
  222. package/lib/managers/piptree.js +267 -0
  223. package/lib/parsers/cmakeCache.js +199 -0
  224. package/lib/parsers/gguf.js +492 -0
  225. package/lib/parsers/gitAiNotes.js +233 -0
  226. package/lib/parsers/gitmodules.js +239 -0
  227. package/lib/parsers/htmlExtract.js +610 -0
  228. package/lib/parsers/huggingfaceManifest.js +551 -0
  229. package/lib/parsers/huggingfaceUtils.js +506 -0
  230. package/lib/parsers/iri.js +618 -0
  231. package/lib/parsers/npmrc.js +99 -0
  232. package/lib/parsers/ollama.js +101 -0
  233. package/lib/parsers/xml.js +841 -0
  234. package/lib/server/openapi.yaml +433 -0
  235. package/lib/server/server.js +616 -0
  236. package/lib/stages/postgen/annotator.js +977 -0
  237. package/lib/stages/postgen/auditBom.js +468 -0
  238. package/lib/stages/postgen/postgen.js +1239 -0
  239. package/lib/stages/postgen/ruleEngine.js +731 -0
  240. package/lib/stages/postgen/sortBom.js +195 -0
  241. package/lib/stages/postgen/spdxConverter.js +796 -0
  242. package/lib/stages/postgen/specVersionCompat.js +703 -0
  243. package/lib/stages/pregen/envAudit.js +388 -0
  244. package/lib/stages/pregen/pregen.js +637 -0
  245. package/lib/third-party/README.md +9 -0
  246. package/lib/third-party/arborist/CHANGELOG.md +1109 -0
  247. package/lib/third-party/arborist/LICENSE.md +20 -0
  248. package/lib/third-party/arborist/README.md +315 -0
  249. package/lib/third-party/arborist/lib/arborist/index.js +258 -0
  250. package/lib/third-party/arborist/lib/arborist/load-actual.js +605 -0
  251. package/lib/third-party/arborist/lib/arborist/load-virtual.js +300 -0
  252. package/lib/third-party/arborist/lib/bin-links.js +120 -0
  253. package/lib/third-party/arborist/lib/calc-dep-flags.js +130 -0
  254. package/lib/third-party/arborist/lib/case-insensitive-map.js +51 -0
  255. package/lib/third-party/arborist/lib/consistent-resolve.js +42 -0
  256. package/lib/third-party/arborist/lib/debug.js +50 -0
  257. package/lib/third-party/arborist/lib/dep-valid.js +190 -0
  258. package/lib/third-party/arborist/lib/edge.js +417 -0
  259. package/lib/third-party/arborist/lib/from-path.js +36 -0
  260. package/lib/third-party/arborist/lib/gather-dep-set.js +43 -0
  261. package/lib/third-party/arborist/lib/index.js +22 -0
  262. package/lib/third-party/arborist/lib/inventory.js +138 -0
  263. package/lib/third-party/arborist/lib/link.js +169 -0
  264. package/lib/third-party/arborist/lib/node.js +1673 -0
  265. package/lib/third-party/arborist/lib/npm-extension.js +45 -0
  266. package/lib/third-party/arborist/lib/override-resolves.js +11 -0
  267. package/lib/third-party/arborist/lib/override-set.js +319 -0
  268. package/lib/third-party/arborist/lib/package-extensions.js +289 -0
  269. package/lib/third-party/arborist/lib/printable.js +210 -0
  270. package/lib/third-party/arborist/lib/proc-log.js +30 -0
  271. package/lib/third-party/arborist/lib/realpath.js +100 -0
  272. package/lib/third-party/arborist/lib/relpath.js +4 -0
  273. package/lib/third-party/arborist/lib/shrinkwrap.js +1291 -0
  274. package/lib/third-party/arborist/lib/spec-from-lock.js +34 -0
  275. package/lib/third-party/arborist/lib/tree-check.js +165 -0
  276. package/lib/third-party/arborist/lib/validate-npm-package-name.js +107 -0
  277. package/lib/third-party/arborist/lib/version-from-tgz.js +51 -0
  278. package/lib/third-party/arborist/lib/yarn-lock.js +397 -0
  279. package/lib/validator/bomValidator.js +985 -0
  280. package/lib/validator/complianceEngine.js +241 -0
  281. package/lib/validator/complianceRules.js +1680 -0
  282. package/lib/validator/generated/runtime.mjs +17 -0
  283. package/lib/validator/generated/validate-1.6.mjs +21258 -0
  284. package/lib/validator/generated/validate-1.7.mjs +24803 -0
  285. package/lib/validator/generated/validate-2.0.mjs +22931 -0
  286. package/lib/validator/index.js +246 -0
  287. package/lib/validator/reporters/annotations.js +142 -0
  288. package/lib/validator/reporters/console.js +160 -0
  289. package/lib/validator/reporters/index.js +41 -0
  290. package/lib/validator/reporters/json.js +37 -0
  291. package/lib/validator/reporters/sarif.js +184 -0
  292. package/package.json +209 -26
  293. package/types/bin/audit.d.ts +3 -0
  294. package/types/bin/audit.d.ts.map +1 -0
  295. package/types/bin/cdxgen.d.ts +3 -0
  296. package/types/bin/cdxgen.d.ts.map +1 -0
  297. package/types/bin/convert.d.ts +3 -0
  298. package/types/bin/convert.d.ts.map +1 -0
  299. package/types/bin/evinse.d.ts +3 -0
  300. package/types/bin/evinse.d.ts.map +1 -0
  301. package/types/bin/hbom.d.ts +3 -0
  302. package/types/bin/hbom.d.ts.map +1 -0
  303. package/types/bin/repl.d.ts +3 -0
  304. package/types/bin/repl.d.ts.map +1 -0
  305. package/types/bin/sign.d.ts +3 -0
  306. package/types/bin/sign.d.ts.map +1 -0
  307. package/types/bin/tracebom.d.ts +3 -0
  308. package/types/bin/tracebom.d.ts.map +1 -0
  309. package/types/bin/validate.d.ts +14 -0
  310. package/types/bin/validate.d.ts.map +1 -0
  311. package/types/bin/verify.d.ts +3 -0
  312. package/types/bin/verify.d.ts.map +1 -0
  313. package/types/lib/audit/index.d.ts +153 -0
  314. package/types/lib/audit/index.d.ts.map +1 -0
  315. package/types/lib/audit/progress.d.ts +31 -0
  316. package/types/lib/audit/progress.d.ts.map +1 -0
  317. package/types/lib/audit/reporters.d.ts +62 -0
  318. package/types/lib/audit/reporters.d.ts.map +1 -0
  319. package/types/lib/audit/scoring.d.ts +36 -0
  320. package/types/lib/audit/scoring.d.ts.map +1 -0
  321. package/types/lib/audit/targets.d.ts +77 -0
  322. package/types/lib/audit/targets.d.ts.map +1 -0
  323. package/types/lib/cli/bomAssembly.d.ts +329 -0
  324. package/types/lib/cli/bomAssembly.d.ts.map +1 -0
  325. package/types/lib/cli/cliOptions.d.ts +156 -0
  326. package/types/lib/cli/cliOptions.d.ts.map +1 -0
  327. package/types/lib/cli/index.d.ts +107 -0
  328. package/types/lib/cli/index.d.ts.map +1 -0
  329. package/types/lib/cli/jsBom.d.ts +94 -0
  330. package/types/lib/cli/jsBom.d.ts.map +1 -0
  331. package/types/lib/cli/jvmBom.d.ts +54 -0
  332. package/types/lib/cli/jvmBom.d.ts.map +1 -0
  333. package/types/lib/cli/managedBom.d.ts +105 -0
  334. package/types/lib/cli/managedBom.d.ts.map +1 -0
  335. package/types/lib/cli/nativeBom.d.ts +143 -0
  336. package/types/lib/cli/nativeBom.d.ts.map +1 -0
  337. package/types/lib/core/activity.d.ts +178 -0
  338. package/types/lib/core/activity.d.ts.map +1 -0
  339. package/types/lib/core/env.d.ts +192 -0
  340. package/types/lib/core/env.d.ts.map +1 -0
  341. package/types/lib/core/fs.d.ts +158 -0
  342. package/types/lib/core/fs.d.ts.map +1 -0
  343. package/types/lib/core/httpClient.d.ts +149 -0
  344. package/types/lib/core/httpClient.d.ts.map +1 -0
  345. package/types/lib/core/logger.d.ts +50 -0
  346. package/types/lib/core/logger.d.ts.map +1 -0
  347. package/types/lib/core/parallel.d.ts +95 -0
  348. package/types/lib/core/parallel.d.ts.map +1 -0
  349. package/types/lib/core/paths.d.ts +36 -0
  350. package/types/lib/core/paths.d.ts.map +1 -0
  351. package/types/lib/core/projectConfig.d.ts +23 -0
  352. package/types/lib/core/projectConfig.d.ts.map +1 -0
  353. package/types/lib/core/propertySanitizer.d.ts +23 -0
  354. package/types/lib/core/propertySanitizer.d.ts.map +1 -0
  355. package/types/lib/core/spdx.d.ts +5 -0
  356. package/types/lib/core/spdx.d.ts.map +1 -0
  357. package/types/lib/core/state.d.ts +20 -0
  358. package/types/lib/core/state.d.ts.map +1 -0
  359. package/types/lib/core/text.d.ts +78 -0
  360. package/types/lib/core/text.d.ts.map +1 -0
  361. package/types/lib/core/ui.d.ts +87 -0
  362. package/types/lib/core/ui.d.ts.map +1 -0
  363. package/types/lib/core/urls.d.ts +43 -0
  364. package/types/lib/core/urls.d.ts.map +1 -0
  365. package/types/lib/ecosystems/asarutils.d.ts +71 -0
  366. package/types/lib/ecosystems/asarutils.d.ts.map +1 -0
  367. package/types/lib/ecosystems/bunutils.d.ts +38 -0
  368. package/types/lib/ecosystems/bunutils.d.ts.map +1 -0
  369. package/types/lib/ecosystems/caxa.d.ts +8 -0
  370. package/types/lib/ecosystems/caxa.d.ts.map +1 -0
  371. package/types/lib/ecosystems/chromextutils.d.ts +97 -0
  372. package/types/lib/ecosystems/chromextutils.d.ts.map +1 -0
  373. package/types/lib/ecosystems/cmakeResolver.d.ts +176 -0
  374. package/types/lib/ecosystems/cmakeResolver.d.ts.map +1 -0
  375. package/types/lib/ecosystems/cppEvidence.d.ts +35 -0
  376. package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -0
  377. package/types/lib/ecosystems/denoutils.d.ts +76 -0
  378. package/types/lib/ecosystems/denoutils.d.ts.map +1 -0
  379. package/types/lib/ecosystems/dotnetutils.d.ts +45 -0
  380. package/types/lib/ecosystems/dotnetutils.d.ts.map +1 -0
  381. package/types/lib/ecosystems/ecosystems.d.ts +279 -0
  382. package/types/lib/ecosystems/ecosystems.d.ts.map +1 -0
  383. package/types/lib/ecosystems/golem.d.ts +60 -0
  384. package/types/lib/ecosystems/golem.d.ts.map +1 -0
  385. package/types/lib/ecosystems/gradleutils.d.ts +139 -0
  386. package/types/lib/ecosystems/gradleutils.d.ts.map +1 -0
  387. package/types/lib/ecosystems/jsEvidence.d.ts +17 -0
  388. package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -0
  389. package/types/lib/ecosystems/npmutils.d.ts +183 -0
  390. package/types/lib/ecosystems/npmutils.d.ts.map +1 -0
  391. package/types/lib/ecosystems/parsers-bazel.d.ts +36 -0
  392. package/types/lib/ecosystems/parsers-bazel.d.ts.map +1 -0
  393. package/types/lib/ecosystems/parsers-dotnet.d.ts +116 -0
  394. package/types/lib/ecosystems/parsers-dotnet.d.ts.map +1 -0
  395. package/types/lib/ecosystems/parsers-gleam.d.ts +33 -0
  396. package/types/lib/ecosystems/parsers-gleam.d.ts.map +1 -0
  397. package/types/lib/ecosystems/parsers-go.d.ts +92 -0
  398. package/types/lib/ecosystems/parsers-go.d.ts.map +1 -0
  399. package/types/lib/ecosystems/parsers-js.d.ts +242 -0
  400. package/types/lib/ecosystems/parsers-js.d.ts.map +1 -0
  401. package/types/lib/ecosystems/parsers-jvm.d.ts +100 -0
  402. package/types/lib/ecosystems/parsers-jvm.d.ts.map +1 -0
  403. package/types/lib/ecosystems/parsers-misc.d.ts +450 -0
  404. package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -0
  405. package/types/lib/ecosystems/parsers-python.d.ts +145 -0
  406. package/types/lib/ecosystems/parsers-python.d.ts.map +1 -0
  407. package/types/lib/ecosystems/parsers-rust.d.ts +56 -0
  408. package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -0
  409. package/types/lib/ecosystems/parsers-zig.d.ts +83 -0
  410. package/types/lib/ecosystems/parsers-zig.d.ts.map +1 -0
  411. package/types/lib/ecosystems/pep770.d.ts +38 -0
  412. package/types/lib/ecosystems/pep770.d.ts.map +1 -0
  413. package/types/lib/ecosystems/pylockutils.d.ts +68 -0
  414. package/types/lib/ecosystems/pylockutils.d.ts.map +1 -0
  415. package/types/lib/ecosystems/pythonutils.d.ts +70 -0
  416. package/types/lib/ecosystems/pythonutils.d.ts.map +1 -0
  417. package/types/lib/ecosystems/registryProvenance.d.ts +26 -0
  418. package/types/lib/ecosystems/registryProvenance.d.ts.map +1 -0
  419. package/types/lib/ecosystems/remote/huggingface.d.ts +31 -0
  420. package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -0
  421. package/types/lib/ecosystems/rubyutils.d.ts +182 -0
  422. package/types/lib/ecosystems/rubyutils.d.ts.map +1 -0
  423. package/types/lib/ecosystems/rusi.d.ts +40 -0
  424. package/types/lib/ecosystems/rusi.d.ts.map +1 -0
  425. package/types/lib/ecosystems/sbtutils.d.ts +179 -0
  426. package/types/lib/ecosystems/sbtutils.d.ts.map +1 -0
  427. package/types/lib/ecosystems/tea.d.ts +180 -0
  428. package/types/lib/ecosystems/tea.d.ts.map +1 -0
  429. package/types/lib/ecosystems/utils.d.ts +41 -0
  430. package/types/lib/ecosystems/utils.d.ts.map +1 -0
  431. package/types/lib/ecosystems/zigResolver.d.ts +70 -0
  432. package/types/lib/ecosystems/zigResolver.d.ts.map +1 -0
  433. package/types/lib/evinser/db.d.ts +17 -0
  434. package/types/lib/evinser/db.d.ts.map +1 -0
  435. package/types/lib/evinser/evinser.d.ts +354 -0
  436. package/types/lib/evinser/evinser.d.ts.map +1 -0
  437. package/types/lib/evinser/scalasem.d.ts +15 -0
  438. package/types/lib/evinser/scalasem.d.ts.map +1 -0
  439. package/types/lib/evinser/swiftsem.d.ts +103 -0
  440. package/types/lib/evinser/swiftsem.d.ts.map +1 -0
  441. package/types/lib/helpers/annotationFormatter.d.ts +23 -0
  442. package/types/lib/helpers/annotationFormatter.d.ts.map +1 -0
  443. package/types/lib/helpers/bomSigner.d.ts +28 -0
  444. package/types/lib/helpers/bomSigner.d.ts.map +1 -0
  445. package/types/lib/helpers/exportUtils.d.ts +52 -0
  446. package/types/lib/helpers/exportUtils.d.ts.map +1 -0
  447. package/types/lib/helpers/remote/dependency-track.d.ts +23 -0
  448. package/types/lib/helpers/remote/dependency-track.d.ts.map +1 -0
  449. package/types/lib/helpers/versutils.d.ts +8 -0
  450. package/types/lib/helpers/versutils.d.ts.map +1 -0
  451. package/types/lib/helpers/vsixutils.d.ts +130 -0
  452. package/types/lib/helpers/vsixutils.d.ts.map +1 -0
  453. package/types/lib/inventory/agentFormulationParser.d.ts +21 -0
  454. package/types/lib/inventory/agentFormulationParser.d.ts.map +1 -0
  455. package/types/lib/inventory/aiCollector.d.ts +61 -0
  456. package/types/lib/inventory/aiCollector.d.ts.map +1 -0
  457. package/types/lib/inventory/aiInventory.d.ts +103 -0
  458. package/types/lib/inventory/aiInventory.d.ts.map +1 -0
  459. package/types/lib/inventory/aiModelVariants.d.ts +31 -0
  460. package/types/lib/inventory/aiModelVariants.d.ts.map +1 -0
  461. package/types/lib/inventory/aiOversightCollector.d.ts +28 -0
  462. package/types/lib/inventory/aiOversightCollector.d.ts.map +1 -0
  463. package/types/lib/inventory/aiProvenanceCollector.d.ts +13 -0
  464. package/types/lib/inventory/aiProvenanceCollector.d.ts.map +1 -0
  465. package/types/lib/inventory/analyzer.d.ts +157 -0
  466. package/types/lib/inventory/analyzer.d.ts.map +1 -0
  467. package/types/lib/inventory/analyzerScope.d.ts +106 -0
  468. package/types/lib/inventory/analyzerScope.d.ts.map +1 -0
  469. package/types/lib/inventory/astWorker.d.ts +9 -0
  470. package/types/lib/inventory/astWorker.d.ts.map +1 -0
  471. package/types/lib/inventory/atomUtils.d.ts +159 -0
  472. package/types/lib/inventory/atomUtils.d.ts.map +1 -0
  473. package/types/lib/inventory/auditCategories.d.ts +80 -0
  474. package/types/lib/inventory/auditCategories.d.ts.map +1 -0
  475. package/types/lib/inventory/bomUtils.d.ts +145 -0
  476. package/types/lib/inventory/bomUtils.d.ts.map +1 -0
  477. package/types/lib/inventory/cacheCommands.d.ts +28 -0
  478. package/types/lib/inventory/cacheCommands.d.ts.map +1 -0
  479. package/types/lib/inventory/cacheDir.d.ts +55 -0
  480. package/types/lib/inventory/cacheDir.d.ts.map +1 -0
  481. package/types/lib/inventory/cbomutils.d.ts +37 -0
  482. package/types/lib/inventory/cbomutils.d.ts.map +1 -0
  483. package/types/lib/inventory/cdxrs.d.ts +90 -0
  484. package/types/lib/inventory/cdxrs.d.ts.map +1 -0
  485. package/types/lib/inventory/ciParsers/azurePipelines.d.ts +27 -0
  486. package/types/lib/inventory/ciParsers/azurePipelines.d.ts.map +1 -0
  487. package/types/lib/inventory/ciParsers/circleCi.d.ts +27 -0
  488. package/types/lib/inventory/ciParsers/circleCi.d.ts.map +1 -0
  489. package/types/lib/inventory/ciParsers/common.d.ts +11 -0
  490. package/types/lib/inventory/ciParsers/common.d.ts.map +1 -0
  491. package/types/lib/inventory/ciParsers/githubActions.d.ts +38 -0
  492. package/types/lib/inventory/ciParsers/githubActions.d.ts.map +1 -0
  493. package/types/lib/inventory/ciParsers/gitlabCi.d.ts +26 -0
  494. package/types/lib/inventory/ciParsers/gitlabCi.d.ts.map +1 -0
  495. package/types/lib/inventory/ciParsers/jenkins.d.ts +26 -0
  496. package/types/lib/inventory/ciParsers/jenkins.d.ts.map +1 -0
  497. package/types/lib/inventory/citations.d.ts +90 -0
  498. package/types/lib/inventory/citations.d.ts.map +1 -0
  499. package/types/lib/inventory/communityAiConfigParser.d.ts +14 -0
  500. package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -0
  501. package/types/lib/inventory/containerRisk.d.ts +20 -0
  502. package/types/lib/inventory/containerRisk.d.ts.map +1 -0
  503. package/types/lib/inventory/cryptoAlgorithmFamily.d.ts +37 -0
  504. package/types/lib/inventory/cryptoAlgorithmFamily.d.ts.map +1 -0
  505. package/types/lib/inventory/deps.d.ts +140 -0
  506. package/types/lib/inventory/deps.d.ts.map +1 -0
  507. package/types/lib/inventory/depsUtils.d.ts +74 -0
  508. package/types/lib/inventory/depsUtils.d.ts.map +1 -0
  509. package/types/lib/inventory/display.d.ts +227 -0
  510. package/types/lib/inventory/display.d.ts.map +1 -0
  511. package/types/lib/inventory/dosai.d.ts +130 -0
  512. package/types/lib/inventory/dosai.d.ts.map +1 -0
  513. package/types/lib/inventory/dosaiParsers.d.ts +59 -0
  514. package/types/lib/inventory/dosaiParsers.d.ts.map +1 -0
  515. package/types/lib/inventory/dynamic.d.ts +25 -0
  516. package/types/lib/inventory/dynamic.d.ts.map +1 -0
  517. package/types/lib/inventory/envcontext.d.ts +377 -0
  518. package/types/lib/inventory/envcontext.d.ts.map +1 -0
  519. package/types/lib/inventory/evidenceUtils.d.ts +74 -0
  520. package/types/lib/inventory/evidenceUtils.d.ts.map +1 -0
  521. package/types/lib/inventory/fetchBatch.d.ts +127 -0
  522. package/types/lib/inventory/fetchBatch.d.ts.map +1 -0
  523. package/types/lib/inventory/fetchRate.d.ts +118 -0
  524. package/types/lib/inventory/fetchRate.d.ts.map +1 -0
  525. package/types/lib/inventory/forgeEnricher.d.ts +31 -0
  526. package/types/lib/inventory/forgeEnricher.d.ts.map +1 -0
  527. package/types/lib/inventory/formulationParsers.d.ts +50 -0
  528. package/types/lib/inventory/formulationParsers.d.ts.map +1 -0
  529. package/types/lib/inventory/gtfobins.d.ts +27 -0
  530. package/types/lib/inventory/gtfobins.d.ts.map +1 -0
  531. package/types/lib/inventory/hbom.d.ts +58 -0
  532. package/types/lib/inventory/hbom.d.ts.map +1 -0
  533. package/types/lib/inventory/hbomAnalysis.d.ts +56 -0
  534. package/types/lib/inventory/hbomAnalysis.d.ts.map +1 -0
  535. package/types/lib/inventory/hbomLoader.d.ts +7 -0
  536. package/types/lib/inventory/hbomLoader.d.ts.map +1 -0
  537. package/types/lib/inventory/hostTopology.d.ts +47 -0
  538. package/types/lib/inventory/hostTopology.d.ts.map +1 -0
  539. package/types/lib/inventory/inventoryStats.d.ts +42 -0
  540. package/types/lib/inventory/inventoryStats.d.ts.map +1 -0
  541. package/types/lib/inventory/jsonLike.d.ts +23 -0
  542. package/types/lib/inventory/jsonLike.d.ts.map +1 -0
  543. package/types/lib/inventory/licenseEnhancer.d.ts +70 -0
  544. package/types/lib/inventory/licenseEnhancer.d.ts.map +1 -0
  545. package/types/lib/inventory/lolbas.d.ts +16 -0
  546. package/types/lib/inventory/lolbas.d.ts.map +1 -0
  547. package/types/lib/inventory/mcp.d.ts +29 -0
  548. package/types/lib/inventory/mcp.d.ts.map +1 -0
  549. package/types/lib/inventory/mcpConfigParser.d.ts +20 -0
  550. package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -0
  551. package/types/lib/inventory/mcpDiscovery.d.ts +33 -0
  552. package/types/lib/inventory/mcpDiscovery.d.ts.map +1 -0
  553. package/types/lib/inventory/mcpPinning.d.ts +11 -0
  554. package/types/lib/inventory/mcpPinning.d.ts.map +1 -0
  555. package/types/lib/inventory/osPackageResolver.d.ts +49 -0
  556. package/types/lib/inventory/osPackageResolver.d.ts.map +1 -0
  557. package/types/lib/inventory/osinfo.d.ts +201 -0
  558. package/types/lib/inventory/osinfo.d.ts.map +1 -0
  559. package/types/lib/inventory/osqueryTransform.d.ts +84 -0
  560. package/types/lib/inventory/osqueryTransform.d.ts.map +1 -0
  561. package/types/lib/inventory/plugins.d.ts +58 -0
  562. package/types/lib/inventory/plugins.d.ts.map +1 -0
  563. package/types/lib/inventory/protobom.d.ts +71 -0
  564. package/types/lib/inventory/protobom.d.ts.map +1 -0
  565. package/types/lib/inventory/protobomLoader.d.ts +17 -0
  566. package/types/lib/inventory/protobomLoader.d.ts.map +1 -0
  567. package/types/lib/inventory/provenanceUtils.d.ts +98 -0
  568. package/types/lib/inventory/provenanceUtils.d.ts.map +1 -0
  569. package/types/lib/inventory/purl.d.ts +313 -0
  570. package/types/lib/inventory/purl.d.ts.map +1 -0
  571. package/types/lib/inventory/rustFormulationParser.d.ts +17 -0
  572. package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -0
  573. package/types/lib/inventory/sbomDocument.d.ts +59 -0
  574. package/types/lib/inventory/sbomDocument.d.ts.map +1 -0
  575. package/types/lib/inventory/source.d.ts +163 -0
  576. package/types/lib/inventory/source.d.ts.map +1 -0
  577. package/types/lib/inventory/spdx.d.ts +66 -0
  578. package/types/lib/inventory/spdx.d.ts.map +1 -0
  579. package/types/lib/inventory/spdxExpression.d.ts +58 -0
  580. package/types/lib/inventory/spdxExpression.d.ts.map +1 -0
  581. package/types/lib/inventory/spdxUtils.d.ts +12 -0
  582. package/types/lib/inventory/spdxUtils.d.ts.map +1 -0
  583. package/types/lib/inventory/table.d.ts +22 -0
  584. package/types/lib/inventory/table.d.ts.map +1 -0
  585. package/types/lib/inventory/traceRunner.d.ts +80 -0
  586. package/types/lib/inventory/traceRunner.d.ts.map +1 -0
  587. package/types/lib/inventory/unicodeScan.d.ts +46 -0
  588. package/types/lib/inventory/unicodeScan.d.ts.map +1 -0
  589. package/types/lib/managers/binary.d.ts +147 -0
  590. package/types/lib/managers/binary.d.ts.map +1 -0
  591. package/types/lib/managers/containerutils.d.ts +30 -0
  592. package/types/lib/managers/containerutils.d.ts.map +1 -0
  593. package/types/lib/managers/docker.d.ts +157 -0
  594. package/types/lib/managers/docker.d.ts.map +1 -0
  595. package/types/lib/managers/dockerConnection.d.ts +42 -0
  596. package/types/lib/managers/dockerConnection.d.ts.map +1 -0
  597. package/types/lib/managers/oci.d.ts +21 -0
  598. package/types/lib/managers/oci.d.ts.map +1 -0
  599. package/types/lib/managers/piptree.d.ts +13 -0
  600. package/types/lib/managers/piptree.d.ts.map +1 -0
  601. package/types/lib/parsers/cmakeCache.d.ts +70 -0
  602. package/types/lib/parsers/cmakeCache.d.ts.map +1 -0
  603. package/types/lib/parsers/gguf.d.ts +39 -0
  604. package/types/lib/parsers/gguf.d.ts.map +1 -0
  605. package/types/lib/parsers/gitAiNotes.d.ts +15 -0
  606. package/types/lib/parsers/gitAiNotes.d.ts.map +1 -0
  607. package/types/lib/parsers/gitmodules.d.ts +88 -0
  608. package/types/lib/parsers/gitmodules.d.ts.map +1 -0
  609. package/types/lib/parsers/htmlExtract.d.ts +34 -0
  610. package/types/lib/parsers/htmlExtract.d.ts.map +1 -0
  611. package/types/lib/parsers/huggingfaceManifest.d.ts +153 -0
  612. package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -0
  613. package/types/lib/parsers/huggingfaceUtils.d.ts +155 -0
  614. package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -0
  615. package/types/lib/parsers/iri.d.ts +68 -0
  616. package/types/lib/parsers/iri.d.ts.map +1 -0
  617. package/types/lib/parsers/npmrc.d.ts +33 -0
  618. package/types/lib/parsers/npmrc.d.ts.map +1 -0
  619. package/types/lib/parsers/ollama.d.ts +22 -0
  620. package/types/lib/parsers/ollama.d.ts.map +1 -0
  621. package/types/lib/parsers/xml.d.ts +47 -0
  622. package/types/lib/parsers/xml.d.ts.map +1 -0
  623. package/types/lib/server/server.d.ts +51 -0
  624. package/types/lib/server/server.d.ts.map +1 -0
  625. package/types/lib/stages/postgen/annotator.d.ts +36 -0
  626. package/types/lib/stages/postgen/annotator.d.ts.map +1 -0
  627. package/types/lib/stages/postgen/auditBom.d.ts +92 -0
  628. package/types/lib/stages/postgen/auditBom.d.ts.map +1 -0
  629. package/types/lib/stages/postgen/postgen.d.ts +59 -0
  630. package/types/lib/stages/postgen/postgen.d.ts.map +1 -0
  631. package/types/lib/stages/postgen/ruleEngine.d.ts +18 -0
  632. package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -0
  633. package/types/lib/stages/postgen/sortBom.d.ts +34 -0
  634. package/types/lib/stages/postgen/sortBom.d.ts.map +1 -0
  635. package/types/lib/stages/postgen/spdxConverter.d.ts +11 -0
  636. package/types/lib/stages/postgen/spdxConverter.d.ts.map +1 -0
  637. package/types/lib/stages/postgen/specVersionCompat.d.ts +71 -0
  638. package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -0
  639. package/types/lib/stages/pregen/envAudit.d.ts +14 -0
  640. package/types/lib/stages/pregen/envAudit.d.ts.map +1 -0
  641. package/types/lib/stages/pregen/pregen.d.ts +59 -0
  642. package/types/lib/stages/pregen/pregen.d.ts.map +1 -0
  643. package/types/lib/third-party/arborist/lib/arborist/index.d.ts +47 -0
  644. package/types/lib/third-party/arborist/lib/arborist/index.d.ts.map +1 -0
  645. package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts +4 -0
  646. package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts.map +1 -0
  647. package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts +4 -0
  648. package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts.map +1 -0
  649. package/types/lib/third-party/arborist/lib/bin-links.d.ts +18 -0
  650. package/types/lib/third-party/arborist/lib/bin-links.d.ts.map +1 -0
  651. package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts +3 -0
  652. package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts.map +1 -0
  653. package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts +9 -0
  654. package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts.map +1 -0
  655. package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts +3 -0
  656. package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts.map +1 -0
  657. package/types/lib/third-party/arborist/lib/debug.d.ts +3 -0
  658. package/types/lib/third-party/arborist/lib/debug.d.ts.map +1 -0
  659. package/types/lib/third-party/arborist/lib/dep-valid.d.ts +3 -0
  660. package/types/lib/third-party/arborist/lib/dep-valid.d.ts.map +1 -0
  661. package/types/lib/third-party/arborist/lib/edge.d.ts +46 -0
  662. package/types/lib/third-party/arborist/lib/edge.d.ts.map +1 -0
  663. package/types/lib/third-party/arborist/lib/from-path.d.ts +3 -0
  664. package/types/lib/third-party/arborist/lib/from-path.d.ts.map +1 -0
  665. package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts +3 -0
  666. package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts.map +1 -0
  667. package/types/lib/third-party/arborist/lib/index.d.ts +3 -0
  668. package/types/lib/third-party/arborist/lib/index.d.ts.map +1 -0
  669. package/types/lib/third-party/arborist/lib/inventory.d.ts +14 -0
  670. package/types/lib/third-party/arborist/lib/inventory.d.ts.map +1 -0
  671. package/types/lib/third-party/arborist/lib/link.d.ts +18 -0
  672. package/types/lib/third-party/arborist/lib/link.d.ts.map +1 -0
  673. package/types/lib/third-party/arborist/lib/node.d.ts +112 -0
  674. package/types/lib/third-party/arborist/lib/node.d.ts.map +1 -0
  675. package/types/lib/third-party/arborist/lib/npm-extension.d.ts +18 -0
  676. package/types/lib/third-party/arborist/lib/npm-extension.d.ts.map +1 -0
  677. package/types/lib/third-party/arborist/lib/override-resolves.d.ts +3 -0
  678. package/types/lib/third-party/arborist/lib/override-resolves.d.ts.map +1 -0
  679. package/types/lib/third-party/arborist/lib/override-set.d.ts +27 -0
  680. package/types/lib/third-party/arborist/lib/override-set.d.ts.map +1 -0
  681. package/types/lib/third-party/arborist/lib/package-extensions.d.ts +36 -0
  682. package/types/lib/third-party/arborist/lib/package-extensions.d.ts.map +1 -0
  683. package/types/lib/third-party/arborist/lib/printable.d.ts +3 -0
  684. package/types/lib/third-party/arborist/lib/printable.d.ts.map +1 -0
  685. package/types/lib/third-party/arborist/lib/proc-log.d.ts +20 -0
  686. package/types/lib/third-party/arborist/lib/proc-log.d.ts.map +1 -0
  687. package/types/lib/third-party/arborist/lib/realpath.d.ts +3 -0
  688. package/types/lib/third-party/arborist/lib/realpath.d.ts.map +1 -0
  689. package/types/lib/third-party/arborist/lib/relpath.d.ts +3 -0
  690. package/types/lib/third-party/arborist/lib/relpath.d.ts.map +1 -0
  691. package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts +54 -0
  692. package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts.map +1 -0
  693. package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts +3 -0
  694. package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts.map +1 -0
  695. package/types/lib/third-party/arborist/lib/tree-check.d.ts +3 -0
  696. package/types/lib/third-party/arborist/lib/tree-check.d.ts.map +1 -0
  697. package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts +13 -0
  698. package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts.map +1 -0
  699. package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts +6 -0
  700. package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts.map +1 -0
  701. package/types/lib/third-party/arborist/lib/yarn-lock.d.ts +35 -0
  702. package/types/lib/third-party/arborist/lib/yarn-lock.d.ts.map +1 -0
  703. package/types/lib/validator/bomValidator.d.ts +40 -0
  704. package/types/lib/validator/bomValidator.d.ts.map +1 -0
  705. package/types/lib/validator/complianceEngine.d.ts +72 -0
  706. package/types/lib/validator/complianceEngine.d.ts.map +1 -0
  707. package/types/lib/validator/complianceRules.d.ts +61 -0
  708. package/types/lib/validator/complianceRules.d.ts.map +1 -0
  709. package/types/lib/validator/index.d.ts +101 -0
  710. package/types/lib/validator/index.d.ts.map +1 -0
  711. package/types/lib/validator/reporters/annotations.d.ts +37 -0
  712. package/types/lib/validator/reporters/annotations.d.ts.map +1 -0
  713. package/types/lib/validator/reporters/console.d.ts +34 -0
  714. package/types/lib/validator/reporters/console.d.ts.map +1 -0
  715. package/types/lib/validator/reporters/index.d.ts +30 -0
  716. package/types/lib/validator/reporters/index.d.ts.map +1 -0
  717. package/types/lib/validator/reporters/json.d.ts +11 -0
  718. package/types/lib/validator/reporters/json.d.ts.map +1 -0
  719. package/types/lib/validator/reporters/sarif.d.ts +22 -0
  720. package/types/lib/validator/reporters/sarif.d.ts.map +1 -0
  721. package/mod.d.ts +0 -7
  722. package/mod.js +0 -22
@@ -0,0 +1,1281 @@
1
+ import { readdirSync, readFileSync } from "node:fs";
2
+ import { platform } from "node:os";
3
+ import {
4
+ delimiter as _delimiter,
5
+ basename,
6
+ dirname,
7
+ join,
8
+ resolve,
9
+ sep,
10
+ } from "node:path";
11
+ import process from "node:process";
12
+
13
+ import { build } from "@cdxgen/cdx-purl";
14
+
15
+ import {
16
+ DEBUG_MODE,
17
+ isSecureMode,
18
+ readEnvironmentVariable,
19
+ } from "../core/activity.js";
20
+ import { PYTHON_CMD, PYTHON_EXCLUDED_COMPONENTS } from "../core/env.js";
21
+ import { safeExistsSync, safeSpawnSync } from "../core/fs.js";
22
+ import { thoughtLog } from "../core/logger.js";
23
+ import { isWin } from "../core/paths.js";
24
+ import {
25
+ PYPI_MODULE_PACKAGE_MAPPING,
26
+ PYTHON_STD_MODULES,
27
+ } from "../core/state.js";
28
+ import { findAppModules } from "../inventory/atomUtils.js";
29
+ import { flattenDeps } from "../inventory/deps.js";
30
+ import { pypiBomRef } from "../inventory/purl.js";
31
+ import { getPyMetadata } from "./ecosystems.js";
32
+ import { parseReqFile } from "./parsers-python.js";
33
+
34
+ /**
35
+ * Universal virtual environment metadata detector
36
+ * @param {Object} env - Environment variables (defaults to process.env)
37
+ * @param {string} [explicitPath] - Optional explicit venv path to inspect
38
+ * @returns {Object} Structured environment metadata
39
+ */
40
+ export function getVenvMetadata(env = process.env, explicitPath = null) {
41
+ const result = {
42
+ type: "system", // 'uv' | 'venv' | 'conda' | 'miniconda' | 'pyenv' | 'poetry' | 'pipenv' | 'virtualenv' | 'pixi' | 'bazel' | 'rye' | 'hatch' | 'pdm' | 'system' | 'unknown'
43
+ path: null,
44
+ isActive: false,
45
+ pythonExecutable: null,
46
+ pythonVersion: "unknown",
47
+ pythonImplementation: null,
48
+ toolVersion: null,
49
+ uv: null,
50
+ conda: null,
51
+ pyenv: null,
52
+ poetry: null,
53
+ pipenv: null,
54
+ pixi: null,
55
+ };
56
+ let venvPath = explicitPath;
57
+ if (!venvPath) {
58
+ if (env.VIRTUAL_ENV) {
59
+ venvPath = env.VIRTUAL_ENV;
60
+ result.isActive = true;
61
+ } else if (env.CONDA_PREFIX) {
62
+ venvPath = env.CONDA_PREFIX;
63
+ result.isActive = true;
64
+ } else if (env.PIXI_PROJECT_ROOT && env.PIXI_ENVIRONMENT_NAME) {
65
+ venvPath = join(
66
+ env.PIXI_PROJECT_ROOT,
67
+ ".pixi",
68
+ "envs",
69
+ env.PIXI_ENVIRONMENT_NAME,
70
+ );
71
+ result.isActive = true;
72
+ } else if (env.CONDA_PYTHON_EXE && safeExistsSync(env.CONDA_PYTHON_EXE)) {
73
+ result.pythonExecutable = env.CONDA_PYTHON_EXE;
74
+ result.type = "conda";
75
+ }
76
+ }
77
+ if (!venvPath) {
78
+ return result;
79
+ }
80
+ result.path = venvPath;
81
+ const isWin = process.platform === "win32";
82
+ const binDir = isWin ? "Scripts" : "bin";
83
+ const exeNames = isWin
84
+ ? ["python.exe", "python3.exe"]
85
+ : ["python", "python3"];
86
+ if (!isWin) {
87
+ for (let minor = 16; minor >= 6; minor--) {
88
+ exeNames.push(`python3.${minor}`);
89
+ }
90
+ }
91
+ for (const exe of exeNames) {
92
+ const candidate = join(venvPath, binDir, exe);
93
+ if (safeExistsSync(candidate)) {
94
+ result.pythonExecutable = candidate;
95
+ break;
96
+ }
97
+ }
98
+ if (!result.pythonExecutable && isWin) {
99
+ const rootExe = join(venvPath, "python.exe");
100
+ if (safeExistsSync(rootExe)) {
101
+ result.pythonExecutable = rootExe;
102
+ }
103
+ }
104
+ if (
105
+ env.BUILD_WORKSPACE_DIRECTORY ||
106
+ venvPath.includes("bazel-out") ||
107
+ venvPath.includes(".runfiles")
108
+ ) {
109
+ result.type = "bazel";
110
+ return result;
111
+ }
112
+ const isLocalVenv = basename(venvPath) === ".venv";
113
+ const projectRoot = isLocalVenv ? dirname(venvPath) : null;
114
+ const pyvenvCfgPath = join(venvPath, "pyvenv.cfg");
115
+ if (safeExistsSync(pyvenvCfgPath)) {
116
+ const cfg = _parsePyvenvCfg(pyvenvCfgPath);
117
+ result.pythonVersion = cfg.version_info || "unknown";
118
+ result.pythonImplementation = cfg.implementation || null;
119
+ if (cfg.uv) {
120
+ result.type = "uv";
121
+ result.toolVersion = cfg.uv;
122
+ result.uv = { version: cfg.uv, home: cfg.home };
123
+ return result;
124
+ }
125
+ if (
126
+ env.POETRY_ACTIVE === "1" ||
127
+ venvPath.includes(`pypoetry${sep}virtualenvs`) ||
128
+ (projectRoot && safeExistsSync(join(projectRoot, "poetry.lock")))
129
+ ) {
130
+ result.type = "poetry";
131
+ if (projectRoot) result.poetry = { projectRoot };
132
+ const lockFile = projectRoot ? join(projectRoot, "poetry.lock") : null;
133
+ if (lockFile && safeExistsSync(lockFile)) {
134
+ const poetryVersion = _extractPoetryVersion(lockFile);
135
+ if (poetryVersion) result.toolVersion = poetryVersion;
136
+ }
137
+ return result;
138
+ }
139
+ if (
140
+ env.PIPENV_ACTIVE === "1" ||
141
+ venvPath.includes(`.virtualenvs${sep}`) ||
142
+ (projectRoot && safeExistsSync(join(projectRoot, "Pipfile")))
143
+ ) {
144
+ result.type = "pipenv";
145
+ if (projectRoot) result.pipenv = { projectRoot };
146
+ return result;
147
+ }
148
+ if (
149
+ env.RYE_ACTIVE === "1" ||
150
+ (projectRoot &&
151
+ safeExistsSync(join(projectRoot, "requirements.lock")) &&
152
+ safeExistsSync(join(projectRoot, ".rye")))
153
+ ) {
154
+ result.type = "rye";
155
+ return result;
156
+ }
157
+ if (env.HATCH_ENV_ACTIVE || venvPath.includes(`hatch${sep}env`)) {
158
+ result.type = "hatch";
159
+ return result;
160
+ }
161
+ if (
162
+ env.PDM_ACTIVE === "1" ||
163
+ (projectRoot && safeExistsSync(join(projectRoot, "pdm.lock")))
164
+ ) {
165
+ result.type = "pdm";
166
+ return result;
167
+ }
168
+ if (cfg.virtualenv) {
169
+ result.type = "virtualenv";
170
+ result.toolVersion = cfg.virtualenv;
171
+ } else {
172
+ result.type = "venv";
173
+ }
174
+ return result;
175
+ }
176
+
177
+ const condaMetaDir = join(venvPath, "conda-meta");
178
+ if (safeExistsSync(condaMetaDir)) {
179
+ if (env.PIXI_PROJECT_ROOT || venvPath.includes(`.pixi${sep}envs`)) {
180
+ result.type = "pixi";
181
+ result.pixi = {
182
+ projectRoot:
183
+ env.PIXI_PROJECT_ROOT || dirname(dirname(dirname(venvPath))),
184
+ };
185
+ } else {
186
+ result.type =
187
+ env.CONDA_PREFIX?.includes("miniconda") ||
188
+ env.CONDA_PREFIX?.includes("mini")
189
+ ? "miniconda"
190
+ : "conda";
191
+ result.conda = {
192
+ name: env.CONDA_DEFAULT_ENV || basename(venvPath),
193
+ prefix: venvPath,
194
+ };
195
+ }
196
+ if (env.CONDA_VERSION) {
197
+ result.toolVersion = env.CONDA_VERSION;
198
+ } else {
199
+ const historyPath = join(condaMetaDir, "history");
200
+ if (safeExistsSync(historyPath)) {
201
+ const condaVersion = _extractCondaVersion(historyPath);
202
+ if (condaVersion) result.toolVersion = condaVersion;
203
+ }
204
+ }
205
+ const pythonPkgs = _findCondaPythonPackage(condaMetaDir);
206
+ if (pythonPkgs?.version) {
207
+ result.pythonVersion = pythonPkgs.version;
208
+ }
209
+ return result;
210
+ }
211
+ if (env.PYENV_ROOT && venvPath.startsWith(env.PYENV_ROOT)) {
212
+ result.type = "pyenv";
213
+ const versionsDir = join(env.PYENV_ROOT, "versions");
214
+ if (venvPath.startsWith(`${versionsDir}${sep}`)) {
215
+ const version = basename(venvPath);
216
+ result.pyenv = { version, path: venvPath };
217
+ result.pythonVersion = version;
218
+ }
219
+ return result;
220
+ }
221
+ result.type = "unknown";
222
+ return result;
223
+ }
224
+
225
+ /**
226
+ * Parse pyvenv.cfg file into key-value object
227
+ */
228
+ function _parsePyvenvCfg(filePath) {
229
+ const result = {};
230
+ try {
231
+ const content = readFileSync(filePath, "utf-8");
232
+ for (const line of content.split(/\r?\n/)) {
233
+ const trimmed = line.trim();
234
+ if (!trimmed || trimmed.startsWith("#")) continue;
235
+ const match = trimmed.match(/^([^=]+?)\s*=\s*(.+)$/);
236
+ if (match) {
237
+ const [, key, value] = match;
238
+ result[key.trim()] = value.trim();
239
+ }
240
+ }
241
+ } catch (_err) {
242
+ // Return empty on error
243
+ }
244
+ return result;
245
+ }
246
+
247
+ /**
248
+ * Extract poetry version from poetry.lock file
249
+ */
250
+ function _extractPoetryVersion(lockPath) {
251
+ try {
252
+ const content = readFileSync(lockPath, "utf-8");
253
+ const match = content.match(/^\s*poetry-version\s*=\s*"([^"]+)"/m);
254
+ return match ? match[1] : null;
255
+ } catch (_err) {
256
+ return null;
257
+ }
258
+ }
259
+
260
+ /**
261
+ * Extract conda version from conda-meta/history
262
+ */
263
+ function _extractCondaVersion(historyPath) {
264
+ try {
265
+ const content = readFileSync(historyPath, "utf-8");
266
+ const match = content.match(/conda version:\s*(\S+)/i);
267
+ return match ? match[1] : null;
268
+ } catch (_err) {
269
+ return null;
270
+ }
271
+ }
272
+
273
+ /**
274
+ * Find python package info in conda-meta directory
275
+ */
276
+ function _findCondaPythonPackage(condaMetaDir) {
277
+ try {
278
+ const files = readdirSync(condaMetaDir);
279
+ const pythonFile = files.find(
280
+ (f) => f.startsWith("python-") && f.endsWith(".json"),
281
+ );
282
+ if (!pythonFile) return null;
283
+
284
+ const pkgInfo = JSON.parse(
285
+ readFileSync(join(condaMetaDir, pythonFile), "utf-8"),
286
+ );
287
+ return {
288
+ version: pkgInfo?.version,
289
+ build: pkgInfo?.build,
290
+ };
291
+ } catch (_err) {
292
+ return null;
293
+ }
294
+ }
295
+
296
+ /**
297
+ * Determines the appropriate Python executable path from a virtual environment.
298
+ * Inspects the virtual environment metadata to detect the Python type (system,
299
+ * conda, pyenv, etc.) and returns the most specific executable found, falling
300
+ * back to the global `PYTHON_CMD` constant when no executable is detected.
301
+ *
302
+ * @param {string} env Path to the Python virtual environment directory
303
+ * @returns {string} Path to the Python executable or the fallback command name
304
+ */
305
+ export function get_python_command_from_env(env) {
306
+ const fallbackCmd = PYTHON_CMD;
307
+ const meta = getVenvMetadata(env);
308
+ const pyVersionTxt =
309
+ meta.pythonVersion && meta.pythonVersion !== "unknown"
310
+ ? ` version ${meta.pythonVersion}`
311
+ : "";
312
+ if (meta.type === "system") {
313
+ thoughtLog(
314
+ `I'm operating with system-managed python${pyVersionTxt}. I should be careful with the virtualenv creation and dependency tree construction.`,
315
+ );
316
+ } else if (meta.type === "unknown") {
317
+ thoughtLog(
318
+ `I'm operating with an unmanaged python${pyVersionTxt}. Let's check if pip and virtualenv packages are available.`,
319
+ );
320
+ } else {
321
+ thoughtLog(`Looks like python${pyVersionTxt} is managed by ${meta.type}.`);
322
+ }
323
+ if (meta?.pythonExecutable) {
324
+ if (DEBUG_MODE) {
325
+ console.log(
326
+ `Found python${pyVersionTxt} at ${meta.pythonExecutable} managed by ${meta.type}.`,
327
+ );
328
+ }
329
+ return meta.pythonExecutable;
330
+ }
331
+ return fallbackCmd;
332
+ }
333
+
334
+ /**
335
+ * Method to find python modules by parsing the imports and then checking with PyPI to obtain the latest version
336
+ *
337
+ * @param {string} src directory
338
+ * @param {Array} epkgList Existing package list
339
+ * @param {Object} options CLI options
340
+ * @returns List of packages
341
+ */
342
+ export async function getPyModules(src, epkgList, options) {
343
+ const allImports = {};
344
+ const dependenciesList = [];
345
+ let modList = [];
346
+ const slicesFile = resolve(
347
+ options.depsSlicesFile || options.usagesSlicesFile,
348
+ );
349
+ // Issue: 615 fix. Reuse existing slices file
350
+ if (slicesFile && safeExistsSync(slicesFile)) {
351
+ const slicesData = JSON.parse(readFileSync(slicesFile, "utf-8"));
352
+ if (slicesData && Object.keys(slicesData) && slicesData.modules) {
353
+ modList = slicesData.modules;
354
+ } else {
355
+ modList = slicesData;
356
+ }
357
+ } else {
358
+ modList = findAppModules(src, "python", "parsedeps", slicesFile, options);
359
+ }
360
+ const pyDefaultModules = new Set(PYTHON_STD_MODULES);
361
+ modList = modList.filter(
362
+ (x) =>
363
+ !pyDefaultModules.has(x.name.toLowerCase()) &&
364
+ !x.name.startsWith("_") &&
365
+ !x.name.startsWith("."),
366
+ );
367
+ let pkgList = modList.map((p) => {
368
+ const apkg = {
369
+ name:
370
+ PYPI_MODULE_PACKAGE_MAPPING[p.name.toLowerCase()] ||
371
+ PYPI_MODULE_PACKAGE_MAPPING[p.name.replace(/_/g, "-").toLowerCase()] ||
372
+ p.name.replace(/_/g, "-").toLowerCase(),
373
+ version: p.version?.trim().length ? p.version : undefined,
374
+ scope: "required",
375
+ properties: [
376
+ {
377
+ name: "cdx:pypi:versionSpecifiers",
378
+ value: p.versionSpecifiers,
379
+ },
380
+ ],
381
+ };
382
+ if (p.importedSymbols) {
383
+ apkg.properties.push({
384
+ name: "internal:ImportedModules",
385
+ value: p.importedSymbols,
386
+ });
387
+ }
388
+ return apkg;
389
+ });
390
+ pkgList = pkgList.filter(
391
+ (obj, index) => pkgList.findIndex((i) => i.name === obj.name) === index,
392
+ );
393
+ if (epkgList?.length) {
394
+ const pkgMaps = epkgList.map((p) => p.name);
395
+ pkgList = pkgList.filter((p) => !pkgMaps.includes(p.name));
396
+ }
397
+ pkgList = await getPyMetadata(pkgList, true);
398
+ // Populate the imports list after dealiasing
399
+ if (pkgList?.length) {
400
+ pkgList.forEach((p) => {
401
+ allImports[p.name] = true;
402
+ });
403
+ }
404
+ for (const p of pkgList) {
405
+ if (p.version) {
406
+ dependenciesList.push({
407
+ ref: pypiBomRef(p.name, p.version),
408
+ dependsOn: [],
409
+ });
410
+ }
411
+ }
412
+ return { allImports, pkgList, dependenciesList, modList };
413
+ }
414
+
415
+ /**
416
+ * Create uv.lock file with uv sync command.
417
+ *
418
+ * @param {string} basePath Path
419
+ * @param {Object} options CLI options
420
+ */
421
+ export function createUVLock(basePath, options) {
422
+ const python_cmd = get_python_command_from_env(process.env);
423
+ let uvSyncArgs = ["-m", "uv", "sync"];
424
+ // Do not update the lock file in pre-build mode
425
+ if (options?.lifecycle?.includes("pre-build")) {
426
+ uvSyncArgs.push("--frozen");
427
+ } else if (options?.recurse) {
428
+ uvSyncArgs = uvSyncArgs.concat(["--all-groups", "--all-packages"]);
429
+ }
430
+ // Install everything and do not remove anything extraneous
431
+ if (options?.deep) {
432
+ uvSyncArgs = uvSyncArgs.concat(["--all-extras", "--inexact"]);
433
+ }
434
+ if (process?.env?.UV_INSTALL_ARGS) {
435
+ const addArgs = readEnvironmentVariable("UV_INSTALL_ARGS").split(" ");
436
+ uvSyncArgs = uvSyncArgs.concat(addArgs);
437
+ }
438
+ if (DEBUG_MODE) {
439
+ console.log(
440
+ `Executing ${python_cmd} ${uvSyncArgs.join(" ")} in ${basePath}`,
441
+ );
442
+ }
443
+ let result = safeSpawnSync(python_cmd, uvSyncArgs, {
444
+ shell: isWin,
445
+ cwd: basePath,
446
+ });
447
+ if (result.status !== 0 || result.error) {
448
+ if (result?.stderr?.includes("No module named uv")) {
449
+ if (DEBUG_MODE) {
450
+ console.log(`Executing uv sync in ${basePath}`);
451
+ }
452
+ result = safeSpawnSync("uv", ["sync"], {
453
+ shell: isWin,
454
+ cwd: basePath,
455
+ });
456
+ if (result.status !== 0 || result.error) {
457
+ console.log("Check if uv is installed and available in PATH.");
458
+ if (readEnvironmentVariable("CDXGEN_IN_CONTAINER") !== "true") {
459
+ console.log(
460
+ "Use the cdxgen container image which comes with uv installed.",
461
+ );
462
+ }
463
+ console.log(result.stderr);
464
+ }
465
+ } else {
466
+ console.log(result.stderr);
467
+ }
468
+ }
469
+ }
470
+
471
+ /**
472
+ * Execute pip freeze by creating a virtual env in a temp directory and construct the dependency tree
473
+ *
474
+ * @param {string} basePath Base path
475
+ * @param {string} reqOrSetupFile Requirements or setup.py file
476
+ * @param {string} tempVenvDir Temp venv dir
477
+ * @param {Object} parentComponent Parent component
478
+ *
479
+ * @returns {Object} List of packages from the virtual env
480
+ */
481
+ export async function getPipFrozenTree(
482
+ basePath,
483
+ reqOrSetupFile,
484
+ tempVenvDir,
485
+ parentComponent,
486
+ projectRoot,
487
+ getTreeWithPluginFn,
488
+ ) {
489
+ const pkgList = [];
490
+ const formulationList = [];
491
+ const rootList = [];
492
+ const dependenciesList = [];
493
+ let result;
494
+ let frozen = true;
495
+ const env = {
496
+ ...process.env,
497
+ };
498
+ if (!env.CFLAGS) {
499
+ env.CFLAGS = "-fcommon";
500
+ } else if (!env.CFLAGS.includes("-fcommon")) {
501
+ env.CFLAGS = `${env.CFLAGS} -fcommon`;
502
+ }
503
+
504
+ const explicitDeps = new Set();
505
+ if (reqOrSetupFile?.endsWith(".txt") && safeExistsSync(reqOrSetupFile)) {
506
+ // We only need the package names, so we pass `false` to avoid fetching full metadata.
507
+ const tempPkgList = await parseReqFile(reqOrSetupFile, null, false);
508
+ for (const pkg of tempPkgList) {
509
+ if (pkg.name) {
510
+ explicitDeps.add(pkg.name.replace(/_/g, "-").toLowerCase());
511
+ }
512
+ }
513
+ }
514
+
515
+ /**
516
+ * Let's start with an attempt to create a new temporary virtual environment in case we aren't in one
517
+ *
518
+ * By checking the environment variable "VIRTUAL_ENV" we decide whether to create an env or not
519
+ */
520
+ if (
521
+ !readEnvironmentVariable("VIRTUAL_ENV") &&
522
+ !readEnvironmentVariable("CONDA_PREFIX") &&
523
+ reqOrSetupFile &&
524
+ !reqOrSetupFile.endsWith("poetry.lock")
525
+ ) {
526
+ thoughtLog(
527
+ "Let me create a new virtual environment for installing the packages with pip.",
528
+ );
529
+ const venvCreationArgs = ["-m", "venv", tempVenvDir];
530
+ if (isSecureMode) {
531
+ venvCreationArgs.unshift("-S");
532
+ }
533
+ result = safeSpawnSync(PYTHON_CMD, venvCreationArgs, {
534
+ shell: isWin,
535
+ });
536
+ if (result.status !== 0 || result.error) {
537
+ frozen = false;
538
+ if (DEBUG_MODE) {
539
+ console.log("Virtual env creation has failed");
540
+ if (result.stderr?.includes("safeSpawnSync python ENOENT")) {
541
+ console.log(
542
+ "Install suitable version of python or set the environment variable PYTHON_CMD.",
543
+ );
544
+ }
545
+ }
546
+ } else {
547
+ if (DEBUG_MODE) {
548
+ console.log("Using the virtual environment", tempVenvDir);
549
+ }
550
+ env.VIRTUAL_ENV = tempVenvDir;
551
+ env.PATH = `${join(
552
+ tempVenvDir,
553
+ platform() === "win32" ? "Scripts" : "bin",
554
+ )}${_delimiter}${readEnvironmentVariable("PATH") || ""}`;
555
+ // When cdxgen is invoked with the container image, we seem to be including unnecessary packages from the image.
556
+ // This workaround, unsets PYTHONPATH to suppress the pre-installed packages
557
+ if (
558
+ env?.PYTHONPATH === "/opt/pypi" &&
559
+ env?.CDXGEN_IN_CONTAINER === "true"
560
+ ) {
561
+ env.PYTHONPATH = undefined;
562
+ }
563
+ }
564
+ }
565
+ const venvMeta = getVenvMetadata(env);
566
+ const python_cmd_for_tree = get_python_command_from_env(env);
567
+ // Check if pyproject.toml is actually a uv-configured workspace
568
+ let hasToolUv = false;
569
+ let hasToolPoetry = false;
570
+ if (
571
+ reqOrSetupFile?.endsWith("pyproject.toml") &&
572
+ safeExistsSync(reqOrSetupFile)
573
+ ) {
574
+ try {
575
+ const content = readFileSync(reqOrSetupFile, "utf-8");
576
+ hasToolUv = content.includes("[tool.uv]");
577
+ hasToolPoetry = content.includes('build-backend = "poetry.core');
578
+ } catch (_err) {
579
+ // Ignore read error
580
+ }
581
+ }
582
+ if (reqOrSetupFile) {
583
+ // We have a poetry.lock file
584
+ if (reqOrSetupFile.endsWith("poetry.lock") || hasToolPoetry) {
585
+ const poetryConfigArgs = [
586
+ "-m",
587
+ "poetry",
588
+ "config",
589
+ "virtualenvs.options.no-setuptools",
590
+ "true",
591
+ "--local",
592
+ ];
593
+ if (isSecureMode) {
594
+ poetryConfigArgs.unshift("-S");
595
+ }
596
+ result = safeSpawnSync(PYTHON_CMD, poetryConfigArgs, {
597
+ cwd: basePath,
598
+ shell: isWin,
599
+ });
600
+ thoughtLog("Performing poetry install");
601
+ let poetryInstallArgs = ["-m", "poetry", "install", "-n", "--no-root"];
602
+ if (isSecureMode) {
603
+ poetryInstallArgs.unshift("-S");
604
+ }
605
+ // Attempt to perform poetry install
606
+ result = safeSpawnSync(PYTHON_CMD, poetryInstallArgs, {
607
+ cwd: basePath,
608
+ shell: isWin,
609
+ });
610
+ if (result.status !== 0 || result.error) {
611
+ if (result.stderr?.includes("No module named poetry")) {
612
+ thoughtLog(
613
+ "Hmm, poetry doesn't seem to be available as a module. Perhaps it was installed directly 🤔?",
614
+ );
615
+ poetryInstallArgs = ["install", "-n", "--no-root"];
616
+ // Attempt to perform poetry install
617
+ result = safeSpawnSync("poetry", poetryInstallArgs, {
618
+ cwd: basePath,
619
+ shell: isWin,
620
+ env,
621
+ });
622
+ if (result.status !== 0 || result.error) {
623
+ frozen = false;
624
+ if (DEBUG_MODE && result.stderr) {
625
+ console.log(result.stderr);
626
+ }
627
+ thoughtLog(
628
+ "poetry install has failed. Let me suggest some troubleshooting ideas.",
629
+ );
630
+ console.log("poetry install has failed.");
631
+ console.log(
632
+ "1. Install the poetry command using python -m pip install poetry.",
633
+ );
634
+ console.log(
635
+ "2. Check the version of python supported by the project. Poetry is strict about the version used.",
636
+ );
637
+ console.log(
638
+ "3. Setup and activate the poetry virtual environment and re-run cdxgen.",
639
+ );
640
+ }
641
+ } else {
642
+ frozen = false;
643
+ console.log(
644
+ "Poetry install has failed. Setup and activate the poetry virtual environment and re-run cdxgen.",
645
+ );
646
+ if (DEBUG_MODE) {
647
+ if (result.error) {
648
+ console.log(result.error);
649
+ }
650
+ if (result.stderr) {
651
+ console.log(result.stderr);
652
+ }
653
+ }
654
+ }
655
+ } else {
656
+ const poetryEnvArgs = ["env info", "--path"];
657
+ result = safeSpawnSync("poetry", poetryEnvArgs, {
658
+ cwd: basePath,
659
+ shell: isWin,
660
+ env,
661
+ });
662
+ tempVenvDir = result.stdout?.replaceAll(/[\r\n]+/g, "");
663
+ if (tempVenvDir?.length) {
664
+ env.VIRTUAL_ENV = tempVenvDir;
665
+ env.PATH = `${join(
666
+ tempVenvDir,
667
+ platform() === "win32" ? "Scripts" : "bin",
668
+ )}${_delimiter}${readEnvironmentVariable("PATH") || ""}`;
669
+ }
670
+ }
671
+ } else if (reqOrSetupFile.endsWith("pdm.lock") || venvMeta.type === "pdm") {
672
+ thoughtLog("Performing pdm install");
673
+ result = safeSpawnSync("pdm", ["install"], {
674
+ cwd: basePath,
675
+ shell: isWin,
676
+ env,
677
+ });
678
+ if (result.status !== 0 || result.error) {
679
+ frozen = false;
680
+ }
681
+ } else if (
682
+ reqOrSetupFile.endsWith("pixi.lock") ||
683
+ venvMeta.type === "pixi"
684
+ ) {
685
+ thoughtLog("Performing pixi install");
686
+ result = safeSpawnSync("pixi", ["install"], {
687
+ cwd: basePath,
688
+ shell: isWin,
689
+ env,
690
+ });
691
+ if (result.status !== 0 || result.error) {
692
+ frozen = false;
693
+ }
694
+ } else if (
695
+ reqOrSetupFile.endsWith("uv.lock") ||
696
+ (venvMeta.type === "uv" && hasToolUv)
697
+ ) {
698
+ thoughtLog("Performing uv sync");
699
+ result = safeSpawnSync("uv", ["sync"], {
700
+ cwd: basePath,
701
+ shell: isWin,
702
+ env,
703
+ });
704
+ if (result.status !== 0 || result.error) {
705
+ frozen = false;
706
+ }
707
+ } else if (
708
+ venvMeta.type === "rye" ||
709
+ reqOrSetupFile.endsWith("requirements.lock")
710
+ ) {
711
+ thoughtLog("Performing rye sync");
712
+ result = safeSpawnSync("rye", ["sync"], {
713
+ cwd: basePath,
714
+ shell: isWin,
715
+ env,
716
+ });
717
+ if (result.status !== 0 || result.error) {
718
+ frozen = false;
719
+ }
720
+ } else {
721
+ // General package installation (Handling pip, or uv pip)
722
+ let installCmd = python_cmd_for_tree;
723
+ let pipInstallArgs = [];
724
+ if (venvMeta.type === "uv") {
725
+ installCmd = "uv";
726
+ pipInstallArgs = ["pip", "install"];
727
+ if (isSecureMode) {
728
+ pipInstallArgs.push("--only-binary");
729
+ pipInstallArgs.push(":all:");
730
+ }
731
+ } else {
732
+ pipInstallArgs = [
733
+ "-m",
734
+ "pip",
735
+ "install",
736
+ "--disable-pip-version-check",
737
+ ];
738
+ if (isSecureMode) {
739
+ pipInstallArgs.push("--only-binary=:all:");
740
+ pipInstallArgs.unshift("-S");
741
+ }
742
+ }
743
+ if (
744
+ !reqOrSetupFile.endsWith("setup.py") &&
745
+ !reqOrSetupFile.endsWith("pyproject.toml")
746
+ ) {
747
+ pipInstallArgs.push("-r");
748
+ pipInstallArgs.push(resolve(reqOrSetupFile));
749
+ if (reqOrSetupFile.includes("test")) {
750
+ thoughtLog(
751
+ `${reqOrSetupFile} appears to be related to tests. Should I suggest the "--exclude" argument?`,
752
+ );
753
+ }
754
+ } else {
755
+ pipInstallArgs.push(resolve(basePath));
756
+ }
757
+ if (process?.env?.PIP_INSTALL_ARGS) {
758
+ const addArgs = readEnvironmentVariable("PIP_INSTALL_ARGS").split(" ");
759
+ pipInstallArgs = pipInstallArgs.concat(addArgs);
760
+ }
761
+ thoughtLog(
762
+ `**INSTALL**: Trying package install using the arguments: ${installCmd} ${pipInstallArgs.join(" ")}`,
763
+ );
764
+ if (DEBUG_MODE) {
765
+ console.log("Executing", installCmd);
766
+ }
767
+ result = safeSpawnSync(installCmd, pipInstallArgs, {
768
+ cwd: projectRoot || basePath,
769
+ shell: isWin,
770
+ env,
771
+ });
772
+ if (result.status !== 0 || result.error) {
773
+ frozen = false;
774
+ let versionRelatedError = false;
775
+ if (
776
+ result.stderr?.includes(
777
+ "Could not find a version that satisfies the requirement",
778
+ ) ||
779
+ result.stderr?.includes("No matching distribution found for")
780
+ ) {
781
+ versionRelatedError = true;
782
+ if (readEnvironmentVariable("PIP_INSTALL_ARGS")) {
783
+ console.log(
784
+ "1. Try invoking cdxgen with a different python type. Example: `-t python`, `-t python310`, or `-t python39`\n",
785
+ );
786
+ } else {
787
+ console.log(
788
+ "The version or the version specifiers used for a dependency is invalid. Try with a different python type such as -t python310 or -t python39.\nOriginal error from pip:\n",
789
+ );
790
+ }
791
+ console.log(result.stderr);
792
+ } else if (result?.stderr?.includes("No module named pip")) {
793
+ console.log(
794
+ "Using uv? Ensure 'uv' is in your PATH to allow cdxgen to use `uv pip install` automatically.",
795
+ );
796
+ } else if (
797
+ readEnvironmentVariable("PIP_INSTALL_ARGS") &&
798
+ result.stderr?.includes("Cannot set --home and --prefix together")
799
+ ) {
800
+ versionRelatedError = true;
801
+ thoughtLog(`Got the error: ${result.stderr.split("\n").slice(0, 5)}`);
802
+ if (DEBUG_MODE) {
803
+ console.log(result.stderr);
804
+ } else {
805
+ console.log(
806
+ "Possible build errors detected with 'pip install'. Set the environment variable CDXGEN_DEBUG_MODE=debug to troubleshoot.",
807
+ );
808
+ if (result?.stderr?.includes("No module named pip")) {
809
+ console.log(
810
+ "Using uv? Run uv pip install command prior to running cdxgen.",
811
+ );
812
+ } else {
813
+ console.log(result.stderr.split("\n").slice(0, 5));
814
+ }
815
+ }
816
+ console.warn(
817
+ "This project does not support python with version types. Use an appropriate container image such as `ghcr.io/appthreat/cdxgen-python39:v13` or `ghcr.io/appthreat/cdxgen-python311:v13` and invoke cdxgen with `-t python` instead.\n",
818
+ );
819
+ } else if (
820
+ result?.stderr?.includes(
821
+ "pip subprocess to install build dependencies",
822
+ )
823
+ ) {
824
+ console.log(
825
+ "Installing build dependencies has failed. Use an appropriate container image such as `ghcr.io/appthreat/cdxgen-python39:v13` or `ghcr.io/appthreat/cdxgen-python311:v13` and invoke cdxgen with `-t python` instead.",
826
+ );
827
+ if (
828
+ result?.stderr?.includes(
829
+ "Failed to build installable wheels for some pyproject.toml based projects",
830
+ )
831
+ ) {
832
+ console.log(
833
+ "Try upgrading setuptools with `python -m pip install setuptools --upgrade`",
834
+ );
835
+ }
836
+ if (readEnvironmentVariable("CDXGEN_IN_CONTAINER") !== "true") {
837
+ thoughtLog(
838
+ "Installation of build dependencies failed. I told you we must use container images for python.",
839
+ );
840
+ } else {
841
+ thoughtLog(
842
+ "Installation of build dependencies failed. Perhaps the user is using the wrong container image?",
843
+ );
844
+ }
845
+ }
846
+ if (!versionRelatedError) {
847
+ if (DEBUG_MODE) {
848
+ console.info(
849
+ "\nEXPERIMENTAL: Invoke cdxgen with '--feature-flags safe-pip-install' to recover a partial dependency tree for projects with build errors.\n",
850
+ );
851
+ if (result.stderr) {
852
+ console.log(result.stderr);
853
+ }
854
+ console.log(
855
+ "Possible build errors detected. The resulting list in the SBOM would therefore be incomplete.\nTry installing any missing build tools or development libraries to improve the accuracy.",
856
+ );
857
+ thoughtLog(
858
+ "Possible build errors detected. We have an incomplete list of pypi components and dependencies.",
859
+ );
860
+ if (platform() === "win32") {
861
+ console.log(
862
+ "- Install the appropriate compilers and build tools on Windows by following this documentation - https://wiki.python.org/moin/WindowsCompilers",
863
+ );
864
+ } else {
865
+ console.log(
866
+ "- For example, you may have to install gcc, gcc-c++ compiler, postgresql or mysql devel packages and additional development libraries using apt-get or yum package manager.",
867
+ );
868
+ }
869
+ console.log(
870
+ "- Certain projects would only build with specific versions of Python. Data science and ML related projects might require a conda/anaconda distribution.",
871
+ );
872
+ console.log(
873
+ "- Check if any git submodules have to be initialized.\n- If the application has its own Dockerfile, look for any clues for build dependencies.",
874
+ );
875
+ if (
876
+ readEnvironmentVariable("CDXGEN_IN_CONTAINER") !== "true" &&
877
+ !readEnvironmentVariable("PIP_INSTALL_ARGS")
878
+ ) {
879
+ console.log(
880
+ "1. Try invoking cdxgen with a specific python version type. Example: `-t python36` or `-t python39`",
881
+ );
882
+ console.log(
883
+ "2. Alternatively, try using the custom container images `ghcr.io/cdxgen/cdxgen-python39:v13` or `ghcr.io/cdxgen/cdxgen-python311:v13`, which bundles a range of build tools and development libraries.",
884
+ );
885
+ } else if (
886
+ readEnvironmentVariable("PIP_INSTALL_ARGS")?.includes(
887
+ "--python-version",
888
+ )
889
+ ) {
890
+ console.log(
891
+ "1. Try invoking cdxgen with a different python version type. Example: `-t python`, `-t python39`, or `-t python311`",
892
+ );
893
+ console.log(
894
+ "2. Try with the experimental flag '--feature-flags safe-pip-install'",
895
+ );
896
+ }
897
+ } else {
898
+ if (readEnvironmentVariable("CDXGEN_IN_CONTAINER") !== "true") {
899
+ thoughtLog(
900
+ "**PIP**: Installation of build dependencies failed. If in doubt, use the cdxgen container images for python.",
901
+ );
902
+ } else {
903
+ thoughtLog(
904
+ "Installation of build dependencies failed. Perhaps the user is using the wrong cdxgen container image? Should I recommend raising a GitHub issue?",
905
+ );
906
+ }
907
+ // Bug #1640. result.stderr is null here despite the process erroring with a non-zero value.
908
+ // How do we reproduce this with repo tests?
909
+ if (result?.stderr) {
910
+ if (result?.stderr?.includes("No module named pip")) {
911
+ console.log(
912
+ "Using uv? Run uv pip install command prior to running cdxgen.",
913
+ );
914
+ } else {
915
+ console.log(
916
+ "Possible build errors detected. Set the environment variable CDXGEN_DEBUG_MODE=debug to troubleshoot.",
917
+ );
918
+ console.log(result.stderr?.split("\n")?.slice(0, 5));
919
+ }
920
+ }
921
+ }
922
+ }
923
+ }
924
+ }
925
+ }
926
+ // Bug #375. Attempt pip freeze on existing and new virtual environments
927
+ if (env.VIRTUAL_ENV?.length || env.CONDA_PREFIX?.length) {
928
+ const venvRoot = env.VIRTUAL_ENV || env.CONDA_PREFIX;
929
+ const binDir = platform() === "win32" ? "Scripts" : "bin";
930
+ const pipExe = join(
931
+ venvRoot,
932
+ binDir,
933
+ platform() === "win32" ? "pip.exe" : "pip",
934
+ );
935
+ if (!safeExistsSync(pipExe)) {
936
+ thoughtLog(
937
+ "The 'pip' module is missing in this environment. Bootstrapping it to support piptree extraction.",
938
+ );
939
+ if (venvMeta.type === "uv") {
940
+ safeSpawnSync("uv", ["pip", "install", "pip"], {
941
+ cwd: basePath,
942
+ shell: isWin,
943
+ env,
944
+ });
945
+ } else if (venvMeta.type === "rye") {
946
+ safeSpawnSync("rye", ["run", "pip", "install", "pip"], {
947
+ cwd: basePath,
948
+ shell: isWin,
949
+ env,
950
+ });
951
+ } else {
952
+ safeSpawnSync(python_cmd_for_tree, ["-m", "ensurepip", "--upgrade"], {
953
+ cwd: basePath,
954
+ shell: isWin,
955
+ env,
956
+ });
957
+ }
958
+ }
959
+ if (DEBUG_MODE && reqOrSetupFile) {
960
+ console.log(
961
+ `About to construct the dependency tree based on ${reqOrSetupFile}. Please wait ...`,
962
+ );
963
+ }
964
+ // This is a slow step that ideally needs to be invoked only once per venv
965
+ const tree = getTreeWithPluginFn(env, python_cmd_for_tree, basePath);
966
+ if (DEBUG_MODE && !tree.length) {
967
+ console.log(
968
+ "Dependency tree generation has failed. Please check for any errors or version incompatibilities reported in the logs.",
969
+ );
970
+ }
971
+ const dependenciesMap = {};
972
+ for (const t of tree) {
973
+ const name = t.name.replace(/_/g, "-").toLowerCase();
974
+ // Bug #1232 - the root package might lack a version resulting in duplicate tree
975
+ // So we make use of the existing parent component to try and patch the version
976
+ if (
977
+ parentComponent &&
978
+ parentComponent.name === t.name &&
979
+ parentComponent.version &&
980
+ parentComponent?.version !== "latest" &&
981
+ t.version === "latest"
982
+ ) {
983
+ t.version = parentComponent.version;
984
+ }
985
+ const version = t.version;
986
+ const scope = PYTHON_EXCLUDED_COMPONENTS.includes(name)
987
+ ? "excluded"
988
+ : undefined;
989
+ if (!scope && !t.version.length) {
990
+ // Don't leave out any local dependencies
991
+ if (t.dependencies.length) {
992
+ flattenDeps(dependenciesMap, pkgList, reqOrSetupFile, t);
993
+ }
994
+ continue;
995
+ }
996
+ const purlString = build({
997
+ type: "pypi",
998
+ namespace: "" || null,
999
+ name: name,
1000
+ version: version || null,
1001
+ });
1002
+ const apkg = {
1003
+ name,
1004
+ version,
1005
+ purl: purlString,
1006
+ type: "library",
1007
+ "bom-ref": decodeURIComponent(purlString),
1008
+ scope,
1009
+ evidence: {
1010
+ identity: {
1011
+ field: "purl",
1012
+ confidence: 1,
1013
+ methods: [
1014
+ {
1015
+ technique: "instrumentation",
1016
+ confidence: 1,
1017
+ value: env.VIRTUAL_ENV || env.CONDA_PREFIX,
1018
+ },
1019
+ ],
1020
+ },
1021
+ },
1022
+ properties: [
1023
+ {
1024
+ name: "internal:SrcFile",
1025
+ value: reqOrSetupFile,
1026
+ },
1027
+ ],
1028
+ };
1029
+ if (scope !== "excluded") {
1030
+ pkgList.push(apkg);
1031
+ if (explicitDeps.size === 0 || explicitDeps.has(name)) {
1032
+ rootList.push({
1033
+ name,
1034
+ version,
1035
+ purl: purlString,
1036
+ "bom-ref": decodeURIComponent(purlString),
1037
+ });
1038
+ }
1039
+ flattenDeps(dependenciesMap, pkgList, reqOrSetupFile, t);
1040
+ } else {
1041
+ formulationList.push(apkg);
1042
+ }
1043
+ } // end for
1044
+ for (const k of Object.keys(dependenciesMap)) {
1045
+ dependenciesList.push({
1046
+ ref: k,
1047
+ dependsOn: [...new Set(dependenciesMap[k])].sort(),
1048
+ });
1049
+ }
1050
+ }
1051
+ return {
1052
+ pkgList,
1053
+ formulationList,
1054
+ rootList,
1055
+ dependenciesList,
1056
+ frozen,
1057
+ };
1058
+ }
1059
+
1060
+ export function getPipTreeForPackages(
1061
+ basePath,
1062
+ pkgList,
1063
+ tempVenvDir,
1064
+ parentComponent,
1065
+ getTreeWithPluginFn,
1066
+ ) {
1067
+ const failedPkgList = [];
1068
+ const rootList = [];
1069
+ const dependenciesList = [];
1070
+ let result;
1071
+ const env = {
1072
+ ...process.env,
1073
+ };
1074
+ if (!env.CFLAGS) {
1075
+ env.CFLAGS = "-fcommon";
1076
+ } else if (!env.CFLAGS.includes("-fcommon")) {
1077
+ env.CFLAGS = `${env.CFLAGS} -fcommon`;
1078
+ }
1079
+ if (
1080
+ !readEnvironmentVariable("VIRTUAL_ENV") &&
1081
+ !readEnvironmentVariable("CONDA_PREFIX")
1082
+ ) {
1083
+ // Create a virtual environment
1084
+ const venvCreationArgs = ["-m", "venv", tempVenvDir];
1085
+ if (isSecureMode) {
1086
+ venvCreationArgs.unshift("-S");
1087
+ }
1088
+ result = safeSpawnSync(PYTHON_CMD, venvCreationArgs, {
1089
+ shell: isWin,
1090
+ });
1091
+ if (result.status !== 0 || result.error) {
1092
+ console.log("Virtual env creation has failed. Unable to continue.");
1093
+ return {};
1094
+ }
1095
+ env.VIRTUAL_ENV = tempVenvDir;
1096
+ env.PATH = `${join(
1097
+ tempVenvDir,
1098
+ platform() === "win32" ? "Scripts" : "bin",
1099
+ )}${_delimiter}${readEnvironmentVariable("PATH") || ""}`;
1100
+ // When cdxgen is invoked with the container image, we seem to be including unnecessary packages from the image.
1101
+ // This workaround, unsets PYTHONPATH to suppress the pre-installed packages
1102
+ if (
1103
+ env?.PYTHONPATH === "/opt/pypi" &&
1104
+ env?.CDXGEN_IN_CONTAINER === "true"
1105
+ ) {
1106
+ env.PYTHONPATH = undefined;
1107
+ }
1108
+ }
1109
+ const venvMeta = getVenvMetadata(env);
1110
+ const python_cmd_for_tree = get_python_command_from_env(env);
1111
+ let installCmd = python_cmd_for_tree;
1112
+ let pipInstallArgs = [];
1113
+ if (venvMeta.type === "uv") {
1114
+ installCmd = "uv";
1115
+ pipInstallArgs = ["pip", "install"];
1116
+ if (isSecureMode) {
1117
+ pipInstallArgs.push("--only-binary");
1118
+ pipInstallArgs.push(":all:");
1119
+ }
1120
+ } else {
1121
+ pipInstallArgs = ["-m", "pip", "install", "--disable-pip-version-check"];
1122
+ if (isSecureMode) {
1123
+ pipInstallArgs.push("--only-binary=:all:");
1124
+ pipInstallArgs.unshift("-S");
1125
+ }
1126
+ }
1127
+ // Support for passing additional arguments to pip
1128
+ // Eg: --python-version 3.10 --ignore-requires-python --no-warn-conflicts
1129
+ if (process?.env?.PIP_INSTALL_ARGS) {
1130
+ const addArgs = readEnvironmentVariable("PIP_INSTALL_ARGS").split(" ");
1131
+ pipInstallArgs = pipInstallArgs.concat(addArgs);
1132
+ } else {
1133
+ if (venvMeta.type !== "uv") {
1134
+ pipInstallArgs = pipInstallArgs.concat([
1135
+ "--ignore-requires-python",
1136
+ "--no-compile",
1137
+ "--no-warn-script-location",
1138
+ "--no-warn-conflicts",
1139
+ ]);
1140
+ } else {
1141
+ pipInstallArgs.push("--no-compile");
1142
+ }
1143
+ }
1144
+ if (DEBUG_MODE) {
1145
+ console.log(
1146
+ "Installing",
1147
+ pkgList.length,
1148
+ "packages using the command",
1149
+ installCmd,
1150
+ pipInstallArgs.join(" "),
1151
+ );
1152
+ }
1153
+ for (const apkg of pkgList) {
1154
+ let pkgSpecifier = apkg.name;
1155
+ if (apkg.version && apkg.version !== "latest") {
1156
+ pkgSpecifier = `${apkg.name}==${apkg.version}`;
1157
+ } else if (apkg.properties) {
1158
+ let versionSpecifierFound = false;
1159
+ for (const aprop of apkg.properties) {
1160
+ if (aprop.name === "cdx:pypi:versionSpecifiers") {
1161
+ pkgSpecifier = `${apkg.name}${aprop.value}`;
1162
+ versionSpecifierFound = true;
1163
+ break;
1164
+ }
1165
+ }
1166
+ if (!versionSpecifierFound) {
1167
+ failedPkgList.push(apkg);
1168
+ continue;
1169
+ }
1170
+ } else {
1171
+ failedPkgList.push(apkg);
1172
+ continue;
1173
+ }
1174
+ if (DEBUG_MODE) {
1175
+ console.log("Installing", pkgSpecifier);
1176
+ }
1177
+ const result = safeSpawnSync(
1178
+ installCmd,
1179
+ [...pipInstallArgs, pkgSpecifier],
1180
+ {
1181
+ cwd: basePath,
1182
+ shell: isWin,
1183
+ env,
1184
+ },
1185
+ );
1186
+ if (result.status !== 0 || result.error) {
1187
+ failedPkgList.push(apkg);
1188
+ if (DEBUG_MODE) {
1189
+ console.log(apkg.name, "failed to install.");
1190
+ }
1191
+ }
1192
+ }
1193
+ // Did any package get installed successfully?
1194
+ if (failedPkgList.length < pkgList.length) {
1195
+ const venvRoot = env.VIRTUAL_ENV || env.CONDA_PREFIX;
1196
+ if (venvRoot) {
1197
+ const binDir = platform() === "win32" ? "Scripts" : "bin";
1198
+ const pipExe = join(
1199
+ venvRoot,
1200
+ binDir,
1201
+ platform() === "win32" ? "pip.exe" : "pip",
1202
+ );
1203
+ if (!safeExistsSync(pipExe)) {
1204
+ if (venvMeta.type === "uv") {
1205
+ safeSpawnSync("uv", ["pip", "install", "pip"], {
1206
+ cwd: basePath,
1207
+ shell: isWin,
1208
+ env,
1209
+ });
1210
+ } else {
1211
+ safeSpawnSync(python_cmd_for_tree, ["-m", "ensurepip", "--upgrade"], {
1212
+ cwd: basePath,
1213
+ shell: isWin,
1214
+ env,
1215
+ });
1216
+ }
1217
+ }
1218
+ }
1219
+ const dependenciesMap = {};
1220
+ const tree = getTreeWithPluginFn(env, python_cmd_for_tree, basePath);
1221
+ for (const t of tree) {
1222
+ const name = t.name.replace(/_/g, "-").toLowerCase();
1223
+ // We can ignore excluded components such as build tools
1224
+ if (PYTHON_EXCLUDED_COMPONENTS.includes(name)) {
1225
+ continue;
1226
+ }
1227
+ if (parentComponent && parentComponent.name === t.name) {
1228
+ t.version = parentComponent.version;
1229
+ } else if (t.version && t.version === "latest") {
1230
+ continue;
1231
+ }
1232
+ const version = t.version;
1233
+ const purlString = build({
1234
+ type: "pypi",
1235
+ namespace: "" || null,
1236
+ name: name,
1237
+ version: version || null,
1238
+ });
1239
+ const apkg = {
1240
+ name,
1241
+ version,
1242
+ purl: purlString,
1243
+ type: "library",
1244
+ "bom-ref": decodeURIComponent(purlString),
1245
+ evidence: {
1246
+ identity: {
1247
+ field: "purl",
1248
+ confidence: 0.5,
1249
+ methods: [
1250
+ {
1251
+ technique: "instrumentation",
1252
+ confidence: 0.5,
1253
+ value: env.VIRTUAL_ENV,
1254
+ },
1255
+ ],
1256
+ },
1257
+ },
1258
+ };
1259
+ // These packages have lower confidence
1260
+ pkgList.push(apkg);
1261
+ rootList.push({
1262
+ name,
1263
+ version,
1264
+ purl: purlString,
1265
+ "bom-ref": decodeURIComponent(purlString),
1266
+ });
1267
+ flattenDeps(dependenciesMap, pkgList, undefined, t);
1268
+ } // end for
1269
+ for (const k of Object.keys(dependenciesMap)) {
1270
+ dependenciesList.push({
1271
+ ref: k,
1272
+ dependsOn: [...new Set(dependenciesMap[k])].sort(),
1273
+ });
1274
+ }
1275
+ } // end if
1276
+ return {
1277
+ failedPkgList,
1278
+ rootList,
1279
+ dependenciesList,
1280
+ };
1281
+ }