@cdxgen/cdxgen 0.0.1 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (722) hide show
  1. package/README.md +921 -87
  2. package/bin/audit.js +239 -0
  3. package/bin/cdxgen.js +2324 -0
  4. package/bin/convert.js +213 -0
  5. package/bin/evinse.js +353 -0
  6. package/bin/hbom.js +495 -0
  7. package/bin/repl.js +2224 -0
  8. package/bin/sign.js +195 -0
  9. package/bin/tracebom.js +295 -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 +1833 -0
  85. package/lib/cli/cliOptions.js +513 -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 +142 -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 +876 -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 +575 -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 +1789 -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 +277 -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 +263 -0
  215. package/lib/inventory/traceRunner.js +439 -0
  216. package/lib/inventory/unicodeScan.js +147 -0
  217. package/lib/managers/binary.js +3307 -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 +315 -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 +28 -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 +120 -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 +19 -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 +76 -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,985 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ import { Purl } from "@cdxgen/cdx-purl";
5
+ import Ajv from "ajv";
6
+ import Ajv2020 from "ajv/dist/2020.js";
7
+ import addFormats from "ajv-formats";
8
+
9
+ import { DEBUG_MODE, readEnvironmentVariable } from "../core/activity.js";
10
+ import { thoughtLog } from "../core/logger.js";
11
+ import { dirNameStr } from "../core/paths.js";
12
+ import { SPDX_JSONLD_CONTEXT, SPDX_SPEC_VERSION } from "../core/spdx.js";
13
+ import {
14
+ isCycloneDxSpecVersionAtLeast,
15
+ toCycloneDxSpecVersionString,
16
+ } from "../inventory/bomUtils.js";
17
+ import { isPartialTree } from "../inventory/depsUtils.js";
18
+ import { isValidPurl } from "../inventory/purl.js";
19
+
20
+ const dirName = dirNameStr;
21
+ // The v13 floor is spec 1.6. 1.4 and 1.5 were dropped here so that the JS and
22
+ // Rust (`cdxrs validate`) validators agree on what they accept: cdxrs supports
23
+ // 1.6/1.7 only, and while the two sets differed, whether a 1.5 BOM passed
24
+ // validation depended on whether a cdxrs binary happened to be installed.
25
+ const SUPPORTED_CYCLONEDX_SCHEMA_VERSIONS = new Set(["1.6", "1.7", "2.0"]);
26
+ const PLACEHOLDER_COMPONENT_NAMES = new Set(["app", "application", "project"]);
27
+ const SPDX_EXPORT_TYPES = new Set([
28
+ "CreationInfo",
29
+ "Relationship",
30
+ "SpdxDocument",
31
+ "software_File",
32
+ "software_Package",
33
+ ]);
34
+ const NPM_NATIVE_ADDON_EVIDENCE_PROPERTIES = new Set([
35
+ "cdx:npm:native_addon",
36
+ "cdx:npm:has_binary",
37
+ "cdx:npm:os",
38
+ "cdx:npm:cpu",
39
+ ]);
40
+ let spdxExportSchemaValidator;
41
+ const cycloneDxSchemaValidators = new Map();
42
+
43
+ /**
44
+ * Compile a schema validator at runtime.
45
+ *
46
+ * This is the fallback used when the pre-compiled module from
47
+ * `contrib/gen-validators.mjs` is not available (e.g. during development
48
+ * before `node contrib/gen-validators.mjs` has been run). It pays the full
49
+ * ~114 ms compilation cost on the first call per spec version per process.
50
+ */
51
+ const compileSchemaValidator = (specVersion) => {
52
+ let validate;
53
+ if (isCycloneDxSpecVersionAtLeast(specVersion, "2.0")) {
54
+ const ajv = new Ajv2020(AJV_OPTIONS);
55
+ useLinearUniqueItems(ajv);
56
+ addFormats(ajv);
57
+ addDraft2020BundledSchema(
58
+ ajv,
59
+ readJsonSchema("cryptography-defs.schema.json"),
60
+ "https://cyclonedx.org/schema/cryptography-defs.schema.json",
61
+ );
62
+ addDraft2020BundledSchema(
63
+ ajv,
64
+ readJsonSchema("jsf-0.82.schema.json"),
65
+ "https://cyclonedx.org/schema/jsf-0.82.schema.json",
66
+ );
67
+ addDraft2020BundledSchema(
68
+ ajv,
69
+ readJsonSchema("spdx.schema.json"),
70
+ "https://cyclonedx.org/schema/spdx.schema.json",
71
+ );
72
+ validate = ajv.compile(readJsonSchema("cyclonedx-2.0-bundled.schema.json"));
73
+ } else {
74
+ const schemas = [
75
+ readJsonSchema(`bom-${specVersion}.schema.json`),
76
+ readJsonSchema("jsf-0.82.schema.json"),
77
+ readJsonSchema("spdx.schema.json"),
78
+ ];
79
+ if (isCycloneDxSpecVersionAtLeast(specVersion, "1.7")) {
80
+ schemas.push(readJsonSchema("cryptography-defs.schema.json"));
81
+ }
82
+ const ajv = new Ajv({
83
+ ...AJV_OPTIONS,
84
+ schemas,
85
+ });
86
+ useLinearUniqueItems(ajv);
87
+ addFormats(ajv);
88
+ validate = ajv.getSchema(
89
+ `http://cyclonedx.org/schema/bom-${specVersion}.schema.json`,
90
+ );
91
+ }
92
+ return validate;
93
+ };
94
+
95
+ /**
96
+ * Return the schema validator for a CycloneDX spec version.
97
+ *
98
+ * Prefers the pre-compiled module generated by `contrib/gen-validators.mjs`
99
+ * (skips ~114 ms of ajv compilation per process). Falls back to runtime
100
+ * compilation if the generated file is missing. Set
101
+ * `CDXGEN_PRECOMPILED_VALIDATORS=0` to always compile, which is how the two
102
+ * paths are compared for equivalence.
103
+ *
104
+ * Returns a Promise that resolves to the validator function, so callers must
105
+ * `await` the result. The promise is cached so repeated calls for the same
106
+ * version resolve instantly.
107
+ *
108
+ * @param {string} specVersion CycloneDX spec version ("1.6", "1.7", "2.0")
109
+ * @returns {Promise<Function>} Validator function (call with data to validate)
110
+ */
111
+ const getCycloneDxSchemaValidator = (specVersion) => {
112
+ if (cycloneDxSchemaValidators.has(specVersion)) {
113
+ return cycloneDxSchemaValidators.get(specVersion);
114
+ }
115
+ const precompiledDisabled = ["0", "false"].includes(
116
+ (readEnvironmentVariable("CDXGEN_PRECOMPILED_VALIDATORS") || "")
117
+ .trim()
118
+ .toLowerCase(),
119
+ );
120
+ const promise = precompiledDisabled
121
+ ? Promise.resolve(compileSchemaValidator(specVersion))
122
+ : import(`./generated/validate-${specVersion}.mjs`)
123
+ .then((mod) => mod.default || mod.validate)
124
+ .catch((err) => {
125
+ // The two validators are equivalent, so falling back only costs the
126
+ // compilation time. Saying so keeps a missing or unreadable generated
127
+ // module from looking like a validation result.
128
+ thoughtLog(
129
+ `Pre-compiled validator for CycloneDX ${specVersion} is unavailable (${err.message}); compiling the schema instead.`,
130
+ );
131
+ return compileSchemaValidator(specVersion);
132
+ });
133
+ cycloneDxSchemaValidators.set(specVersion, promise);
134
+ return promise;
135
+ };
136
+
137
+ const AJV_OPTIONS = {
138
+ strict: false,
139
+ logger: false,
140
+ verbose: true,
141
+ code: {
142
+ source: true,
143
+ lines: true,
144
+ optimize: true,
145
+ },
146
+ };
147
+
148
+ /**
149
+ * Serialise a value so that two values are deep-equal exactly when their
150
+ * serialisations match: object keys are emitted in sorted order and every
151
+ * string is length-prefixed so that no two distinct values can collide.
152
+ *
153
+ * @param {*} value Value from a parsed BOM document
154
+ * @returns {string} Canonical form of the value
155
+ */
156
+ const canonicalize = (value) => {
157
+ if (value === null || typeof value !== "object") {
158
+ return typeof value === "string"
159
+ ? `s${value.length}:${value}`
160
+ : `${typeof value}:${value}`;
161
+ }
162
+ if (Array.isArray(value)) {
163
+ return `[${value.map(canonicalize).join(",")}]`;
164
+ }
165
+ const keys = Object.keys(value).sort();
166
+ return `{${keys.map((key) => `s${key.length}:${key}=${canonicalize(value[key])}`).join(",")}}`;
167
+ };
168
+
169
+ /**
170
+ * Replace Ajv's `uniqueItems` implementation with one that runs in linear time.
171
+ *
172
+ * Ajv compares every pair of items with a deep equality check, which is
173
+ * quadratic in the length of the array. The CycloneDX schema sets the keyword
174
+ * on 46 arrays, `components` among them, so a BOM describing a container image
175
+ * spends the bulk of its validation there. Comparing canonical serialisations
176
+ * through a set decides the same question in one pass.
177
+ *
178
+ * @param {object} ajv Ajv instance whose validators are about to be compiled
179
+ */
180
+ const useLinearUniqueItems = (ajv) => {
181
+ ajv.removeKeyword("uniqueItems");
182
+ ajv.addKeyword({
183
+ keyword: "uniqueItems",
184
+ type: "array",
185
+ schemaType: "boolean",
186
+ errors: false,
187
+ error: {
188
+ message: "must NOT have duplicate items",
189
+ },
190
+ validate: (schema, data) => {
191
+ if (schema === false || !Array.isArray(data) || data.length < 2) {
192
+ return true;
193
+ }
194
+ const seen = new Set();
195
+ for (const item of data) {
196
+ const key = canonicalize(item);
197
+ if (seen.has(key)) {
198
+ return false;
199
+ }
200
+ seen.add(key);
201
+ }
202
+ return true;
203
+ },
204
+ });
205
+ };
206
+
207
+ const readJsonSchema = (fileName) =>
208
+ JSON.parse(readFileSync(join(dirName, "data", fileName), "utf-8"));
209
+
210
+ const addDraft2020BundledSchema = (ajv, schema, schemaId) => {
211
+ const bundledSchema = { ...schema };
212
+ delete bundledSchema.$schema;
213
+ bundledSchema.$id = schemaId;
214
+ ajv.addSchema(bundledSchema);
215
+ };
216
+
217
+ const getSpdxElementId = (element) => element?.spdxId || element?.["@id"];
218
+
219
+ const getSpdxExportSchemaValidator = () => {
220
+ if (spdxExportSchemaValidator !== undefined) {
221
+ return spdxExportSchemaValidator;
222
+ }
223
+ try {
224
+ const spdxExportSchema = JSON.parse(
225
+ readFileSync(join(dirName, "data", "spdx-export.schema.json"), "utf-8"),
226
+ );
227
+ const ajv = new Ajv2020({
228
+ strict: false,
229
+ validateSchema: false,
230
+ logger: false,
231
+ verbose: true,
232
+ code: {
233
+ source: true,
234
+ lines: true,
235
+ optimize: true,
236
+ },
237
+ });
238
+ addFormats(ajv);
239
+ spdxExportSchemaValidator = ajv.compile(spdxExportSchema);
240
+ } catch (_error) {
241
+ spdxExportSchemaValidator = null;
242
+ }
243
+ return spdxExportSchemaValidator;
244
+ };
245
+
246
+ /**
247
+ * Validate the generated bom using jsonschema
248
+ *
249
+ * @param {object} bomJson content
250
+ *
251
+ * @returns {Promise<Boolean>} true if the BOM is valid. false otherwise.
252
+ */
253
+ export const validateBom = async (bomJson) => {
254
+ if (!bomJson) {
255
+ return true;
256
+ }
257
+ const specVersion = toCycloneDxSpecVersionString(bomJson.specVersion);
258
+ if (!SUPPORTED_CYCLONEDX_SCHEMA_VERSIONS.has(specVersion)) {
259
+ console.log(
260
+ `Unsupported CycloneDX specVersion '${bomJson.specVersion}'. Supported versions are ${[
261
+ ...SUPPORTED_CYCLONEDX_SCHEMA_VERSIONS,
262
+ ].join(", ")}.`,
263
+ );
264
+ return false;
265
+ }
266
+ const validate = await getCycloneDxSchemaValidator(specVersion);
267
+ const isValid = validate(bomJson);
268
+ if (!isValid) {
269
+ if (bomJson.metadata?.component?.name) {
270
+ console.log(
271
+ `Schema validation failed for ${bomJson.metadata.component.name}`,
272
+ );
273
+ } else {
274
+ console.log("Schema validation failed");
275
+ }
276
+ console.log(validate.errors);
277
+ return false;
278
+ }
279
+ // Deep validation tests
280
+ return (
281
+ validateMetadata(bomJson) &&
282
+ validatePurls(bomJson) &&
283
+ validateRefs(bomJson) &&
284
+ validateProps(bomJson)
285
+ );
286
+ };
287
+
288
+ /**
289
+ * Validate the generated SPDX export.
290
+ *
291
+ * @param {object|string} spdxJson SPDX json object
292
+ * @returns {boolean} true if the SPDX export is valid
293
+ */
294
+ export const validateSpdx = (spdxJson) => {
295
+ if (!spdxJson) {
296
+ return true;
297
+ }
298
+ if (typeof spdxJson === "string" || spdxJson instanceof String) {
299
+ spdxJson = JSON.parse(spdxJson);
300
+ }
301
+ const spdxDocument = (spdxJson?.["@graph"] || []).find(
302
+ (element) => element?.type === "SpdxDocument",
303
+ );
304
+ const validateSchema = getSpdxExportSchemaValidator();
305
+ if (!validateSchema) {
306
+ console.log("The bundled SPDX export schema is empty or malformed.");
307
+ return false;
308
+ }
309
+ if (!validateSchema(spdxJson)) {
310
+ console.log(
311
+ `SPDX 3.0.1 schema validation failed${spdxDocument?.name ? ` for ${spdxDocument.name}` : ""}`,
312
+ );
313
+ console.log(validateSchema.errors);
314
+ return false;
315
+ }
316
+ const errorList = [];
317
+ if (spdxJson?.["@context"] !== SPDX_JSONLD_CONTEXT) {
318
+ errorList.push(`@context must be '${SPDX_JSONLD_CONTEXT}'.`);
319
+ }
320
+ if (!Array.isArray(spdxJson?.["@graph"]) || !spdxJson["@graph"].length) {
321
+ errorList.push("@graph must be a non-empty array.");
322
+ }
323
+ const ids = new Set();
324
+ const knownRefs = new Set();
325
+ let creationInfoCount = 0;
326
+ let documentCount = 0;
327
+ let usesExtensionProfile = false;
328
+ for (const element of spdxJson?.["@graph"] || []) {
329
+ if (!SPDX_EXPORT_TYPES.has(element?.type)) {
330
+ errorList.push(`Unsupported SPDX export type '${element?.type}'.`);
331
+ }
332
+ const elementId = getSpdxElementId(element);
333
+ if (!elementId || typeof elementId !== "string") {
334
+ errorList.push(
335
+ `Missing SPDX identifier for type '${element?.type || "unknown"}'.`,
336
+ );
337
+ continue;
338
+ }
339
+ if (ids.has(elementId)) {
340
+ errorList.push(`Duplicate SPDX identifier '${elementId}'.`);
341
+ }
342
+ ids.add(elementId);
343
+ knownRefs.add(elementId);
344
+ if (Array.isArray(element?.extension) && element.extension.length) {
345
+ usesExtensionProfile = true;
346
+ }
347
+ switch (element.type) {
348
+ case "CreationInfo":
349
+ creationInfoCount += 1;
350
+ if (element.specVersion !== SPDX_SPEC_VERSION) {
351
+ errorList.push(
352
+ `CreationInfo '${elementId}' has unexpected specVersion '${element.specVersion}'.`,
353
+ );
354
+ }
355
+ if (!Array.isArray(element.createdBy) || !element.createdBy.length) {
356
+ errorList.push(`CreationInfo '${elementId}' must include createdBy.`);
357
+ }
358
+ if (!element.created) {
359
+ errorList.push(`CreationInfo '${elementId}' must include created.`);
360
+ }
361
+ break;
362
+ case "SpdxDocument":
363
+ documentCount += 1;
364
+ if (!element.creationInfo) {
365
+ errorList.push(
366
+ `SpdxDocument '${elementId}' must include creationInfo.`,
367
+ );
368
+ }
369
+ if (!Array.isArray(element.element) || !element.element.length) {
370
+ errorList.push(
371
+ `SpdxDocument '${elementId}' must include element refs.`,
372
+ );
373
+ }
374
+ if (
375
+ element.rootElement &&
376
+ (!Array.isArray(element.rootElement) || !element.rootElement.length)
377
+ ) {
378
+ errorList.push(
379
+ `SpdxDocument '${elementId}' rootElement must be a non-empty array when present.`,
380
+ );
381
+ }
382
+ break;
383
+ case "Relationship":
384
+ if (
385
+ !element.creationInfo ||
386
+ !element.from ||
387
+ typeof element.from !== "string"
388
+ ) {
389
+ errorList.push(
390
+ `Relationship '${elementId}' must include creationInfo and from.`,
391
+ );
392
+ }
393
+ if (!element.to || !Array.isArray(element.to) || !element.to.length) {
394
+ errorList.push(`Relationship '${elementId}' must include to refs.`);
395
+ }
396
+ if (element.relationshipType !== "dependsOn") {
397
+ errorList.push(
398
+ `Relationship '${elementId}' has unsupported relationshipType '${element.relationshipType}'.`,
399
+ );
400
+ }
401
+ break;
402
+ case "software_File":
403
+ case "software_Package":
404
+ if (!element.creationInfo || !element.name) {
405
+ errorList.push(
406
+ `${element.type} '${elementId}' must include creationInfo and name.`,
407
+ );
408
+ }
409
+ break;
410
+ default:
411
+ break;
412
+ }
413
+ }
414
+ if (creationInfoCount !== 1) {
415
+ errorList.push(
416
+ `Expected exactly one CreationInfo, found ${creationInfoCount}.`,
417
+ );
418
+ }
419
+ if (documentCount !== 1) {
420
+ errorList.push(
421
+ `Expected exactly one SpdxDocument, found ${documentCount}.`,
422
+ );
423
+ }
424
+ for (const element of spdxJson?.["@graph"] || []) {
425
+ const elementId = getSpdxElementId(element);
426
+ if (element.creationInfo && !knownRefs.has(element.creationInfo)) {
427
+ errorList.push(
428
+ `Element '${elementId || "unknown"}' references unknown creationInfo '${element.creationInfo}'.`,
429
+ );
430
+ }
431
+ if (Array.isArray(element.element)) {
432
+ for (const ref of element.element) {
433
+ if (!knownRefs.has(ref)) {
434
+ errorList.push(
435
+ `SpdxDocument '${elementId || "unknown"}' references unknown element '${ref}'.`,
436
+ );
437
+ }
438
+ }
439
+ }
440
+ if (Array.isArray(element.rootElement)) {
441
+ for (const ref of element.rootElement) {
442
+ if (!knownRefs.has(ref)) {
443
+ errorList.push(
444
+ `SpdxDocument '${elementId || "unknown"}' references unknown rootElement '${ref}'.`,
445
+ );
446
+ }
447
+ }
448
+ }
449
+ if (typeof element.from === "string" && !knownRefs.has(element.from)) {
450
+ errorList.push(
451
+ `Relationship '${elementId || "unknown"}' references unknown from '${element.from}'.`,
452
+ );
453
+ }
454
+ if (Array.isArray(element.to)) {
455
+ for (const ref of element.to) {
456
+ if (!knownRefs.has(ref)) {
457
+ errorList.push(
458
+ `Relationship '${elementId || "unknown"}' references unknown to '${ref}'.`,
459
+ );
460
+ }
461
+ }
462
+ }
463
+ }
464
+ if (usesExtensionProfile) {
465
+ if (!spdxDocument?.profileConformance?.includes("extension")) {
466
+ errorList.push(
467
+ `SpdxDocument '${spdxDocument?.spdxId || "unknown"}' must declare the extension profile when extension data is present.`,
468
+ );
469
+ }
470
+ }
471
+ if (errorList.length > 0) {
472
+ console.log("SPDX 3.0.1 validation failed");
473
+ console.log(errorList);
474
+ return false;
475
+ }
476
+ return true;
477
+ };
478
+
479
+ /**
480
+ * Validate the metadata object
481
+ *
482
+ * @param {object} bomJson Bom json object
483
+ */
484
+ export const validateMetadata = (bomJson) => {
485
+ const errorList = [];
486
+ const warningsList = [];
487
+ if (bomJson?.metadata) {
488
+ if (
489
+ !bomJson.metadata.component ||
490
+ !Object.keys(bomJson.metadata.component).length
491
+ ) {
492
+ warningsList.push(
493
+ "metadata.component is missing. Run cdxgen with both --project-name and --project-version argument.",
494
+ );
495
+ }
496
+ if (bomJson.metadata.component) {
497
+ // Do we have a purl and bom-ref for metadata.component
498
+ if (!bomJson.metadata.component.purl) {
499
+ warningsList.push("purl is missing for metadata.component");
500
+ }
501
+ if (!bomJson.metadata.component["bom-ref"]) {
502
+ warningsList.push("bom-ref is missing for metadata.component");
503
+ }
504
+ // Do we have a version for metadata.component
505
+ if (!bomJson.metadata.component.version) {
506
+ warningsList.push(
507
+ "Version is missing for metadata.component. Pass the version using --project-version argument.",
508
+ );
509
+ }
510
+ const metadataName = bomJson.metadata.component.name
511
+ ?.trim()
512
+ .toLowerCase();
513
+ if (metadataName && PLACEHOLDER_COMPONENT_NAMES.has(metadataName)) {
514
+ warningsList.push(
515
+ `metadata.component.name appears to be a placeholder ('${bomJson.metadata.component.name}'). Pass --project-name to set the correct parent component name.`,
516
+ );
517
+ }
518
+ // Is the same component getting repeated inside the components block
519
+ if (bomJson.metadata.component.components?.length) {
520
+ for (const comp of bomJson.metadata.component.components) {
521
+ if (comp["bom-ref"] === bomJson.metadata.component["bom-ref"]) {
522
+ warningsList.push(
523
+ `Found parent component with ref ${comp["bom-ref"]} in metadata.component.components`,
524
+ );
525
+ } else if (
526
+ (!comp["bom-ref"] || !bomJson.metadata.component["bom-ref"]) &&
527
+ comp["name"] === bomJson.metadata.component["name"]
528
+ ) {
529
+ warningsList.push(
530
+ `Found parent component with name ${comp["name"]} in metadata.component.components`,
531
+ );
532
+ }
533
+ }
534
+ }
535
+ }
536
+ }
537
+ if (DEBUG_MODE && warningsList.length !== 0) {
538
+ console.log("===== WARNINGS =====");
539
+ console.log(warningsList);
540
+ thoughtLog(
541
+ "**VALIDATION**: There are some warnings regarding the BOM Metadata.",
542
+ );
543
+ }
544
+ if (errorList.length !== 0) {
545
+ console.log(errorList);
546
+ return false;
547
+ }
548
+ return true;
549
+ };
550
+
551
+ /**
552
+ * Yield `{ purl, where }` for every purl outside the top-level `components`
553
+ * array, which `validatePurls` walks separately for its richer per-type rules.
554
+ *
555
+ * Covers `metadata.component` (and its nested components),
556
+ * `metadata.tools.components`, `services`, and components nested inside
557
+ * top-level components.
558
+ *
559
+ * @param {object} bomJson Bom json object
560
+ */
561
+ function* eachExtraPurl(bomJson) {
562
+ function* walk(node, where) {
563
+ if (!node || typeof node !== "object") {
564
+ return;
565
+ }
566
+ if (Array.isArray(node)) {
567
+ for (let i = 0; i < node.length; i++) {
568
+ yield* walk(node[i], `${where}[${i}]`);
569
+ }
570
+ return;
571
+ }
572
+ if (typeof node.purl === "string" && node.purl.length) {
573
+ yield { purl: node.purl, where: `${where}.purl` };
574
+ }
575
+ yield* walk(node.components, `${where}.components`);
576
+ }
577
+ yield* walk(bomJson?.metadata?.component, "metadata.component");
578
+ yield* walk(
579
+ bomJson?.metadata?.tools?.components,
580
+ "metadata.tools.components",
581
+ );
582
+ yield* walk(bomJson?.services, "services");
583
+ // Nested components only — the top-level entries themselves are covered by
584
+ // the main loop, which also applies the crypto-asset and qualifier rules.
585
+ for (let i = 0; i < (bomJson?.components?.length || 0); i++) {
586
+ yield* walk(
587
+ bomJson.components[i].components,
588
+ `components[${i}].components`,
589
+ );
590
+ }
591
+ }
592
+
593
+ /**
594
+ * Validate the format of all purls
595
+ *
596
+ * @param {object} bomJson Bom json object
597
+ */
598
+ export const validatePurls = (bomJson) => {
599
+ const errorList = [];
600
+ const warningsList = [];
601
+ let frameworksCount = 0;
602
+ if (bomJson?.components) {
603
+ for (const comp of bomJson.components) {
604
+ if (comp.type === "framework") {
605
+ frameworksCount += 1;
606
+ }
607
+ if (comp.type === "cryptographic-asset") {
608
+ if (comp.purl?.length) {
609
+ errorList.push(
610
+ `purl should not be defined for cryptographic-asset ${comp.purl}`,
611
+ );
612
+ }
613
+ if (!comp.cryptoProperties) {
614
+ errorList.push(
615
+ `cryptoProperties is missing for cryptographic-asset ${comp.purl}`,
616
+ );
617
+ } else if (
618
+ comp.cryptoProperties.assetType === "algorithm" &&
619
+ !comp.cryptoProperties.oid
620
+ ) {
621
+ errorList.push(
622
+ `cryptoProperties.oid is missing for cryptographic-asset of type algorithm ${comp.purl}`,
623
+ );
624
+ } else if (
625
+ comp.cryptoProperties.assetType === "certificate" &&
626
+ !comp.cryptoProperties.algorithmProperties
627
+ ) {
628
+ errorList.push(
629
+ `cryptoProperties.algorithmProperties is missing for cryptographic-asset of type certificate ${comp.purl}`,
630
+ );
631
+ }
632
+ } else {
633
+ try {
634
+ if (comp.purl) {
635
+ const purlObj = Purl.parse(comp.purl);
636
+ if (purlObj.type && purlObj.type !== purlObj.type.toLowerCase()) {
637
+ warningsList.push(
638
+ `purl type is not normalized to lower case ${comp.purl}`,
639
+ );
640
+ }
641
+ if (
642
+ ["npm", "golang"].includes(purlObj.type) &&
643
+ purlObj.name.includes("%2F") &&
644
+ !purlObj.namespace
645
+ ) {
646
+ errorList.push(
647
+ `purl does not include namespace but includes encoded slash in name for npm type. ${comp.purl}`,
648
+ );
649
+ }
650
+ // Catch the trivy version hack that removes the epoch from version
651
+ const qualifiers = purlObj.qualifiers || {};
652
+ if (
653
+ Object.keys(qualifiers).length &&
654
+ [
655
+ "cargo",
656
+ "cocoapods",
657
+ "composer",
658
+ "cran",
659
+ "github",
660
+ "golang",
661
+ "hackage",
662
+ "nuget",
663
+ "opam",
664
+ "pub",
665
+ "qpkg",
666
+ "swift",
667
+ ].includes(purlObj.type)
668
+ ) {
669
+ warningsList.push(
670
+ `SPEC VIOLATION: Qualifiers are not expected for ${purlObj.type} type. Purl: ${comp.purl}, Qualifier(s): ${Object.keys(qualifiers).join(", ")}.`,
671
+ );
672
+ }
673
+ if (
674
+ qualifiers.epoch &&
675
+ !comp.version.startsWith(`${qualifiers.epoch}:`)
676
+ ) {
677
+ errorList.push(
678
+ `'${comp.name}' version '${comp.version}' doesn't include epoch '${qualifiers.epoch}'.`,
679
+ );
680
+ }
681
+ }
682
+ } catch (_ex) {
683
+ errorList.push(`Invalid purl ${comp.purl}`);
684
+ }
685
+ }
686
+ }
687
+ }
688
+ // Syntax check every *other* place a purl can appear. The loop above only
689
+ // walks top-level `components`, which is how `"purl": "swift-smoke"` reached
690
+ // a committed golden through `metadata.component` unnoticed. Nested
691
+ // components and `metadata.tools.components` had the same blind spot.
692
+ for (const { purl, where } of eachExtraPurl(bomJson)) {
693
+ if (!isValidPurl(purl)) {
694
+ errorList.push(`Invalid purl ${purl} at ${where}`);
695
+ }
696
+ }
697
+ if (frameworksCount > 20) {
698
+ warningsList.push(
699
+ `BOM likey has too many framework components. Count: ${frameworksCount}`,
700
+ );
701
+ }
702
+ if (DEBUG_MODE && warningsList.length !== 0) {
703
+ console.log("===== WARNINGS =====");
704
+ console.log(warningsList);
705
+ thoughtLog(
706
+ "**VALIDATION**: There are some warnings regarding the purls in our SBOM. These could be bugs.",
707
+ );
708
+ }
709
+ if (errorList.length !== 0) {
710
+ console.log(errorList);
711
+ return false;
712
+ }
713
+ return true;
714
+ };
715
+
716
+ const buildRefs = (bomJson) => {
717
+ const refMap = {};
718
+ if (bomJson) {
719
+ if (bomJson.metadata) {
720
+ if (bomJson.metadata.component) {
721
+ refMap[bomJson.metadata.component["bom-ref"]] = true;
722
+ if (bomJson.metadata.component.components) {
723
+ for (const comp of bomJson.metadata.component.components) {
724
+ refMap[comp["bom-ref"]] = true;
725
+ }
726
+ }
727
+ }
728
+ }
729
+ if (bomJson.components) {
730
+ for (const comp of bomJson.components) {
731
+ refMap[comp["bom-ref"]] = true;
732
+ }
733
+ }
734
+ if (bomJson?.formulation) {
735
+ for (const aformulation of bomJson.formulation) {
736
+ if (aformulation?.components?.length) {
737
+ for (const formComp of aformulation.components) {
738
+ refMap[formComp["bom-ref"]] = true;
739
+ }
740
+ }
741
+ if (aformulation?.workflows?.length) {
742
+ for (const formWf of aformulation.workflows) {
743
+ refMap[formWf["bom-ref"]] = true;
744
+ if (formWf?.tasks?.length) {
745
+ for (const atask of formWf.tasks) {
746
+ refMap[atask["bom-ref"]] = true;
747
+ }
748
+ }
749
+ }
750
+ }
751
+ }
752
+ }
753
+ }
754
+ return refMap;
755
+ };
756
+
757
+ /**
758
+ * Validate the refs in dependencies block
759
+ *
760
+ * @param {object} bomJson Bom json object
761
+ */
762
+ export const validateRefs = (bomJson) => {
763
+ const errorList = [];
764
+ const warningsList = [];
765
+ const refMap = buildRefs(bomJson);
766
+ const parentComponentRef = bomJson?.metadata?.component?.["bom-ref"];
767
+ if (bomJson?.dependencies) {
768
+ if (isPartialTree(bomJson.dependencies, bomJson?.components?.length)) {
769
+ warningsList.push(
770
+ "Dependency tree has multiple empty dependsOn attributes.",
771
+ );
772
+ }
773
+ for (const dep of bomJson.dependencies) {
774
+ if (
775
+ dep.ref.includes("%40") ||
776
+ dep.ref.includes("%3A") ||
777
+ dep.ref.includes("%2F")
778
+ ) {
779
+ errorList.push(`Invalid encoded ref in dependencies ${dep.ref}`);
780
+ }
781
+ if (!refMap[dep.ref]) {
782
+ warningsList.push(`Invalid ref in dependencies ${dep.ref}`);
783
+ }
784
+ let parentPurlType;
785
+ try {
786
+ const purlObj = Purl.parse(dep.ref);
787
+ parentPurlType = purlObj.type;
788
+ } catch (_e) {
789
+ // pass
790
+ }
791
+ if (
792
+ parentComponentRef &&
793
+ dep.ref === parentComponentRef &&
794
+ dep.dependsOn.length === 0 &&
795
+ bomJson.dependencies.length > 1
796
+ ) {
797
+ warningsList.push(
798
+ `Parent component ${parentComponentRef} doesn't have any children. The dependency tree must contain dangling nodes, which are unsupported by tools such as Dependency-Track.`,
799
+ );
800
+ }
801
+ if (dep.dependsOn) {
802
+ for (const don of dep.dependsOn) {
803
+ if (!refMap[don]) {
804
+ warningsList.push(
805
+ `Invalid ref in dependencies.dependsOn ${don}. Parent: ${dep.ref}`,
806
+ );
807
+ }
808
+ let childPurlType;
809
+ try {
810
+ const purlObj = Purl.parse(don);
811
+ childPurlType = purlObj.type;
812
+ } catch (_e) {
813
+ // pass
814
+ }
815
+ if (
816
+ parentPurlType &&
817
+ childPurlType &&
818
+ parentPurlType !== childPurlType &&
819
+ !["oci", "generic", "container"].includes(parentPurlType)
820
+ ) {
821
+ warningsList.push(
822
+ `The parent package '${dep.ref}' (type ${parentPurlType}) depends on the child package '${don}' (type ${childPurlType}). This is a bug in cdxgen if this project is not a monorepo.`,
823
+ );
824
+ }
825
+ }
826
+ }
827
+ if (dep.provides) {
828
+ for (const don of dep.provides) {
829
+ if (!refMap[don]) {
830
+ warningsList.push(`Invalid ref in dependencies.provides ${don}`);
831
+ }
832
+ }
833
+ }
834
+ }
835
+ }
836
+ if (DEBUG_MODE && warningsList.length !== 0) {
837
+ console.log("===== WARNINGS =====");
838
+ console.log(warningsList);
839
+ thoughtLog(
840
+ "**VALIDATION**: There are some warnings regarding the dependency tree in our BOM.",
841
+ );
842
+ }
843
+ if (errorList.length !== 0) {
844
+ console.log(errorList);
845
+ return false;
846
+ }
847
+ return true;
848
+ };
849
+
850
+ /**
851
+ * Validate the component properties
852
+ *
853
+ * @param {object} bomJson Bom json object
854
+ */
855
+ export function validateProps(bomJson) {
856
+ const errorList = [];
857
+ const warningsList = [];
858
+ let isWorkspaceMode = false;
859
+ let lacksProperties = false;
860
+ let lacksEvidence = false;
861
+ let lacksRelativePath = false;
862
+ let npmComponentsWithoutTarball = 0;
863
+ let npmComponentsWithTarball = 0;
864
+ if (
865
+ !["application", "framework", "library"].includes(
866
+ bomJson?.metadata?.component?.type,
867
+ )
868
+ ) {
869
+ return true;
870
+ }
871
+ if (bomJson?.components) {
872
+ const npmPkgs =
873
+ bomJson.components?.filter((c) => c.purl?.startsWith("pkg:npm")) || [];
874
+ const nativeByName = new Set(
875
+ npmPkgs
876
+ .filter((c) =>
877
+ c.properties?.some(
878
+ (p) => p.name === "cdx:npm:native_addon" && p.value === "true",
879
+ ),
880
+ )
881
+ .map((c) => c.name),
882
+ );
883
+ const suspicious = npmPkgs.filter(
884
+ (c) =>
885
+ c.scope !== "optional" &&
886
+ (c.name.includes("native") || c.name.includes("bindings")) &&
887
+ !nativeByName.has(c.name) &&
888
+ !c.properties?.some((p) =>
889
+ NPM_NATIVE_ADDON_EVIDENCE_PROPERTIES.has(p.name),
890
+ ),
891
+ );
892
+ if (suspicious.length > 0 && DEBUG_MODE) {
893
+ warningsList.push(
894
+ `Found ${suspicious.length} packages with native-sounding names but no native_addon flag: ${suspicious.map((c) => c.name).join(", ")}. May need deeper inspection.`,
895
+ );
896
+ }
897
+ for (const comp of bomJson.components) {
898
+ if (!["library", "framework"].includes(comp.type)) {
899
+ continue;
900
+ }
901
+ // Limit to only npm and pypi for now
902
+ if (
903
+ !comp.purl?.startsWith("pkg:npm") &&
904
+ !comp.purl?.startsWith("pkg:pypi")
905
+ ) {
906
+ continue;
907
+ }
908
+ if (comp.purl?.startsWith("pkg:npm")) {
909
+ const hasDistributionRef = comp.externalReferences?.some(
910
+ (ref) => ref.type === "distribution" && ref.url,
911
+ );
912
+ if (hasDistributionRef) {
913
+ npmComponentsWithTarball++;
914
+ } else {
915
+ npmComponentsWithoutTarball++;
916
+ }
917
+ }
918
+ if (!comp.properties) {
919
+ if (!lacksProperties) {
920
+ warningsList.push(`${comp["bom-ref"]} lacks properties.`);
921
+ lacksProperties = true;
922
+ }
923
+ } else {
924
+ let srcFilePropFound = false;
925
+ let workspacePropFound = false;
926
+ for (const p of comp.properties) {
927
+ if (p.name === "internal:SrcFile") {
928
+ srcFilePropFound = true;
929
+ // Quick linux/unix only check for relative paths.
930
+ if (!lacksRelativePath && p.value?.startsWith("/")) {
931
+ lacksRelativePath = true;
932
+ }
933
+ }
934
+ if (p.name === "internal:workspaceRef") {
935
+ isWorkspaceMode = true;
936
+ workspacePropFound = true;
937
+ }
938
+ }
939
+ if (
940
+ isWorkspaceMode &&
941
+ !workspacePropFound &&
942
+ !srcFilePropFound &&
943
+ comp?.scope !== "optional"
944
+ ) {
945
+ warningsList.push(
946
+ `${comp["bom-ref"]} lacks workspace-related properties.`,
947
+ );
948
+ }
949
+ if (!srcFilePropFound && !lacksProperties) {
950
+ warningsList.push(`${comp["bom-ref"]} lacks SrcFile property.`);
951
+ lacksProperties = true;
952
+ }
953
+ }
954
+ if (!comp.evidence && !lacksEvidence) {
955
+ lacksEvidence = true;
956
+ warningsList.push(`${comp["bom-ref"]} lacks evidence.`);
957
+ }
958
+ }
959
+ }
960
+ if (npmComponentsWithoutTarball > 0 && npmComponentsWithTarball > 0) {
961
+ warningsList.push(
962
+ `Found ${npmComponentsWithoutTarball} pkg:npm components without externalReferences.distribution. Please file a bug, if your package-lock.json or pnpm-lock.yaml includes the tarball url.`,
963
+ );
964
+ }
965
+ if (lacksRelativePath) {
966
+ warningsList.push(
967
+ "BOM includes absolute paths for properties like SrcFile.",
968
+ );
969
+ thoughtLog(
970
+ "BOM still includes absolute paths for properties like SrcFile. My postgen optimizations didn't work completely.",
971
+ );
972
+ }
973
+ if (DEBUG_MODE && warningsList.length !== 0) {
974
+ console.log("===== WARNINGS =====");
975
+ console.log(warningsList);
976
+ thoughtLog(
977
+ "**VALIDATION**: There are some warnings regarding the evidence attribute in our BOM, which can be safely ignored.",
978
+ );
979
+ }
980
+ if (errorList.length !== 0) {
981
+ console.log(errorList);
982
+ return false;
983
+ }
984
+ return true;
985
+ }