@cdxgen/cdxgen 13.3.0 → 13.5.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 (372) hide show
  1. package/README.md +12 -9
  2. package/bin/cdxgen-secure.js +15 -0
  3. package/bin/cdxgen.js +115 -31
  4. package/bin/evinse.js +23 -1
  5. package/bin/hbom.js +15 -7
  6. package/bin/repl.js +115 -0
  7. package/bin/sign.js +45 -15
  8. package/bin/tracebom.js +5 -1
  9. package/bin/validate.js +84 -18
  10. package/bin/verify.js +155 -86
  11. package/data/cbomosdb-queries.json +13 -1
  12. package/data/component-tags.json +8 -0
  13. package/data/helpers/init.gradle +46 -21
  14. package/data/queries-darwin.json +25 -1
  15. package/data/queries-win.json +19 -1
  16. package/data/queries.json +41 -0
  17. package/data/remediations.json +344 -1
  18. package/data/rules/cbom-security.yaml +235 -4
  19. package/data/rules/dependency-sources.yaml +67 -0
  20. package/data/rules/go-binaries.yaml +46 -0
  21. package/data/rules/golem-go.yaml +80 -0
  22. package/data/rules/hbom-compliance.yaml +40 -22
  23. package/data/rules/hbom-performance.yaml +7 -1
  24. package/data/rules/host-topology.yaml +1 -1
  25. package/data/rules/obom-runtime.yaml +31 -2
  26. package/data/rules/php-runtime.yaml +143 -0
  27. package/data/rules/scala-evidence.yaml +115 -0
  28. package/lib/audit/index.js +52 -6
  29. package/lib/cli/bomAssembly.js +28 -3
  30. package/lib/cli/cliOptions.js +110 -3
  31. package/lib/cli/index.js +186 -58
  32. package/lib/cli/jsBom.js +50 -29
  33. package/lib/cli/jvmBom.js +779 -146
  34. package/lib/cli/managedBom.js +1021 -261
  35. package/lib/cli/nativeBom.js +364 -58
  36. package/lib/core/activity.js +12 -0
  37. package/lib/core/env.js +47 -17
  38. package/lib/core/fs.js +31 -21
  39. package/lib/core/httpClient.js +233 -69
  40. package/lib/core/pluginRun.js +184 -0
  41. package/lib/core/processTree.js +100 -0
  42. package/lib/core/projectConfig.js +1 -0
  43. package/lib/core/projectTooling.js +97 -0
  44. package/lib/core/propertySanitizer.js +72 -0
  45. package/lib/core/runState.js +39 -0
  46. package/lib/core/toml.js +72 -0
  47. package/lib/ecosystems/asarutils.js +4 -2
  48. package/lib/ecosystems/bunutils.js +5 -7
  49. package/lib/ecosystems/cargoCache.js +231 -8
  50. package/lib/ecosystems/cmakeResolver.js +10 -21
  51. package/lib/ecosystems/cppBuildContext.js +631 -0
  52. package/lib/ecosystems/cppEvidence.js +337 -22
  53. package/lib/ecosystems/cppIncludeResolver.js +294 -0
  54. package/lib/ecosystems/denoutils.js +93 -66
  55. package/lib/ecosystems/ecosystems.js +1967 -788
  56. package/lib/ecosystems/golem.js +578 -18
  57. package/lib/ecosystems/gradleutils.js +340 -46
  58. package/lib/ecosystems/jsEvidence.js +85 -24
  59. package/lib/ecosystems/kosi.js +21 -4
  60. package/lib/ecosystems/npmutils.js +64 -0
  61. package/lib/ecosystems/parsers-dotnet.js +668 -153
  62. package/lib/ecosystems/parsers-elm.js +46 -28
  63. package/lib/ecosystems/parsers-gleam.js +3 -4
  64. package/lib/ecosystems/parsers-go.js +1283 -297
  65. package/lib/ecosystems/parsers-js.js +92 -26
  66. package/lib/ecosystems/parsers-julia.js +2 -3
  67. package/lib/ecosystems/parsers-jvm.js +463 -29
  68. package/lib/ecosystems/parsers-misc.js +405 -93
  69. package/lib/ecosystems/parsers-python.js +152 -20
  70. package/lib/ecosystems/parsers-rust.js +4 -4
  71. package/lib/ecosystems/parsers-terraform.js +1573 -19
  72. package/lib/ecosystems/pythonutils.js +102 -6
  73. package/lib/ecosystems/remote/huggingface.js +3 -0
  74. package/lib/ecosystems/rubyutils.js +73 -20
  75. package/lib/ecosystems/rusi.js +32 -9
  76. package/lib/ecosystems/sbtutils.js +243 -187
  77. package/lib/ecosystems/scalacliutils.js +343 -0
  78. package/lib/ecosystems/scalasem.js +2620 -0
  79. package/lib/ecosystems/terraformRegistry.js +288 -0
  80. package/lib/ecosystems/utils.js +2 -0
  81. package/lib/ecosystems/vendoredCode.js +156 -0
  82. package/lib/evinser/evinser.js +695 -78
  83. package/lib/evinser/swiftsem.js +68 -5
  84. package/lib/helpers/agenticToolutils.js +2 -2
  85. package/lib/helpers/bomSigner.js +576 -128
  86. package/lib/inventory/agentSkillSpec.js +17 -0
  87. package/lib/inventory/aiCollector.js +4 -1
  88. package/lib/inventory/analyzer.js +110 -127
  89. package/lib/inventory/apkInstalledDb.js +243 -0
  90. package/lib/inventory/atomUtils.js +204 -48
  91. package/lib/inventory/auditCategories.js +10 -3
  92. package/lib/inventory/buildToolRateLimit.js +144 -0
  93. package/lib/inventory/cacheCommands.js +2 -1
  94. package/lib/inventory/cacheDir.js +52 -9
  95. package/lib/inventory/certificates.js +2371 -0
  96. package/lib/inventory/cmakeBuildDirs.js +254 -0
  97. package/lib/inventory/communityAiConfigParser.js +4 -9
  98. package/lib/inventory/deps.js +507 -128
  99. package/lib/inventory/display.js +200 -3
  100. package/lib/inventory/dosai.js +747 -101
  101. package/lib/inventory/dosaiParsers.js +310 -15
  102. package/lib/inventory/dynamic.js +96 -8
  103. package/lib/inventory/envcontext.js +168 -5
  104. package/lib/inventory/evidenceUtils.js +590 -132
  105. package/lib/inventory/fetchBatch.js +574 -38
  106. package/lib/inventory/fetchDiskCache.js +597 -0
  107. package/lib/inventory/forgeEnricher.js +14 -5
  108. package/lib/inventory/formulationParsers.js +3 -2
  109. package/lib/inventory/goBuildInfo.js +140 -0
  110. package/lib/inventory/hbom.js +67 -7
  111. package/lib/inventory/hbomAnalysis.js +16 -0
  112. package/lib/inventory/hostTopology.js +21 -0
  113. package/lib/inventory/jvmLocalRepos.js +917 -0
  114. package/lib/inventory/mcpConfigParser.js +2 -3
  115. package/lib/inventory/osPackagePurl.js +244 -0
  116. package/lib/inventory/osPackageResolver.js +89 -87
  117. package/lib/inventory/osinfo.js +79 -31
  118. package/lib/inventory/osqueryTransform.js +114 -5
  119. package/lib/inventory/parentSelection.js +146 -0
  120. package/lib/inventory/phpBuildInfo.js +487 -0
  121. package/lib/inventory/phpHostProbe.js +641 -0
  122. package/lib/inventory/rootfsCerts.js +426 -0
  123. package/lib/inventory/rustFormulationParser.js +3 -4
  124. package/lib/inventory/scalaCoords.js +153 -0
  125. package/lib/inventory/source.js +215 -11
  126. package/lib/inventory/spdx.js +245 -0
  127. package/lib/inventory/traceRunner.js +93 -8
  128. package/lib/inventory/tracedCrypto.js +423 -0
  129. package/lib/managers/binary.js +529 -183
  130. package/lib/managers/docker.js +199 -44
  131. package/lib/managers/oci.js +24 -2
  132. package/lib/parsers/cmakeCache.js +69 -0
  133. package/lib/parsers/cmakeLists.js +16 -2
  134. package/lib/parsers/cmakePresets.js +400 -0
  135. package/lib/parsers/compileCommands.js +557 -0
  136. package/lib/parsers/email.js +277 -0
  137. package/lib/parsers/largeJson.js +34 -2
  138. package/lib/parsers/strictJson.js +322 -0
  139. package/lib/parsers/terraformConfig.js +1073 -0
  140. package/lib/parsers/terraformSource.js +652 -0
  141. package/lib/server/server.js +209 -1
  142. package/lib/stages/postgen/annotator.js +17 -1
  143. package/lib/stages/postgen/introspection/markers.js +1 -1
  144. package/lib/stages/postgen/introspection/reflect.js +4 -1
  145. package/lib/stages/postgen/postgen.js +20 -6
  146. package/lib/stages/postgen/ruleEngine.js +58 -1
  147. package/lib/stages/postgen/specVersionCompat.js +62 -0
  148. package/lib/stages/pregen/pregen.js +117 -5
  149. package/lib/validator/bomValidator.js +26 -5
  150. package/lib/validator/generated/runtime.mjs +13 -0
  151. package/lib/validator/generated/validate-1.6.mjs +26 -7
  152. package/lib/validator/generated/validate-1.7.mjs +31 -12
  153. package/lib/validator/generated/validate-2.0.mjs +30 -11
  154. package/lib/validator/index.js +25 -10
  155. package/lib/validator/reporters/json.js +1 -0
  156. package/package.json +23 -23
  157. package/types/bin/cdxgen-secure.d.ts +3 -0
  158. package/types/bin/cdxgen-secure.d.ts.map +1 -0
  159. package/types/bin/repl.d.ts.map +1 -1
  160. package/types/lib/audit/index.d.ts.map +1 -1
  161. package/types/lib/cli/bomAssembly.d.ts +9 -2
  162. package/types/lib/cli/bomAssembly.d.ts.map +1 -1
  163. package/types/lib/cli/cliOptions.d.ts +43 -0
  164. package/types/lib/cli/cliOptions.d.ts.map +1 -1
  165. package/types/lib/cli/index.d.ts.map +1 -1
  166. package/types/lib/cli/jsBom.d.ts.map +1 -1
  167. package/types/lib/cli/jvmBom.d.ts +44 -1
  168. package/types/lib/cli/jvmBom.d.ts.map +1 -1
  169. package/types/lib/cli/managedBom.d.ts +7 -4
  170. package/types/lib/cli/managedBom.d.ts.map +1 -1
  171. package/types/lib/cli/nativeBom.d.ts +3 -1
  172. package/types/lib/cli/nativeBom.d.ts.map +1 -1
  173. package/types/lib/core/activity.d.ts.map +1 -1
  174. package/types/lib/core/env.d.ts +27 -2
  175. package/types/lib/core/env.d.ts.map +1 -1
  176. package/types/lib/core/fs.d.ts.map +1 -1
  177. package/types/lib/core/httpClient.d.ts +13 -8
  178. package/types/lib/core/httpClient.d.ts.map +1 -1
  179. package/types/lib/core/pluginRun.d.ts +97 -0
  180. package/types/lib/core/pluginRun.d.ts.map +1 -0
  181. package/types/lib/core/processTree.d.ts +36 -0
  182. package/types/lib/core/processTree.d.ts.map +1 -0
  183. package/types/lib/core/projectConfig.d.ts.map +1 -1
  184. package/types/lib/core/projectTooling.d.ts +41 -0
  185. package/types/lib/core/projectTooling.d.ts.map +1 -0
  186. package/types/lib/core/propertySanitizer.d.ts +26 -0
  187. package/types/lib/core/propertySanitizer.d.ts.map +1 -1
  188. package/types/lib/core/runState.d.ts +29 -0
  189. package/types/lib/core/runState.d.ts.map +1 -0
  190. package/types/lib/core/toml.d.ts +20 -0
  191. package/types/lib/core/toml.d.ts.map +1 -0
  192. package/types/lib/ecosystems/asarutils.d.ts.map +1 -1
  193. package/types/lib/ecosystems/bunutils.d.ts.map +1 -1
  194. package/types/lib/ecosystems/cargoCache.d.ts +12 -0
  195. package/types/lib/ecosystems/cargoCache.d.ts.map +1 -1
  196. package/types/lib/ecosystems/cmakeResolver.d.ts +5 -3
  197. package/types/lib/ecosystems/cmakeResolver.d.ts.map +1 -1
  198. package/types/lib/ecosystems/cppBuildContext.d.ts +55 -0
  199. package/types/lib/ecosystems/cppBuildContext.d.ts.map +1 -0
  200. package/types/lib/ecosystems/cppEvidence.d.ts +19 -3
  201. package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -1
  202. package/types/lib/ecosystems/cppIncludeResolver.d.ts +92 -0
  203. package/types/lib/ecosystems/cppIncludeResolver.d.ts.map +1 -0
  204. package/types/lib/ecosystems/denoutils.d.ts +9 -3
  205. package/types/lib/ecosystems/denoutils.d.ts.map +1 -1
  206. package/types/lib/ecosystems/ecosystems.d.ts +62 -13
  207. package/types/lib/ecosystems/ecosystems.d.ts.map +1 -1
  208. package/types/lib/ecosystems/golem.d.ts +81 -1
  209. package/types/lib/ecosystems/golem.d.ts.map +1 -1
  210. package/types/lib/ecosystems/gradleutils.d.ts +59 -7
  211. package/types/lib/ecosystems/gradleutils.d.ts.map +1 -1
  212. package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -1
  213. package/types/lib/ecosystems/kosi.d.ts.map +1 -1
  214. package/types/lib/ecosystems/npmutils.d.ts +15 -0
  215. package/types/lib/ecosystems/npmutils.d.ts.map +1 -1
  216. package/types/lib/ecosystems/parsers-dotnet.d.ts +155 -5
  217. package/types/lib/ecosystems/parsers-dotnet.d.ts.map +1 -1
  218. package/types/lib/ecosystems/parsers-elm.d.ts.map +1 -1
  219. package/types/lib/ecosystems/parsers-gleam.d.ts.map +1 -1
  220. package/types/lib/ecosystems/parsers-go.d.ts +119 -5
  221. package/types/lib/ecosystems/parsers-go.d.ts.map +1 -1
  222. package/types/lib/ecosystems/parsers-js.d.ts +6 -1
  223. package/types/lib/ecosystems/parsers-js.d.ts.map +1 -1
  224. package/types/lib/ecosystems/parsers-julia.d.ts.map +1 -1
  225. package/types/lib/ecosystems/parsers-jvm.d.ts +74 -3
  226. package/types/lib/ecosystems/parsers-jvm.d.ts.map +1 -1
  227. package/types/lib/ecosystems/parsers-misc.d.ts +21 -59
  228. package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -1
  229. package/types/lib/ecosystems/parsers-python.d.ts +57 -6
  230. package/types/lib/ecosystems/parsers-python.d.ts.map +1 -1
  231. package/types/lib/ecosystems/parsers-terraform.d.ts +38 -21
  232. package/types/lib/ecosystems/parsers-terraform.d.ts.map +1 -1
  233. package/types/lib/ecosystems/pythonutils.d.ts +26 -1
  234. package/types/lib/ecosystems/pythonutils.d.ts.map +1 -1
  235. package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -1
  236. package/types/lib/ecosystems/rubyutils.d.ts +21 -1
  237. package/types/lib/ecosystems/rubyutils.d.ts.map +1 -1
  238. package/types/lib/ecosystems/rusi.d.ts.map +1 -1
  239. package/types/lib/ecosystems/sbtutils.d.ts +88 -2
  240. package/types/lib/ecosystems/sbtutils.d.ts.map +1 -1
  241. package/types/lib/ecosystems/scalacliutils.d.ts +56 -0
  242. package/types/lib/ecosystems/scalacliutils.d.ts.map +1 -0
  243. package/types/lib/ecosystems/scalasem.d.ts +311 -0
  244. package/types/lib/ecosystems/scalasem.d.ts.map +1 -0
  245. package/types/lib/ecosystems/terraformRegistry.d.ts +9 -0
  246. package/types/lib/ecosystems/terraformRegistry.d.ts.map +1 -0
  247. package/types/lib/ecosystems/utils.d.ts +2 -2
  248. package/types/lib/ecosystems/utils.d.ts.map +1 -1
  249. package/types/lib/ecosystems/vendoredCode.d.ts +32 -0
  250. package/types/lib/ecosystems/vendoredCode.d.ts.map +1 -0
  251. package/types/lib/evinser/evinser.d.ts +100 -8
  252. package/types/lib/evinser/evinser.d.ts.map +1 -1
  253. package/types/lib/evinser/swiftsem.d.ts +10 -0
  254. package/types/lib/evinser/swiftsem.d.ts.map +1 -1
  255. package/types/lib/helpers/bomSigner.d.ts +80 -4
  256. package/types/lib/helpers/bomSigner.d.ts.map +1 -1
  257. package/types/lib/inventory/agentSkillSpec.d.ts +13 -0
  258. package/types/lib/inventory/agentSkillSpec.d.ts.map +1 -0
  259. package/types/lib/inventory/aiCollector.d.ts.map +1 -1
  260. package/types/lib/inventory/analyzer.d.ts.map +1 -1
  261. package/types/lib/inventory/apkInstalledDb.d.ts +42 -0
  262. package/types/lib/inventory/apkInstalledDb.d.ts.map +1 -0
  263. package/types/lib/inventory/atomUtils.d.ts +96 -10
  264. package/types/lib/inventory/atomUtils.d.ts.map +1 -1
  265. package/types/lib/inventory/auditCategories.d.ts +3 -0
  266. package/types/lib/inventory/auditCategories.d.ts.map +1 -1
  267. package/types/lib/inventory/buildToolRateLimit.d.ts +38 -0
  268. package/types/lib/inventory/buildToolRateLimit.d.ts.map +1 -0
  269. package/types/lib/inventory/cacheCommands.d.ts +2 -1
  270. package/types/lib/inventory/cacheCommands.d.ts.map +1 -1
  271. package/types/lib/inventory/cacheDir.d.ts +12 -4
  272. package/types/lib/inventory/cacheDir.d.ts.map +1 -1
  273. package/types/lib/inventory/certificates.d.ts +205 -0
  274. package/types/lib/inventory/certificates.d.ts.map +1 -0
  275. package/types/lib/inventory/cmakeBuildDirs.d.ts +58 -0
  276. package/types/lib/inventory/cmakeBuildDirs.d.ts.map +1 -0
  277. package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -1
  278. package/types/lib/inventory/deps.d.ts +61 -2
  279. package/types/lib/inventory/deps.d.ts.map +1 -1
  280. package/types/lib/inventory/display.d.ts +18 -0
  281. package/types/lib/inventory/display.d.ts.map +1 -1
  282. package/types/lib/inventory/dosai.d.ts +202 -14
  283. package/types/lib/inventory/dosai.d.ts.map +1 -1
  284. package/types/lib/inventory/dosaiParsers.d.ts +53 -7
  285. package/types/lib/inventory/dosaiParsers.d.ts.map +1 -1
  286. package/types/lib/inventory/dynamic.d.ts +16 -1
  287. package/types/lib/inventory/dynamic.d.ts.map +1 -1
  288. package/types/lib/inventory/envcontext.d.ts +40 -2
  289. package/types/lib/inventory/envcontext.d.ts.map +1 -1
  290. package/types/lib/inventory/evidenceUtils.d.ts +48 -14
  291. package/types/lib/inventory/evidenceUtils.d.ts.map +1 -1
  292. package/types/lib/inventory/fetchBatch.d.ts +83 -14
  293. package/types/lib/inventory/fetchBatch.d.ts.map +1 -1
  294. package/types/lib/inventory/fetchDiskCache.d.ts +169 -0
  295. package/types/lib/inventory/fetchDiskCache.d.ts.map +1 -0
  296. package/types/lib/inventory/forgeEnricher.d.ts.map +1 -1
  297. package/types/lib/inventory/formulationParsers.d.ts.map +1 -1
  298. package/types/lib/inventory/goBuildInfo.d.ts +10 -0
  299. package/types/lib/inventory/goBuildInfo.d.ts.map +1 -0
  300. package/types/lib/inventory/hbom.d.ts.map +1 -1
  301. package/types/lib/inventory/hbomAnalysis.d.ts +10 -0
  302. package/types/lib/inventory/hbomAnalysis.d.ts.map +1 -1
  303. package/types/lib/inventory/hostTopology.d.ts.map +1 -1
  304. package/types/lib/inventory/jvmLocalRepos.d.ts +178 -0
  305. package/types/lib/inventory/jvmLocalRepos.d.ts.map +1 -0
  306. package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -1
  307. package/types/lib/inventory/osPackagePurl.d.ts +99 -0
  308. package/types/lib/inventory/osPackagePurl.d.ts.map +1 -0
  309. package/types/lib/inventory/osPackageResolver.d.ts +6 -2
  310. package/types/lib/inventory/osPackageResolver.d.ts.map +1 -1
  311. package/types/lib/inventory/osinfo.d.ts +31 -6
  312. package/types/lib/inventory/osinfo.d.ts.map +1 -1
  313. package/types/lib/inventory/osqueryTransform.d.ts +51 -0
  314. package/types/lib/inventory/osqueryTransform.d.ts.map +1 -1
  315. package/types/lib/inventory/parentSelection.d.ts +34 -0
  316. package/types/lib/inventory/parentSelection.d.ts.map +1 -0
  317. package/types/lib/inventory/phpBuildInfo.d.ts +142 -0
  318. package/types/lib/inventory/phpBuildInfo.d.ts.map +1 -0
  319. package/types/lib/inventory/phpHostProbe.d.ts +35 -0
  320. package/types/lib/inventory/phpHostProbe.d.ts.map +1 -0
  321. package/types/lib/inventory/rootfsCerts.d.ts +27 -0
  322. package/types/lib/inventory/rootfsCerts.d.ts.map +1 -0
  323. package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -1
  324. package/types/lib/inventory/scalaCoords.d.ts +80 -0
  325. package/types/lib/inventory/scalaCoords.d.ts.map +1 -0
  326. package/types/lib/inventory/source.d.ts +28 -0
  327. package/types/lib/inventory/source.d.ts.map +1 -1
  328. package/types/lib/inventory/spdx.d.ts +24 -0
  329. package/types/lib/inventory/spdx.d.ts.map +1 -1
  330. package/types/lib/inventory/traceRunner.d.ts +16 -1
  331. package/types/lib/inventory/traceRunner.d.ts.map +1 -1
  332. package/types/lib/inventory/tracedCrypto.d.ts +64 -0
  333. package/types/lib/inventory/tracedCrypto.d.ts.map +1 -0
  334. package/types/lib/managers/binary.d.ts +10 -0
  335. package/types/lib/managers/binary.d.ts.map +1 -1
  336. package/types/lib/managers/docker.d.ts +12 -0
  337. package/types/lib/managers/docker.d.ts.map +1 -1
  338. package/types/lib/managers/oci.d.ts +3 -1
  339. package/types/lib/managers/oci.d.ts.map +1 -1
  340. package/types/lib/parsers/cmakeCache.d.ts +16 -0
  341. package/types/lib/parsers/cmakeCache.d.ts.map +1 -1
  342. package/types/lib/parsers/cmakeLists.d.ts +2 -1
  343. package/types/lib/parsers/cmakeLists.d.ts.map +1 -1
  344. package/types/lib/parsers/cmakePresets.d.ts +78 -0
  345. package/types/lib/parsers/cmakePresets.d.ts.map +1 -0
  346. package/types/lib/parsers/compileCommands.d.ts +115 -0
  347. package/types/lib/parsers/compileCommands.d.ts.map +1 -0
  348. package/types/lib/parsers/email.d.ts +19 -0
  349. package/types/lib/parsers/email.d.ts.map +1 -0
  350. package/types/lib/parsers/largeJson.d.ts +13 -0
  351. package/types/lib/parsers/largeJson.d.ts.map +1 -1
  352. package/types/lib/parsers/strictJson.d.ts +46 -0
  353. package/types/lib/parsers/strictJson.d.ts.map +1 -0
  354. package/types/lib/parsers/terraformConfig.d.ts +70 -0
  355. package/types/lib/parsers/terraformConfig.d.ts.map +1 -0
  356. package/types/lib/parsers/terraformSource.d.ts +66 -0
  357. package/types/lib/parsers/terraformSource.d.ts.map +1 -0
  358. package/types/lib/server/server.d.ts +8 -0
  359. package/types/lib/server/server.d.ts.map +1 -1
  360. package/types/lib/stages/postgen/annotator.d.ts.map +1 -1
  361. package/types/lib/stages/postgen/introspection/reflect.d.ts.map +1 -1
  362. package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
  363. package/types/lib/stages/postgen/ruleEngine.d.ts +7 -4
  364. package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -1
  365. package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -1
  366. package/types/lib/stages/pregen/pregen.d.ts +14 -1
  367. package/types/lib/stages/pregen/pregen.d.ts.map +1 -1
  368. package/types/lib/validator/bomValidator.d.ts.map +1 -1
  369. package/types/lib/validator/index.d.ts +8 -0
  370. package/types/lib/validator/index.d.ts.map +1 -1
  371. package/types/lib/validator/reporters/json.d.ts.map +1 -1
  372. package/lib/third-party/arborist/snapshots/calc-dep-flags.test.cjs +0 -462
