@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,918 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ import { parse as parseYaml } from "yaml";
6
+
7
+ import { DEFAULT_CDX_SPEC_VERSION } from "./bomUtils.js";
8
+ import {
9
+ canonicalizeAST,
10
+ correctLicenseId,
11
+ isLicenseRef,
12
+ parseSpdxExpression,
13
+ renderAST,
14
+ tokenize,
15
+ upgradeDeprecatedAST,
16
+ } from "./spdxExpression.js";
17
+
18
+ let spdxLicenseList = null;
19
+ let licenseDb = null;
20
+ let licenseAliases = null;
21
+ let licenseDeprecations = null;
22
+
23
+ let url = import.meta?.url;
24
+ if (url && !url.startsWith("file://")) {
25
+ url = new URL(`file://${import.meta.url}`).toString();
26
+ }
27
+ const dirNameStr = url
28
+ ? dirname(dirname(dirname(fileURLToPath(url))))
29
+ : __dirname;
30
+
31
+ function loadSpdxLicenseList() {
32
+ if (!spdxLicenseList) {
33
+ try {
34
+ spdxLicenseList = JSON.parse(
35
+ readFileSync(
36
+ join(dirNameStr, "data", "spdx-license-list.json"),
37
+ "utf-8",
38
+ ),
39
+ );
40
+ } catch (_e) {
41
+ spdxLicenseList = { licenses: {}, exceptions: {} };
42
+ }
43
+ }
44
+ return spdxLicenseList;
45
+ }
46
+
47
+ function loadLicenseDb() {
48
+ if (!licenseDb) {
49
+ try {
50
+ licenseDb = JSON.parse(
51
+ readFileSync(join(dirNameStr, "data", "license-db.json"), "utf-8"),
52
+ );
53
+ } catch (_e) {
54
+ licenseDb = {};
55
+ }
56
+ }
57
+ return licenseDb;
58
+ }
59
+
60
+ function _loadLicenseAliases() {
61
+ if (!licenseAliases) {
62
+ try {
63
+ licenseAliases = JSON.parse(
64
+ readFileSync(join(dirNameStr, "data", "license-aliases.json"), "utf-8"),
65
+ );
66
+ } catch (_e) {
67
+ licenseAliases = {};
68
+ }
69
+ }
70
+ return licenseAliases;
71
+ }
72
+
73
+ function loadLicenseDeprecations() {
74
+ if (!licenseDeprecations) {
75
+ try {
76
+ licenseDeprecations = JSON.parse(
77
+ readFileSync(
78
+ join(dirNameStr, "data", "license-deprecations.json"),
79
+ "utf-8",
80
+ ),
81
+ );
82
+ } catch (_e) {
83
+ licenseDeprecations = {};
84
+ }
85
+ }
86
+ return licenseDeprecations;
87
+ }
88
+
89
+ const FOSS_CATEGORIES = new Set([
90
+ "Copyleft",
91
+ "Copyleft Limited",
92
+ "Patent License",
93
+ "Permissive",
94
+ "Public Domain",
95
+ "CLA",
96
+ ]);
97
+
98
+ /**
99
+ * Parses a compliance policy file.
100
+ *
101
+ * @param {string} policyPath Path to policy file
102
+ * @returns {object|null} Parsed policy object
103
+ */
104
+ export function loadPolicy(policyPath) {
105
+ if (!policyPath) return null;
106
+ try {
107
+ const content = readFileSync(policyPath, "utf-8");
108
+ return parseYaml(content);
109
+ } catch (err) {
110
+ console.error(
111
+ `Failed to load license policy from ${policyPath}: ${err.message}`,
112
+ );
113
+ return null;
114
+ }
115
+ }
116
+
117
+ export { parseSpdxExpression };
118
+
119
+ /**
120
+ * Resolves a raw license ID or expression to a CycloneDX license object shape.
121
+ *
122
+ * @param {string} raw Raw license string
123
+ * @param {object} opts Options
124
+ * @returns {object|null} Resolved license object: { id } or { expression } or { name }
125
+ */
126
+ export function resolveLicenseId(raw, opts = {}) {
127
+ if (!raw) return null;
128
+ const trimmed = raw.trim();
129
+ if (!trimmed) return null;
130
+
131
+ // 1. URL check
132
+ if (trimmed.startsWith("http")) {
133
+ const spdxList = loadSpdxLicenseList();
134
+ const cleanUrl = trimmed.toLowerCase().replace(/\/$/, "");
135
+ for (const [id, meta] of Object.entries(spdxList.licenses)) {
136
+ if (meta.seeAlso) {
137
+ for (const u of meta.seeAlso) {
138
+ if (u.trim().toLowerCase().replace(/\/$/, "") === cleanUrl) {
139
+ return { id, url: trimmed };
140
+ }
141
+ }
142
+ }
143
+ }
144
+
145
+ if (opts.getKnownLicense) {
146
+ const known = opts.getKnownLicense(trimmed, opts.pkg || {});
147
+ if (known) {
148
+ const res = {};
149
+ if (known.id) res.id = known.id;
150
+ if (known.name) res.name = known.name;
151
+ res.url = trimmed;
152
+ return res;
153
+ }
154
+ }
155
+
156
+ return { name: "CUSTOM", url: trimmed };
157
+ }
158
+
159
+ // 2. Parser check for complex expression
160
+ const tokens = tokenize(trimmed);
161
+ const hasOperators = tokens.some((t) => {
162
+ const u = t.toUpperCase();
163
+ return u === "AND" || u === "OR" || u === "WITH";
164
+ });
165
+
166
+ if (hasOperators || tokens.includes("(") || tokens.includes(")")) {
167
+ const parsed = parseSpdxExpression(trimmed);
168
+ if (parsed.ast) {
169
+ const upgradedAST = upgradeDeprecatedAST(parsed.ast);
170
+ const canonicalAST = canonicalizeAST(upgradedAST);
171
+ const normalizedExpr = renderAST(canonicalAST);
172
+ return { expression: normalizedExpr };
173
+ }
174
+ }
175
+
176
+ // 3. Simple identifier/alias check
177
+ const corrected = correctLicenseId(trimmed);
178
+ if (corrected) {
179
+ const upgraded = upgradeDeprecated(corrected);
180
+ if (
181
+ upgraded.includes(" ") ||
182
+ upgraded.includes("WITH") ||
183
+ upgraded.includes("AND") ||
184
+ upgraded.includes("OR")
185
+ ) {
186
+ return { expression: upgraded };
187
+ }
188
+ // LicenseRef-* identifiers are not valid SPDX ids and must not be placed in
189
+ // the CycloneDX `id` field. Emit them as an `expression` when LicenseRef
190
+ // synthesis is enabled, otherwise fall through so the original name/text is
191
+ // preserved (avoids producing schema-invalid BOMs).
192
+ if (isLicenseRef(upgraded)) {
193
+ if (opts.licenseRef) {
194
+ return { expression: upgraded };
195
+ }
196
+ return null;
197
+ }
198
+ const res = { id: upgraded };
199
+ res.url = `https://opensource.org/licenses/${upgraded}`;
200
+ return res;
201
+ }
202
+
203
+ // 4. Fallback: synthesize LicenseRef if enabled
204
+ if (opts.licenseRef) {
205
+ const slug = makeRefSlug(trimmed);
206
+ if (slug) {
207
+ return { expression: `LicenseRef-cdxgen-${slug}` };
208
+ }
209
+ }
210
+
211
+ return null;
212
+ }
213
+
214
+ const MAX_REF_SLUG_LENGTH = 128;
215
+
216
+ function makeRefSlug(str) {
217
+ // Runs of non-alphanumerics collapse to a single dash, so at most one leading
218
+ // and one trailing dash can remain and slicing them off is enough.
219
+ const slug = str
220
+ .slice(0, MAX_REF_SLUG_LENGTH)
221
+ .toLowerCase()
222
+ .replaceAll(/[^a-z0-9]+/g, "-");
223
+ const start = slug.startsWith("-") ? 1 : 0;
224
+ const end = slug.endsWith("-") ? slug.length - 1 : slug.length;
225
+ return end > start ? slug.slice(start, end) : "";
226
+ }
227
+
228
+ /**
229
+ * Upgrades deprecated SPDX license identifiers or expressions.
230
+ *
231
+ * @param {string} idOrExpr License ID or expression
232
+ * @returns {string} Upgraded identifier or expression
233
+ */
234
+ export function upgradeDeprecated(idOrExpr) {
235
+ if (!idOrExpr) return idOrExpr;
236
+
237
+ const tokens = tokenize(idOrExpr);
238
+ const hasOperators = tokens.some((t) => {
239
+ const u = t.toUpperCase();
240
+ return u === "AND" || u === "OR" || u === "WITH";
241
+ });
242
+
243
+ if (hasOperators || tokens.includes("(") || tokens.includes(")")) {
244
+ const parsed = parseSpdxExpression(idOrExpr);
245
+ if (parsed.ast) {
246
+ const upgradedAST = upgradeDeprecatedAST(parsed.ast);
247
+ const canonicalAST = canonicalizeAST(upgradedAST);
248
+ return renderAST(canonicalAST);
249
+ }
250
+ }
251
+
252
+ const deprecations = loadLicenseDeprecations();
253
+ const canonical = getCanonicalId(idOrExpr);
254
+ const repl =
255
+ deprecations[idOrExpr] ||
256
+ deprecations[idOrExpr.toLowerCase()] ||
257
+ (canonical && deprecations[canonical]);
258
+ if (repl) {
259
+ return repl;
260
+ }
261
+ return canonical || idOrExpr;
262
+ }
263
+
264
+ // Memoized lowercase lookup maps to avoid O(n) scans on every license.
265
+ let spdxLowerMap = null;
266
+ let dbKeyLowerMap = null;
267
+ let dbBySpdxLowerMap = null;
268
+
269
+ function getSpdxLowerMap() {
270
+ if (!spdxLowerMap) {
271
+ spdxLowerMap = new Map();
272
+ for (const [id, entry] of Object.entries(loadSpdxLicenseList().licenses)) {
273
+ spdxLowerMap.set(id.toLowerCase(), { id, entry });
274
+ }
275
+ }
276
+ return spdxLowerMap;
277
+ }
278
+
279
+ function getDbKeyLowerMap() {
280
+ if (!dbKeyLowerMap) {
281
+ dbKeyLowerMap = new Map();
282
+ const db = loadLicenseDb();
283
+ for (const key of Object.keys(db)) {
284
+ dbKeyLowerMap.set(key.toLowerCase(), db[key].spdx_license_key);
285
+ }
286
+ }
287
+ return dbKeyLowerMap;
288
+ }
289
+
290
+ function getDbBySpdxLowerMap() {
291
+ if (!dbBySpdxLowerMap) {
292
+ dbBySpdxLowerMap = new Map();
293
+ for (const entry of Object.values(loadLicenseDb())) {
294
+ if (entry.spdx_license_key) {
295
+ const k = entry.spdx_license_key.toLowerCase();
296
+ // First entry wins to keep behavior deterministic.
297
+ if (!dbBySpdxLowerMap.has(k)) {
298
+ dbBySpdxLowerMap.set(k, entry);
299
+ }
300
+ }
301
+ }
302
+ }
303
+ return dbBySpdxLowerMap;
304
+ }
305
+
306
+ function getCanonicalId(id) {
307
+ if (!id) return null;
308
+ const lower = id.toLowerCase();
309
+ const spdxHit = getSpdxLowerMap().get(lower);
310
+ if (spdxHit) {
311
+ return spdxHit.id;
312
+ }
313
+ const dbHit = getDbKeyLowerMap().get(lower);
314
+ if (dbHit) {
315
+ return dbHit;
316
+ }
317
+ return null;
318
+ }
319
+
320
+ /**
321
+ * Normalizes a single CycloneDX license object or string.
322
+ *
323
+ * @param {object|string} license License object or string
324
+ * @param {object} opts Options
325
+ * @returns {object} Normalized license object
326
+ */
327
+ export function normalizeLicense(license, opts = {}) {
328
+ if (!license) return license;
329
+
330
+ if (typeof license === "string") {
331
+ const resolved = resolveLicenseId(license, opts);
332
+ if (resolved) {
333
+ return resolved;
334
+ }
335
+ return { name: license };
336
+ }
337
+
338
+ if (license.license && typeof license.license === "object") {
339
+ const resLic = normalizeLicense(license.license, opts);
340
+ // CycloneDX requires an SPDX expression at the license-choice level
341
+ // ({ expression }), not nested inside `license`. When the inner license
342
+ // resolves to an expression, hoist it and drop the `license` wrapper to
343
+ // keep the BOM schema-valid.
344
+ if (resLic?.expression) {
345
+ const hoisted = { expression: resLic.expression };
346
+ if (license.acknowledgement) {
347
+ hoisted.acknowledgement = license.acknowledgement;
348
+ }
349
+ if (license["bom-ref"]) {
350
+ hoisted["bom-ref"] = license["bom-ref"];
351
+ }
352
+ return hoisted;
353
+ }
354
+ return { ...license, license: resLic };
355
+ }
356
+
357
+ const result = { ...license };
358
+ if (result.expression) {
359
+ const resolved = resolveLicenseId(result.expression, opts);
360
+ if (resolved?.expression) {
361
+ result.expression = resolved.expression;
362
+ delete result.id;
363
+ delete result.name;
364
+ }
365
+ } else if (result.id) {
366
+ const resolved = resolveLicenseId(result.id, opts);
367
+ if (resolved) {
368
+ if (resolved.id) {
369
+ if (result.id !== resolved.id) {
370
+ delete result.url;
371
+ }
372
+ result.id = resolved.id;
373
+ delete result.name;
374
+ delete result.expression;
375
+ } else if (resolved.expression) {
376
+ result.expression = resolved.expression;
377
+ delete result.id;
378
+ delete result.name;
379
+ }
380
+ }
381
+ } else if (result.name) {
382
+ const resolved = resolveLicenseId(result.name, opts);
383
+ if (resolved) {
384
+ if (resolved.id) {
385
+ result.id = resolved.id;
386
+ delete result.name;
387
+ delete result.expression;
388
+ } else if (resolved.expression) {
389
+ result.expression = resolved.expression;
390
+ delete result.id;
391
+ delete result.name;
392
+ }
393
+ } else if (opts.licenseRef) {
394
+ const slug = makeRefSlug(result.name);
395
+ if (slug) {
396
+ result.expression = `LicenseRef-cdxgen-${slug}`;
397
+ delete result.id;
398
+ delete result.name;
399
+ }
400
+ }
401
+ }
402
+ if (
403
+ result.id &&
404
+ !result.id.toLowerCase().startsWith("licenseref-") &&
405
+ !result.url
406
+ ) {
407
+ result.url = `https://opensource.org/licenses/${result.id}`;
408
+ }
409
+ return result;
410
+ }
411
+
412
+ /**
413
+ * Normalizes and deduplicates a component's licenses array.
414
+ *
415
+ * @param {object} component CycloneDX Component
416
+ * @param {object} opts Options
417
+ * @returns {object} Modified component
418
+ */
419
+ export function enhanceComponentLicenses(component, opts = {}) {
420
+ if (!component?.licenses) return component;
421
+
422
+ const compOpts = {
423
+ ...opts,
424
+ pkg: {
425
+ name: component.name,
426
+ group: component.group,
427
+ purl: component.purl,
428
+ },
429
+ };
430
+
431
+ const rawLicenses = Array.isArray(component.licenses)
432
+ ? component.licenses
433
+ : [component.licenses];
434
+
435
+ const normalized = rawLicenses
436
+ .map((l) => normalizeLicense(l, compOpts))
437
+ .filter(Boolean);
438
+
439
+ const seen = new Set();
440
+ const deduped = [];
441
+ for (const l of normalized) {
442
+ const core = l.license || l;
443
+ const key = core.expression
444
+ ? `expr:${core.expression}`
445
+ : core.id
446
+ ? `id:${core.id}`
447
+ : `name:${core.name}`;
448
+
449
+ if (!seen.has(key)) {
450
+ seen.add(key);
451
+ deduped.push(l);
452
+ }
453
+ }
454
+
455
+ // Pre-1.7 schemas require a single SPDX-expression tuple when an expression is
456
+ // present; 1.7 permits a mixed list, so only collapse when asked.
457
+ component.licenses = opts._collapseLicenses
458
+ ? collapseLicenseChoice(deduped)
459
+ : deduped;
460
+ return component;
461
+ }
462
+
463
+ /**
464
+ * Combines license-choice entries into a single SPDX expression operand string,
465
+ * AND-ing the operands (matching the CycloneDX schema example
466
+ * `Apache-2.0 AND (MIT OR GPL-2.0-only)`). Sub-expressions containing AND/OR are
467
+ * parenthesized. Named (non-SPDX) licenses cannot be valid expression operands
468
+ * and are omitted.
469
+ *
470
+ * @param {object[]} entries normalized license-choice entries
471
+ * @returns {string|null} combined expression, or null when no valid operands
472
+ */
473
+ function combineLicensesToExpression(entries) {
474
+ const operands = [];
475
+ for (const entry of entries) {
476
+ if (entry.expression) {
477
+ operands.push(
478
+ /\b(AND|OR)\b/i.test(entry.expression)
479
+ ? `(${entry.expression})`
480
+ : entry.expression,
481
+ );
482
+ continue;
483
+ }
484
+ const core = entry.license || entry;
485
+ if (core.id) {
486
+ operands.push(core.id);
487
+ }
488
+ }
489
+ return operands.length ? operands.join(" AND ") : null;
490
+ }
491
+
492
+ /**
493
+ * Enforces the CycloneDX license-choice rule: a `licenses` array is EITHER a
494
+ * list of `{license:{id|name}}` objects OR a single-element tuple holding one
495
+ * `{expression}`. When normalization yields an expression mixed with other
496
+ * entries (or multiple entries with an expression), collapse everything into a
497
+ * single combined expression so the BOM stays schema-valid.
498
+ *
499
+ * @param {object[]} entries normalized license-choice entries
500
+ * @returns {object[]} a schema-valid license-choice array
501
+ */
502
+ function collapseLicenseChoice(entries) {
503
+ if (!Array.isArray(entries) || entries.length <= 1) {
504
+ return entries;
505
+ }
506
+ if (!entries.some((entry) => entry.expression)) {
507
+ // Pure list of id/name licenses is already a valid choice.
508
+ return entries;
509
+ }
510
+ const combined = combineLicensesToExpression(entries);
511
+ return combined ? [{ expression: combined }] : entries;
512
+ }
513
+
514
+ function getComplianceAlert(licenseId, category, policy) {
515
+ if (!policy?.license_policies) return null;
516
+ const idLower = licenseId ? licenseId.toLowerCase() : "";
517
+ const catLower = category ? category.toLowerCase() : "";
518
+
519
+ for (const entry of policy.license_policies) {
520
+ if (entry.license_key && entry.license_key.toLowerCase() === idLower) {
521
+ return normalizeAlertLabel(entry.label || entry.compliance_alert);
522
+ }
523
+ }
524
+
525
+ for (const entry of policy.license_policies) {
526
+ if (entry.category && entry.category.toLowerCase() === catLower) {
527
+ return normalizeAlertLabel(entry.label || entry.compliance_alert);
528
+ }
529
+ }
530
+
531
+ return null;
532
+ }
533
+
534
+ function normalizeAlertLabel(label) {
535
+ if (!label) return null;
536
+ const l = label.toLowerCase();
537
+ if (
538
+ l.includes("approve") ||
539
+ l.includes("pass") ||
540
+ l.includes("allow") ||
541
+ l === "green"
542
+ ) {
543
+ return "pass";
544
+ }
545
+ if (l.includes("restrict") || l.includes("warn") || l === "yellow") {
546
+ return "warning";
547
+ }
548
+ if (
549
+ l.includes("prohibit") ||
550
+ l.includes("error") ||
551
+ l.includes("fail") ||
552
+ l.includes("deny") ||
553
+ l.includes("reject") ||
554
+ l === "red"
555
+ ) {
556
+ return "error";
557
+ }
558
+ return label;
559
+ }
560
+
561
+ /**
562
+ * Opt-in: enriches a license object with metadata properties and compliance policy.
563
+ *
564
+ * @param {object} licenseWrapper License wrapper object
565
+ * @param {object} policy Compliance policy
566
+ * @param {object} opts Options
567
+ * @returns {object} Enriched license wrapper
568
+ */
569
+ export function enrichLicenseMetadata(licenseWrapper, policy, _opts = {}) {
570
+ if (!licenseWrapper) return licenseWrapper;
571
+
572
+ const core = licenseWrapper.license || licenseWrapper;
573
+ if (!core || core.expression) {
574
+ return licenseWrapper;
575
+ }
576
+
577
+ const id = core.id;
578
+ const name = core.name;
579
+
580
+ let category = "Unstated License";
581
+ let osiApproved = "false";
582
+ let fsfLibre = "false";
583
+ let deprecated = "false";
584
+
585
+ let dbEntry = null;
586
+ if (id) {
587
+ dbEntry = getDbBySpdxLowerMap().get(id.toLowerCase()) || null;
588
+ } else if (name) {
589
+ const alias = correctLicenseId(name);
590
+ if (alias) {
591
+ dbEntry = getDbBySpdxLowerMap().get(alias.toLowerCase()) || null;
592
+ }
593
+ }
594
+
595
+ if (dbEntry) {
596
+ category = dbEntry.category || "Unstated License";
597
+ deprecated = dbEntry.is_deprecated ? "true" : "false";
598
+ if (dbEntry.osi_url) {
599
+ osiApproved = "true";
600
+ }
601
+ }
602
+
603
+ const spdxHit = id ? getSpdxLowerMap().get(id.toLowerCase()) : null;
604
+ if (spdxHit) {
605
+ const spdxEntry = spdxHit.entry;
606
+ osiApproved = spdxEntry.isOsiApproved ? "true" : "false";
607
+ fsfLibre = spdxEntry.isFsfLibre ? "true" : "false";
608
+ deprecated = spdxEntry.isDeprecated ? "true" : "false";
609
+ }
610
+
611
+ const foss = FOSS_CATEGORIES.has(category) ? "true" : "false";
612
+ const alert = getComplianceAlert(id || name, category, policy);
613
+
614
+ if (!core.properties) {
615
+ core.properties = [];
616
+ }
617
+
618
+ const props = [
619
+ { name: "cdx:license:category", value: category },
620
+ { name: "cdx:license:foss", value: foss },
621
+ { name: "cdx:license:osiApproved", value: osiApproved },
622
+ { name: "cdx:license:fsfLibre", value: fsfLibre },
623
+ { name: "cdx:license:deprecated", value: deprecated },
624
+ ];
625
+
626
+ if (alert) {
627
+ props.push({ name: "cdx:license:complianceAlert", value: alert });
628
+ }
629
+
630
+ for (const p of props) {
631
+ const idx = core.properties.findIndex((item) => item.name === p.name);
632
+ if (idx >= 0) {
633
+ core.properties[idx].value = p.value;
634
+ } else {
635
+ core.properties.push(p);
636
+ }
637
+ }
638
+
639
+ return licenseWrapper;
640
+ }
641
+
642
+ /**
643
+ * Walks a whole BOM and enhances all metadata and component licenses.
644
+ *
645
+ * @param {object} bom CycloneDX BOM JSON Object
646
+ * @param {object} opts Options
647
+ * @returns {object} Enhanced BOM
648
+ */
649
+ export function enhanceBom(bom, opts = {}) {
650
+ if (!bom) return bom;
651
+
652
+ const policy = opts.licensePolicy ? loadPolicy(opts.licensePolicy) : null;
653
+
654
+ // CycloneDX 1.7 allows a mixed list of named licenses and SPDX expressions in
655
+ // the same `licenses` array, so we preserve that granularity. Pre-1.7 schemas
656
+ // require a single SPDX-expression tuple, so collapse mixed entries there.
657
+ const specVersion = Number(
658
+ opts.specVersion ?? bom.specVersion ?? DEFAULT_CDX_SPEC_VERSION,
659
+ );
660
+ const effectiveOpts = {
661
+ ...opts,
662
+ _collapseLicenses: Number.isFinite(specVersion) && specVersion < 1.7,
663
+ };
664
+
665
+ if (bom.metadata?.component) {
666
+ enhanceComponent(bom.metadata.component, policy, effectiveOpts);
667
+ }
668
+
669
+ if (bom.metadata?.licenses) {
670
+ const rawLicenses = Array.isArray(bom.metadata.licenses)
671
+ ? bom.metadata.licenses
672
+ : [bom.metadata.licenses];
673
+
674
+ const normalizedMeta = rawLicenses
675
+ .map((l) => {
676
+ const normalized = normalizeLicense(l, effectiveOpts);
677
+ if (effectiveOpts.licenseEnrich) {
678
+ enrichLicenseMetadata(normalized, policy, effectiveOpts);
679
+ }
680
+ return normalized;
681
+ })
682
+ .filter(Boolean);
683
+ bom.metadata.licenses = effectiveOpts._collapseLicenses
684
+ ? collapseLicenseChoice(normalizedMeta)
685
+ : normalizedMeta;
686
+ }
687
+
688
+ if (bom.components && Array.isArray(bom.components)) {
689
+ for (const comp of bom.components) {
690
+ enhanceComponent(comp, policy, effectiveOpts);
691
+ }
692
+ }
693
+
694
+ return bom;
695
+ }
696
+
697
+ function enhanceComponent(component, policy, opts) {
698
+ if (!component) return;
699
+
700
+ if (opts.licenseEnhance !== false) {
701
+ enhanceComponentLicenses(component, opts);
702
+ }
703
+
704
+ if (opts.licenseEnrich && component.licenses) {
705
+ let componentWorstAlert = null;
706
+ const categories = new Set();
707
+
708
+ for (const l of component.licenses) {
709
+ enrichLicenseMetadata(l, policy, opts);
710
+
711
+ const core = l.license || l;
712
+ if (core.properties) {
713
+ const catProp = core.properties.find(
714
+ (p) => p.name === "cdx:license:category",
715
+ );
716
+ if (catProp) categories.add(catProp.value);
717
+
718
+ const alertProp = core.properties.find(
719
+ (p) => p.name === "cdx:license:complianceAlert",
720
+ );
721
+ if (alertProp) {
722
+ componentWorstAlert = getWorstAlert(
723
+ componentWorstAlert,
724
+ alertProp.value,
725
+ );
726
+ }
727
+ }
728
+ }
729
+
730
+ if (!componentWorstAlert && policy) {
731
+ for (const l of component.licenses) {
732
+ const core = l.license || l;
733
+ if (core.expression) {
734
+ const parsed = parseSpdxExpression(core.expression);
735
+ if (parsed.ast) {
736
+ const operands = [];
737
+ collectASTOperands(parsed.ast, operands);
738
+ for (const op of operands) {
739
+ const alert = getComplianceAlert(op, null, policy);
740
+ if (alert) {
741
+ componentWorstAlert = getWorstAlert(componentWorstAlert, alert);
742
+ }
743
+ }
744
+ }
745
+ }
746
+ }
747
+ }
748
+
749
+ if (categories.size > 0) {
750
+ setComponentProperty(
751
+ component,
752
+ "cdx:license:category",
753
+ Array.from(categories).join(", "),
754
+ );
755
+ }
756
+ if (componentWorstAlert) {
757
+ setComponentProperty(
758
+ component,
759
+ "cdx:license:complianceAlert",
760
+ componentWorstAlert,
761
+ );
762
+ }
763
+ }
764
+
765
+ if (component.components && Array.isArray(component.components)) {
766
+ for (const sub of component.components) {
767
+ enhanceComponent(sub, policy, opts);
768
+ }
769
+ }
770
+ }
771
+
772
+ function getWorstAlert(current, next) {
773
+ if (!current) return next;
774
+ if (!next) return current;
775
+ const levels = { error: 3, warning: 2, pass: 1 };
776
+ const currentVal = levels[current] || 0;
777
+ const nextVal = levels[next] || 0;
778
+ return nextVal > currentVal ? next : current;
779
+ }
780
+
781
+ function setComponentProperty(component, name, value) {
782
+ if (!component.properties) {
783
+ component.properties = [];
784
+ }
785
+ const idx = component.properties.findIndex((p) => p.name === name);
786
+ if (idx >= 0) {
787
+ component.properties[idx].value = value;
788
+ } else {
789
+ component.properties.push({ name, value });
790
+ }
791
+ }
792
+
793
+ function collectASTOperands(node, operands) {
794
+ if (node.type === "License") {
795
+ operands.push(node.id);
796
+ } else if (node.type === "With") {
797
+ collectASTOperands(node.license, operands);
798
+ } else if (node.type === "And" || node.type === "Or") {
799
+ collectASTOperands(node.left, operands);
800
+ collectASTOperands(node.right, operands);
801
+ }
802
+ }
803
+
804
+ /**
805
+ * Looks up the ScanCode category for a license identifier from the bundled
806
+ * database.
807
+ *
808
+ * @param {string} id SPDX license identifier
809
+ * @returns {string|null} Category label or null
810
+ */
811
+ function getLicenseCategory(id) {
812
+ if (!id) {
813
+ return null;
814
+ }
815
+ const entry = getDbBySpdxLowerMap().get(id.toLowerCase());
816
+ return entry?.category || null;
817
+ }
818
+
819
+ const ALERT_RANK = { error: 3, warning: 2, pass: 1 };
820
+
821
+ /**
822
+ * Evaluates a single license object (`{id}`, `{name}`, or `{expression}`)
823
+ * against a compliance policy.
824
+ *
825
+ * @param {object} core License object
826
+ * @param {object} policy Parsed policy
827
+ * @returns {object|null} { license, category, alert } or null when no alert
828
+ */
829
+ function evaluateLicensePolicy(core, policy) {
830
+ if (!core) {
831
+ return null;
832
+ }
833
+ if (core.expression) {
834
+ const parsed = parseSpdxExpression(core.expression);
835
+ if (!parsed.ast) {
836
+ return null;
837
+ }
838
+ const operands = [];
839
+ collectASTOperands(parsed.ast, operands);
840
+ let worstAlert = null;
841
+ let worstCategory = null;
842
+ for (const op of operands) {
843
+ const category = getLicenseCategory(op);
844
+ const alert = getComplianceAlert(op, category, policy);
845
+ if (
846
+ alert &&
847
+ (!worstAlert || ALERT_RANK[alert] > ALERT_RANK[worstAlert])
848
+ ) {
849
+ worstAlert = alert;
850
+ worstCategory = category;
851
+ }
852
+ }
853
+ return worstAlert
854
+ ? { license: core.expression, category: worstCategory, alert: worstAlert }
855
+ : null;
856
+ }
857
+ const display = core.id || core.name;
858
+ if (!display) {
859
+ return null;
860
+ }
861
+ const id = core.id || correctLicenseId(core.name);
862
+ const category = getLicenseCategory(id);
863
+ const alert = getComplianceAlert(id || core.name, category, policy);
864
+ return alert ? { license: display, category, alert } : null;
865
+ }
866
+
867
+ /**
868
+ * Walks every component license in a BOM and returns the entries that violate
869
+ * the supplied compliance policy (alert `error`, or `warning` when
870
+ * `includeWarnings` is set). Recurses into nested components and the metadata
871
+ * component.
872
+ *
873
+ * @param {object} bom CycloneDX BOM
874
+ * @param {object} policy Parsed policy object (see loadPolicy)
875
+ * @param {object} [opts] { includeWarnings?: boolean }
876
+ * @returns {object[]} Violations: { ref, name, version, license, category, alert }
877
+ */
878
+ export function collectPolicyViolations(bom, policy, opts = {}) {
879
+ if (!bom || !policy) {
880
+ return [];
881
+ }
882
+ const minRank = opts.includeWarnings === true ? 2 : 3;
883
+ const violations = [];
884
+ const visit = (component) => {
885
+ if (!component) {
886
+ return;
887
+ }
888
+ const licenses = Array.isArray(component.licenses)
889
+ ? component.licenses
890
+ : component.licenses
891
+ ? [component.licenses]
892
+ : [];
893
+ for (const l of licenses) {
894
+ const core = l.license || l;
895
+ const evaluated = evaluateLicensePolicy(core, policy);
896
+ if (evaluated && (ALERT_RANK[evaluated.alert] || 0) >= minRank) {
897
+ violations.push({
898
+ ref:
899
+ component.purl ||
900
+ component["bom-ref"] ||
901
+ component.name ||
902
+ "unknown",
903
+ name: component.name,
904
+ version: component.version,
905
+ ...evaluated,
906
+ });
907
+ }
908
+ }
909
+ for (const sub of component.components || []) {
910
+ visit(sub);
911
+ }
912
+ };
913
+ visit(bom?.metadata?.component);
914
+ for (const component of bom?.components || []) {
915
+ visit(component);
916
+ }
917
+ return violations;
918
+ }