@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,1094 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { homedir, platform } from "node:os";
3
+ import { basename, dirname, join } from "node:path";
4
+
5
+ import { build } from "@cdxgen/cdx-purl";
6
+
7
+ // utils.js does not import denoutils.js, so importing from it here is safe and
8
+ // does not introduce a cyclic dependency.
9
+ import {
10
+ cdxgenAgent,
11
+ DEBUG_MODE,
12
+ readEnvironmentVariable,
13
+ } from "../core/activity.js";
14
+ import { shouldFetchLicense, shouldFetchVCS } from "../core/env.js";
15
+ import { safeExistsSync } from "../core/fs.js";
16
+ import {
17
+ prefetchEnabled,
18
+ prefetchedResponse,
19
+ prefetchJson,
20
+ } from "../inventory/fetchBatch.js";
21
+ import { getNpmMetadata } from "./ecosystems.js";
22
+ import {
23
+ buildNpmRegistryTarballUrl,
24
+ loadNpmrcConfig,
25
+ normalizeNpmRegistryUrl,
26
+ } from "./npmutils.js";
27
+
28
+ const DEFAULT_NPM_REGISTRY = "https://registry.npmjs.org/";
29
+
30
+ // jsr's metadata API. Version endpoints expose the SPDX license and package
31
+ // endpoints expose the description + GitHub repository.
32
+ // Overridable for the same reason NPM_URL is: without it the jsr lookups cannot
33
+ // be covered offline, and a private jsr mirror cannot be pointed at.
34
+ const JSR_API_URL =
35
+ readEnvironmentVariable("JSR_API_URL") || "https://api.jsr.io/";
36
+
37
+ // Small in-module response cache so repeated packages (or multiple lockfiles)
38
+ // don't re-fetch the same jsr metadata.
39
+ const jsrMetadataCache = new Map();
40
+
41
+ /**
42
+ * purl decision for `jsr:` dependencies.
43
+ *
44
+ * JSR (https://jsr.io) does not have a ratified PackageURL type yet. JSR
45
+ * publishes every package to a real npm scope, `@jsr/<owner>__<package>`, on
46
+ * its npm mirror (npm.jsr.io), so a `jsr:@std/assert@1.0.19` import resolves
47
+ * to the installable npm package `@jsr/std__assert@1.0.19`.
48
+ *
49
+ * We therefore map jsr deps to `pkg:npm/@jsr/<owner>__<name>@<version>`. This
50
+ * keeps cdxgen aligned with the AppThreat vulnerability-DB / dep-scan lookups,
51
+ * which index npm advisories, so jsr packages get vulnerability matching for
52
+ * free without needing a dedicated VDB integration. The original jsr identity
53
+ * is preserved in the `cdx:deno:jsrKey` property for traceability.
54
+ */
55
+ const JSR_NPM_SCOPE = "@jsr";
56
+
57
+ // jsr publishes an npm-compatible mirror at npm.jsr.io. jsr packages are NOT
58
+ // available on registry.npmjs.org, so license/metadata lookups for the
59
+ // `@jsr/<owner>__<name>` components must target this registry instead.
60
+ const JSR_NPM_REGISTRY = "https://npm.jsr.io/";
61
+ const JSR_NPM_REGISTRY_HOST = "npm.jsr.io";
62
+
63
+ /**
64
+ * Remove JSONC (JSON-with-comments) noise from a source string so it can be
65
+ * parsed with `JSON.parse`. Handles `//` line comments, `/* block *​/`
66
+ * comments and trailing commas, while leaving string literals untouched.
67
+ *
68
+ * Implemented as a small single-pass scanner rather than a regex, per the
69
+ * cdxgen convention of avoiding hard-to-review/exponential regexes for
70
+ * untrusted input.
71
+ *
72
+ * @param {string} text Raw JSONC source.
73
+ * @returns {string} Plain JSON text.
74
+ */
75
+ export function stripJsonc(text) {
76
+ if (!text) {
77
+ return text;
78
+ }
79
+ let out = "";
80
+ let i = 0;
81
+ const len = text.length;
82
+ while (i < len) {
83
+ const ch = text[i];
84
+ const next = text[i + 1];
85
+ // String literal (including escaped quotes) — copy verbatim.
86
+ if (ch === '"') {
87
+ out += ch;
88
+ i++;
89
+ while (i < len) {
90
+ const c = text[i];
91
+ out += c;
92
+ if (c === "\\" && i + 1 < len) {
93
+ out += text[i + 1];
94
+ i += 2;
95
+ continue;
96
+ }
97
+ if (c === '"') {
98
+ i++;
99
+ break;
100
+ }
101
+ i++;
102
+ }
103
+ continue;
104
+ }
105
+ // Line comment `// ...`
106
+ if (ch === "/" && next === "/") {
107
+ i += 2;
108
+ while (i < len && text[i] !== "\n") {
109
+ i++;
110
+ }
111
+ continue;
112
+ }
113
+ // Block comment `/* ... */`
114
+ if (ch === "/" && next === "*") {
115
+ i += 2;
116
+ while (i < len && !(text[i] === "*" && text[i + 1] === "/")) {
117
+ i++;
118
+ }
119
+ i += 2;
120
+ continue;
121
+ }
122
+ out += ch;
123
+ i++;
124
+ }
125
+ // Strip trailing commas that JSONC allows before `}` or `]`. Safe because
126
+ // `,}` / `,]` never appear inside string literals after comment stripping.
127
+ return out.replace(/,(\s*[}\]])/g, "$1");
128
+ }
129
+
130
+ /**
131
+ * Parse a JSON or JSONC file (deno.json or deno.jsonc) into a plain object.
132
+ *
133
+ * @param {string} jsonFile Path to the deno.json(c) file.
134
+ * @returns {Object|undefined} Parsed config, or undefined on failure.
135
+ */
136
+ export function parseDenoJsonFile(jsonFile) {
137
+ if (!safeExistsSync(jsonFile)) {
138
+ return undefined;
139
+ }
140
+ let rawData;
141
+ try {
142
+ rawData = readFileSync(jsonFile, "utf8");
143
+ } catch (err) {
144
+ if (DEBUG_MODE) {
145
+ console.log(`Unable to read ${jsonFile}`, err);
146
+ }
147
+ return undefined;
148
+ }
149
+ try {
150
+ return JSON.parse(stripJsonc(rawData));
151
+ } catch (err) {
152
+ if (DEBUG_MODE) {
153
+ console.log(`Unable to parse ${jsonFile}`, err);
154
+ }
155
+ return undefined;
156
+ }
157
+ }
158
+
159
+ /**
160
+ * Locate the deno.json or deno.jsonc manifest for a given directory.
161
+ *
162
+ * @param {string} dir Directory to search.
163
+ * @returns {string|undefined} Path to the manifest, if present.
164
+ */
165
+ export function findDenoJson(dir) {
166
+ const jsonPath = join(dir, "deno.json");
167
+ if (safeExistsSync(jsonPath)) {
168
+ return jsonPath;
169
+ }
170
+ const jsoncPath = join(dir, "deno.jsonc");
171
+ if (safeExistsSync(jsoncPath)) {
172
+ return jsoncPath;
173
+ }
174
+ return undefined;
175
+ }
176
+
177
+ /**
178
+ * Split a `@scope/name@version` descriptor into its group, name and version.
179
+ * Handles scoped names that themselves begin with `@`.
180
+ *
181
+ * @param {string} descriptor The `[@scope/]name[@version]` descriptor.
182
+ * @returns {{group: string, name: string, version: string}} Parsed pieces.
183
+ */
184
+ function parseScopedDescriptor(descriptor) {
185
+ const atIndex = descriptor.indexOf("@", 1);
186
+ let fullName = descriptor;
187
+ let version = "";
188
+ if (atIndex > 0) {
189
+ fullName = descriptor.substring(0, atIndex);
190
+ version = descriptor.substring(atIndex + 1);
191
+ }
192
+ let group = "";
193
+ let name = fullName;
194
+ if (fullName.startsWith("@")) {
195
+ const slashIndex = fullName.indexOf("/");
196
+ if (slashIndex > 0) {
197
+ group = fullName.substring(0, slashIndex);
198
+ name = fullName.substring(slashIndex + 1);
199
+ }
200
+ }
201
+ return { group, name, version };
202
+ }
203
+
204
+ /**
205
+ * Build the JSR npm-compat name (`<owner>__<name>`) for a jsr group/name pair.
206
+ * The returned value is the npm *package name* that lives under the `@jsr`
207
+ * scope on npm.jsr.io, e.g. `jsr:@std/assert` -> npm `@jsr/std__assert`. The
208
+ * `@jsr` scope itself is applied separately as the purl namespace/group so the
209
+ * resulting purl is a valid two-segment npm purl
210
+ * (`pkg:npm/%40jsr/std__assert@1.0.19`).
211
+ *
212
+ * @param {string} group Original jsr scope, e.g. `@std`.
213
+ * @param {string} name Original jsr name, e.g. `assert`.
214
+ * @returns {string} npm package name, e.g. `std__assert`.
215
+ */
216
+ function jsrNpmName(group, name) {
217
+ const owner = group ? group.replace(/^@/, "") : "";
218
+ if (!owner) {
219
+ return name;
220
+ }
221
+ return `${owner}__${name}`;
222
+ }
223
+
224
+ /**
225
+ * Parse an npm integrity string into a canonical `_integrity` value. npm
226
+ * lockfiles already use the SRI form (`sha512-base64==`); deno's npm entries
227
+ * reuse the same form, so this is mostly a passthrough that discards blanks.
228
+ *
229
+ * @param {string} integrity Raw integrity from the lockfile.
230
+ * @returns {string|undefined} Normalised integrity, or undefined.
231
+ */
232
+ function toNpmIntegrity(integrity) {
233
+ if (!integrity || typeof integrity !== "string") {
234
+ return undefined;
235
+ }
236
+ const trimmed = integrity.trim();
237
+ if (!trimmed) {
238
+ return undefined;
239
+ }
240
+ return trimmed;
241
+ }
242
+
243
+ /**
244
+ * Normalise a jsr integrity hash (raw sha256 hex, as emitted by deno) into an
245
+ * `_integrity`-shaped value. We prefix `sha256-` but keep the hex payload
246
+ * verbatim rather than base64-encoding, and store the raw value in a property
247
+ * so consumers can distinguish it from a canonical SRI digest.
248
+ *
249
+ * @param {string} integrity Raw sha256 hex string.
250
+ * @returns {string|undefined} Prefixed integrity, or undefined.
251
+ */
252
+ function toJsrIntegrity(integrity) {
253
+ if (!integrity || typeof integrity !== "string") {
254
+ return undefined;
255
+ }
256
+ const trimmed = integrity.trim();
257
+ if (!trimmed) {
258
+ return undefined;
259
+ }
260
+ return trimmed.startsWith("sha256-") ? trimmed : `sha256-${trimmed}`;
261
+ }
262
+
263
+ /**
264
+ * Read and JSON-parse a package.json, tolerating any IO/parse failure.
265
+ *
266
+ * @param {string} pkgJsonFile Path to a package.json.
267
+ * @returns {Object|undefined} Parsed manifest, or undefined.
268
+ */
269
+ function readPackageJsonSafe(pkgJsonFile) {
270
+ if (!safeExistsSync(pkgJsonFile)) {
271
+ return undefined;
272
+ }
273
+ try {
274
+ return JSON.parse(readFileSync(pkgJsonFile, "utf8"));
275
+ } catch {
276
+ return undefined;
277
+ }
278
+ }
279
+
280
+ /**
281
+ * Add a `vcs` external reference to a component, de-duplicating by URL.
282
+ *
283
+ * @param {Object} component The component to enrich.
284
+ * @param {string} url The repository URL.
285
+ */
286
+ function addVcsReference(component, url) {
287
+ if (!url) {
288
+ return;
289
+ }
290
+ component.externalReferences = component.externalReferences || [];
291
+ if (
292
+ !component.externalReferences.some(
293
+ (ref) => ref.type === "vcs" && ref.url === url,
294
+ )
295
+ ) {
296
+ component.externalReferences.push({ type: "vcs", url });
297
+ }
298
+ }
299
+
300
+ /**
301
+ * Copy license/description/repository from a package.json manifest onto a
302
+ * component, without overwriting values already resolved. The repository is
303
+ * emitted as a `vcs` external reference (deno components are added directly to
304
+ * the BOM and never pass through the npm `listComponents` normalisation that
305
+ * would otherwise convert a `repository` field).
306
+ *
307
+ * @param {Object} component The component to enrich.
308
+ * @param {Object} pj Parsed package.json manifest.
309
+ */
310
+ function applyPackageJsonMetadata(component, pj) {
311
+ if (!pj) {
312
+ return;
313
+ }
314
+ if (!component.description && pj.description) {
315
+ component.description = pj.description;
316
+ }
317
+ if (!component.license && (pj.license || pj.licenses)) {
318
+ component.license = pj.license || pj.licenses;
319
+ }
320
+ if (pj.repository) {
321
+ const url =
322
+ typeof pj.repository === "string" ? pj.repository : pj.repository.url;
323
+ addVcsReference(component, url);
324
+ }
325
+ }
326
+
327
+ /**
328
+ * Resolve the Deno cache directory ($DENO_DIR or the per-OS default) used to
329
+ * store the npm compatibility layer at `<denoDir>/npm/<registry-host>/...`.
330
+ *
331
+ * @returns {string|undefined} The Deno cache directory, if resolvable.
332
+ */
333
+ function resolveDenoCacheDir() {
334
+ if (readEnvironmentVariable("DENO_DIR")) {
335
+ return readEnvironmentVariable("DENO_DIR");
336
+ }
337
+ const home = homedir();
338
+ if (!home) {
339
+ return undefined;
340
+ }
341
+ switch (platform()) {
342
+ case "darwin":
343
+ return join(home, "Library", "Caches", "deno");
344
+ case "win32":
345
+ return join(
346
+ readEnvironmentVariable("LOCALAPPDATA") ||
347
+ join(home, "AppData", "Local"),
348
+ "deno",
349
+ );
350
+ default:
351
+ return join(
352
+ readEnvironmentVariable("XDG_CACHE_HOME") || join(home, ".cache"),
353
+ "deno",
354
+ );
355
+ }
356
+ }
357
+
358
+ /**
359
+ * Locate an installed package.json for a component by checking, in order:
360
+ * 1. the project-local `node_modules` (deno `nodeModulesDir`),
361
+ * 2. deno's flattened `.deno` node_modules layout, and
362
+ * 3. deno's global npm cache under `<denoDir>/npm/<registry-host>/`.
363
+ *
364
+ * jsr components resolve under the `@jsr` scope (their npm-compat name), which
365
+ * is only present when a project materialises jsr packages into node_modules.
366
+ *
367
+ * @param {Object} component The component to resolve.
368
+ * @param {string} projectRoot The directory containing deno.lock.
369
+ * @param {string[]} registryHosts npm registry hosts to probe in the cache.
370
+ * @returns {Object|undefined} Parsed package.json, if found.
371
+ */
372
+ function findInstalledManifest(component, projectRoot, registryHosts) {
373
+ const { group, name, version } = component;
374
+ const scopedName = group ? `${group}/${name}` : name;
375
+ const candidates = [];
376
+ if (projectRoot) {
377
+ const nmDir = join(projectRoot, "node_modules");
378
+ // 1. Hoisted/symlinked layout: node_modules/<scope>/<name>/package.json
379
+ candidates.push(join(nmDir, scopedName, "package.json"));
380
+ // 2. Deno's flattened layout: node_modules/.deno/<key>@<version>/node_modules/<scope>/<name>/package.json
381
+ const denoKey = `${group ? `${group.replace(/^@/, "")}+` : ""}${name}@${version}`;
382
+ candidates.push(
383
+ join(nmDir, ".deno", denoKey, "node_modules", scopedName, "package.json"),
384
+ );
385
+ }
386
+ // 3. Deno global npm cache: <denoDir>/npm/<host>/<scope>/<name>/<version>/package.json
387
+ const denoCacheDir = resolveDenoCacheDir();
388
+ if (denoCacheDir && version) {
389
+ for (const host of registryHosts) {
390
+ candidates.push(
391
+ join(denoCacheDir, "npm", host, scopedName, version, "package.json"),
392
+ );
393
+ }
394
+ }
395
+ for (const candidate of candidates) {
396
+ const pj = readPackageJsonSafe(candidate);
397
+ if (pj) {
398
+ return pj;
399
+ }
400
+ }
401
+ return undefined;
402
+ }
403
+
404
+ /**
405
+ * Enrich components with license/description/repository metadata mined offline
406
+ * from a project's `node_modules` and the global deno npm cache. Runs before
407
+ * any network lookup so air-gapped scans still capture available metadata.
408
+ *
409
+ * @param {Array} pkgList Components to enrich (mutated in place).
410
+ * @param {string} projectRoot Directory containing deno.lock.
411
+ * @param {string} jsrNpmRegistryHost Host of jsr's npm mirror.
412
+ */
413
+ function mineInstalledMetadata(pkgList, projectRoot, jsrNpmRegistryHost) {
414
+ for (const component of pkgList) {
415
+ if (component.description && component.license) {
416
+ continue;
417
+ }
418
+ // jsr components are cached under jsr's npm-mirror host; npm components
419
+ // under the default registry host.
420
+ const registryHosts =
421
+ component.group === JSR_NPM_SCOPE
422
+ ? [jsrNpmRegistryHost, "registry.npmjs.org"]
423
+ : ["registry.npmjs.org"];
424
+ const pj = findInstalledManifest(component, projectRoot, registryHosts);
425
+ if (pj) {
426
+ applyPackageJsonMetadata(component, pj);
427
+ }
428
+ }
429
+ }
430
+
431
+ /**
432
+ * Fetch license, description and repository metadata for jsr components from
433
+ * jsr's metadata API (api.jsr.io). jsr's npm mirror does not expose license
434
+ * data, so this is the authoritative source for it.
435
+ *
436
+ * @param {Array} pkgList jsr components (identified by `cdx:deno:jsrKey`).
437
+ * @returns {Promise<Array>} The same component list.
438
+ */
439
+ /**
440
+ * The two jsr.io API URLs a component needs, or undefined when it has no
441
+ * `cdx:deno:jsrKey` property to derive them from.
442
+ *
443
+ * Shared by the batch prefetch and the loop so neither can drift from the
444
+ * other.
445
+ *
446
+ * @param {Object} component CycloneDX component with cdxgen properties.
447
+ * @returns {{versionUrl: string, packageUrl: string}|undefined}
448
+ */
449
+ function jsrUrlsFor(component) {
450
+ const jsrKey = (component.properties || []).find(
451
+ (p) => p.name === "cdx:deno:jsrKey",
452
+ )?.value;
453
+ if (!jsrKey) {
454
+ return undefined;
455
+ }
456
+ const atIndex = jsrKey.lastIndexOf("@");
457
+ const idPart = atIndex > 0 ? jsrKey.substring(0, atIndex) : jsrKey;
458
+ const version =
459
+ atIndex > 0 ? jsrKey.substring(atIndex + 1) : component.version;
460
+ const match = idPart.match(/^@([^/]+)\/(.+)$/);
461
+ if (!match) {
462
+ return undefined;
463
+ }
464
+ const [, scope, pkgName] = match;
465
+ return {
466
+ versionUrl: `${JSR_API_URL}scopes/${scope}/packages/${pkgName}/versions/${version}`,
467
+ packageUrl: `${JSR_API_URL}scopes/${scope}/packages/${pkgName}`,
468
+ };
469
+ }
470
+
471
+ /**
472
+ * Fetch JSR registry metadata for deno/jsr package components.
473
+ *
474
+ * For each component carrying a `cdx:deno:jsrKey` property, fetches the version
475
+ * and package endpoints from the JSR API (batched in a single prefetch round
476
+ * when enabled) and fills in license, description, and the GitHub source link.
477
+ *
478
+ * @param {Array<object>} pkgList Package components potentially enriched with `cdx:deno:jsrKey`.
479
+ * @returns {Promise<Array<object>>} The enriched package list (same reference as pkgList).
480
+ */
481
+ export async function getJsrMetadata(pkgList) {
482
+ // Both URLs per component, for every component, in one batched round.
483
+ const prefetched = await prefetchJson(
484
+ prefetchEnabled()
485
+ ? pkgList.flatMap((component) => {
486
+ const urls = jsrUrlsFor(component);
487
+ return urls
488
+ ? [{ url: urls.versionUrl }, { url: urls.packageUrl }]
489
+ : [];
490
+ })
491
+ : [],
492
+ );
493
+ for (const component of pkgList) {
494
+ try {
495
+ const jsrKey = (component.properties || []).find(
496
+ (p) => p.name === "cdx:deno:jsrKey",
497
+ )?.value;
498
+ if (!jsrKey) {
499
+ continue;
500
+ }
501
+ // jsrKey looks like `@scope/name@version`.
502
+ const atIndex = jsrKey.lastIndexOf("@");
503
+ const idPart = atIndex > 0 ? jsrKey.substring(0, atIndex) : jsrKey;
504
+ const version =
505
+ atIndex > 0 ? jsrKey.substring(atIndex + 1) : component.version;
506
+ const match = idPart.match(/^@([^/]+)\/(.+)$/);
507
+ if (!match) {
508
+ continue;
509
+ }
510
+ const [, scope, pkgName] = match;
511
+ const versionUrl = `${JSR_API_URL}scopes/${scope}/packages/${pkgName}/versions/${version}`;
512
+ const packageUrl = `${JSR_API_URL}scopes/${scope}/packages/${pkgName}`;
513
+
514
+ let versionBody = jsrMetadataCache.get(versionUrl);
515
+ if (!versionBody) {
516
+ const res =
517
+ prefetchedResponse(prefetched, versionUrl) ||
518
+ (await cdxgenAgent.get(versionUrl, { responseType: "json" }));
519
+ versionBody = res.body;
520
+ jsrMetadataCache.set(versionUrl, versionBody);
521
+ }
522
+ if (versionBody?.license && !component.license) {
523
+ component.license = versionBody.license;
524
+ }
525
+
526
+ let packageBody = jsrMetadataCache.get(packageUrl);
527
+ if (!packageBody) {
528
+ const res =
529
+ prefetchedResponse(prefetched, packageUrl) ||
530
+ (await cdxgenAgent.get(packageUrl, { responseType: "json" }));
531
+ packageBody = res.body;
532
+ jsrMetadataCache.set(packageUrl, packageBody);
533
+ }
534
+ if (packageBody?.description && !component.description) {
535
+ component.description = packageBody.description;
536
+ }
537
+ const ghRepo = packageBody?.githubRepository;
538
+ if (ghRepo?.owner && ghRepo?.name) {
539
+ addVcsReference(
540
+ component,
541
+ `https://github.com/${ghRepo.owner}/${ghRepo.name}`,
542
+ );
543
+ }
544
+ } catch (_err) {
545
+ if (DEBUG_MODE) {
546
+ console.log(`${component.name} was not found on jsr`);
547
+ }
548
+ }
549
+ }
550
+ return pkgList;
551
+ }
552
+
553
+ /**
554
+ * Parse a deno.lock file (versions 2 through 5) and return the package list
555
+ * and dependency graph in the same shape as the other lockfile parsers.
556
+ *
557
+ * Lock version summary:
558
+ * - v5 (Deno >= 2.x, current): flat top-level `specifiers`, `jsr`, `npm` and
559
+ * optional `remote` maps. jsr entries list their own jsr dependencies; npm
560
+ * entries only carry an integrity hash and DO NOT list their own transitive
561
+ * npm dependencies (see the limitation note below).
562
+ * - v2/v3/v4: `npm.specifiers` + `npm.packages` (packages carry a
563
+ * `dependencies` map of `name` -> `name@version`), optional `jsr` map and
564
+ * `remote` map.
565
+ *
566
+ * purl mapping:
567
+ * - `jsr:@scope/name@ver` -> `pkg:npm/@jsr/scope__name@ver` (see
568
+ * `JSR_NPM_SCOPE` doc comment for the rationale).
569
+ * - `npm:name@ver` -> `pkg:npm/name@ver` with the sha512 integrity as
570
+ * `_integrity`.
571
+ * - `https://...` remote imports -> `pkg:generic/<basename>` with a
572
+ * `download_url` external reference.
573
+ *
574
+ * v5 npm-transitive limitation: in v5 lockfiles the `npm` map is flat and each
575
+ * npm entry contains only an integrity hash, never a dependencies list. As a
576
+ * result the CycloneDX dependency graph for npm packages under v5 is shallow
577
+ * (only the parent component -> direct npm deps). Resolving the full npm
578
+ * transitive graph would require hitting the npm registry or the deno
579
+ * `node_modules` cache, which cdxgen intentionally does not do by default.
580
+ *
581
+ * @param {string} lockFile Path to the deno.lock file.
582
+ * @param {Object} [options] Parsing options (`parentComponent`, `projectRoot`).
583
+ * @returns {Promise<{pkgList: Array, dependenciesList: Array}>} Parsed
584
+ * packages and dependency graph.
585
+ */
586
+ export async function parseDenoLock(lockFile, options = {}) {
587
+ let pkgList = [];
588
+ const dependenciesList = [];
589
+ if (!safeExistsSync(lockFile)) {
590
+ return { pkgList, dependenciesList };
591
+ }
592
+ let lockData;
593
+ try {
594
+ lockData = JSON.parse(readFileSync(lockFile, "utf8"));
595
+ } catch (err) {
596
+ if (DEBUG_MODE) {
597
+ console.log(`Unable to parse ${lockFile}`, err);
598
+ }
599
+ return { pkgList, dependenciesList };
600
+ }
601
+ const version = `${lockData.version ?? ""}`;
602
+ if (DEBUG_MODE) {
603
+ console.log(`Parsing deno.lock (${lockFile}) version ${version || "?"}`);
604
+ }
605
+
606
+ const npmrcConfig = loadNpmrcConfig(options.projectRoot || dirname(lockFile));
607
+ const defaultRegistry =
608
+ normalizeNpmRegistryUrl(npmrcConfig.registry) || DEFAULT_NPM_REGISTRY;
609
+
610
+ // Map of concrete package key -> bom-ref for dependency resolution.
611
+ // Keys are the canonical `@scope/name@version` (jsr) or `name@version` (npm).
612
+ const keyToBomRef = new Map();
613
+ // Map of bom-ref -> dependency bom-refs (collected during the first pass so
614
+ // we can emit the graph without ordering constraints).
615
+ const edgesByBomRef = new Map();
616
+ // Direct dependencies of the parent/application component (the roots of the
617
+ // graph). Populated from the workspace block or the specifiers maps below.
618
+ const rootRefs = new Set();
619
+ const pkgObjectsByKey = new Map();
620
+
621
+ const rememberEdge = (fromRef, toRef) => {
622
+ if (!fromRef || !toRef || fromRef === toRef) {
623
+ return;
624
+ }
625
+ const set = edgesByBomRef.get(fromRef);
626
+ if (set) {
627
+ set.add(toRef);
628
+ } else {
629
+ edgesByBomRef.set(fromRef, new Set([toRef]));
630
+ }
631
+ };
632
+
633
+ // ---- jsr packages -----------------------------------------------------
634
+ // Resolve a jsr dependency reference (e.g. `jsr:@std/internal@^1.0.12`) to
635
+ // the bom-ref of the concrete installed package, using the specifiers map
636
+ // to turn the requirement into a pinned version.
637
+ const resolveJsrRef = (jsrRef, specifiers) => {
638
+ if (!jsrRef) {
639
+ return undefined;
640
+ }
641
+ const req = jsrRef.startsWith("jsr:") ? jsrRef.slice(4) : jsrRef;
642
+ // Specifiers may key the exact requirement string (with the `jsr:` prefix)
643
+ // so look it up both ways before falling back to a version-less match.
644
+ const pinnedVersion = specifiers?.[jsrRef] ?? specifiers?.[`jsr:${req}`];
645
+ const { group, name } = parseScopedDescriptor(req);
646
+ if (pinnedVersion) {
647
+ const concreteKey = `${group ? `${group}/` : ""}${name}@${pinnedVersion}`;
648
+ return keyToBomRef.get(concreteKey);
649
+ }
650
+ // Fall back to any concrete key matching this group/name. Picks the first
651
+ // known version — deno does not allow two versions of the same jsr package
652
+ // in a single resolve, so this is unambiguous in practice.
653
+ for (const [ck, ref] of keyToBomRef) {
654
+ const prefix = `${group ? `${group}/` : ""}${name}@`;
655
+ if (ck.startsWith(prefix)) {
656
+ return ref;
657
+ }
658
+ }
659
+ return undefined;
660
+ };
661
+
662
+ const jsrMap = lockData.jsr || {};
663
+ const specifiers = lockData.specifiers || {};
664
+ for (const [entryKey, entry] of Object.entries(jsrMap)) {
665
+ const { group, name, version } = parseScopedDescriptor(entryKey);
666
+ if (!name || !version) {
667
+ continue;
668
+ }
669
+ const npmName = jsrNpmName(group, name);
670
+ const purlString = build({
671
+ type: "npm",
672
+ namespace: JSR_NPM_SCOPE || null,
673
+ name: npmName,
674
+ version: version || null,
675
+ });
676
+ const bomRef = decodeURIComponent(purlString);
677
+ keyToBomRef.set(entryKey, bomRef);
678
+ const integrity = toJsrIntegrity(entry?.integrity);
679
+ const properties = [
680
+ { name: "internal:SrcFile", value: lockFile },
681
+ { name: "cdx:deno:source", value: "jsr" },
682
+ // Preserve the original jsr identity for traceability, since the purl is
683
+ // rewritten to the npm-compat form (`@jsr/<owner>__<name>`).
684
+ { name: "cdx:deno:jsrKey", value: entryKey },
685
+ ];
686
+ if (integrity) {
687
+ properties.push({
688
+ name: "cdx:deno:integrity",
689
+ value: entry?.integrity,
690
+ });
691
+ }
692
+ // Deterministic canonical jsr page for the original specifier, e.g.
693
+ // `https://jsr.io/@std/assert@1.0.19`. The npm-mirror tarball URL is only
694
+ // available after a registry lookup, so this gives every jsr component a
695
+ // stable reference even without --fetch-license.
696
+ const jsrHomepage = `https://jsr.io/${group ? `${group}/` : ""}${name}@${version}`;
697
+ const pkgObj = {
698
+ group: JSR_NPM_SCOPE,
699
+ name: npmName,
700
+ version,
701
+ purl: purlString,
702
+ "bom-ref": bomRef,
703
+ properties,
704
+ externalReferences: [{ type: "website", url: jsrHomepage }],
705
+ evidence: {
706
+ identity: {
707
+ field: "purl",
708
+ confidence: 1,
709
+ methods: [
710
+ {
711
+ technique: "manifest-analysis",
712
+ confidence: 1,
713
+ value: lockFile,
714
+ },
715
+ ],
716
+ },
717
+ },
718
+ };
719
+ if (integrity) {
720
+ pkgObj._integrity = integrity;
721
+ }
722
+ pkgObjectsByKey.set(entryKey, pkgObj);
723
+ // Always seed an edge set so leaf jsr packages (no dependencies array)
724
+ // still appear in the CycloneDX dependency graph with an empty dependsOn,
725
+ // matching how the npm loop below treats every entry.
726
+ if (!edgesByBomRef.has(bomRef)) {
727
+ edgesByBomRef.set(bomRef, new Set());
728
+ }
729
+ }
730
+ // Wire up jsr -> jsr edges now that every jsr bom-ref is known.
731
+ for (const [entryKey, entry] of Object.entries(jsrMap)) {
732
+ const fromRef = keyToBomRef.get(entryKey);
733
+ if (!fromRef || !Array.isArray(entry?.dependencies)) {
734
+ continue;
735
+ }
736
+ for (const depRef of entry.dependencies) {
737
+ const toRef = resolveJsrRef(depRef, specifiers);
738
+ if (toRef) {
739
+ rememberEdge(fromRef, toRef);
740
+ }
741
+ }
742
+ }
743
+
744
+ // ---- npm packages -----------------------------------------------------
745
+ // v5: flat `npm` map keyed by `name@version` with integrity only.
746
+ // v2/v3/v4: nested `npm.packages` map with a `dependencies` object whose
747
+ // values are `name@version` references to other entries.
748
+ const npmFlat = Array.isArray(lockData.npm) ? {} : lockData.npm || {};
749
+ const npmFlatEntries = npmFlat?.packages ? {} : npmFlat;
750
+ const npmNested = npmFlat?.packages ? npmFlat.packages : {};
751
+
752
+ // v5-style flat entries.
753
+ for (const [entryKey, entry] of Object.entries(npmFlatEntries)) {
754
+ if (entryKey === "specifiers") {
755
+ continue;
756
+ }
757
+ const { group, name, version } = parseScopedDescriptor(entryKey);
758
+ if (!name || !version) {
759
+ continue;
760
+ }
761
+ const purlString = build({
762
+ type: "npm",
763
+ namespace: group || null,
764
+ name: name,
765
+ version: version || null,
766
+ });
767
+ const bomRef = decodeURIComponent(purlString);
768
+ keyToBomRef.set(entryKey, bomRef);
769
+ const integrity = toNpmIntegrity(
770
+ entry && typeof entry === "object" ? entry.integrity : entry,
771
+ );
772
+ const resolvedUrl = buildNpmRegistryTarballUrl(
773
+ defaultRegistry,
774
+ group,
775
+ name,
776
+ version,
777
+ );
778
+ const properties = [
779
+ { name: "internal:SrcFile", value: lockFile },
780
+ { name: "cdx:deno:source", value: "npm" },
781
+ ];
782
+ const externalReferences = [];
783
+ if (resolvedUrl) {
784
+ properties.push({ name: "internal:ResolvedUrl", value: resolvedUrl });
785
+ externalReferences.push({ type: "distribution", url: resolvedUrl });
786
+ }
787
+ const pkgObj = {
788
+ group: group || "",
789
+ name,
790
+ version,
791
+ purl: purlString,
792
+ "bom-ref": bomRef,
793
+ properties,
794
+ evidence: {
795
+ identity: {
796
+ field: "purl",
797
+ confidence: 1,
798
+ methods: [
799
+ {
800
+ technique: "manifest-analysis",
801
+ confidence: 1,
802
+ value: lockFile,
803
+ },
804
+ ],
805
+ },
806
+ },
807
+ };
808
+ if (integrity) {
809
+ pkgObj._integrity = integrity;
810
+ }
811
+ if (externalReferences.length) {
812
+ pkgObj.externalReferences = externalReferences;
813
+ }
814
+ // v5 npm entries have no dependencies; initialise an empty edge set so
815
+ // the dependency graph still references every component.
816
+ pkgObjectsByKey.set(entryKey, pkgObj);
817
+ if (!edgesByBomRef.has(bomRef)) {
818
+ edgesByBomRef.set(bomRef, new Set());
819
+ }
820
+ }
821
+
822
+ // v2/v3/v4-style nested packages with explicit dependency maps.
823
+ for (const [entryKey, entry] of Object.entries(npmNested)) {
824
+ if (entryKey === "specifiers") {
825
+ continue;
826
+ }
827
+ const { group, name, version } = parseScopedDescriptor(entryKey);
828
+ if (!name || !version) {
829
+ continue;
830
+ }
831
+ const purlString = build({
832
+ type: "npm",
833
+ namespace: group || null,
834
+ name: name,
835
+ version: version || null,
836
+ });
837
+ const bomRef = decodeURIComponent(purlString);
838
+ keyToBomRef.set(entryKey, bomRef);
839
+ const integrity = toNpmIntegrity(entry?.integrity);
840
+ const resolvedUrl = buildNpmRegistryTarballUrl(
841
+ defaultRegistry,
842
+ group,
843
+ name,
844
+ version,
845
+ );
846
+ const properties = [
847
+ { name: "internal:SrcFile", value: lockFile },
848
+ { name: "cdx:deno:source", value: "npm" },
849
+ ];
850
+ const externalReferences = [];
851
+ if (resolvedUrl) {
852
+ properties.push({ name: "internal:ResolvedUrl", value: resolvedUrl });
853
+ externalReferences.push({ type: "distribution", url: resolvedUrl });
854
+ }
855
+ const pkgObj = {
856
+ group: group || "",
857
+ name,
858
+ version,
859
+ purl: purlString,
860
+ "bom-ref": bomRef,
861
+ properties,
862
+ evidence: {
863
+ identity: {
864
+ field: "purl",
865
+ confidence: 1,
866
+ methods: [
867
+ {
868
+ technique: "manifest-analysis",
869
+ confidence: 1,
870
+ value: lockFile,
871
+ },
872
+ ],
873
+ },
874
+ },
875
+ };
876
+ if (integrity) {
877
+ pkgObj._integrity = integrity;
878
+ }
879
+ if (externalReferences.length) {
880
+ pkgObj.externalReferences = externalReferences;
881
+ }
882
+ pkgObjectsByKey.set(entryKey, pkgObj);
883
+ if (!edgesByBomRef.has(bomRef)) {
884
+ edgesByBomRef.set(bomRef, new Set());
885
+ }
886
+ }
887
+ // Wire up nested npm -> npm edges using the `name@version` references.
888
+ for (const [entryKey, entry] of Object.entries(npmNested)) {
889
+ const fromRef = keyToBomRef.get(entryKey);
890
+ if (!fromRef || !entry?.dependencies) {
891
+ continue;
892
+ }
893
+ for (const depName of Object.keys(entry.dependencies)) {
894
+ const depTarget = entry.dependencies[depName];
895
+ // v2 maps each dependency name to a canonical `name@version` key.
896
+ const toRef = keyToBomRef.get(depTarget) || keyToBomRef.get(depName);
897
+ if (toRef) {
898
+ rememberEdge(fromRef, toRef);
899
+ }
900
+ }
901
+ }
902
+
903
+ // ---- remote (https://) imports ---------------------------------------
904
+ // Keyed by full URL; value is an integrity hash. Represented as
905
+ // `pkg:generic` with a download_url external reference.
906
+ const remoteMap = lockData.remote || {};
907
+ for (const [url, integrity] of Object.entries(remoteMap)) {
908
+ if (!url) {
909
+ continue;
910
+ }
911
+ let remoteName;
912
+ try {
913
+ remoteName = basename(new URL(url).pathname) || "remote";
914
+ } catch {
915
+ remoteName = "remote";
916
+ }
917
+ // Strip any query fragment from the stored name; the URL itself is kept
918
+ // whole only in the external reference (no userinfo is expected here).
919
+ const cleanName = remoteName.split("?")[0].split("#")[0] || "remote";
920
+ const integritySafe =
921
+ typeof integrity === "string" ? integrity : `${integrity}`;
922
+ const shortHash = integritySafe.slice(0, 12);
923
+ const qualifiers = { download_url: url };
924
+ const purlString = build({
925
+ type: "generic",
926
+ name: cleanName,
927
+ version: shortHash || null,
928
+ qualifiers: qualifiers || null,
929
+ });
930
+ const bomRef = decodeURIComponent(purlString);
931
+ // Only add each remote URL once (a bom-ref collision means we already did).
932
+ if (keyToBomRef.has(`remote:${url}`)) {
933
+ continue;
934
+ }
935
+ keyToBomRef.set(`remote:${url}`, bomRef);
936
+ const properties = [
937
+ { name: "internal:SrcFile", value: lockFile },
938
+ { name: "cdx:deno:source", value: "https" },
939
+ ];
940
+ const pkgObj = {
941
+ name: cleanName,
942
+ version: shortHash,
943
+ purl: purlString,
944
+ "bom-ref": bomRef,
945
+ externalReferences: [{ type: "distribution", url }],
946
+ properties,
947
+ evidence: {
948
+ identity: {
949
+ field: "purl",
950
+ confidence: 0.7,
951
+ methods: [
952
+ {
953
+ technique: "manifest-analysis",
954
+ confidence: 0.7,
955
+ value: lockFile,
956
+ },
957
+ ],
958
+ },
959
+ },
960
+ };
961
+ pkgObjectsByKey.set(`remote:${url}`, pkgObj);
962
+ if (!edgesByBomRef.has(bomRef)) {
963
+ edgesByBomRef.set(bomRef, new Set());
964
+ }
965
+ }
966
+
967
+ // ---- root dependencies (workspace) -----------------------------------
968
+ // The workspace.dependencies array (v5) or npm.specifiers / npm-flat-specs
969
+ // lists the packages the project directly imports. Link the parent component
970
+ // to these so the root of the dependency graph is meaningful.
971
+ const workspaceDeps = lockData.workspace?.dependencies;
972
+ if (Array.isArray(workspaceDeps)) {
973
+ for (const depRef of workspaceDeps) {
974
+ const ref = resolveRootDep(depRef, specifiers, keyToBomRef);
975
+ if (ref) {
976
+ rootRefs.add(ref);
977
+ }
978
+ }
979
+ } else {
980
+ // Fall back to the specifiers maps for lockfiles without an explicit
981
+ // workspace block.
982
+ // v5 top-level specifiers: keys are `jsr:`/`npm:` requirements, values are
983
+ // the pinned version. v2 `npm.specifiers`: keys are `name@range`, values
984
+ // are the canonical `name@version` package key used in `npm.packages`.
985
+ for (const [req, resolved] of Object.entries(specifiers)) {
986
+ if (req.startsWith("jsr:")) {
987
+ const ref = resolveJsrRef(req, specifiers);
988
+ if (ref) {
989
+ rootRefs.add(ref);
990
+ }
991
+ } else if (req.startsWith("npm:")) {
992
+ const { group, name } = parseScopedDescriptor(req.slice(4));
993
+ const ref = keyToBomRef.get(
994
+ `${group ? `${group}/` : ""}${name}@${resolved}`,
995
+ );
996
+ if (ref) {
997
+ rootRefs.add(ref);
998
+ }
999
+ }
1000
+ }
1001
+ const npmSpecifiers = npmFlat?.specifiers || {};
1002
+ for (const resolved of Object.values(npmSpecifiers)) {
1003
+ // v2 specifier values are already the package key (e.g.
1004
+ // `@cdxgen/cdxgen@9.0.1`).
1005
+ const ref = keyToBomRef.get(resolved);
1006
+ if (ref) {
1007
+ rootRefs.add(ref);
1008
+ }
1009
+ }
1010
+ }
1011
+ // ---- emit -------------------------------------------------------------
1012
+ pkgList = [...pkgObjectsByKey.values()];
1013
+ for (const [ref, deps] of edgesByBomRef) {
1014
+ dependenciesList.push({ ref, dependsOn: [...deps].sort() });
1015
+ }
1016
+
1017
+ // Parent component -> direct dependencies. Mirror the bun emitter by
1018
+ // appending an entry for the parent so the application root is wired into
1019
+ // the dependency graph.
1020
+ const parentRef = options.parentComponent?.["bom-ref"];
1021
+ if (parentRef) {
1022
+ dependenciesList.push({
1023
+ ref: parentRef,
1024
+ dependsOn: [...rootRefs].sort(),
1025
+ });
1026
+ }
1027
+
1028
+ // Offline enrichment first: mine license/description/repository from a
1029
+ // project's node_modules and the global deno npm cache. This needs no
1030
+ // network and runs even without --fetch-license.
1031
+ mineInstalledMetadata(
1032
+ pkgList,
1033
+ options.projectRoot || dirname(lockFile),
1034
+ JSR_NPM_REGISTRY_HOST,
1035
+ );
1036
+
1037
+ if (
1038
+ shouldFetchLicense() ||
1039
+ shouldFetchVCS() ||
1040
+ readEnvironmentVariable("FETCH_LICENSE") === "true"
1041
+ ) {
1042
+ if (DEBUG_MODE) {
1043
+ console.log(
1044
+ `About to fetch registry metadata for ${pkgList.length} packages in parseDenoLock`,
1045
+ );
1046
+ }
1047
+ // getNpmMetadata mutates each component in place, so the split lists share
1048
+ // the same objects as pkgList. jsr packages live on jsr's npm mirror
1049
+ // (npm.jsr.io), NOT registry.npmjs.org, so they must be resolved against a
1050
+ // different registry or every lookup 404s.
1051
+ const jsrPkgs = pkgList.filter((p) => p.group === JSR_NPM_SCOPE);
1052
+ const npmPkgs = pkgList.filter((p) => p.group !== JSR_NPM_SCOPE);
1053
+ if (npmPkgs.length) {
1054
+ await getNpmMetadata(npmPkgs, defaultRegistry);
1055
+ }
1056
+ if (jsrPkgs.length) {
1057
+ // The npm mirror provides the description + resolved tarball
1058
+ // (distribution externalReference) but no license; jsr's own API is the
1059
+ // authoritative source for the license, so query it afterwards.
1060
+ await getNpmMetadata(jsrPkgs, JSR_NPM_REGISTRY);
1061
+ await getJsrMetadata(jsrPkgs);
1062
+ }
1063
+ }
1064
+ return { pkgList, dependenciesList };
1065
+ }
1066
+
1067
+ /**
1068
+ * Resolve a top-level workspace dependency reference from a v5 lockfile to a
1069
+ * concrete bom-ref.
1070
+ *
1071
+ * @param {string} depRef Reference such as `jsr:@std/assert@1` or
1072
+ * `npm:chalk@^5.3.0`.
1073
+ * @param {Object} specifiers The v5 `specifiers` map (req -> pinned version).
1074
+ * @param {Map<string, string>} keyToBomRef Concrete-key -> bom-ref lookup.
1075
+ * @returns {string|undefined} Resolved bom-ref.
1076
+ */
1077
+ function resolveRootDep(depRef, specifiers, keyToBomRef) {
1078
+ if (!depRef) {
1079
+ return undefined;
1080
+ }
1081
+ const pinned = specifiers?.[depRef];
1082
+ if (depRef.startsWith("jsr:")) {
1083
+ const { group, name } = parseScopedDescriptor(depRef.slice(4));
1084
+ if (pinned) {
1085
+ return keyToBomRef.get(`${group ? `${group}/` : ""}${name}@${pinned}`);
1086
+ }
1087
+ } else if (depRef.startsWith("npm:")) {
1088
+ const { group, name } = parseScopedDescriptor(depRef.slice(4));
1089
+ if (pinned) {
1090
+ return keyToBomRef.get(`${group ? `${group}/` : ""}${name}@${pinned}`);
1091
+ }
1092
+ }
1093
+ return undefined;
1094
+ }