@@ -0,0 +1,288 @@
1
+ import { DEBUG_MODE, readEnvironmentVariable } from "../core/activity.js";
2
+ import { sanitizeBomUrl } from "../core/propertySanitizer.js";
3
+ import {
4
+ gatedGet,
5
+ prefetchEnabled,
6
+ prefetchedResponse,
7
+ prefetchJson,
8
+ } from "../inventory/fetchBatch.js";
9
+ import { getRepoLicense, prefetchRepoLicenses } from "./ecosystems.js";
10
+
11
+ /**
12
+ * Opt-in remote enrichment for Terraform / OpenTofu components: licenses,
13
+ * repository URLs and registry flags.
14
+ *
15
+ * Callers gate this on `shouldFetchPackageMetadata()` (the same rule as the
16
+ * Elm collector), so an ordinary scan makes no requests at all. When it does
17
+ * run, only the two public registries are contacted — `registry.terraform.io`
18
+ * and `registry.opentofu.org` — never a private registry host, whose name
19
+ * alone can be confidential.
20
+ *
21
+ * The OpenTofu docs API is queried for both public hosts because it fronts
22
+ * the same namespace with per-version SPDX ids and a confidence score; the
23
+ * Terraform registry only contributes repository URLs, verification flags
24
+ * and tiers. GitHub's license API is the last resort and reports the default
25
+ * branch's license, not necessarily the license at the pinned tag.
26
+ */
27
+
28
+ const PUBLIC_REGISTRY_HOSTS = new Set([
29
+ "registry.terraform.io",
30
+ "registry.opentofu.org",
31
+ ]);
32
+ const MIN_LICENSE_CONFIDENCE = 0.8;
33
+ const GITHUB_TREE_URL = /^https:\/\/github\.com\/([^/]+)\/([^/]+)\/tree\/.+$/;
34
+ const GITHUB_REPO_URL = /^https:\/\/github\.com\/[^/]+\/[^/]+$/;
35
+
36
+ const property = (pkg, name) =>
37
+ (pkg.properties || []).find((prop) => prop.name === name)?.value;
38
+
39
+ const setProperty = (pkg, name, value) => {
40
+ (pkg.properties = pkg.properties || []).push({ name, value });
41
+ };
42
+
43
+ /**
44
+ * Registry address of a component, split into its parts.
45
+ *
46
+ * @param {object} pkg Component
47
+ * @returns {undefined|{ host: string, parts: string[] }} Address descriptor
48
+ */
49
+ function registryAddress(pkg) {
50
+ const address = property(pkg, "cdx:tf:address");
51
+ if (!address) {
52
+ return undefined;
53
+ }
54
+ const parts = address.split("/");
55
+ if (parts.length < 3 || parts.length > 4) {
56
+ return undefined;
57
+ }
58
+ return { host: parts[0], parts };
59
+ }
60
+
61
+ /**
62
+ * Enrich Terraform components in place. Never throws; a failed lookup leaves
63
+ * the component exactly as the offline pass produced it.
64
+ *
65
+ * @param {object[]} pkgList Components to enrich
66
+ * @returns {Promise<object[]>} The same package list
67
+ */
68
+ export async function getTerraformRegistryMetadata(pkgList) {
69
+ const components = pkgList || [];
70
+ // Only public-registry components with an exact version take part in the
71
+ // registry steps; the GitHub fallback below runs for the whole list.
72
+ const targets = components.filter(
73
+ (pkg) =>
74
+ pkg.version &&
75
+ PUBLIC_REGISTRY_HOSTS.has(registryAddress(pkg)?.host || ""),
76
+ );
77
+ const docsBase = (
78
+ readEnvironmentVariable("CDXGEN_TOFU_DOCS_URL") ||
79
+ "https://api.opentofu.org"
80
+ ).replace(/\/+$/u, "");
81
+ const tfBase = (
82
+ readEnvironmentVariable("CDXGEN_TF_REGISTRY_URL") ||
83
+ "https://registry.terraform.io"
84
+ ).replace(/\/+$/u, "");
85
+
86
+ const docsUrl = (pkg) => {
87
+ const { parts } = registryAddress(pkg);
88
+ const encoded = parts.map((segment) => encodeURIComponent(segment));
89
+ const version = encodeURIComponent(pkg.version);
90
+ if (property(pkg, "cdx:tf:kind") === "provider") {
91
+ // parts: host, namespace, type
92
+ return `${docsBase}/registry/docs/providers/${encoded[1]}/${encoded[2]}/v${version}/index.json`;
93
+ }
94
+ // parts: host, namespace, name, system
95
+ return `${docsBase}/registry/docs/modules/${encoded[1]}/${encoded[2]}/${encoded[3]}/v${version}/index.json`;
96
+ };
97
+ const registryUrl = (pkg) => {
98
+ const { parts } = registryAddress(pkg);
99
+ const encoded = parts.map((segment) => encodeURIComponent(segment));
100
+ const version = encodeURIComponent(pkg.version);
101
+ if (property(pkg, "cdx:tf:kind") === "provider") {
102
+ return `${tfBase}/v1/providers/${encoded[1]}/${encoded[2]}/${version}`;
103
+ }
104
+ return `${tfBase}/v1/modules/${encoded[1]}/${encoded[2]}/${encoded[3]}/${version}`;
105
+ };
106
+
107
+ // The OpenTofu docs API fronts both public registries; the Terraform
108
+ // registry API is asked only about its own components, so scanning an
109
+ // OpenTofu project never sends its module list to registry.terraform.io.
110
+ const onTerraformRegistry = (pkg) =>
111
+ registryAddress(pkg)?.host === "registry.terraform.io";
112
+ const urls = [
113
+ ...new Set(
114
+ targets.flatMap((pkg) =>
115
+ onTerraformRegistry(pkg)
116
+ ? [docsUrl(pkg), registryUrl(pkg)]
117
+ : [docsUrl(pkg)],
118
+ ),
119
+ ),
120
+ ];
121
+ const prefetched = await prefetchJson(
122
+ prefetchEnabled() ? urls.map((url) => ({ url })) : [],
123
+ );
124
+
125
+ for (const pkg of targets) {
126
+ // 1. OpenTofu docs API: per-version SPDX ids with confidence.
127
+ const docs = await fetchJson(docsUrl(pkg), prefetched);
128
+ if (docs) {
129
+ const entries = Array.isArray(docs.licenses)
130
+ ? docs.licenses
131
+ : Array.isArray(docs.license)
132
+ ? docs.license
133
+ : [];
134
+ const best = entries
135
+ .filter(
136
+ (entry) =>
137
+ entry &&
138
+ typeof entry.spdx === "string" &&
139
+ entry.spdx &&
140
+ typeof entry.confidence === "number" &&
141
+ entry.confidence >= MIN_LICENSE_CONFIDENCE,
142
+ )
143
+ .sort((a, b) => b.confidence - a.confidence)[0];
144
+ if (best && !pkg.license) {
145
+ pkg.license = best.spdx;
146
+ setProperty(pkg, "cdx:tf:licenseSource", "opentofu-registry");
147
+ }
148
+ const link = typeof docs.link === "string" ? docs.link : "";
149
+ if (registryAddress(pkg).host === "registry.opentofu.org") {
150
+ const tree = link.match(GITHUB_TREE_URL);
151
+ if (tree && !pkg.repository) {
152
+ pkg.repository = {
153
+ url: `https://github.com/${tree[1]}/${tree[2]}`,
154
+ };
155
+ }
156
+ }
157
+ }
158
+ // 2. Terraform registry: repository, verification, tier, deprecation.
159
+ if (!onTerraformRegistry(pkg)) {
160
+ continue;
161
+ }
162
+ const meta = await fetchJson(registryUrl(pkg), prefetched);
163
+ if (meta) {
164
+ applyRegistryMetadata(pkg, meta);
165
+ }
166
+ }
167
+
168
+ // 3. GitHub fallback for anything still without a license.
169
+ const githubUrls = [
170
+ ...new Set(
171
+ components
172
+ .filter((pkg) => !pkg.license)
173
+ .map((pkg) => githubRepositoryUrl(pkg))
174
+ .filter(Boolean),
175
+ ),
176
+ ];
177
+ if (githubUrls.length) {
178
+ await prefetchRepoLicenses(githubUrls);
179
+ for (const pkg of components.filter((pkg) => !pkg.license)) {
180
+ const url = githubRepositoryUrl(pkg);
181
+ if (!url) {
182
+ continue;
183
+ }
184
+ try {
185
+ const license = await getRepoLicense(url, undefined);
186
+ if (license?.id) {
187
+ pkg.license = license.id;
188
+ setProperty(pkg, "cdx:tf:licenseSource", "github");
189
+ }
190
+ } catch (err) {
191
+ if (DEBUG_MODE) {
192
+ console.log(
193
+ `Unable to read the GitHub license of ${url}: ${err.message}`,
194
+ );
195
+ }
196
+ }
197
+ }
198
+ }
199
+ return pkgList;
200
+ }
201
+
202
+ /**
203
+ * The GitHub repository URL of a component, if it has one.
204
+ *
205
+ * @param {object} pkg Component
206
+ * @returns {string|undefined}
207
+ */
208
+ function githubRepositoryUrl(pkg) {
209
+ const repository =
210
+ typeof pkg.repository?.url === "string" ? pkg.repository.url : undefined;
211
+ if (repository && GITHUB_REPO_URL.test(repository)) {
212
+ return repository;
213
+ }
214
+ // A git module's sanitized VCS URL, kept in its display source.
215
+ const source = property(pkg, "cdx:tf:module:source") || "";
216
+ if (source.startsWith("git::https://github.com/")) {
217
+ const url = source.slice("git::".length).replace(/\.git$/u, "");
218
+ if (GITHUB_REPO_URL.test(url)) {
219
+ return url;
220
+ }
221
+ }
222
+ return undefined;
223
+ }
224
+
225
+ /**
226
+ * Apply one Terraform registry document to a component.
227
+ *
228
+ * @param {object} pkg Component
229
+ * @param {object} meta Registry document
230
+ */
231
+ function applyRegistryMetadata(pkg, meta) {
232
+ if (
233
+ typeof meta.source === "string" &&
234
+ (meta.source.startsWith("http://") || meta.source.startsWith("https://")) &&
235
+ !pkg.repository
236
+ ) {
237
+ const sanitized = sanitizeBomUrl(meta.source);
238
+ if (sanitized) {
239
+ pkg.repository = { url: sanitized };
240
+ }
241
+ }
242
+ if (property(pkg, "cdx:tf:kind") === "module") {
243
+ if (typeof meta.verified === "boolean") {
244
+ setProperty(
245
+ pkg,
246
+ "cdx:tf:registry:verified",
247
+ meta.verified ? "true" : "false",
248
+ );
249
+ }
250
+ if (meta.deprecation !== null && meta.deprecation !== undefined) {
251
+ setProperty(pkg, "cdx:tf:deprecated", "true");
252
+ }
253
+ if (typeof meta.description === "string" && !pkg.description) {
254
+ pkg.description = meta.description.slice(0, 1024);
255
+ }
256
+ } else {
257
+ if (
258
+ meta.tier === "official" ||
259
+ meta.tier === "partner" ||
260
+ meta.tier === "community"
261
+ ) {
262
+ setProperty(pkg, "cdx:tf:registry:tier", meta.tier);
263
+ }
264
+ }
265
+ }
266
+
267
+ /**
268
+ * Read one registry document, preferring the batched prefetch. A document the
269
+ * batch did not answer is fetched through the host's gate, so a rate limited
270
+ * registry is not asked again and a definite miss is remembered for the scan.
271
+ *
272
+ * @param {string} url Document URL
273
+ * @param {Map} prefetched Batched results
274
+ * @returns {Promise<object|undefined>} Parsed document
275
+ */
276
+ async function fetchJson(url, prefetched) {
277
+ try {
278
+ const res =
279
+ prefetchedResponse(prefetched, url) ||
280
+ (await gatedGet(url, { responseType: "json" }));
281
+ return res?.body;
282
+ } catch (err) {
283
+ if (DEBUG_MODE) {
284
+ console.log(`Unable to fetch ${url}: ${err.message}`);
285
+ }
286
+ return undefined;
287
+ }
288
+ }
@@ -211,6 +211,7 @@ import {
211
211
  parseGoModWhy,
212
212
  parseGopkgData,
213
213
  parseGosumData,
214
+ parseGosumHashes,
214
215
  parseGoVersionData,
215
216
  } from "./parsers-go.js";
