@cdxgen/cdxgen 13.2.0 → 13.4.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 (311) hide show
  1. package/README.md +33 -14
  2. package/bin/cdxgen.js +310 -138
  3. package/bin/evinse.js +22 -0
  4. package/bin/repl.js +86 -0
  5. package/bin/sign.js +119 -15
  6. package/bin/tracebom.js +69 -5
  7. package/bin/validate.js +107 -19
  8. package/bin/verify.js +172 -63
  9. package/data/helpers/init.gradle +46 -21
  10. package/data/remediations.json +85 -0
  11. package/data/rules/dependency-sources.yaml +67 -0
  12. package/data/rules/scala-evidence.yaml +115 -0
  13. package/lib/audit/index.js +38 -6
  14. package/lib/cli/bomAssembly.js +105 -15
  15. package/lib/cli/cliOptions.js +93 -1
  16. package/lib/cli/index.js +156 -58
  17. package/lib/cli/jsBom.js +99 -53
  18. package/lib/cli/jvmBom.js +708 -147
  19. package/lib/cli/managedBom.js +415 -224
  20. package/lib/cli/nativeBom.js +264 -44
  21. package/lib/core/activity.js +12 -0
  22. package/lib/core/env.js +22 -15
  23. package/lib/core/fs.js +176 -7
  24. package/lib/core/httpClient.js +159 -24
  25. package/lib/core/metadataProperties.js +97 -0
  26. package/lib/core/pluginRun.js +184 -0
  27. package/lib/core/processTree.js +100 -0
  28. package/lib/core/projectConfig.js +31 -4
  29. package/lib/core/runState.js +39 -0
  30. package/lib/core/toml.js +72 -0
  31. package/lib/ecosystems/asarutils.js +4 -2
  32. package/lib/ecosystems/bunutils.js +274 -108
  33. package/lib/ecosystems/cargoCache.js +231 -8
  34. package/lib/ecosystems/caxa.js +434 -2
  35. package/lib/ecosystems/cmakeResolver.js +76 -21
  36. package/lib/ecosystems/cppBuildContext.js +631 -0
  37. package/lib/ecosystems/cppEvidence.js +399 -51
  38. package/lib/ecosystems/cppIncludeResolver.js +294 -0
  39. package/lib/ecosystems/denoutils.js +93 -66
  40. package/lib/ecosystems/ecosystems.js +1983 -793
  41. package/lib/ecosystems/golem.js +28 -12
  42. package/lib/ecosystems/gradleutils.js +356 -37
  43. package/lib/ecosystems/jsEvidence.js +104 -44
  44. package/lib/ecosystems/kosi.js +31 -7
  45. package/lib/ecosystems/npmutils.js +174 -9
  46. package/lib/ecosystems/parsers-dotnet.js +616 -159
  47. package/lib/ecosystems/parsers-elm.js +46 -28
  48. package/lib/ecosystems/parsers-gleam.js +3 -4
  49. package/lib/ecosystems/parsers-go.js +371 -70
  50. package/lib/ecosystems/parsers-js.js +263 -76
  51. package/lib/ecosystems/parsers-julia.js +2 -3
  52. package/lib/ecosystems/parsers-jvm.js +204 -12
  53. package/lib/ecosystems/parsers-misc.js +929 -216
  54. package/lib/ecosystems/parsers-python.js +167 -24
  55. package/lib/ecosystems/parsers-rust.js +28 -22
  56. package/lib/ecosystems/parsers-terraform.js +1573 -19
  57. package/lib/ecosystems/pythonutils.js +102 -6
  58. package/lib/ecosystems/remote/huggingface.js +3 -0
  59. package/lib/ecosystems/rubyutils.js +1492 -182
  60. package/lib/ecosystems/rusi.js +54 -10
  61. package/lib/ecosystems/sbtutils.js +243 -187
  62. package/lib/ecosystems/scalacliutils.js +342 -0
  63. package/lib/ecosystems/scalasem.js +2618 -0
  64. package/lib/ecosystems/terraformRegistry.js +288 -0
  65. package/lib/ecosystems/utils.js +2 -0
  66. package/lib/ecosystems/vendoredCode.js +156 -0
  67. package/lib/evinser/evinser.js +1008 -191
  68. package/lib/evinser/swiftsem.js +1914 -302
  69. package/lib/helpers/agenticToolutils.js +2 -2
  70. package/lib/helpers/bomSigner.js +1101 -222
  71. package/lib/inventory/aiCollector.js +4 -1
  72. package/lib/inventory/analyzer.js +110 -127
  73. package/lib/inventory/atomUtils.js +703 -43
  74. package/lib/inventory/auditCategories.js +7 -0
  75. package/lib/inventory/buildToolRateLimit.js +144 -0
  76. package/lib/inventory/cacheCommands.js +2 -1
  77. package/lib/inventory/cdxrs.js +103 -12
  78. package/lib/inventory/cmakeBuildDirs.js +254 -0
  79. package/lib/inventory/deps.js +501 -124
  80. package/lib/inventory/depsUtils.js +183 -11
  81. package/lib/inventory/display.js +4 -5
  82. package/lib/inventory/dosai.js +798 -57
  83. package/lib/inventory/dosaiParsers.js +310 -15
  84. package/lib/inventory/dynamic.js +90 -6
  85. package/lib/inventory/evidenceUtils.js +166 -113
  86. package/lib/inventory/fetchBatch.js +690 -55
  87. package/lib/inventory/fetchDiskCache.js +597 -0
  88. package/lib/inventory/forgeEnricher.js +14 -5
  89. package/lib/inventory/jvmLocalRepos.js +917 -0
  90. package/lib/inventory/mcpConfigParser.js +2 -3
  91. package/lib/inventory/parentSelection.js +146 -0
  92. package/lib/inventory/protobom.js +8 -1
  93. package/lib/inventory/purl.js +152 -3
  94. package/lib/inventory/rustFormulationParser.js +3 -4
  95. package/lib/inventory/sbomDocument.js +2 -70
  96. package/lib/inventory/scalaCoords.js +153 -0
  97. package/lib/inventory/source.js +45 -27
  98. package/lib/inventory/spdx.js +101 -0
  99. package/lib/inventory/traceRunner.js +295 -25
  100. package/lib/inventory/tracedCrypto.js +294 -0
  101. package/lib/managers/binary.js +115 -24
  102. package/lib/managers/docker.js +467 -46
  103. package/lib/managers/oci.js +63 -3
  104. package/lib/parsers/cmakeCache.js +69 -0
  105. package/lib/parsers/cmakeLists.js +466 -0
  106. package/lib/parsers/cmakePresets.js +400 -0
  107. package/lib/parsers/compileCommands.js +557 -0
  108. package/lib/parsers/largeJson.js +454 -0
  109. package/lib/parsers/npmrc.js +19 -1
  110. package/lib/parsers/strictJson.js +322 -0
  111. package/lib/parsers/terraformConfig.js +1073 -0
  112. package/lib/parsers/terraformSource.js +652 -0
  113. package/lib/server/server.js +23 -0
  114. package/lib/stages/postgen/introspection/markers.js +1 -1
  115. package/lib/stages/postgen/postgen.js +83 -16
  116. package/lib/stages/postgen/specVersionCompat.js +32 -0
  117. package/lib/validator/bomValidator.js +6 -16
  118. package/lib/validator/index.js +64 -11
  119. package/lib/validator/reporters/console.js +3 -0
  120. package/lib/validator/reporters/json.js +2 -0
  121. package/lib/validator/reporters/sarif.js +7 -0
  122. package/package.json +23 -23
  123. package/types/lib/audit/index.d.ts.map +1 -1
  124. package/types/lib/cli/bomAssembly.d.ts +2 -1
  125. package/types/lib/cli/bomAssembly.d.ts.map +1 -1
  126. package/types/lib/cli/cliOptions.d.ts +33 -1
  127. package/types/lib/cli/cliOptions.d.ts.map +1 -1
  128. package/types/lib/cli/index.d.ts.map +1 -1
  129. package/types/lib/cli/jsBom.d.ts.map +1 -1
  130. package/types/lib/cli/jvmBom.d.ts +24 -1
  131. package/types/lib/cli/jvmBom.d.ts.map +1 -1
  132. package/types/lib/cli/managedBom.d.ts +7 -4
  133. package/types/lib/cli/managedBom.d.ts.map +1 -1
  134. package/types/lib/cli/nativeBom.d.ts +3 -1
  135. package/types/lib/cli/nativeBom.d.ts.map +1 -1
  136. package/types/lib/core/activity.d.ts.map +1 -1
  137. package/types/lib/core/env.d.ts +9 -0
  138. package/types/lib/core/env.d.ts.map +1 -1
  139. package/types/lib/core/fs.d.ts +55 -0
  140. package/types/lib/core/fs.d.ts.map +1 -1
  141. package/types/lib/core/httpClient.d.ts +13 -8
  142. package/types/lib/core/httpClient.d.ts.map +1 -1
  143. package/types/lib/core/metadataProperties.d.ts +39 -0
  144. package/types/lib/core/metadataProperties.d.ts.map +1 -0
  145. package/types/lib/core/pluginRun.d.ts +97 -0
  146. package/types/lib/core/pluginRun.d.ts.map +1 -0
  147. package/types/lib/core/processTree.d.ts +36 -0
  148. package/types/lib/core/processTree.d.ts.map +1 -0
  149. package/types/lib/core/projectConfig.d.ts +6 -2
  150. package/types/lib/core/projectConfig.d.ts.map +1 -1
  151. package/types/lib/core/runState.d.ts +29 -0
  152. package/types/lib/core/runState.d.ts.map +1 -0
  153. package/types/lib/core/toml.d.ts +20 -0
  154. package/types/lib/core/toml.d.ts.map +1 -0
  155. package/types/lib/ecosystems/asarutils.d.ts.map +1 -1
  156. package/types/lib/ecosystems/bunutils.d.ts +12 -5
  157. package/types/lib/ecosystems/bunutils.d.ts.map +1 -1
  158. package/types/lib/ecosystems/cargoCache.d.ts +12 -0
  159. package/types/lib/ecosystems/cargoCache.d.ts.map +1 -1
  160. package/types/lib/ecosystems/caxa.d.ts +14 -0
  161. package/types/lib/ecosystems/caxa.d.ts.map +1 -1
  162. package/types/lib/ecosystems/cmakeResolver.d.ts +28 -3
  163. package/types/lib/ecosystems/cmakeResolver.d.ts.map +1 -1
  164. package/types/lib/ecosystems/cppBuildContext.d.ts +55 -0
  165. package/types/lib/ecosystems/cppBuildContext.d.ts.map +1 -0
  166. package/types/lib/ecosystems/cppEvidence.d.ts +17 -1
  167. package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -1
  168. package/types/lib/ecosystems/cppIncludeResolver.d.ts +92 -0
  169. package/types/lib/ecosystems/cppIncludeResolver.d.ts.map +1 -0
  170. package/types/lib/ecosystems/denoutils.d.ts +9 -3
  171. package/types/lib/ecosystems/denoutils.d.ts.map +1 -1
  172. package/types/lib/ecosystems/ecosystems.d.ts +62 -13
  173. package/types/lib/ecosystems/ecosystems.d.ts.map +1 -1
  174. package/types/lib/ecosystems/golem.d.ts.map +1 -1
  175. package/types/lib/ecosystems/gradleutils.d.ts +70 -4
  176. package/types/lib/ecosystems/gradleutils.d.ts.map +1 -1
  177. package/types/lib/ecosystems/jsEvidence.d.ts +5 -2
  178. package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -1
  179. package/types/lib/ecosystems/kosi.d.ts +13 -0
  180. package/types/lib/ecosystems/kosi.d.ts.map +1 -1
  181. package/types/lib/ecosystems/npmutils.d.ts +57 -0
  182. package/types/lib/ecosystems/npmutils.d.ts.map +1 -1
  183. package/types/lib/ecosystems/parsers-dotnet.d.ts +118 -4
  184. package/types/lib/ecosystems/parsers-dotnet.d.ts.map +1 -1
  185. package/types/lib/ecosystems/parsers-elm.d.ts.map +1 -1
  186. package/types/lib/ecosystems/parsers-gleam.d.ts.map +1 -1
  187. package/types/lib/ecosystems/parsers-go.d.ts +54 -2
  188. package/types/lib/ecosystems/parsers-go.d.ts.map +1 -1
  189. package/types/lib/ecosystems/parsers-js.d.ts +16 -5
  190. package/types/lib/ecosystems/parsers-js.d.ts.map +1 -1
  191. package/types/lib/ecosystems/parsers-julia.d.ts.map +1 -1
  192. package/types/lib/ecosystems/parsers-jvm.d.ts +46 -1
  193. package/types/lib/ecosystems/parsers-jvm.d.ts.map +1 -1
  194. package/types/lib/ecosystems/parsers-misc.d.ts +70 -4
  195. package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -1
  196. package/types/lib/ecosystems/parsers-python.d.ts +53 -3
  197. package/types/lib/ecosystems/parsers-python.d.ts.map +1 -1
  198. package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -1
  199. package/types/lib/ecosystems/parsers-terraform.d.ts +38 -21
  200. package/types/lib/ecosystems/parsers-terraform.d.ts.map +1 -1
  201. package/types/lib/ecosystems/pythonutils.d.ts +27 -2
  202. package/types/lib/ecosystems/pythonutils.d.ts.map +1 -1
  203. package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -1
  204. package/types/lib/ecosystems/rubyutils.d.ts +164 -3
  205. package/types/lib/ecosystems/rubyutils.d.ts.map +1 -1
  206. package/types/lib/ecosystems/rusi.d.ts +13 -0
  207. package/types/lib/ecosystems/rusi.d.ts.map +1 -1
  208. package/types/lib/ecosystems/sbtutils.d.ts +88 -2
  209. package/types/lib/ecosystems/sbtutils.d.ts.map +1 -1
  210. package/types/lib/ecosystems/scalacliutils.d.ts +56 -0
  211. package/types/lib/ecosystems/scalacliutils.d.ts.map +1 -0
  212. package/types/lib/ecosystems/scalasem.d.ts +311 -0
  213. package/types/lib/ecosystems/scalasem.d.ts.map +1 -0
  214. package/types/lib/ecosystems/terraformRegistry.d.ts +9 -0
  215. package/types/lib/ecosystems/terraformRegistry.d.ts.map +1 -0
  216. package/types/lib/ecosystems/utils.d.ts +2 -2
  217. package/types/lib/ecosystems/utils.d.ts.map +1 -1
  218. package/types/lib/ecosystems/vendoredCode.d.ts +32 -0
  219. package/types/lib/ecosystems/vendoredCode.d.ts.map +1 -0
  220. package/types/lib/evinser/evinser.d.ts +132 -15
  221. package/types/lib/evinser/evinser.d.ts.map +1 -1
  222. package/types/lib/evinser/swiftsem.d.ts +280 -15
  223. package/types/lib/evinser/swiftsem.d.ts.map +1 -1
  224. package/types/lib/helpers/bomSigner.d.ts +182 -13
  225. package/types/lib/helpers/bomSigner.d.ts.map +1 -1
  226. package/types/lib/inventory/aiCollector.d.ts.map +1 -1
  227. package/types/lib/inventory/analyzer.d.ts.map +1 -1
  228. package/types/lib/inventory/atomUtils.d.ts +219 -5
  229. package/types/lib/inventory/atomUtils.d.ts.map +1 -1
  230. package/types/lib/inventory/auditCategories.d.ts +3 -0
  231. package/types/lib/inventory/auditCategories.d.ts.map +1 -1
  232. package/types/lib/inventory/buildToolRateLimit.d.ts +38 -0
  233. package/types/lib/inventory/buildToolRateLimit.d.ts.map +1 -0
  234. package/types/lib/inventory/cacheCommands.d.ts +2 -1
  235. package/types/lib/inventory/cacheCommands.d.ts.map +1 -1
  236. package/types/lib/inventory/cdxrs.d.ts +8 -3
  237. package/types/lib/inventory/cdxrs.d.ts.map +1 -1
  238. package/types/lib/inventory/cmakeBuildDirs.d.ts +58 -0
  239. package/types/lib/inventory/cmakeBuildDirs.d.ts.map +1 -0
  240. package/types/lib/inventory/deps.d.ts +59 -1
  241. package/types/lib/inventory/deps.d.ts.map +1 -1
  242. package/types/lib/inventory/depsUtils.d.ts +15 -0
  243. package/types/lib/inventory/depsUtils.d.ts.map +1 -1
  244. package/types/lib/inventory/display.d.ts.map +1 -1
  245. package/types/lib/inventory/dosai.d.ts +121 -9
  246. package/types/lib/inventory/dosai.d.ts.map +1 -1
  247. package/types/lib/inventory/dosaiParsers.d.ts +53 -7
  248. package/types/lib/inventory/dosaiParsers.d.ts.map +1 -1
  249. package/types/lib/inventory/dynamic.d.ts +10 -0
  250. package/types/lib/inventory/dynamic.d.ts.map +1 -1
  251. package/types/lib/inventory/evidenceUtils.d.ts +19 -4
  252. package/types/lib/inventory/evidenceUtils.d.ts.map +1 -1
  253. package/types/lib/inventory/fetchBatch.d.ts +83 -14
  254. package/types/lib/inventory/fetchBatch.d.ts.map +1 -1
  255. package/types/lib/inventory/fetchDiskCache.d.ts +169 -0
  256. package/types/lib/inventory/fetchDiskCache.d.ts.map +1 -0
  257. package/types/lib/inventory/forgeEnricher.d.ts.map +1 -1
  258. package/types/lib/inventory/jvmLocalRepos.d.ts +178 -0
  259. package/types/lib/inventory/jvmLocalRepos.d.ts.map +1 -0
  260. package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -1
  261. package/types/lib/inventory/parentSelection.d.ts +34 -0
  262. package/types/lib/inventory/parentSelection.d.ts.map +1 -0
  263. package/types/lib/inventory/plugins.d.ts.map +1 -1
  264. package/types/lib/inventory/protobom.d.ts.map +1 -1
  265. package/types/lib/inventory/purl.d.ts +71 -2
  266. package/types/lib/inventory/purl.d.ts.map +1 -1
  267. package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -1
  268. package/types/lib/inventory/sbomDocument.d.ts.map +1 -1
  269. package/types/lib/inventory/scalaCoords.d.ts +80 -0
  270. package/types/lib/inventory/scalaCoords.d.ts.map +1 -0
  271. package/types/lib/inventory/source.d.ts.map +1 -1
  272. package/types/lib/inventory/spdx.d.ts +9 -0
  273. package/types/lib/inventory/spdx.d.ts.map +1 -1
  274. package/types/lib/inventory/traceRunner.d.ts +59 -1
  275. package/types/lib/inventory/traceRunner.d.ts.map +1 -1
  276. package/types/lib/inventory/tracedCrypto.d.ts +42 -0
  277. package/types/lib/inventory/tracedCrypto.d.ts.map +1 -0
  278. package/types/lib/managers/binary.d.ts +30 -1
  279. package/types/lib/managers/binary.d.ts.map +1 -1
  280. package/types/lib/managers/docker.d.ts +29 -0
  281. package/types/lib/managers/docker.d.ts.map +1 -1
  282. package/types/lib/managers/oci.d.ts +17 -1
  283. package/types/lib/managers/oci.d.ts.map +1 -1
  284. package/types/lib/parsers/cmakeCache.d.ts +16 -0
  285. package/types/lib/parsers/cmakeCache.d.ts.map +1 -1
  286. package/types/lib/parsers/cmakeLists.d.ts +77 -0
  287. package/types/lib/parsers/cmakeLists.d.ts.map +1 -0
  288. package/types/lib/parsers/cmakePresets.d.ts +78 -0
  289. package/types/lib/parsers/cmakePresets.d.ts.map +1 -0
  290. package/types/lib/parsers/compileCommands.d.ts +115 -0
  291. package/types/lib/parsers/compileCommands.d.ts.map +1 -0
  292. package/types/lib/parsers/largeJson.d.ts +52 -0
  293. package/types/lib/parsers/largeJson.d.ts.map +1 -0
  294. package/types/lib/parsers/npmrc.d.ts +5 -0
  295. package/types/lib/parsers/npmrc.d.ts.map +1 -1
  296. package/types/lib/parsers/strictJson.d.ts +46 -0
  297. package/types/lib/parsers/strictJson.d.ts.map +1 -0
  298. package/types/lib/parsers/terraformConfig.d.ts +70 -0
  299. package/types/lib/parsers/terraformConfig.d.ts.map +1 -0
  300. package/types/lib/parsers/terraformSource.d.ts +66 -0
  301. package/types/lib/parsers/terraformSource.d.ts.map +1 -0
  302. package/types/lib/server/server.d.ts.map +1 -1
  303. package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
  304. package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -1
  305. package/types/lib/validator/bomValidator.d.ts.map +1 -1
  306. package/types/lib/validator/index.d.ts +18 -1
  307. package/types/lib/validator/index.d.ts.map +1 -1
  308. package/types/lib/validator/reporters/console.d.ts.map +1 -1
  309. package/types/lib/validator/reporters/json.d.ts.map +1 -1
  310. package/types/lib/validator/reporters/sarif.d.ts.map +1 -1
  311. package/lib/third-party/arborist/snapshots/calc-dep-flags.test.cjs +0 -462
