@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,1294 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { sep as _sep, basename, dirname, join, resolve } from "node:path";
3
+
4
+ import { build } from "@cdxgen/cdx-purl";
5
+ import toml from "@iarna/toml";
6
+ import { globSync } from "glob";
7
+
8
+ import { DEBUG_MODE } from "../core/activity.js";
9
+ import { shouldFetchLicense } from "../core/env.js";
10
+ import { safeExistsSync } from "../core/fs.js";
11
+ import { traceLog } from "../core/logger.js";
12
+ import { getCratesMetadata, normalizeCargoIntegrity } from "./ecosystems.js";
13
+
14
+ /**
15
+ * Convert list of file paths to components
16
+ *
17
+ * @param {Array} fileList List of file paths
18
+ *
19
+ * @returns {Array} List of components
20
+ */
21
+ function fileListToComponents(fileList) {
22
+ const components = [];
23
+ for (const afile of fileList) {
24
+ components.push({
25
+ name: basename(afile),
26
+ type: "file",
27
+ properties: [
28
+ {
29
+ name: "internal:SrcFile",
30
+ value: afile,
31
+ },
32
+ ],
33
+ });
34
+ }
35
+ return components;
36
+ }
37
+
38
+ /**
39
+ * Parse dependency info from the `[package]` node in `cargo.toml` or `cargo.lock`
40
+ * @param {Object} packageNode
41
+ * @returns {Object} dependency info
42
+ * @throws {Error} if dependency name or version is invalid
43
+ */
44
+ function parseCargoDependencyFromPackageNode(packageNode) {
45
+ const pkg = {};
46
+ const pkgName = packageNode["name"];
47
+ let group = dirname(pkgName.toString());
48
+ if (group === ".") {
49
+ group = "";
50
+ }
51
+ const pkgChecksum = packageNode["checksum"];
52
+ const pkgVersion = packageNode["version"];
53
+ const pkgAuthors = packageNode["authors"];
54
+ const pkgHomepage = packageNode["homepage"];
55
+ const pkgRepository = packageNode["repository"];
56
+ const pkgLicense = packageNode["license"];
57
+ const pkgDependencies = packageNode["dependencies"];
58
+
59
+ // the value of attributes like:
60
+ // - `version = 1.0.0`
61
+ // - `version.workspace = true`
62
+ const isExtendFromWorkspace = (attribute) => {
63
+ return attribute?.workspace;
64
+ };
65
+ if (!pkgName || !pkgVersion) {
66
+ throw new Error("name or version is not defined");
67
+ }
68
+
69
+ if (!isExtendFromWorkspace(pkgChecksum) && pkgChecksum) {
70
+ const normalizedCargoIntegrity = normalizeCargoIntegrity(pkgChecksum);
71
+ if (normalizedCargoIntegrity) {
72
+ pkg._integrity = normalizedCargoIntegrity;
73
+ }
74
+ }
75
+ if (!isExtendFromWorkspace(pkgName) && pkgName) {
76
+ pkg.group = group;
77
+ pkg.name = basename(pkgName.toString());
78
+ }
79
+ if (!isExtendFromWorkspace(pkgVersion) && pkgVersion) {
80
+ pkg.version = pkgVersion;
81
+ }
82
+ if (!isExtendFromWorkspace(pkgAuthors) && pkgAuthors) {
83
+ if (Array.isArray(pkgAuthors)) {
84
+ pkg.author = pkgAuthors.join(",");
85
+ } else {
86
+ pkg.author = Object.prototype.toString.call(pkgAuthors);
87
+ }
88
+ }
89
+ if (!isExtendFromWorkspace(pkgHomepage) && pkgHomepage) {
90
+ pkg.homepage = { url: pkgHomepage };
91
+ }
92
+ if (!isExtendFromWorkspace(pkgRepository) && pkgRepository) {
93
+ pkg.repository = { url: pkgRepository };
94
+ }
95
+ if (!isExtendFromWorkspace(pkgLicense) && pkgLicense) {
96
+ pkg.license = pkgLicense;
97
+ }
98
+ if (!isExtendFromWorkspace(pkgDependencies) && pkgDependencies) {
99
+ pkg.dependencies = pkgDependencies;
100
+ }
101
+ return pkg;
102
+ }
103
+
104
+ function cargoIntegrityToComponentHash(integrity) {
105
+ const normalizedIntegrity = normalizeCargoIntegrity(integrity);
106
+ if (!normalizedIntegrity) {
107
+ return undefined;
108
+ }
109
+ const [, algorithm, digest] = /^(sha256|sha384)-([a-f0-9]+)$/i.exec(
110
+ normalizedIntegrity,
111
+ );
112
+ return {
113
+ alg: algorithm.toLowerCase() === "sha384" ? "SHA-384" : "SHA-256",
114
+ content: digest,
115
+ };
116
+ }
117
+
118
+ function readCargoTomlData(cargoTomlFile) {
119
+ if (!cargoTomlFile || !safeExistsSync(cargoTomlFile)) {
120
+ return undefined;
121
+ }
122
+ try {
123
+ return toml.parse(readFileSync(cargoTomlFile, { encoding: "utf-8" }));
124
+ } catch (error) {
125
+ traceLog("cargo", {
126
+ cargoTomlFile,
127
+ error: error.message,
128
+ });
129
+ if (DEBUG_MODE) {
130
+ console.warn(`Failed to parse Cargo manifest ${cargoTomlFile}:`, error);
131
+ }
132
+ return undefined;
133
+ }
134
+ }
135
+
136
+ function isCargoWorkspaceReference(value) {
137
+ return Boolean(value?.workspace);
138
+ }
139
+
140
+ function cargoPackageInfoToPurl(pkg) {
141
+ return decodeURIComponent(
142
+ build({
143
+ type: "cargo",
144
+ namespace: pkg?.group || null,
145
+ name: pkg?.name,
146
+ version: pkg?.version || null,
147
+ }),
148
+ );
149
+ }
150
+
151
+ function resolveCargoDependencyAliasName(dependencyName, dependencyNode) {
152
+ if (
153
+ dependencyNode &&
154
+ typeof dependencyNode === "object" &&
155
+ typeof dependencyNode.package === "string" &&
156
+ dependencyNode.package
157
+ ) {
158
+ return dependencyNode.package;
159
+ }
160
+ return dependencyName;
161
+ }
162
+
163
+ function resolveCargoWorkspaceContext(cargoTomlFile, cargoData, context = {}) {
164
+ if (
165
+ context?.workspaceRootFile &&
166
+ context?.workspaceRootData &&
167
+ safeExistsSync(context.workspaceRootFile)
168
+ ) {
169
+ return {
170
+ isVirtualWorkspace: !context.workspaceRootData?.package,
171
+ isWorkspaceRoot: context.workspaceRootFile === cargoTomlFile,
172
+ workspaceData: context.workspaceRootData.workspace,
173
+ workspaceRootData: context.workspaceRootData,
174
+ workspaceRootFile: context.workspaceRootFile,
175
+ };
176
+ }
177
+ let currentDir = dirname(cargoTomlFile);
178
+ while (currentDir && currentDir !== dirname(currentDir)) {
179
+ const candidateFile = join(currentDir, "Cargo.toml");
180
+ if (safeExistsSync(candidateFile)) {
181
+ const candidateData =
182
+ candidateFile === cargoTomlFile
183
+ ? cargoData
184
+ : readCargoTomlData(candidateFile);
185
+ if (candidateData?.workspace) {
186
+ return {
187
+ isVirtualWorkspace: !candidateData?.package,
188
+ isWorkspaceRoot: candidateFile === cargoTomlFile,
189
+ workspaceData: candidateData.workspace,
190
+ workspaceRootData: candidateData,
191
+ workspaceRootFile: candidateFile,
192
+ };
193
+ }
194
+ }
195
+ const parentDir = dirname(currentDir);
196
+ if (parentDir === currentDir) {
197
+ break;
198
+ }
199
+ currentDir = parentDir;
200
+ }
201
+ return {};
202
+ }
203
+
204
+ function resolveCargoWorkspaceMembers(workspaceRootFile, workspaceData) {
205
+ const workspaceRootDir = dirname(workspaceRootFile);
206
+ const members = [];
207
+ const excludedRoots = new Set();
208
+ for (const excludedPattern of workspaceData?.exclude || []) {
209
+ excludedRoots.add(resolve(workspaceRootDir, excludedPattern));
210
+ }
211
+ for (const memberPattern of workspaceData?.members || []) {
212
+ const directMemberFile = resolve(
213
+ workspaceRootDir,
214
+ memberPattern,
215
+ "Cargo.toml",
216
+ );
217
+ if (safeExistsSync(directMemberFile)) {
218
+ members.push(directMemberFile);
219
+ continue;
220
+ }
221
+ const matchedMemberFiles = globSync(
222
+ join(memberPattern, "Cargo.toml").replaceAll("\\", "/"),
223
+ {
224
+ absolute: true,
225
+ cwd: workspaceRootDir,
226
+ nodir: true,
227
+ windowsPathsNoEscape: true,
228
+ },
229
+ );
230
+ if (matchedMemberFiles?.length) {
231
+ members.push(...matchedMemberFiles);
232
+ }
233
+ }
234
+ return [...new Set(members)]
235
+ .filter((memberFile) => {
236
+ const memberDir = resolve(dirname(memberFile));
237
+ for (const excludedRoot of excludedRoots) {
238
+ if (
239
+ memberDir === excludedRoot ||
240
+ memberDir.startsWith(`${excludedRoot}${_sep}`)
241
+ ) {
242
+ return false;
243
+ }
244
+ }
245
+ return true;
246
+ })
247
+ .sort();
248
+ }
249
+
250
+ function resolveCargoWorkspacePackageNode(packageNode, workspacePackageNode) {
251
+ if (!packageNode || typeof packageNode !== "object") {
252
+ return packageNode;
253
+ }
254
+ const mergedNode = { ...packageNode };
255
+ for (const fieldName of [
256
+ "authors",
257
+ "description",
258
+ "documentation",
259
+ "edition",
260
+ "homepage",
261
+ "keywords",
262
+ "license",
263
+ "name",
264
+ "readme",
265
+ "repository",
266
+ "rust-version",
267
+ "version",
268
+ ]) {
269
+ if (
270
+ isCargoWorkspaceReference(packageNode[fieldName]) &&
271
+ workspacePackageNode?.[fieldName] !== undefined
272
+ ) {
273
+ mergedNode[fieldName] = workspacePackageNode[fieldName];
274
+ }
275
+ }
276
+ return mergedNode;
277
+ }
278
+
279
+ function resolveCargoManifestPackageIdentity(
280
+ cargoTomlFile,
281
+ cargoData,
282
+ context = {},
283
+ ) {
284
+ const workspaceContext = resolveCargoWorkspaceContext(
285
+ cargoTomlFile,
286
+ cargoData,
287
+ context,
288
+ );
289
+ const resolvedPackageNode = resolveCargoWorkspacePackageNode(
290
+ cargoData?.package,
291
+ workspaceContext?.workspaceData?.package,
292
+ );
293
+ if (
294
+ resolvedPackageNode &&
295
+ typeof resolvedPackageNode === "object" &&
296
+ !Array.isArray(resolvedPackageNode)
297
+ ) {
298
+ try {
299
+ return parseCargoDependencyFromPackageNode(resolvedPackageNode);
300
+ } catch {
301
+ return undefined;
302
+ }
303
+ }
304
+ if (
305
+ cargoData?.workspace &&
306
+ workspaceContext?.isWorkspaceRoot &&
307
+ workspaceContext?.isVirtualWorkspace
308
+ ) {
309
+ return {
310
+ group: "",
311
+ name: basename(dirname(cargoTomlFile)),
312
+ version: "workspace",
313
+ };
314
+ }
315
+ return undefined;
316
+ }
317
+
318
+ function normalizeCargoDependencySpec(dependencySpec) {
319
+ if (typeof dependencySpec === "string") {
320
+ return { version: dependencySpec };
321
+ }
322
+ if (!dependencySpec || typeof dependencySpec !== "object") {
323
+ return {};
324
+ }
325
+ return { ...dependencySpec };
326
+ }
327
+
328
+ function mergeCargoWorkspaceDependencySpec(
329
+ dependencyName,
330
+ dependencyNode,
331
+ workspaceDependencies,
332
+ ) {
333
+ if (
334
+ !dependencyNode ||
335
+ typeof dependencyNode !== "object" ||
336
+ dependencyNode.workspace !== true
337
+ ) {
338
+ return dependencyNode;
339
+ }
340
+ const workspaceDependencyNode = workspaceDependencies?.[dependencyName];
341
+ if (workspaceDependencyNode === undefined) {
342
+ return dependencyNode;
343
+ }
344
+ const mergedSpec = {
345
+ ...normalizeCargoDependencySpec(workspaceDependencyNode),
346
+ ...normalizeCargoDependencySpec(dependencyNode),
347
+ };
348
+ mergedSpec.workspace = true;
349
+ if (
350
+ Array.isArray(workspaceDependencyNode?.features) ||
351
+ Array.isArray(dependencyNode?.features)
352
+ ) {
353
+ mergedSpec.features = [
354
+ ...new Set([
355
+ ...(workspaceDependencyNode?.features || []),
356
+ ...(dependencyNode?.features || []),
357
+ ]),
358
+ ];
359
+ }
360
+ return mergedSpec;
361
+ }
362
+
363
+ function resolveCargoWorkspaceMemberMap(
364
+ workspaceRootFile,
365
+ workspaceRootData,
366
+ workspaceMemberCache,
367
+ ) {
368
+ if (!workspaceRootFile || !workspaceRootData?.workspace) {
369
+ return new Map();
370
+ }
371
+ const cacheKey = resolve(workspaceRootFile);
372
+ if (workspaceMemberCache?.has(cacheKey)) {
373
+ return workspaceMemberCache.get(cacheKey);
374
+ }
375
+ const memberMap = new Map();
376
+ const workspaceMemberFiles = resolveCargoWorkspaceMembers(
377
+ workspaceRootFile,
378
+ workspaceRootData.workspace,
379
+ );
380
+ for (const workspaceMemberFile of workspaceMemberFiles) {
381
+ const memberCargoData = readCargoTomlData(workspaceMemberFile);
382
+ if (!memberCargoData) {
383
+ continue;
384
+ }
385
+ const memberIdentity = resolveCargoManifestPackageIdentity(
386
+ workspaceMemberFile,
387
+ memberCargoData,
388
+ {
389
+ workspaceRootData,
390
+ workspaceRootFile,
391
+ },
392
+ );
393
+ if (!memberIdentity?.name || !memberIdentity?.version) {
394
+ continue;
395
+ }
396
+ memberMap.set(memberIdentity.name, {
397
+ ...memberIdentity,
398
+ filePath: workspaceMemberFile,
399
+ ref: cargoPackageInfoToPurl(memberIdentity),
400
+ });
401
+ }
402
+ workspaceMemberCache?.set(cacheKey, memberMap);
403
+ return memberMap;
404
+ }
405
+
406
+ function resolveCargoWorkspaceDependencyTarget(
407
+ cargoTomlFile,
408
+ dependencyName,
409
+ dependencyNode,
410
+ workspaceContext,
411
+ workspaceMemberMap,
412
+ ) {
413
+ const resolvedDependencyName = resolveCargoDependencyAliasName(
414
+ dependencyName,
415
+ dependencyNode,
416
+ );
417
+ if (
418
+ dependencyNode &&
419
+ typeof dependencyNode === "object" &&
420
+ dependencyNode.workspace === true &&
421
+ workspaceMemberMap?.has(resolvedDependencyName)
422
+ ) {
423
+ return workspaceMemberMap.get(resolvedDependencyName);
424
+ }
425
+ const dependencyPath =
426
+ dependencyNode &&
427
+ typeof dependencyNode === "object" &&
428
+ typeof dependencyNode.path === "string" &&
429
+ dependencyNode.path
430
+ ? resolve(dirname(cargoTomlFile), dependencyNode.path, "Cargo.toml")
431
+ : undefined;
432
+ if (!dependencyPath || !safeExistsSync(dependencyPath)) {
433
+ return undefined;
434
+ }
435
+ const dependencyCargoData = readCargoTomlData(dependencyPath);
436
+ if (!dependencyCargoData) {
437
+ return undefined;
438
+ }
439
+ const dependencyIdentity = resolveCargoManifestPackageIdentity(
440
+ dependencyPath,
441
+ dependencyCargoData,
442
+ {
443
+ workspaceRootData: workspaceContext?.workspaceRootData,
444
+ workspaceRootFile: workspaceContext?.workspaceRootFile,
445
+ },
446
+ );
447
+ if (!dependencyIdentity?.name || !dependencyIdentity?.version) {
448
+ return undefined;
449
+ }
450
+ return {
451
+ ...dependencyIdentity,
452
+ filePath: dependencyPath,
453
+ ref: cargoPackageInfoToPurl(dependencyIdentity),
454
+ };
455
+ }
456
+
457
+ function ensurePropertiesArray(pkg) {
458
+ if (!pkg.properties) {
459
+ pkg.properties = [];
460
+ }
461
+ return pkg.properties;
462
+ }
463
+
464
+ function appendCargoProperty(pkg, name, value) {
465
+ if (!name || value === undefined || value === null || value === "") {
466
+ return;
467
+ }
468
+ const properties = ensurePropertiesArray(pkg);
469
+ const stringValue = typeof value === "string" ? value : String(value);
470
+ if (
471
+ properties.some(
472
+ (property) => property.name === name && property.value === stringValue,
473
+ )
474
+ ) {
475
+ return;
476
+ }
477
+ properties.push({
478
+ name,
479
+ value: stringValue,
480
+ });
481
+ }
482
+
483
+ function normalizeCargoDependencyVersion(dependencyNode) {
484
+ if (typeof dependencyNode === "string" || dependencyNode instanceof String) {
485
+ return dependencyNode.trim();
486
+ }
487
+ if (!dependencyNode || typeof dependencyNode !== "object") {
488
+ return "";
489
+ }
490
+ if (typeof dependencyNode.version === "string" && dependencyNode.version) {
491
+ return dependencyNode.version;
492
+ }
493
+ if (typeof dependencyNode.git === "string" && dependencyNode.git) {
494
+ return `git+${dependencyNode.git}`;
495
+ }
496
+ if (typeof dependencyNode.path === "string" && dependencyNode.path) {
497
+ return `path+${dependencyNode.path}`;
498
+ }
499
+ if (dependencyNode.workspace === true) {
500
+ return "workspace";
501
+ }
502
+ return "";
503
+ }
504
+
505
+ function applyCargoDependencySpecMetadata(
506
+ pkg,
507
+ dependencyNode,
508
+ dependencyKind,
509
+ targetSelector,
510
+ resolvedWorkspaceTarget,
511
+ ) {
512
+ appendCargoProperty(pkg, "cdx:cargo:dependencyKind", dependencyKind);
513
+ appendCargoProperty(pkg, "cdx:cargo:scope", dependencyKind);
514
+ if (targetSelector) {
515
+ appendCargoProperty(pkg, "cdx:cargo:target", targetSelector);
516
+ }
517
+ if (!dependencyNode || typeof dependencyNode !== "object") {
518
+ if (dependencyKind === "dev") {
519
+ pkg.scope = "excluded";
520
+ }
521
+ return;
522
+ }
523
+ if (dependencyKind === "dev") {
524
+ pkg.scope = "excluded";
525
+ }
526
+ if (dependencyNode.optional === true) {
527
+ pkg.scope = "optional";
528
+ appendCargoProperty(pkg, "cdx:cargo:optional", "true");
529
+ }
530
+ if (dependencyNode.default_features === false) {
531
+ appendCargoProperty(pkg, "cdx:cargo:defaultFeatures", "false");
532
+ }
533
+ if (dependencyNode["default-features"] === false) {
534
+ appendCargoProperty(pkg, "cdx:cargo:defaultFeatures", "false");
535
+ }
536
+ if (
537
+ Array.isArray(dependencyNode.features) &&
538
+ dependencyNode.features.length
539
+ ) {
540
+ appendCargoProperty(
541
+ pkg,
542
+ "cdx:cargo:dependencyFeatures",
543
+ JSON.stringify(dependencyNode.features),
544
+ );
545
+ }
546
+ appendCargoProperty(pkg, "cdx:cargo:path", dependencyNode.path);
547
+ appendCargoProperty(pkg, "cdx:cargo:git", dependencyNode.git);
548
+ appendCargoProperty(pkg, "cdx:cargo:gitBranch", dependencyNode.branch);
549
+ appendCargoProperty(pkg, "cdx:cargo:gitTag", dependencyNode.tag);
550
+ appendCargoProperty(pkg, "cdx:cargo:gitRev", dependencyNode.rev);
551
+ appendCargoProperty(pkg, "cdx:cargo:registry", dependencyNode.registry);
552
+ appendCargoProperty(pkg, "cdx:cargo:package", dependencyNode.package);
553
+ appendCargoProperty(
554
+ pkg,
555
+ "cdx:cargo:workspaceDependency",
556
+ dependencyNode.workspace === true ? "true" : undefined,
557
+ );
558
+ appendCargoProperty(
559
+ pkg,
560
+ "cdx:cargo:workspaceDependencyResolved",
561
+ resolvedWorkspaceTarget ? "true" : undefined,
562
+ );
563
+ appendCargoProperty(
564
+ pkg,
565
+ "cdx:cargo:resolvedWorkspaceMember",
566
+ resolvedWorkspaceTarget?.name,
567
+ );
568
+ appendCargoProperty(
569
+ pkg,
570
+ "cdx:cargo:resolvedMemberPath",
571
+ resolvedWorkspaceTarget?.filePath,
572
+ );
573
+ }
574
+
575
+ function collectCargoManifestDependencyComponents(
576
+ dependencyEntries,
577
+ addPackageToList,
578
+ pkgList,
579
+ simple,
580
+ dependencyKind,
581
+ targetSelector,
582
+ workspaceDependencies,
583
+ cargoTomlFile,
584
+ workspaceContext,
585
+ workspaceMemberMap,
586
+ ) {
587
+ if (!dependencyEntries || typeof dependencyEntries !== "object") {
588
+ return;
589
+ }
590
+ for (const dependencyName of Object.keys(dependencyEntries)) {
591
+ const dependencyNode = mergeCargoWorkspaceDependencySpec(
592
+ dependencyName,
593
+ dependencyEntries[dependencyName],
594
+ workspaceDependencies,
595
+ );
596
+ const resolvedWorkspaceTarget = resolveCargoWorkspaceDependencyTarget(
597
+ cargoTomlFile,
598
+ dependencyName,
599
+ dependencyNode,
600
+ workspaceContext,
601
+ workspaceMemberMap,
602
+ );
603
+ const version = normalizeCargoDependencyVersion(dependencyNode);
604
+ if (!dependencyName || !version) {
605
+ continue;
606
+ }
607
+ const pkg = {
608
+ name: dependencyName,
609
+ version,
610
+ };
611
+ applyCargoDependencySpecMetadata(
612
+ pkg,
613
+ dependencyNode,
614
+ dependencyKind,
615
+ targetSelector,
616
+ resolvedWorkspaceTarget,
617
+ );
618
+ addPackageToList(pkgList, pkg, { packageMode: false, simple });
619
+ }
620
+ }
621
+
622
+ /**
623
+ * Method to parse cargo.toml data
624
+ *
625
+ * The component described by a [package] section will be put at the front of
626
+ * the list, regardless of if [package] appears before or after
627
+ * [dependencies]. Found dependencies will be placed at the back of the
628
+ * list.
629
+ *
630
+ * The Cargo documentation specifies that the [package] section should appear
631
+ * first as a convention, but it is not enforced.
632
+ * https://doc.rust-lang.org/stable/style-guide/cargo.html#formatting-conventions
633
+ *
634
+ * @param {String} cargoTomlFile cargo.toml file
635
+ * @param {boolean} simple Return a simpler representation of the component by skipping extended attributes and license fetch.
636
+ * @param {Object} pkgFilesMap Object with package name and list of files
637
+ *
638
+ * @returns {Array} Package list
639
+ */
640
+ export async function parseCargoTomlData(
641
+ cargoTomlFile,
642
+ simple = false,
643
+ pkgFilesMap = {},
644
+ context = {},
645
+ ) {
646
+ const pkgList = [];
647
+
648
+ // Helper function to add a component to the package list. It will uphold
649
+ // the guarantee that the component described by the
650
+ // [package]-section remains at the front of the list, and add evidence if
651
+ // requested.
652
+ const addPackageToList = (packageList, pkg, { packageMode, simple }) => {
653
+ if (!pkg) return;
654
+
655
+ if (!simple) {
656
+ pkg.properties = [
657
+ {
658
+ name: "internal:SrcFile",
659
+ value: cargoTomlFile,
660
+ },
661
+ ...(pkg.properties || []),
662
+ ];
663
+ if (pkgFilesMap?.[pkg.name]) {
664
+ pkg.components = fileListToComponents(pkgFilesMap[pkg.name]);
665
+ }
666
+ pkg.evidence = {
667
+ identity: {
668
+ field: "purl",
669
+ confidence: pkg.version ? 0.5 : 0,
670
+ methods: [
671
+ {
672
+ technique: "manifest-analysis",
673
+ confidence: pkg.version ? 0.5 : 0,
674
+ value: cargoTomlFile,
675
+ },
676
+ ],
677
+ },
678
+ };
679
+ }
680
+ const ppurl = build({
681
+ type: "cargo",
682
+ namespace: pkg.group || null,
683
+ name: pkg.name,
684
+ version: pkg.version || null,
685
+ });
686
+ pkg.purl = ppurl;
687
+ pkg["bom-ref"] = decodeURIComponent(ppurl);
688
+ pkg.type = "library";
689
+
690
+ // Ensure the component described by [package] is in front of the list to
691
+ // give the caller some information about which component the BOM is the
692
+ // parent component and which are dependencies.
693
+ if (packageMode) {
694
+ packageList.unshift(pkg);
695
+ } else {
696
+ packageList.push(pkg);
697
+ }
698
+ };
699
+
700
+ if (!cargoTomlFile || !safeExistsSync(cargoTomlFile)) {
701
+ return pkgList;
702
+ }
703
+ const normalizedCargoTomlFile = resolve(cargoTomlFile);
704
+ cargoTomlFile = normalizedCargoTomlFile;
705
+ const visitedCargoTomlFiles = context?.visitedCargoTomlFiles || new Set();
706
+ for (const visitedCargoTomlFile of visitedCargoTomlFiles) {
707
+ if (typeof visitedCargoTomlFile === "string") {
708
+ visitedCargoTomlFiles.add(resolve(visitedCargoTomlFile));
709
+ }
710
+ }
711
+ if (visitedCargoTomlFiles.has(normalizedCargoTomlFile)) {
712
+ return pkgList;
713
+ }
714
+ visitedCargoTomlFiles.add(normalizedCargoTomlFile);
715
+ const cargoData = readCargoTomlData(normalizedCargoTomlFile);
716
+ if (!cargoData) {
717
+ return pkgList;
718
+ }
719
+ const workspaceContext = resolveCargoWorkspaceContext(
720
+ normalizedCargoTomlFile,
721
+ cargoData,
722
+ context,
723
+ );
724
+ const workspacePackageNode = workspaceContext?.workspaceData?.package;
725
+ const workspaceDependencies = workspaceContext?.workspaceData?.dependencies;
726
+ const workspaceMemberCache = context?.workspaceMemberCache || new Map();
727
+ const workspaceMemberMap = resolveCargoWorkspaceMemberMap(
728
+ workspaceContext?.workspaceRootFile,
729
+ workspaceContext?.workspaceRootData,
730
+ workspaceMemberCache,
731
+ );
732
+ const packageNode = resolveCargoWorkspacePackageNode(
733
+ cargoData["package"],
734
+ workspacePackageNode,
735
+ );
736
+ // parse `[package]`
737
+ if (packageNode instanceof Object && !Array.isArray(packageNode)) {
738
+ /** @type {Object} */
739
+ const packageObjNode = packageNode;
740
+ try {
741
+ const pkg = parseCargoDependencyFromPackageNode(packageNode);
742
+ addPackageToList(pkgList, pkg, { packageMode: true, simple });
743
+ } catch (e) {
744
+ console.warn(
745
+ `Failed to parse package: ${packageObjNode?.name}@${packageObjNode?.version},fail with:${e.message}`,
746
+ );
747
+ }
748
+ } else if (
749
+ cargoData.workspace &&
750
+ workspaceContext?.isWorkspaceRoot &&
751
+ workspaceContext?.isVirtualWorkspace
752
+ ) {
753
+ const workspaceComponent = {
754
+ name: basename(dirname(cargoTomlFile)),
755
+ properties: [],
756
+ version: "workspace",
757
+ };
758
+ appendCargoProperty(
759
+ workspaceComponent,
760
+ "cdx:cargo:manifestMode",
761
+ "virtual-workspace",
762
+ );
763
+ addPackageToList(pkgList, workspaceComponent, {
764
+ packageMode: true,
765
+ simple,
766
+ });
767
+ }
768
+ if (pkgList[0] && workspaceContext?.workspaceRootFile) {
769
+ appendCargoProperty(
770
+ pkgList[0],
771
+ "cdx:cargo:workspaceRoot",
772
+ workspaceContext.workspaceRootFile,
773
+ );
774
+ appendCargoProperty(
775
+ pkgList[0],
776
+ "cdx:cargo:manifestMode",
777
+ cargoData?.workspace
778
+ ? workspaceContext?.isVirtualWorkspace
779
+ ? "virtual-workspace"
780
+ : "workspace"
781
+ : "package",
782
+ );
783
+ }
784
+ if (Array.isArray(cargoData?.workspace?.members) && pkgList[0]) {
785
+ appendCargoProperty(pkgList[0], "cdx:cargo:hasWorkspaceMembers", "true");
786
+ appendCargoProperty(
787
+ pkgList[0],
788
+ "cdx:cargo:workspaceMembers",
789
+ cargoData.workspace.members.join(", "),
790
+ );
791
+ }
792
+ collectCargoManifestDependencyComponents(
793
+ cargoData["dependencies"],
794
+ addPackageToList,
795
+ pkgList,
796
+ simple,
797
+ "runtime",
798
+ undefined,
799
+ workspaceDependencies,
800
+ cargoTomlFile,
801
+ workspaceContext,
802
+ workspaceMemberMap,
803
+ );
804
+ collectCargoManifestDependencyComponents(
805
+ cargoData["build-dependencies"],
806
+ addPackageToList,
807
+ pkgList,
808
+ simple,
809
+ "build",
810
+ undefined,
811
+ workspaceDependencies,
812
+ cargoTomlFile,
813
+ workspaceContext,
814
+ workspaceMemberMap,
815
+ );
816
+ collectCargoManifestDependencyComponents(
817
+ cargoData["dev-dependencies"],
818
+ addPackageToList,
819
+ pkgList,
820
+ simple,
821
+ "dev",
822
+ undefined,
823
+ workspaceDependencies,
824
+ cargoTomlFile,
825
+ workspaceContext,
826
+ workspaceMemberMap,
827
+ );
828
+ if (cargoData.target && typeof cargoData.target === "object") {
829
+ for (const targetSelector of Object.keys(cargoData.target)) {
830
+ const targetBlock = cargoData.target[targetSelector];
831
+ if (!targetBlock || typeof targetBlock !== "object") {
832
+ continue;
833
+ }
834
+ collectCargoManifestDependencyComponents(
835
+ targetBlock["dependencies"],
836
+ addPackageToList,
837
+ pkgList,
838
+ simple,
839
+ "runtime",
840
+ targetSelector,
841
+ workspaceDependencies,
842
+ cargoTomlFile,
843
+ workspaceContext,
844
+ workspaceMemberMap,
845
+ );
846
+ collectCargoManifestDependencyComponents(
847
+ targetBlock["build-dependencies"],
848
+ addPackageToList,
849
+ pkgList,
850
+ simple,
851
+ "build",
852
+ targetSelector,
853
+ workspaceDependencies,
854
+ cargoTomlFile,
855
+ workspaceContext,
856
+ workspaceMemberMap,
857
+ );
858
+ collectCargoManifestDependencyComponents(
859
+ targetBlock["dev-dependencies"],
860
+ addPackageToList,
861
+ pkgList,
862
+ simple,
863
+ "dev",
864
+ targetSelector,
865
+ workspaceDependencies,
866
+ cargoTomlFile,
867
+ workspaceContext,
868
+ workspaceMemberMap,
869
+ );
870
+ }
871
+ }
872
+ if (
873
+ context?.includeWorkspaceMembers !== false &&
874
+ workspaceContext?.isWorkspaceRoot &&
875
+ Array.isArray(cargoData?.workspace?.members)
876
+ ) {
877
+ const workspaceMemberFiles = resolveCargoWorkspaceMembers(
878
+ cargoTomlFile,
879
+ cargoData.workspace,
880
+ );
881
+ for (const workspaceMemberFile of workspaceMemberFiles) {
882
+ if (workspaceMemberFile === cargoTomlFile) {
883
+ continue;
884
+ }
885
+ const workspaceMemberPackages = await parseCargoTomlData(
886
+ workspaceMemberFile,
887
+ simple,
888
+ pkgFilesMap,
889
+ {
890
+ includeWorkspaceMembers: false,
891
+ visitedCargoTomlFiles,
892
+ workspaceMemberCache,
893
+ workspaceRootData: cargoData,
894
+ workspaceRootFile: cargoTomlFile,
895
+ },
896
+ );
897
+ if (workspaceMemberPackages?.length) {
898
+ pkgList.push(...workspaceMemberPackages);
899
+ }
900
+ }
901
+ }
902
+
903
+ if (!simple && shouldFetchLicense()) {
904
+ return await getCratesMetadata(pkgList);
905
+ }
906
+ return pkgList;
907
+ }
908
+
909
+ /**
910
+ * Parse a Cargo.lock file to find components within the Rust project.
911
+ *
912
+ * @param {String} cargoLockFile A path to a Cargo.lock file. The Cargo.lock-file path may be used as information for extended attributes, such as manifest based evidence.
913
+ * @param {boolean} simple Return a simpler representation of the component by skipping extended attributes and license fetch.
914
+ * @param {Object} pkgFilesMap Object with package name and list of files
915
+ *
916
+ * @returns {Array} A list of the project's components as described by the Cargo.lock-file.
917
+ */
918
+ export async function parseCargoData(
919
+ cargoLockFile,
920
+ simple = false,
921
+ pkgFilesMap = {},
922
+ ) {
923
+ const addPackageToList = (packageList, newPackage, { simple }) => {
924
+ if (!newPackage) {
925
+ return;
926
+ }
927
+
928
+ const purl = build({
929
+ type: "cargo",
930
+ namespace: "" || null,
931
+ name: newPackage.name,
932
+ version: newPackage.version || null,
933
+ });
934
+ const component = {
935
+ type: "library",
936
+ group: newPackage.group,
937
+ "bom-ref": purl,
938
+ purl: purl,
939
+ name: newPackage.name,
940
+ version: newPackage.version,
941
+ };
942
+
943
+ const integrityHash = cargoIntegrityToComponentHash(newPackage._integrity);
944
+ if (integrityHash) {
945
+ component.hashes = [integrityHash];
946
+ }
947
+
948
+ if (!simple) {
949
+ // Assign evidence according to CycloneDX's confidence recommendations in section Evidence of:
950
+ // * https://cyclonedx.org/guides/OWASP_CycloneDX-Authoritative-Guide-to-SBOM-en.pdf
951
+ // The evidence is deemed to be reliable because Cargo itself generates
952
+ // the Cargo.lock-file based on the listed dependencies in the
953
+ // Cargo.toml-file and registry information. So, either we get a direct
954
+ // dependency (very likely), or a transitive dependency based on
955
+ // evidence from the package information in the Cargo registry.
956
+ component.evidence = {
957
+ identity: {
958
+ field: "purl",
959
+ confidence: 0.6,
960
+ methods: [
961
+ {
962
+ technique: "manifest-analysis",
963
+ confidence: 0.6,
964
+ value: cargoLockFile,
965
+ },
966
+ ],
967
+ },
968
+ };
969
+
970
+ // Evidence information for CyclondDX specification version < 1.5.
971
+ component.properties = [
972
+ {
973
+ name: "internal:SrcFile",
974
+ value: cargoLockFile,
975
+ },
976
+ ];
977
+ if (pkgFilesMap?.[newPackage.name]) {
978
+ component.components = fileListToComponents(
979
+ pkgFilesMap[component.name],
980
+ );
981
+ }
982
+ }
983
+ packageList.push(component);
984
+ };
985
+ const pkgList = [];
986
+ if (!cargoLockFile) {
987
+ return pkgList;
988
+ }
989
+
990
+ const cargoData = toml.parse(
991
+ readFileSync(cargoLockFile, { encoding: "utf-8" }),
992
+ );
993
+ if (!cargoData) {
994
+ return pkgList;
995
+ }
996
+
997
+ const packageNode = cargoData["package"];
998
+ // parse `[[package]]`
999
+ if (Array.isArray(packageNode)) {
1000
+ packageNode.forEach((packageItem) => {
1001
+ try {
1002
+ const pkg = parseCargoDependencyFromPackageNode(packageItem);
1003
+ addPackageToList(pkgList, pkg, { simple });
1004
+ } catch (e) {
1005
+ console.warn(
1006
+ `Failed to parse package: ${packageItem["name"]}@${packageItem["version"]},fail with:${e.message}`,
1007
+ );
1008
+ }
1009
+ });
1010
+ }
1011
+ if (shouldFetchLicense() && !simple) {
1012
+ return await getCratesMetadata(pkgList);
1013
+ }
1014
+ return pkgList;
1015
+ }
1016
+
1017
+ function collectCargoManifestDependencyRefs(
1018
+ cargoTomlFile,
1019
+ dependencyEntries,
1020
+ workspaceDependencies,
1021
+ workspaceContext,
1022
+ workspaceMemberMap,
1023
+ dependsOn,
1024
+ ) {
1025
+ if (!dependencyEntries || typeof dependencyEntries !== "object") {
1026
+ return;
1027
+ }
1028
+ for (const dependencyName of Object.keys(dependencyEntries)) {
1029
+ const dependencyNode = mergeCargoWorkspaceDependencySpec(
1030
+ dependencyName,
1031
+ dependencyEntries[dependencyName],
1032
+ workspaceDependencies,
1033
+ );
1034
+ const resolvedWorkspaceTarget = resolveCargoWorkspaceDependencyTarget(
1035
+ cargoTomlFile,
1036
+ dependencyName,
1037
+ dependencyNode,
1038
+ workspaceContext,
1039
+ workspaceMemberMap,
1040
+ );
1041
+ if (resolvedWorkspaceTarget?.ref) {
1042
+ dependsOn.add(resolvedWorkspaceTarget.ref);
1043
+ }
1044
+ }
1045
+ }
1046
+
1047
+ /**
1048
+ * Build a Cargo dependency graph from manifest relationships so workspace roots
1049
+ * and member-to-member links can complement lockfile-derived dependency data.
1050
+ *
1051
+ * @param {string} cargoTomlFile Cargo.toml path
1052
+ * @param {object} [context] manifest graph context
1053
+ * @returns {object[]} Cargo dependency relationships
1054
+ */
1055
+ export function parseCargoManifestDependencyData(cargoTomlFile, context = {}) {
1056
+ if (!cargoTomlFile || !safeExistsSync(cargoTomlFile)) {
1057
+ return [];
1058
+ }
1059
+ const normalizedCargoTomlFile = resolve(cargoTomlFile);
1060
+ cargoTomlFile = normalizedCargoTomlFile;
1061
+ const visitedCargoTomlFiles =
1062
+ context?.visitedCargoTomlDependencyGraphFiles || new Set();
1063
+ for (const visitedCargoTomlFile of visitedCargoTomlFiles) {
1064
+ if (typeof visitedCargoTomlFile === "string") {
1065
+ visitedCargoTomlFiles.add(resolve(visitedCargoTomlFile));
1066
+ }
1067
+ }
1068
+ if (visitedCargoTomlFiles.has(normalizedCargoTomlFile)) {
1069
+ return [];
1070
+ }
1071
+ visitedCargoTomlFiles.add(normalizedCargoTomlFile);
1072
+ const cargoData = readCargoTomlData(normalizedCargoTomlFile);
1073
+ if (!cargoData) {
1074
+ return [];
1075
+ }
1076
+ const workspaceContext = resolveCargoWorkspaceContext(
1077
+ cargoTomlFile,
1078
+ cargoData,
1079
+ context,
1080
+ );
1081
+ const workspaceMemberCache = context?.workspaceMemberCache || new Map();
1082
+ const workspaceMemberMap = resolveCargoWorkspaceMemberMap(
1083
+ workspaceContext?.workspaceRootFile,
1084
+ workspaceContext?.workspaceRootData,
1085
+ workspaceMemberCache,
1086
+ );
1087
+ const workspaceDependencies = workspaceContext?.workspaceData?.dependencies;
1088
+ const currentIdentity = resolveCargoManifestPackageIdentity(
1089
+ cargoTomlFile,
1090
+ cargoData,
1091
+ context,
1092
+ );
1093
+ const dependencyGraph = [];
1094
+ const dependsOn = new Set();
1095
+ if (workspaceContext?.isWorkspaceRoot) {
1096
+ for (const workspaceMember of workspaceMemberMap.values()) {
1097
+ if (workspaceMember?.ref) {
1098
+ dependsOn.add(workspaceMember.ref);
1099
+ }
1100
+ }
1101
+ }
1102
+ collectCargoManifestDependencyRefs(
1103
+ cargoTomlFile,
1104
+ cargoData.dependencies,
1105
+ workspaceDependencies,
1106
+ workspaceContext,
1107
+ workspaceMemberMap,
1108
+ dependsOn,
1109
+ );
1110
+ collectCargoManifestDependencyRefs(
1111
+ cargoTomlFile,
1112
+ cargoData["build-dependencies"],
1113
+ workspaceDependencies,
1114
+ workspaceContext,
1115
+ workspaceMemberMap,
1116
+ dependsOn,
1117
+ );
1118
+ collectCargoManifestDependencyRefs(
1119
+ cargoTomlFile,
1120
+ cargoData["dev-dependencies"],
1121
+ workspaceDependencies,
1122
+ workspaceContext,
1123
+ workspaceMemberMap,
1124
+ dependsOn,
1125
+ );
1126
+ if (cargoData.target && typeof cargoData.target === "object") {
1127
+ for (const targetBlock of Object.values(cargoData.target)) {
1128
+ if (!targetBlock || typeof targetBlock !== "object") {
1129
+ continue;
1130
+ }
1131
+ collectCargoManifestDependencyRefs(
1132
+ cargoTomlFile,
1133
+ targetBlock.dependencies,
1134
+ workspaceDependencies,
1135
+ workspaceContext,
1136
+ workspaceMemberMap,
1137
+ dependsOn,
1138
+ );
1139
+ collectCargoManifestDependencyRefs(
1140
+ cargoTomlFile,
1141
+ targetBlock["build-dependencies"],
1142
+ workspaceDependencies,
1143
+ workspaceContext,
1144
+ workspaceMemberMap,
1145
+ dependsOn,
1146
+ );
1147
+ collectCargoManifestDependencyRefs(
1148
+ cargoTomlFile,
1149
+ targetBlock["dev-dependencies"],
1150
+ workspaceDependencies,
1151
+ workspaceContext,
1152
+ workspaceMemberMap,
1153
+ dependsOn,
1154
+ );
1155
+ }
1156
+ }
1157
+ if (currentIdentity?.name && currentIdentity?.version) {
1158
+ dependencyGraph.push({
1159
+ dependsOn: [...dependsOn].sort(),
1160
+ ref: cargoPackageInfoToPurl(currentIdentity),
1161
+ });
1162
+ }
1163
+ if (
1164
+ context?.includeWorkspaceMembers !== false &&
1165
+ workspaceContext?.isWorkspaceRoot &&
1166
+ Array.isArray(cargoData?.workspace?.members)
1167
+ ) {
1168
+ for (const workspaceMemberFile of resolveCargoWorkspaceMembers(
1169
+ cargoTomlFile,
1170
+ cargoData.workspace,
1171
+ )) {
1172
+ if (workspaceMemberFile === cargoTomlFile) {
1173
+ continue;
1174
+ }
1175
+ dependencyGraph.push(
1176
+ ...parseCargoManifestDependencyData(workspaceMemberFile, {
1177
+ includeWorkspaceMembers: false,
1178
+ visitedCargoTomlDependencyGraphFiles: visitedCargoTomlFiles,
1179
+ workspaceMemberCache,
1180
+ workspaceRootData: cargoData,
1181
+ workspaceRootFile: cargoTomlFile,
1182
+ }),
1183
+ );
1184
+ }
1185
+ }
1186
+ return dependencyGraph;
1187
+ }
1188
+
1189
+ /**
1190
+ * Parses a Cargo.lock file's TOML data and returns a flat dependency graph as an
1191
+ * array of objects mapping each package purl to the purls it directly depends on.
1192
+ *
1193
+ * @param {string} cargoLockData Raw TOML string contents of a Cargo.lock file
1194
+ * @returns {Object[]} Array of dependency relationship objects with ref and dependsOn fields
1195
+ */
1196
+ export function parseCargoDependencyData(cargoLockData) {
1197
+ const purlFromPackageInfo = (pkg) =>
1198
+ decodeURIComponent(
1199
+ build({
1200
+ type: "cargo",
1201
+ namespace: "" || null,
1202
+ name: pkg.name,
1203
+ version: pkg.version || null,
1204
+ }),
1205
+ );
1206
+ const cargoData = toml.parse(cargoLockData);
1207
+ const packageNode = cargoData?.package;
1208
+ if (!packageNode || !Array.isArray(packageNode)) {
1209
+ return [];
1210
+ }
1211
+ /** @type {Array<Object>} */
1212
+ const packageArrayNode = packageNode;
1213
+ /** @type {Array<{ name: string, version: string, dependencies: Array<string>}>} */
1214
+ const pkgList = [];
1215
+ packageArrayNode.forEach((packageItem) => {
1216
+ try {
1217
+ const pkg = parseCargoDependencyFromPackageNode(packageItem);
1218
+ pkgList.push(pkg);
1219
+ } catch (e) {
1220
+ console.warn(
1221
+ `Failed to parse package: ${packageItem["name"]}@${packageItem["version"]},fail with:${e.message}`,
1222
+ );
1223
+ }
1224
+ });
1225
+ // Create a map of package names to package objects
1226
+ const pkgMap = pkgList.reduce((acc, item) => {
1227
+ acc[item.name] = item;
1228
+ return acc;
1229
+ }, {});
1230
+ const result = [];
1231
+ // parse dependency version
1232
+ Object.values(pkgMap).forEach((pkg) => {
1233
+ const dependsOn = new Set();
1234
+ pkg.dependencies?.forEach((dep) => {
1235
+ if (dep.indexOf(" ") !== -1) {
1236
+ // fill version in dependency definition like `libc 0.2.79`
1237
+ const depSplit = dep.split(" ");
1238
+ dependsOn.add(
1239
+ purlFromPackageInfo({
1240
+ name: depSplit[0].trim(),
1241
+ version: depSplit[1].trim(),
1242
+ }),
1243
+ );
1244
+ } else if (pkgMap[dep]) {
1245
+ dependsOn.add(purlFromPackageInfo(pkgMap[dep]));
1246
+ } else if (DEBUG_MODE) {
1247
+ console.warn(
1248
+ `The package "${dep.name}" appears as a dependency to "${pkg.name}" but is not itself listed in the Cargo.lock file. The Cargo.lock file is invalid! The produced SBOM will not list ${dep.name} as a dependency.`,
1249
+ );
1250
+ }
1251
+ });
1252
+ result.push({
1253
+ ref: purlFromPackageInfo(pkg),
1254
+ dependsOn: [...dependsOn],
1255
+ });
1256
+ });
1257
+ return result;
1258
+ }
1259
+
1260
+ /**
1261
+ * Parses tab-separated cargo-auditable binary metadata output and returns a list
1262
+ * of Rust package components. Optionally fetches crates.io metadata when
1263
+ * FETCH_LICENSE is enabled.
1264
+ *
1265
+ * @param {string} cargoData Tab-separated string output from cargo-auditable or similar tool
1266
+ * @returns {Promise<Object[]>} List of Rust package component objects with group, name, and version
1267
+ */
1268
+ export async function parseCargoAuditableData(cargoData) {
1269
+ const pkgList = [];
1270
+ if (!cargoData) {
1271
+ return pkgList;
1272
+ }
1273
+ cargoData.split("\n").forEach((l) => {
1274
+ l = l.replaceAll("\r", "");
1275
+ const tmpA = l.split("\t");
1276
+ if (tmpA && tmpA.length > 2) {
1277
+ let group = dirname(tmpA[0].trim());
1278
+ const name = basename(tmpA[0].trim());
1279
+ if (group === ".") {
1280
+ group = "";
1281
+ }
1282
+ const version = tmpA[1];
1283
+ pkgList.push({
1284
+ group,
1285
+ name,
1286
+ version,
1287
+ });
1288
+ }
1289
+ });
1290
+ if (shouldFetchLicense()) {
1291
+ return await getCratesMetadata(pkgList);
1292
+ }
1293
+ return pkgList;
1294
+ }