216
217
  import {
@@ -482,6 +483,7 @@ export {
482
483
  parseGoModWhy,
483
484
  parseGopkgData,
484
485
  parseGosumData,
486
+ parseGosumHashes,
485
487
  parseGoVersionData,
486
488
  parseHelmYamlData,
487
489
  parseJarManifest,
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Code a project carries inside its own tree under a license of its own: a
3
+ * copied library, an imported test suite. Such a directory holds its own
4
+ * license file, and the license differs from the project's.
5
+ *
6
+ * Layer 3: reads license files under the scan root.
7
+ */
8
+
9
+ import { readFileSync, statSync } from "node:fs";
10
+ import { basename, dirname, relative, resolve, sep } from "node:path";
11
+
12
+ import { getAllFiles } from "../core/fs.js";
13
+ import { isInsideDir } from "../inventory/cmakeBuildDirs.js";
14
+ import { tryBuildPurl } from "../inventory/purl.js";
15
+ import { guessLicenseId } from "../inventory/spdx.js";
16
+
17
+ /** A license file larger than this is not a license text. */
18
+ const MAX_LICENSE_FILE_BYTES = 256 * 1024;
19
+
20
+ /**
21
+ * Download caches that hold other projects' packages rather than code the
22
+ * project carries. `.terraform` and `.terragrunt-cache` are filled by
23
+ * `terraform init`/Terragrunt; their modules and providers are inventoried,
24
+ * with their licenses, by the Terraform collector, so reporting them again as
25
+ * vendored directories would only duplicate those components under a weaker
26
+ * identity. Listed explicitly because a multi-type scan may have widened the
27
+ * shared options (`includeNodeModulesDir`) to dot directories.
28
+ */
29
+ const DOWNLOAD_CACHE_EXCLUDES = ["**/.terraform/**", "**/.terragrunt-cache/**"];
30
+
31
+ /** Extensions a license file is written with. */
32
+ const LICENSE_EXTENSIONS = new Set(["", ".TXT", ".MD", ".RST", ".LIB"]);
33
+
34
+ /**
35
+ * Whether a file name is a license file: `LICENSE`, `LICENCE` or `COPYING`,
36
+ * bare, with a text extension, or with a suffix naming the license
37
+ * (`LICENSE-MIT`).
38
+ *
39
+ * @param {string} name File name
40
+ * @returns {boolean}
41
+ */
42
+ export function isLicenseFileName(name) {
43
+ const upper = `${name}`.toUpperCase();
44
+ for (const stem of ["LICENSE", "LICENCE", "COPYING"]) {
45
+ if (!upper.startsWith(stem)) {
46
+ continue;
47
+ }
48
+ const rest = upper.slice(stem.length);
49
+ if (LICENSE_EXTENSIONS.has(rest)) {
50
+ return true;
51
+ }
52
+ // LICENSE-MIT, LICENSE-APACHE-2.0, LICENSE-BSD.txt; not license-checker.js
53
+ if (/^-[A-Z0-9-]+(\.[0-9]+)*(\.(TXT|MD|RST))?$/.test(rest)) {
54
+ return true;
55
+ }
56
+ }
57
+ return false;
58
+ }
59
+
60
+ function licenseOf(file) {
61
+ try {
62
+ const stat = statSync(file);
63
+ if (!stat.isFile() || stat.size > MAX_LICENSE_FILE_BYTES) {
64
+ return undefined;
65
+ }
66
+ return guessLicenseId(readFileSync(file, "utf-8"));
67
+ } catch (_err) {
68
+ return undefined;
69
+ }
70
+ }
71
+
72
+ function licenseChoice(id) {
73
+ return id.includes(" ") ? { expression: id } : { license: { id } };
74
+ }
75
+
76
+ /**
77
+ * Find the directories of a project that carry code under a license other
78
+ * than the project's.
79
+ *
80
+ * @param {string} root Project scan root
81
+ * @param {Object} options CLI options (exclusions)
82
+ * @param {string[]} [excludeDirs] Directories already known to hold
83
+ * dependencies (submodules, fetched sources, build trees), not searched
84
+ * @returns {{components: Object[], dirs: string[]}} A component per vendored
85
+ * directory, and the directories
86
+ */
87
+ export function findVendoredCode(root, options = {}, excludeDirs = []) {
88
+ const absRoot = resolve(root);
89
+ const files = getAllFiles(absRoot, "**/{licen[cs]e,copying}*", {
90
+ ...options,
91
+ exclude: [...(options.exclude || []), ...DOWNLOAD_CACHE_EXCLUDES],
92
+ })
93
+ .filter((f) => isLicenseFileName(basename(f)))
94
+ .map((f) => resolve(f))
95
+ .filter((f) => !excludeDirs.some((d) => isInsideDir(f, d)));
96
+ const relDir = (f) => relative(absRoot, dirname(f)).split(sep).join("/");
97
+ const rootLicenses = new Set(
98
+ files
99
+ .filter((f) => relDir(f) === "")
100
+ .map(licenseOf)
101
+ .filter(Boolean),
102
+ );
103
+ const byDepth = files
104
+ .filter((f) => relDir(f) !== "")
105
+ .sort(
106
+ (a, b) =>
107
+ relDir(a).split("/").length - relDir(b).split("/").length ||
108
+ a.localeCompare(b),
109
+ );
110
+ const components = [];
111
+ const dirs = [];
112
+ for (const file of byDepth) {
113
+ const dir = dirname(file);
114
+ if (dirs.some((d) => isInsideDir(dir, d))) {
115
+ continue;
116
+ }
117
+ const id = licenseOf(file);
118
+ if (!id || rootLicenses.has(id)) {
119
+ continue;
120
+ }
121
+ const path = relDir(file);
122
+ const name = basename(dir);
123
+ const purl = tryBuildPurl({ type: "generic", name, subpath: path });
124
+ const licenseFile = relative(absRoot, file).split(sep).join("/");
125
+ const component = {
126
+ type: "library",
127
+ name,
128
+ version: "",
129
+ licenses: [licenseChoice(id)],
130
+ properties: [
131
+ { name: "cdx:vendored", value: "true" },
132
+ { name: "cdx:vendored:path", value: path },
133
+ { name: "cdx:vendored:licenseFile", value: licenseFile },
134
+ ],
135
+ evidence: {
136
+ identity: {
137
+ field: "name",
138
+ confidence: 0.4,
139
+ methods: [
140
+ { technique: "filename", confidence: 0.4, value: licenseFile },
141
+ ],
142
+ },
143
+ licenses: [licenseChoice(id)],
144
+ },
145
+ };
146
+ if (purl) {
147
+ component.purl = purl;
148
+ component["bom-ref"] = decodeURIComponent(purl);
149
+ } else {
150
+ component["bom-ref"] = `vendored:${path}`;
151
+ }
152
+ components.push(component);
153
+ dirs.push(dir);
154
+ }
155
+ return { components, dirs };
156
+ }