package/lib/cli/jsBom.js CHANGED
@@ -13,7 +13,11 @@ import {
13
13
  } from "../core/activity.js";
14
14
  import { recordDegradation } from "../core/buildLedger.js";
15
15
  import { deferFailOnError } from "../core/deferredExit.js";
16
- import { hasAnyProjectType, isPackageManagerAllowed } from "../core/env.js";
16
+ import {
17
+ hasAnyProjectType,
18
+ isPackageManagerAllowed,
19
+ shouldFetchPackageMetadata,
20
+ } from "../core/env.js";
17
21
  import { getAllFiles, safeExistsSync, safeSpawnSync } from "../core/fs.js";
18
22
  import { thoughtLog } from "../core/logger.js";
19
23
  import {
@@ -24,7 +28,10 @@ import {
24
28
  rewriteExtractedArchivePaths,
25
29
  } from "../ecosystems/asarutils.js";
26
30
  import { parseBunLock } from "../ecosystems/bunutils.js";
27
- import { parseCaxaMetadata } from "../ecosystems/caxa.js";
31
+ import {
32
+ enrichCaxaMetadataFromApp,
33
+ parseCaxaMetadata,
34
+ } from "../ecosystems/caxa.js";
28
35
  import {
29
36
  CHROME_EXTENSION_PURL_TYPE,
30
37
  collectChromeExtensionsFromPath,
@@ -36,8 +43,12 @@ import {
36
43
  parseDenoJsonFile,
37
44
  parseDenoLock,
38
45
  } from "../ecosystems/denoutils.js";
46
+ import { getNpmMetadata } from "../ecosystems/ecosystems.js";
39
47
  import { addEvidenceForImports } from "../ecosystems/jsEvidence.js";
40
- import { createNpmWorkspacePurl } from "../ecosystems/npmutils.js";
48
+ import {
49
+ createNpmWorkspacePurl,
50
+ loadNpmrcConfig,
51
+ } from "../ecosystems/npmutils.js";
41
52
  import {
42
53
  parseBowerJson,
43
54
  parseMinJs,
@@ -77,6 +88,7 @@ import {
77
88
  } from "../inventory/analyzer.js";
78
89
  import {
79
90
  markNpmTypesPackagesAsExcluded,
91
+ markTypeOnlyDependenciesOptional,
80
92
  mergeDependencies,
81
93
  mergeServices,
82
94
  propagateRequiredScopeFromDependencies,
@@ -216,12 +228,20 @@ export async function createNodejsBom(path, options) {
216
228
  const pkgJsonFiles = getAllFiles(path, "**/package.json", options);
217
229
  // Are there any package.json files in the container?
218
230
  if (pkgJsonFiles.length) {
231
+ // Every manifest is read locally first, and the registry is asked about
232
+ // the ones still missing fields in one round, rather than once per file.
233
+ const npmrcConfig = loadNpmrcConfig(path);
219
234
  for (const pj of pkgJsonFiles) {
220
- const dlist = await parsePkgJson(pj);
235
+ const dlist = await parsePkgJson(pj, false, false, {
236
+ fetchMetadata: false,
237
+ });
221
238
  if (dlist?.length) {
222
239
  pkgList = pkgList.concat(dlist);
223
240
  }
224
241
  }
242
+ if (shouldFetchPackageMetadata() && pkgList.length) {
243
+ pkgList = await getNpmMetadata(pkgList, undefined, { npmrcConfig });
244
+ }
225
245
  if (includedAiInventoryTypes.length) {
226
246
  aiInventory = collectAiInventory(
227
247
  path,
@@ -567,7 +587,16 @@ export async function createNodejsBom(path, options) {
567
587
  recordSensitiveFileRead(npmrcFile, {
568
588
  label: "npm registry configuration",
569
589
  });
570
- const npmrcObj = parseNpmrc(npmrcData);
590
+ let npmrcObj = {};
591
+ try {
592
+ npmrcObj = parseNpmrc(npmrcData);
593
+ } catch (e) {
594
+ // A malformed .npmrc must degrade to a warning, never abort the scan.
595
+ console.warn(
596
+ `Unable to parse ${npmrcFile}. Continuing without it. ${e?.message || ""}`,
597
+ );
598
+ npmrcObj = {};
599
+ }
571
600
  for (const [key, value] of Object.entries(npmrcObj)) {
572
601
  const baseKey = key.replace(/^(?:\/\/[^/]+\/|@[^:]+:)/, "");
573
602
  if (
@@ -957,8 +986,12 @@ export async function createNodejsBom(path, options) {
957
986
  ) {
958
987
  // Rush.js creates node_modules inside common/temp directory
959
988
  const nmDir = join(path, "common", "temp", "node_modules");
960
- // Do rush install if we don't have node_modules directory
961
- if (!safeExistsSync(nmDir)) {
989
+ // Do rush install if we don't have node_modules directory. `rush install`
990
+ // drives pnpm without cdxgen's --ignore-scripts hardening and
991
+ // --bypass-policy disables rush's own policy gate, so it must respect
992
+ // --no-install-deps and the pre-build lifecycle like every other
993
+ // installer.
994
+ if (!safeExistsSync(nmDir) && options.installDeps !== false) {
962
995
  console.log("Executing 'rush install --no-link'", path);
963
996
  const result = safeSpawnSync(
964
997
  "rush",
@@ -990,14 +1023,12 @@ export async function createNodejsBom(path, options) {
990
1023
  if (safeExistsSync(swFile)) {
991
1024
  let pkgList = await parseNodeShrinkwrap(swFile);
992
1025
  pkgList = addWasmComponentsFromImports(pkgList, allImports);
993
- if (allImports && Object.keys(allImports).length) {
994
- pkgList = await addEvidenceForImports(
995
- pkgList,
996
- allImports,
997
- allExports,
998
- options.deep,
999
- );
1000
- }
1026
+ pkgList = await addEvidenceForImports(
1027
+ pkgList,
1028
+ allImports,
1029
+ allExports,
1030
+ options.deep,
1031
+ );
1001
1032
  return buildBomNSData(options, pkgList, "npm", {
1002
1033
  allImports,
1003
1034
  src: path,
@@ -1026,16 +1057,15 @@ export async function createNodejsBom(path, options) {
1026
1057
  pnpmLockObj.dependenciesList,
1027
1058
  );
1028
1059
  }
1029
- if (allImports && Object.keys(allImports).length) {
1030
- pkgList = await addEvidenceForImports(
1031
- pkgList,
1032
- allImports,
1033
- allExports,
1034
- options.deep,
1035
- );
1036
- }
1060
+ pkgList = await addEvidenceForImports(
1061
+ pkgList,
1062
+ allImports,
1063
+ allExports,
1064
+ options.deep,
1065
+ );
1037
1066
  pkgList = propagateRequiredScopeFromDependencies(pkgList, dependencies);
1038
1067
  pkgList = markNpmTypesPackagesAsExcluded(pkgList);
1068
+ pkgList = markTypeOnlyDependenciesOptional(pkgList, dependencies);
1039
1069
  return buildBomNSData(options, pkgList, "npm", {
1040
1070
  allImports,
1041
1071
  allExports,
@@ -1120,25 +1150,25 @@ export async function createNodejsBom(path, options) {
1120
1150
  );
1121
1151
  workspacePackages.push(workspaceRef);
1122
1152
  workspaceSrcFiles[workspaceRef] = relativePkgJsonFile;
1123
- if (pkgData?.dependencies || pkgData?.devDependencies) {
1124
- const dlist = new Set();
1125
- for (const [k, v] of Object.entries({
1126
- ...(pkgData.dependencies || {}),
1127
- ...(pkgData.devDependencies || {}),
1128
- })) {
1129
- if (v.match(/^\d/)) {
1130
- dlist.add(`pkg:npm/${k}@${v}`);
1131
- } else {
1132
- dlist.add(`pkg:npm/${k}`);
1133
- }
1134
- }
1135
- workspaceDirectDeps[workspaceRef] = Array.from(dlist);
1136
- for (const dep of workspaceDirectDeps[workspaceRef]) {
1137
- if (!depsWorkspaceRefs[dep]) {
1138
- depsWorkspaceRefs[dep] = [];
1139
- }
1140
- depsWorkspaceRefs[dep].push(workspaceRef);
1153
+ // The declared name and range of each direct dependency, which
1154
+ // parseYarnLock resolves against the lock file to link the
1155
+ // member into the dependency tree.
1156
+ const declaredDeps = {
1157
+ ...(pkgData.dependencies || {}),
1158
+ ...(pkgData.optionalDependencies || {}),
1159
+ ...(pkgData.devDependencies || {}),
1160
+ };
1161
+ if (Object.keys(declaredDeps).length) {
1162
+ workspaceDirectDeps[workspaceRef] = declaredDeps;
1163
+ }
1164
+ for (const [k, v] of Object.entries(declaredDeps)) {
1165
+ const dep = /^\d/.test(String(v))
1166
+ ? `pkg:npm/${k}@${v}`
1167
+ : `pkg:npm/${k}`;
1168
+ if (!depsWorkspaceRefs[dep]) {
1169
+ depsWorkspaceRefs[dep] = [];
1141
1170
  }
1171
+ depsWorkspaceRefs[dep].push(workspaceRef);
1142
1172
  }
1143
1173
  }
1144
1174
  }
@@ -1410,12 +1440,21 @@ export async function createNodejsBom(path, options) {
1410
1440
  options,
1411
1441
  );
1412
1442
  manifestFiles = manifestFiles.concat(pkgJsonFiles);
1443
+ // The installed manifests answer locally; one round asks the registry only
1444
+ // about the packages still missing fields, instead of one round per file.
1413
1445
  for (const pkgjf of pkgJsonFiles) {
1414
- const dlist = await parsePkgJson(pkgjf);
1446
+ const dlist = await parsePkgJson(pkgjf, false, false, {
1447
+ fetchMetadata: false,
1448
+ });
1415
1449
  if (dlist?.length) {
1416
1450
  pkgList = pkgList.concat(dlist);
1417
1451
  }
1418
1452
  }
1453
+ if (shouldFetchPackageMetadata() && pkgList.length) {
1454
+ pkgList = await getNpmMetadata(pkgList, undefined, {
1455
+ npmrcConfig: loadNpmrcConfig(path),
1456
+ });
1457
+ }
1419
1458
  if (!parentComponent || !Object.keys(parentComponent).length) {
1420
1459
  if (safeExistsSync(join(path, "package.json"))) {
1421
1460
  const pcs = await parsePkgJson(join(path, "package.json"), true, true);
@@ -1460,15 +1499,15 @@ export async function createNodejsBom(path, options) {
1460
1499
  if ("project-name" in options && !options.parentComponent) {
1461
1500
  options.parentComponent = parentComponent;
1462
1501
  }
1463
- if (allImports && Object.keys(allImports).length) {
1464
- pkgList = addWasmComponentsFromImports(pkgList, allImports);
1465
- pkgList = await addEvidenceForImports(
1466
- pkgList,
1467
- allImports,
1468
- allExports,
1469
- options.deep,
1470
- );
1471
- }
1502
+ // The evidence pass runs without imports too: it also fills deep-mode
1503
+ // metadata and removes internal:LocalNodeModulesPath from every component.
1504
+ pkgList = addWasmComponentsFromImports(pkgList, allImports);
1505
+ pkgList = await addEvidenceForImports(
1506
+ pkgList,
1507
+ allImports,
1508
+ allExports,
1509
+ options.deep,
1510
+ );
1472
1511
  if (mcpInventory.components?.length) {
1473
1512
  pkgList = trimComponents(pkgList.concat(mcpInventory.components));
1474
1513
  }
@@ -1495,6 +1534,7 @@ export async function createNodejsBom(path, options) {
1495
1534
  );
1496
1535
  pkgList = propagateRequiredScopeFromDependencies(pkgList, dependencies);
1497
1536
  pkgList = markNpmTypesPackagesAsExcluded(pkgList);
1537
+ pkgList = markTypeOnlyDependenciesOptional(pkgList, dependencies);
1498
1538
  if (exactAiInventoryType === "mcp") {
1499
1539
  pkgList = trimComponents(filterInventorySubjectsByTypes(pkgList, ["mcp"]));
1500
1540
  dependencies = filterInventoryDependencies(
@@ -1624,8 +1664,14 @@ export async function createCaxaBom(path, options) {
1624
1664
  if (DEBUG_MODE) {
1625
1665
  console.log(`Parsing ${mfile}`);
1626
1666
  }
1627
- const { parentComponent, components, dependencies } =
1628
- await parseCaxaMetadata(mfile);
1667
+ let mdata = await parseCaxaMetadata(mfile);
1668
+ if (options.caxaAppDir) {
1669
+ mdata = await enrichCaxaMetadataFromApp(
1670
+ mdata,
1671
+ resolve(options.caxaAppDir),
1672
+ );
1673
+ }
1674
+ const { parentComponent, components, dependencies } = mdata;
1629
1675
  if (parentComponent) {
1630
1676
  if (!finalParentComponent) {
1631
1677
  finalParentComponent = parentComponent;