@cdxgen/cdxgen 0.0.1 → 13.0.1

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 +2335 -0
  4. package/bin/convert.js +220 -0
  5. package/bin/evinse.js +353 -0
  6. package/bin/hbom.js +504 -0
  7. package/bin/repl.js +2224 -0
  8. package/bin/sign.js +195 -0
  9. package/bin/tracebom.js +303 -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 +1882 -0
  85. package/lib/cli/cliOptions.js +543 -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 +280 -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 +920 -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 +583 -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 +1793 -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 +383 -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 +267 -0
  215. package/lib/inventory/traceRunner.js +439 -0
  216. package/lib/inventory/unicodeScan.js +147 -0
  217. package/lib/managers/binary.js +3459 -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 +329 -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 +50 -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 +201 -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 +22 -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 +147 -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,1291 @@
1
+ import localeCompareFactory from "@isaacs/string-locale-compare";
2
+
3
+ const localeCompare = localeCompareFactory("en");
4
+
5
+ import { readdir, readFile, readlink, stat } from "node:fs/promises";
6
+ import { basename, relative, resolve } from "node:path";
7
+
8
+ import nameFromFolder from "@npmcli/name-from-folder";
9
+ import pkgJson from "@npmcli/package-json";
10
+ import npa from "npm-package-arg";
11
+ import parseJSON from "parse-conflict-json";
12
+
13
+ import consistentResolve from "./consistent-resolve.js";
14
+ import { overrideResolves } from "./override-resolves.js";
15
+ import { log } from "./proc-log.js";
16
+ import relpath from "./relpath.js";
17
+ import specFromLock from "./spec-from-lock.js";
18
+ import versionFromTgz from "./version-from-tgz.js";
19
+ import YarnLock from "./yarn-lock.js";
20
+
21
+ // a module that manages a lockfile (package-lock.json).
22
+
23
+ // Increment whenever the lockfile version updates
24
+ // v1 - npm <=6
25
+ // v2 - arborist v1, npm v7, backwards compatible with v1, add 'packages'
26
+ // v3 will drop the 'dependencies' field, backwards comp with v2, not v1
27
+ //
28
+ // We cannot bump to v3 until npm v6 is out of common usage, and
29
+ // definitely not before npm v8.
30
+
31
+ const defaultLockfileVersion = 3;
32
+ // Bumped to 4 only when a node carries a patch record, so older clients abort.
33
+ const patchedLockfileVersion = 4;
34
+ // packageExtensions provenance also forces lockfileVersion 4 so older clients abort rather than silently dropping the repaired graph.
35
+ // Both features share version 4: they are root-owned graph repairs an old npm must not drop.
36
+ const packageExtensionsLockfileVersion = 4;
37
+ const maxLockfileVersion = 4;
38
+
39
+ // for comparing nodes to yarn.lock entries
40
+ const mismatch = (a, b) => a && b && a !== b;
41
+
42
+ // this.tree => the root node for the tree (ie, same path as this)
43
+ // - Set the first time we do `this.add(node)` for a path matching this.path
44
+ //
45
+ // this.add(node) =>
46
+ // - decorate the node with the metadata we have, if we have it, and it matches
47
+ // - add to the map of nodes needing to be committed, so that subsequent
48
+ // changes are captured when we commit that location's metadata.
49
+ //
50
+ // this.commit() =>
51
+ // - commit all nodes awaiting update to their metadata entries
52
+ // - re-generate this.data and this.yarnLock based on this.tree
53
+ //
54
+ // Note that between this.add() and this.commit(), `this.data` will be out of
55
+ // date! Always call `commit()` before relying on it.
56
+ //
57
+ // After calling this.commit(), any nodes not present in the tree will have
58
+ // been removed from the shrinkwrap data as well.
59
+
60
+ const swKeyOrder = [
61
+ "name",
62
+ "version",
63
+ "lockfileVersion",
64
+ "resolved",
65
+ "integrity",
66
+ "requires",
67
+ "packages",
68
+ "dependencies",
69
+ ];
70
+
71
+ // used to rewrite from yarn registry to npm registry
72
+ const yarnRegRe = /^https?:\/\/registry\.yarnpkg\.com\//;
73
+ const npmRegRe = /^https?:\/\/registry\.npmjs\.org\//;
74
+
75
+ // sometimes resolved: is weird or broken, or something npa can't handle
76
+ const specFromResolved = (resolved) => {
77
+ try {
78
+ return npa(resolved);
79
+ } catch (er) {
80
+ return {};
81
+ }
82
+ };
83
+
84
+ const pkgMetaKeys = [
85
+ // note: name is included if necessary, for alias packages
86
+ "version",
87
+ "dependencies",
88
+ "peerDependencies",
89
+ "peerDependenciesMeta",
90
+ "optionalDependencies",
91
+ "bundleDependencies",
92
+ "acceptDependencies",
93
+ "funding",
94
+ "engines",
95
+ "os",
96
+ "cpu",
97
+ "libc",
98
+ "_integrity",
99
+ "license",
100
+ "hasInstallScript",
101
+ "bin",
102
+ "deprecated",
103
+ "workspaces",
104
+ ];
105
+
106
+ const nodeMetaKeys = [
107
+ "integrity",
108
+ "inBundle",
109
+ "hasInstallScript",
110
+ "patched",
111
+ "packageExtensionsApplied",
112
+ "npmExtensionApplied",
113
+ ];
114
+
115
+ const metaFieldFromPkg = (pkg, key) => {
116
+ const val = pkg[key];
117
+ if (val) {
118
+ // get only the license type, not the full object
119
+ if (key === "license" && typeof val === "object" && val.type) {
120
+ return val.type;
121
+ }
122
+ // skip empty objects and falsey values
123
+ if (typeof val !== "object" || Object.keys(val).length) {
124
+ return val;
125
+ }
126
+ }
127
+ return null;
128
+ };
129
+
130
+ // check to make sure that there are no packages newer than or missing from the hidden lockfile
131
+ const assertNoNewer = async (path, data, lockTime, dir, seen) => {
132
+ const base = basename(dir);
133
+ const isNM = dir !== path && base === "node_modules";
134
+ const isScope = dir !== path && base.startsWith("@");
135
+ const isParent = dir === path || isNM || isScope;
136
+
137
+ const parent = isParent ? dir : resolve(dir, "node_modules");
138
+ const rel = relpath(path, dir);
139
+ seen.add(rel);
140
+ let entries;
141
+ if (dir === path) {
142
+ entries = [{ name: "node_modules", isDirectory: () => true }];
143
+ } else {
144
+ const { mtime: dirTime } = await stat(dir);
145
+ if (dirTime > lockTime) {
146
+ throw new Error(`out of date, updated: ${rel}`);
147
+ }
148
+ if (!isScope && !isNM && !data.packages[rel]) {
149
+ throw new Error(`missing from lockfile: ${rel}`);
150
+ }
151
+ entries = await readdir(parent, { withFileTypes: true }).catch(() => []);
152
+ }
153
+
154
+ // TODO limit concurrency here, this is recursive
155
+ await Promise.all(
156
+ entries.map(async (dirent) => {
157
+ const child = resolve(parent, dirent.name);
158
+ if (dirent.isDirectory() && !dirent.name.startsWith(".")) {
159
+ await assertNoNewer(path, data, lockTime, child, seen);
160
+ } else if (dirent.isSymbolicLink()) {
161
+ const target = resolve(parent, await readlink(child));
162
+ const tstat = await stat(target).catch(
163
+ /* istanbul ignore next - windows */ () => null,
164
+ );
165
+ seen.add(relpath(path, child));
166
+ /* istanbul ignore next - windows cannot do this */
167
+ if (tstat?.isDirectory() && !seen.has(relpath(path, target))) {
168
+ await assertNoNewer(path, data, lockTime, target, seen);
169
+ }
170
+ }
171
+ }),
172
+ );
173
+
174
+ if (dir !== path) {
175
+ return;
176
+ }
177
+
178
+ // The walk above can't reach two linked-strategy layouts: a store package's sibling deps under .store/<key>/node_modules (.store is a skipped dot-dir), and an undeclared workspace not symlinked into root node_modules. Walk those dirs, derived from the lockfile entries.
179
+ // A dir reachable through a link entry is skipped: it was already reached (or, if the symlink is stale, correctly stays unseen so the lockfile is rejected). This keeps the hoisted strategy's stale-symlink detection intact, since there every workspace is a link target.
180
+ const linkTargets = new Set();
181
+ for (const loc in data.packages) {
182
+ const { link, resolved } = data.packages[loc];
183
+ if (link && resolved) {
184
+ linkTargets.add(resolved.replace(/\\/g, "/"));
185
+ }
186
+ }
187
+ const extraDirs = new Set();
188
+ for (const loc in data.packages) {
189
+ const store = loc.match(/^(.*\/\.store\/.+?)\/node_modules\//);
190
+ if (store) {
191
+ // .store/<key> is never walked but has no entry, so mark it seen.
192
+ seen.add(store[1]);
193
+ extraDirs.add(`${store[1]}/node_modules`);
194
+ continue;
195
+ }
196
+ // A workspace/fsChild dir outside node_modules, e.g. packages/a.
197
+ const i = loc.indexOf("/node_modules/");
198
+ const root = i === -1 ? loc : loc.slice(0, i);
199
+ if (
200
+ root &&
201
+ !/(^|\/)node_modules(\/|$)/.test(root) &&
202
+ !linkTargets.has(root)
203
+ ) {
204
+ extraDirs.add(root);
205
+ }
206
+ }
207
+ for (const rel of extraDirs) {
208
+ await assertNoNewer(path, data, lockTime, resolve(path, rel), seen);
209
+ }
210
+
211
+ // assert that all the entries in the lockfile were seen
212
+ for (const loc in data.packages) {
213
+ if (!seen.has(loc)) {
214
+ throw new Error(`missing from node_modules: ${loc}`);
215
+ }
216
+ }
217
+ };
218
+
219
+ class Shrinkwrap {
220
+ static get defaultLockfileVersion() {
221
+ return defaultLockfileVersion;
222
+ }
223
+
224
+ static load(options) {
225
+ return new Shrinkwrap(options).load();
226
+ }
227
+
228
+ static get keyOrder() {
229
+ return swKeyOrder;
230
+ }
231
+
232
+ static async reset(options) {
233
+ // still need to know if it was loaded from the disk, but don't
234
+ // bother reading it if we're gonna just throw it away.
235
+ const s = new Shrinkwrap(options);
236
+ s.reset();
237
+
238
+ const [lock] = await s.resetFiles;
239
+
240
+ if (s.hiddenLockfile) {
241
+ s.filename = resolve(s.path, "node_modules/.package-lock.json");
242
+ } else {
243
+ s.filename = resolve(s.path, "package-lock.json");
244
+ }
245
+ s.loadedFromDisk = !!lock;
246
+ // TODO what uses this?
247
+ s.type = basename(s.filename);
248
+
249
+ return s;
250
+ }
251
+
252
+ static metaFromNode(node, path, options = {}) {
253
+ if (node.isLink) {
254
+ return {
255
+ resolved: relpath(path, node.realpath),
256
+ link: true,
257
+ };
258
+ }
259
+
260
+ const meta = {};
261
+ for (const key of pkgMetaKeys) {
262
+ const val = metaFieldFromPkg(node.package, key);
263
+ if (val) {
264
+ meta[key.replace(/^_/, "")] = val;
265
+ }
266
+ }
267
+ // we only include name if different from the node path name, and for the
268
+ // root to help prevent churn based on the name of the directory the
269
+ // project is in
270
+ const pname = node.packageName;
271
+ // when Target package name and Target node share the same name, we include the name, target node should have name as per realpath.
272
+ if (
273
+ pname &&
274
+ (node === node.root ||
275
+ pname !== node.name ||
276
+ nameFromFolder(node.realpath) !== pname)
277
+ ) {
278
+ meta.name = pname;
279
+ }
280
+
281
+ if (node.isTop && node.package.devDependencies) {
282
+ meta.devDependencies = node.package.devDependencies;
283
+ }
284
+
285
+ for (const key of nodeMetaKeys) {
286
+ if (node[key]) {
287
+ meta[key] = node[key];
288
+ }
289
+ }
290
+
291
+ const resolved = consistentResolve(node.resolved, node.path, path, true);
292
+ // hide resolved from registry dependencies.
293
+ if (!resolved) {
294
+ // no-op
295
+ } else if (node.isRegistryDependency) {
296
+ meta.resolved = overrideResolves(resolved, options);
297
+ } else {
298
+ meta.resolved = resolved;
299
+ }
300
+
301
+ if (node.extraneous) {
302
+ meta.extraneous = true;
303
+ } else {
304
+ if (node.peer) {
305
+ meta.peer = true;
306
+ }
307
+ if (node.dev) {
308
+ meta.dev = true;
309
+ }
310
+ if (node.optional) {
311
+ meta.optional = true;
312
+ }
313
+ if (node.devOptional && !node.dev && !node.optional) {
314
+ meta.devOptional = true;
315
+ }
316
+ }
317
+ return meta;
318
+ }
319
+
320
+ #awaitingUpdate = new Map();
321
+
322
+ constructor(options = {}) {
323
+ const {
324
+ path,
325
+ indent = 2,
326
+ newline = "\n",
327
+ hiddenLockfile = false,
328
+ lockfileVersion,
329
+ resolveOptions = {},
330
+ } = options;
331
+
332
+ if (hiddenLockfile) {
333
+ this.lockfileVersion = 3;
334
+ } else if (lockfileVersion) {
335
+ this.lockfileVersion = Number.parseInt(lockfileVersion, 10);
336
+ } else {
337
+ this.lockfileVersion = null;
338
+ }
339
+
340
+ this.tree = null;
341
+ this.path = resolve(path || ".");
342
+ this.filename = null;
343
+ this.data = null;
344
+ this.indent = indent;
345
+ this.newline = newline;
346
+ this.loadedFromDisk = false;
347
+ this.type = null;
348
+ this.yarnLock = null;
349
+ this.hiddenLockfile = hiddenLockfile;
350
+ this.loadingError = null;
351
+ this.resolveOptions = resolveOptions;
352
+ }
353
+
354
+ // check to see if a spec is present in the yarn.lock file, and if so,
355
+ // if we should use it, and what it should resolve to. This is only
356
+ // done when we did not load a shrinkwrap from disk. Also, decorate
357
+ // the options object if provided with the resolved and integrity that
358
+ // we expect.
359
+ checkYarnLock(spec, options = {}) {
360
+ spec = npa(spec);
361
+ const { yarnLock, loadedFromDisk } = this;
362
+ const useYarnLock = yarnLock && !loadedFromDisk;
363
+ const fromYarn = useYarnLock && yarnLock.entries.get(spec.raw);
364
+ if (fromYarn && fromYarn.version) {
365
+ // if it's the yarn or npm default registry, use the version as
366
+ // our effective spec. if it's any other kind of thing, use that.
367
+ const { resolved, version, integrity } = fromYarn;
368
+ const isYarnReg = spec.registry && yarnRegRe.test(resolved);
369
+ const isnpmReg = spec.registry && !isYarnReg && npmRegRe.test(resolved);
370
+ const isReg = isnpmReg || isYarnReg;
371
+ // don't use the simple version if the "registry" url is
372
+ // something else entirely!
373
+ const tgz = (isReg && versionFromTgz(spec.name, resolved)) || {};
374
+ let yspec = resolved;
375
+ if (tgz.name === spec.name && tgz.version === version) {
376
+ yspec = version;
377
+ } else if (isReg && tgz.name && tgz.version) {
378
+ yspec = `npm:${tgz.name}@${tgz.version}`;
379
+ }
380
+ if (yspec) {
381
+ options.resolved = resolved.replace(
382
+ yarnRegRe,
383
+ "https://registry.npmjs.org/",
384
+ );
385
+ options.integrity = integrity;
386
+ return npa(`${spec.name}@${yspec}`);
387
+ }
388
+ }
389
+ return spec;
390
+ }
391
+
392
+ // throw away the shrinkwrap data so we can start fresh
393
+ // still worth doing a load() first so we know which files to write.
394
+ reset() {
395
+ this.tree = null;
396
+ this.#awaitingUpdate = new Map();
397
+ this.packageExtensionsHash = null;
398
+ this.npmExtensionHash = null;
399
+ const lockfileVersion = this.lockfileVersion || defaultLockfileVersion;
400
+ this.originalLockfileVersion = lockfileVersion;
401
+
402
+ this.data = {
403
+ lockfileVersion,
404
+ requires: true,
405
+ packages: {},
406
+ dependencies: {},
407
+ };
408
+ }
409
+
410
+ // files to potentially read from and write to, in order of priority
411
+ get #filenameSet() {
412
+ if (this.hiddenLockfile) {
413
+ return [`${this.path}/node_modules/.package-lock.json`];
414
+ }
415
+ return [`${this.path}/package-lock.json`, `${this.path}/yarn.lock`];
416
+ }
417
+
418
+ get loadFiles() {
419
+ return Promise.all(
420
+ this.#filenameSet.map(
421
+ (file) =>
422
+ file &&
423
+ readFile(file, "utf8").then(
424
+ (d) => d,
425
+ (er) => {
426
+ /* istanbul ignore else - can't test without breaking module itself */
427
+ if (er.code === "ENOENT") {
428
+ return "";
429
+ } else {
430
+ throw er;
431
+ }
432
+ },
433
+ ),
434
+ ),
435
+ );
436
+ }
437
+
438
+ get resetFiles() {
439
+ // slice out yarn, we only care about the package-lock when checking
440
+ // this way, since we're not actually loading the full lock metadata
441
+ return Promise.all(
442
+ this.#filenameSet.slice(0, 1).map(
443
+ (file) =>
444
+ file &&
445
+ stat(file).then(
446
+ (st) => st.isFile(),
447
+ (er) => {
448
+ /* istanbul ignore else - can't test without breaking module itself */
449
+ if (er.code === "ENOENT") {
450
+ return null;
451
+ } else {
452
+ throw er;
453
+ }
454
+ },
455
+ ),
456
+ ),
457
+ );
458
+ }
459
+
460
+ inferFormattingOptions(packageJSONData) {
461
+ const { [Symbol.for("indent")]: indent, [Symbol.for("newline")]: newline } =
462
+ packageJSONData;
463
+ if (indent !== undefined) {
464
+ this.indent = indent;
465
+ }
466
+ if (newline !== undefined) {
467
+ this.newline = newline;
468
+ }
469
+ }
470
+
471
+ async load() {
472
+ let data;
473
+ try {
474
+ const [lock, yarn] = await this.loadFiles;
475
+ data = lock || "{}";
476
+
477
+ if (this.hiddenLockfile) {
478
+ this.filename = resolve(this.path, "node_modules/.package-lock.json");
479
+ } else {
480
+ this.filename = resolve(this.path, "package-lock.json");
481
+ }
482
+ this.type = basename(this.filename);
483
+ this.loadedFromDisk = Boolean(lock);
484
+
485
+ if (yarn) {
486
+ this.yarnLock = new YarnLock();
487
+ // ignore invalid yarn data. we'll likely clobber it later anyway.
488
+ try {
489
+ this.yarnLock.parse(yarn);
490
+ } catch {
491
+ // ignore errors
492
+ }
493
+ }
494
+
495
+ data = parseJSON(data);
496
+ this.inferFormattingOptions(data);
497
+
498
+ if (this.hiddenLockfile && data.packages) {
499
+ // add a few ms just to account for jitter
500
+ const lockTime = +(await stat(this.filename)).mtime + 10;
501
+ await assertNoNewer(this.path, data, lockTime, this.path, new Set());
502
+ }
503
+
504
+ // all good! hidden lockfile is the newest thing in here.
505
+ } catch (er) {
506
+ /* istanbul ignore else */
507
+ if (typeof this.filename === "string") {
508
+ const rel = relpath(this.path, this.filename);
509
+ log.verbose("shrinkwrap", `failed to load ${rel}`, er.message);
510
+ } else {
511
+ log.verbose("shrinkwrap", `failed to load ${this.path}`, er.message);
512
+ }
513
+ this.loadingError = er;
514
+ this.loadedFromDisk = false;
515
+ this.ancientLockfile = false;
516
+ data = {};
517
+ }
518
+ // refuse lockfiles newer than we understand so we never drop a patched or repaired graph we cannot read
519
+ if (data.lockfileVersion > maxLockfileVersion) {
520
+ throw Object.assign(
521
+ new Error(
522
+ `Unsupported lockfileVersion ${data.lockfileVersion}. This npm only supports up to ${maxLockfileVersion}. Please upgrade npm.`,
523
+ ),
524
+ { code: "ELOCKFILEVERSION" },
525
+ );
526
+ }
527
+ // auto convert v1 lockfiles to v3
528
+ // leave v2 in place unless configured
529
+ // v3 by default
530
+ let lockfileVersion = defaultLockfileVersion;
531
+ if (this.lockfileVersion) {
532
+ lockfileVersion = this.lockfileVersion;
533
+ } else if (data.lockfileVersion && data.lockfileVersion !== 1) {
534
+ lockfileVersion = data.lockfileVersion;
535
+ }
536
+
537
+ this.data = {
538
+ ...data,
539
+ lockfileVersion,
540
+ requires: true,
541
+ packages: data.packages || {},
542
+ dependencies: data.dependencies || {},
543
+ };
544
+
545
+ this.originalLockfileVersion = data.lockfileVersion;
546
+
547
+ // the canonical packageExtensions hash, if the lockfile recorded one on its root entry
548
+ this.packageExtensionsHash =
549
+ data.packages?.[""]?.packageExtensionsHash || null;
550
+ // the .npm-extension file hash, if the lockfile recorded one on its root entry
551
+ this.npmExtensionHash = data.packages?.[""]?.npmExtensionHash || null;
552
+
553
+ // use default if it wasn't explicitly set, and the current file is
554
+ // less than our default. otherwise, keep whatever is in the file,
555
+ // unless we had an explicit setting already.
556
+ if (!this.lockfileVersion) {
557
+ this.lockfileVersion = this.data.lockfileVersion = lockfileVersion;
558
+ }
559
+ this.ancientLockfile =
560
+ this.loadedFromDisk && !(data.lockfileVersion >= 2) && !data.requires;
561
+
562
+ // load old lockfile deps into the packages listing
563
+ if (data.dependencies && !data.packages) {
564
+ let pkg;
565
+ try {
566
+ pkg = await pkgJson.normalize(this.path);
567
+ pkg = pkg.content;
568
+ } catch {
569
+ pkg = {};
570
+ }
571
+ this.#loadAll("", null, this.data);
572
+ this.#fixDependencies(pkg);
573
+ }
574
+ return this;
575
+ }
576
+
577
+ #loadAll(location, name, lock) {
578
+ // migrate a v1 package lock to the new format.
579
+ const meta = this.#metaFromLock(location, name, lock);
580
+ // dependencies nested under a link are actually under the link target
581
+ if (meta.link) {
582
+ location = meta.resolved;
583
+ }
584
+ if (lock.dependencies) {
585
+ for (const name in lock.dependencies) {
586
+ const loc = location + (location ? "/" : "") + "node_modules/" + name;
587
+ this.#loadAll(loc, name, lock.dependencies[name]);
588
+ }
589
+ }
590
+ }
591
+
592
+ // v1 lockfiles track the optional/dev flags, but they don't tell us
593
+ // which thing had what kind of dep on what other thing, so we need
594
+ // to correct that now, or every link will be considered prod
595
+ #fixDependencies(pkg) {
596
+ // we need the root package.json because legacy shrinkwraps just
597
+ // have requires:true at the root level, which is even less useful
598
+ // than merging all dep types into one object.
599
+ const root = this.data.packages[""];
600
+ for (const key of pkgMetaKeys) {
601
+ const val = metaFieldFromPkg(pkg, key);
602
+ if (val) {
603
+ root[key.replace(/^_/, "")] = val;
604
+ }
605
+ }
606
+
607
+ for (const loc in this.data.packages) {
608
+ const meta = this.data.packages[loc];
609
+ if (!meta.requires || !loc) {
610
+ continue;
611
+ }
612
+
613
+ // resolve each require to a meta entry
614
+ // if this node isn't optional, but the dep is, then it's an optionalDep
615
+ // likewise for dev deps.
616
+ // This isn't perfect, but it's a pretty good approximation, and at
617
+ // least gets us out of having all 'prod' edges, which throws off the
618
+ // buildIdealTree process
619
+ for (const name in meta.requires) {
620
+ const dep = this.#resolveMetaNode(loc, name);
621
+ // this overwrites the false value set above
622
+ // default to dependencies if the dep just isn't in the tree, which
623
+ // maybe should be an error, since it means that the shrinkwrap is
624
+ // invalid, but we can't do much better without any info.
625
+ let depType = "dependencies";
626
+ /* istanbul ignore else - dev deps are only for the root level */
627
+ if (dep?.optional && !meta.optional) {
628
+ depType = "optionalDependencies";
629
+ } else if (dep?.dev && !meta.dev) {
630
+ // XXX is this even reachable?
631
+ depType = "devDependencies";
632
+ }
633
+ if (!meta[depType]) {
634
+ meta[depType] = {};
635
+ }
636
+ meta[depType][name] = meta.requires[name];
637
+ }
638
+ delete meta.requires;
639
+ }
640
+ }
641
+
642
+ #resolveMetaNode(loc, name) {
643
+ for (let path = loc; true; path = path.replace(/(^|\/)[^/]*$/, "")) {
644
+ const check = `${path}${path ? "/" : ""}node_modules/${name}`;
645
+ if (this.data.packages[check]) {
646
+ return this.data.packages[check];
647
+ }
648
+
649
+ if (!path) {
650
+ break;
651
+ }
652
+ }
653
+ return null;
654
+ }
655
+
656
+ #lockFromLoc(lock, path, i = 0) {
657
+ if (!lock) {
658
+ return null;
659
+ }
660
+
661
+ if (path[i] === "") {
662
+ i++;
663
+ }
664
+
665
+ if (i >= path.length) {
666
+ return lock;
667
+ }
668
+
669
+ if (!lock.dependencies) {
670
+ return null;
671
+ }
672
+
673
+ return this.#lockFromLoc(lock.dependencies[path[i]], path, i + 1);
674
+ }
675
+
676
+ // pass in a path relative to the root path, or an absolute path,
677
+ // get back a /-normalized location based on root path.
678
+ #pathToLoc(path) {
679
+ return relpath(this.path, resolve(this.path, path));
680
+ }
681
+
682
+ delete(nodePath) {
683
+ if (!this.data) {
684
+ throw new Error("run load() before getting or setting data");
685
+ }
686
+ const location = this.#pathToLoc(nodePath);
687
+ this.#awaitingUpdate.delete(location);
688
+
689
+ delete this.data.packages[location];
690
+ const path = location.split(/(?:^|\/)node_modules\//);
691
+ const name = path.pop();
692
+ const pLock = this.#lockFromLoc(this.data, path);
693
+ if (pLock && pLock.dependencies) {
694
+ delete pLock.dependencies[name];
695
+ }
696
+ }
697
+
698
+ get(nodePath) {
699
+ if (!this.data) {
700
+ throw new Error("run load() before getting or setting data");
701
+ }
702
+
703
+ const location = this.#pathToLoc(nodePath);
704
+ if (this.#awaitingUpdate.has(location)) {
705
+ this.#updateWaitingNode(location);
706
+ }
707
+
708
+ // first try to get from the newer spot, which we know has
709
+ // all the things we need.
710
+ if (this.data.packages[location]) {
711
+ return this.data.packages[location];
712
+ }
713
+
714
+ // otherwise, fall back to the legacy metadata, and hope for the best
715
+ // get the node in the shrinkwrap corresponding to this spot
716
+ const path = location.split(/(?:^|\/)node_modules\//);
717
+ const name = path[path.length - 1];
718
+ const lock = this.#lockFromLoc(this.data, path);
719
+
720
+ return this.#metaFromLock(location, name, lock);
721
+ }
722
+
723
+ #metaFromLock(location, name, lock) {
724
+ // This function tries as hard as it can to figure out the metadata
725
+ // from a lockfile which may be outdated or incomplete. Since v1
726
+ // lockfiles used the "version" field to contain a variety of
727
+ // different possible types of data, this gets a little complicated.
728
+ if (!lock) {
729
+ return {};
730
+ }
731
+
732
+ // try to figure out a npm-package-arg spec from the lockfile entry
733
+ // This will return null if we could not get anything valid out of it.
734
+ const spec = specFromLock(name, lock, this.path);
735
+
736
+ if (spec.type === "directory") {
737
+ // the "version" was a file: url to a non-tarball path
738
+ // this is a symlink dep. We don't store much metadata
739
+ // about symlinks, just the target.
740
+ const target = relpath(this.path, spec.fetchSpec);
741
+ this.data.packages[location] = {
742
+ link: true,
743
+ resolved: target,
744
+ };
745
+ // also save the link target, omitting version since we don't know
746
+ // what it is, but we know it isn't a link to itself!
747
+ if (!this.data.packages[target]) {
748
+ this.#metaFromLock(target, name, { ...lock, version: null });
749
+ }
750
+ return this.data.packages[location];
751
+ }
752
+
753
+ const meta = {};
754
+ // when calling loadAll we'll change these into proper dep objects
755
+ if (lock.requires && typeof lock.requires === "object") {
756
+ meta.requires = lock.requires;
757
+ }
758
+
759
+ if (lock.optional) {
760
+ meta.optional = true;
761
+ }
762
+ if (lock.dev) {
763
+ meta.dev = true;
764
+ }
765
+
766
+ // the root will typically have a name from the root project's
767
+ // package.json file.
768
+ if (location === "") {
769
+ meta.name = lock.name;
770
+ }
771
+
772
+ // if we have integrity, save it now.
773
+ if (lock.integrity) {
774
+ meta.integrity = lock.integrity;
775
+ }
776
+
777
+ if (lock.version && !lock.integrity) {
778
+ // this is usually going to be a git url or symlink, but it could
779
+ // also be a registry dependency that did not have integrity at
780
+ // the time it was saved.
781
+ // Symlinks were already handled above, so that leaves git.
782
+ //
783
+ // For git, always save the full SSH url. we'll actually fetch the
784
+ // tgz most of the time, since it's faster, but it won't work for
785
+ // private repos, and we can't get back to the ssh from the tgz,
786
+ // so we store the ssh instead.
787
+ // For unknown git hosts, just resolve to the raw spec in lock.version
788
+ if (spec.type === "git") {
789
+ meta.resolved = consistentResolve(spec, this.path, this.path);
790
+
791
+ // return early because there is nothing else we can do with this
792
+ return (this.data.packages[location] = meta);
793
+ } else if (spec.registry) {
794
+ // registry dep that didn't save integrity. grab the version, and
795
+ // fall through to pick up the resolved and potentially name.
796
+ meta.version = lock.version;
797
+ }
798
+ // only other possible case is a tarball without integrity.
799
+ // fall through to do what we can with the filename later.
800
+ }
801
+
802
+ // at this point, we know that the spec is either a registry dep
803
+ // (ie, version, because locking, which means a resolved url),
804
+ // or a remote dep, or file: url. Remote deps and file urls
805
+ // have a fetchSpec equal to the fully resolved thing.
806
+ // Registry deps, we take what's in the lockfile.
807
+ if (lock.resolved || (spec.type && !spec.registry)) {
808
+ if (spec.registry) {
809
+ meta.resolved = lock.resolved;
810
+ } else if (spec.type === "file") {
811
+ meta.resolved = consistentResolve(spec, this.path, this.path, true);
812
+ } else if (spec.fetchSpec) {
813
+ meta.resolved = spec.fetchSpec;
814
+ }
815
+ }
816
+
817
+ // at this point, if still we don't have a version, do our best to
818
+ // infer it from the tarball url/file. This works a surprising
819
+ // amount of the time, even though it's not guaranteed.
820
+ if (!meta.version) {
821
+ if (spec.type === "file" || spec.type === "remote") {
822
+ const fromTgz =
823
+ versionFromTgz(spec.name, spec.fetchSpec) ||
824
+ versionFromTgz(spec.name, meta.resolved);
825
+ if (fromTgz) {
826
+ meta.version = fromTgz.version;
827
+ if (fromTgz.name !== name) {
828
+ meta.name = fromTgz.name;
829
+ }
830
+ }
831
+ } else if (spec.type === "alias") {
832
+ meta.name = spec.subSpec.name;
833
+ meta.version = spec.subSpec.fetchSpec;
834
+ } else if (spec.type === "version") {
835
+ meta.version = spec.fetchSpec;
836
+ }
837
+ // ok, I did my best! good luck!
838
+ }
839
+
840
+ if (lock.bundled) {
841
+ meta.inBundle = true;
842
+ }
843
+
844
+ // save it for next time
845
+ return (this.data.packages[location] = meta);
846
+ }
847
+
848
+ add(node) {
849
+ if (!this.data) {
850
+ throw new Error("run load() before getting or setting data");
851
+ }
852
+
853
+ // will be actually updated on read
854
+ const loc = relpath(this.path, node.path);
855
+ if (node.path === this.path) {
856
+ this.tree = node;
857
+ }
858
+
859
+ // if we have metadata about this node, and it's a match, then
860
+ // try to decorate it.
861
+ if (node.resolved === null || node.integrity === null) {
862
+ const { resolved, integrity, version } = this.get(node.path);
863
+
864
+ let pathFixed = null;
865
+ if (resolved) {
866
+ if (!/^file:/.test(resolved)) {
867
+ pathFixed = resolved;
868
+ } else {
869
+ pathFixed = `file:${resolve(this.path, resolved.slice(5))}`;
870
+ }
871
+ }
872
+
873
+ // if we have one, only set the other if it matches
874
+ // otherwise it could be for a completely different thing.
875
+ const resolvedOk =
876
+ !resolved || !node.resolved || node.resolved === pathFixed;
877
+ const integrityOk =
878
+ !integrity || !node.integrity || node.integrity === integrity;
879
+ const versionOk = !version || !node.version || version === node.version;
880
+
881
+ const allOk =
882
+ (resolved || integrity || version) &&
883
+ resolvedOk &&
884
+ integrityOk &&
885
+ versionOk;
886
+
887
+ if (allOk) {
888
+ node.resolved = node.resolved || pathFixed || null;
889
+ node.integrity = node.integrity || integrity || null;
890
+ } else {
891
+ // try to read off the package or node itself
892
+ const { resolved, integrity } = Shrinkwrap.metaFromNode(
893
+ node,
894
+ this.path,
895
+ this.resolveOptions,
896
+ );
897
+ node.resolved = node.resolved || resolved || null;
898
+ node.integrity = node.integrity || integrity || null;
899
+ }
900
+ }
901
+ this.#awaitingUpdate.set(loc, node);
902
+ }
903
+
904
+ addEdge(edge) {
905
+ if (!this.yarnLock || !edge.valid) {
906
+ return;
907
+ }
908
+
909
+ const { to: node } = edge;
910
+
911
+ // if it's already set up, nothing to do
912
+ if (node.resolved !== null && node.integrity !== null) {
913
+ return;
914
+ }
915
+
916
+ // if the yarn lock is empty, nothing to do
917
+ if (!this.yarnLock.entries || !this.yarnLock.entries.size) {
918
+ return;
919
+ }
920
+
921
+ // we relativize the path here because that's how it shows up in the lock
922
+ // XXX why is this different from pathFixed in this.add??
923
+ let pathFixed = null;
924
+ if (node.resolved) {
925
+ if (!/file:/.test(node.resolved)) {
926
+ pathFixed = node.resolved;
927
+ } else {
928
+ pathFixed = consistentResolve(
929
+ node.resolved,
930
+ node.path,
931
+ this.path,
932
+ true,
933
+ );
934
+ }
935
+ }
936
+
937
+ const spec = npa(`${node.name}@${edge.spec}`);
938
+ const entry = this.yarnLock.entries.get(`${node.name}@${edge.spec}`);
939
+
940
+ if (
941
+ !entry ||
942
+ mismatch(node.version, entry.version) ||
943
+ mismatch(node.integrity, entry.integrity) ||
944
+ mismatch(pathFixed, entry.resolved)
945
+ ) {
946
+ return;
947
+ }
948
+
949
+ if (entry.resolved && yarnRegRe.test(entry.resolved) && spec.registry) {
950
+ entry.resolved = entry.resolved.replace(
951
+ yarnRegRe,
952
+ "https://registry.npmjs.org/",
953
+ );
954
+ }
955
+
956
+ node.integrity = node.integrity || entry.integrity || null;
957
+ node.resolved =
958
+ node.resolved ||
959
+ consistentResolve(entry.resolved, this.path, node.path) ||
960
+ null;
961
+
962
+ this.#awaitingUpdate.set(relpath(this.path, node.path), node);
963
+ }
964
+
965
+ #updateWaitingNode(loc) {
966
+ const node = this.#awaitingUpdate.get(loc);
967
+ this.#awaitingUpdate.delete(loc);
968
+ this.data.packages[loc] = Shrinkwrap.metaFromNode(
969
+ node,
970
+ this.path,
971
+ this.resolveOptions,
972
+ );
973
+ }
974
+
975
+ commit() {
976
+ if (this.tree) {
977
+ if (this.yarnLock) {
978
+ this.yarnLock.fromTree(this.tree);
979
+ }
980
+ const root = Shrinkwrap.metaFromNode(
981
+ this.tree.target,
982
+ this.path,
983
+ this.resolveOptions,
984
+ );
985
+ // record the canonical packageExtensions hash on the root entry so npm ci can detect stale extension state
986
+ if (this.packageExtensionsHash) {
987
+ root.packageExtensionsHash = this.packageExtensionsHash;
988
+ }
989
+ // record the .npm-extension file hash on the root entry for the same reason
990
+ if (this.npmExtensionHash) {
991
+ root.npmExtensionHash = this.npmExtensionHash;
992
+ }
993
+ this.data.packages = {};
994
+ if (Object.keys(root).length) {
995
+ this.data.packages[""] = root;
996
+ }
997
+ for (const node of this.tree.root.inventory.values()) {
998
+ // only way this.tree is not root is if the root is a link to it
999
+ if (node === this.tree || node.isRoot || node.location === "") {
1000
+ continue;
1001
+ }
1002
+ const loc = relpath(this.path, node.path);
1003
+ // Drop lockfile entries for extraneous nodes outside node_modules that
1004
+ // are direct fsChildren of the root (or detached link targets). These
1005
+ // are stale top-level entries: a workspace or file: dep removed from
1006
+ // the root manifest, or whose directory was deleted. Extraneous
1007
+ // fsChildren nested under another package (e.g. a file: dep of another
1008
+ // file: dep) are kept so `npm ci` can resolve the parent's dependency.
1009
+ if (
1010
+ node.extraneous &&
1011
+ !/(^|\/)node_modules\//.test(loc) &&
1012
+ loc !== "node_modules" &&
1013
+ (!node.fsParent || node.fsParent.isRoot)
1014
+ ) {
1015
+ continue;
1016
+ }
1017
+ const meta = Shrinkwrap.metaFromNode(
1018
+ node,
1019
+ this.path,
1020
+ this.resolveOptions,
1021
+ );
1022
+ // Skip inert nodes — these are optional deps that failed to load
1023
+ // (e.g. 404 from a proxy registry that hasn't cached the package,
1024
+ // or incomplete manifest missing version field).
1025
+ // #pruneFailedOptional marks them inert so they won't be reified;
1026
+ // writing them to the lockfile produces invalid entries like
1027
+ // {"optional": true} that cause "Invalid Version:" errors.
1028
+ if (node.inert && !node.package.version) {
1029
+ continue;
1030
+ }
1031
+ this.data.packages[loc] = meta;
1032
+ }
1033
+ } else if (this.#awaitingUpdate.size > 0) {
1034
+ for (const loc of this.#awaitingUpdate.keys()) {
1035
+ this.#updateWaitingNode(loc);
1036
+ }
1037
+ }
1038
+
1039
+ // if we haven't set it by now, use the default
1040
+ if (!this.lockfileVersion) {
1041
+ this.lockfileVersion = defaultLockfileVersion;
1042
+ }
1043
+ // patched nodes force lockfileVersion 4 so older clients abort the install
1044
+ // the hidden lockfile is an internal cache pinned to version 3, so it never drives this upgrade
1045
+ const hasPatched =
1046
+ !this.hiddenLockfile &&
1047
+ Object.values(this.data.packages).some((p) => p.patched);
1048
+ if (hasPatched && this.lockfileVersion < patchedLockfileVersion) {
1049
+ log.warn(
1050
+ "shrinkwrap",
1051
+ `patchedDependencies requires lockfileVersion ${patchedLockfileVersion}; upgrading the lockfile from version ${this.lockfileVersion}.`,
1052
+ );
1053
+ this.lockfileVersion = patchedLockfileVersion;
1054
+ }
1055
+ // packageExtensions and .npm-extension state likewise force lockfileVersion 4 so older clients abort instead of dropping the repaired graph
1056
+ const hasExtensionState =
1057
+ !this.hiddenLockfile &&
1058
+ (this.packageExtensionsHash ||
1059
+ this.npmExtensionHash ||
1060
+ Object.values(this.data.packages).some(
1061
+ (p) => p.packageExtensionsApplied || p.npmExtensionApplied,
1062
+ ));
1063
+ if (
1064
+ hasExtensionState &&
1065
+ this.lockfileVersion < packageExtensionsLockfileVersion
1066
+ ) {
1067
+ log.warn(
1068
+ "shrinkwrap",
1069
+ `manifest extensions require lockfileVersion ${packageExtensionsLockfileVersion}; upgrading the lockfile from version ${this.lockfileVersion}.`,
1070
+ );
1071
+ this.lockfileVersion = packageExtensionsLockfileVersion;
1072
+ }
1073
+ this.data.lockfileVersion = this.lockfileVersion;
1074
+
1075
+ // hidden lockfiles don't include legacy metadata or a root entry
1076
+ if (this.hiddenLockfile) {
1077
+ delete this.data.packages[""];
1078
+ delete this.data.dependencies;
1079
+ } else if (this.tree && this.lockfileVersion <= 3) {
1080
+ this.#buildLegacyLockfile(this.tree, this.data);
1081
+ }
1082
+
1083
+ // lf version 1 = dependencies only
1084
+ // lf version 2 = dependencies and packages
1085
+ // lf version 3 = packages only
1086
+ if (this.lockfileVersion >= 3) {
1087
+ const { dependencies, ...data } = this.data;
1088
+ return data;
1089
+ } else if (this.lockfileVersion < 2) {
1090
+ const { packages, ...data } = this.data;
1091
+ return data;
1092
+ } else {
1093
+ return { ...this.data };
1094
+ }
1095
+ }
1096
+
1097
+ #buildLegacyLockfile(node, lock, path = []) {
1098
+ if (node === this.tree) {
1099
+ // the root node
1100
+ lock.name = node.packageName || node.name;
1101
+ if (node.version) {
1102
+ lock.version = node.version;
1103
+ }
1104
+ }
1105
+
1106
+ // npm v6 and before tracked 'from', meaning "the request that led
1107
+ // to this package being installed". However, that's inherently
1108
+ // racy and non-deterministic in a world where deps are deduped
1109
+ // ahead of fetch time. In order to maintain backwards compatibility
1110
+ // with v6 in the lockfile, we do this trick where we pick a valid
1111
+ // dep link out of the edgesIn set. Choose the edge with the fewest
1112
+ // number of `node_modules` sections in the requestor path, and then
1113
+ // lexically sort afterwards.
1114
+ const edge = [...node.edgesIn]
1115
+ .filter((e) => e.valid)
1116
+ .sort((a, b) => {
1117
+ const aloc = a.from.location.split("node_modules");
1118
+ const bloc = b.from.location.split("node_modules");
1119
+ /* istanbul ignore next - sort calling order is indeterminate */
1120
+ if (aloc.length > bloc.length) {
1121
+ return 1;
1122
+ }
1123
+ if (bloc.length > aloc.length) {
1124
+ return -1;
1125
+ }
1126
+ return localeCompare(aloc[aloc.length - 1], bloc[bloc.length - 1]);
1127
+ })[0];
1128
+
1129
+ const res = consistentResolve(node.resolved, this.path, this.path, true);
1130
+ const rSpec = specFromResolved(res);
1131
+
1132
+ // if we don't have anything (ie, it's extraneous) then use the resolved
1133
+ // value as if that was where we got it from, since at least it's true.
1134
+ // if we don't have either, just an empty object so nothing matches below.
1135
+ // This will effectively just save the version and resolved, as if it's
1136
+ // a standard version/range dep, which is a reasonable default.
1137
+ let spec = rSpec;
1138
+ if (edge) {
1139
+ spec = npa.resolve(node.name, edge.spec, edge.from.realpath);
1140
+ }
1141
+
1142
+ if (node.isLink) {
1143
+ lock.version = `file:${relpath(this.path, node.realpath)}`;
1144
+ } else if (spec && (spec.type === "file" || spec.type === "remote")) {
1145
+ lock.version = spec.saveSpec;
1146
+ } else if ((spec && spec.type === "git") || rSpec.type === "git") {
1147
+ lock.version = node.resolved;
1148
+ /* istanbul ignore else - don't think there are any cases where a git
1149
+ * spec (or indeed, ANY npa spec) doesn't have a .raw member */
1150
+ if (spec.raw) {
1151
+ lock.from = spec.raw;
1152
+ }
1153
+ } else if (
1154
+ !node.isRoot &&
1155
+ node.package &&
1156
+ node.packageName &&
1157
+ node.packageName !== node.name
1158
+ ) {
1159
+ lock.version = `npm:${node.packageName}@${node.version}`;
1160
+ } else if (node.package && node.version) {
1161
+ lock.version = node.version;
1162
+ }
1163
+
1164
+ if (node.inDepBundle) {
1165
+ lock.bundled = true;
1166
+ }
1167
+
1168
+ // when we didn't resolve to git, file, or dir, and didn't request
1169
+ // git, file, dir, or remote, then the resolved value is necessary.
1170
+ if (
1171
+ node.resolved &&
1172
+ !node.isLink &&
1173
+ rSpec.type !== "git" &&
1174
+ rSpec.type !== "file" &&
1175
+ rSpec.type !== "directory" &&
1176
+ spec.type !== "directory" &&
1177
+ spec.type !== "git" &&
1178
+ spec.type !== "file" &&
1179
+ spec.type !== "remote"
1180
+ ) {
1181
+ lock.resolved = overrideResolves(node.resolved, this.resolveOptions);
1182
+ }
1183
+
1184
+ if (node.integrity) {
1185
+ lock.integrity = node.integrity;
1186
+ }
1187
+
1188
+ if (node.extraneous) {
1189
+ lock.extraneous = true;
1190
+ } else if (!node.isLink) {
1191
+ if (node.peer) {
1192
+ lock.peer = true;
1193
+ }
1194
+
1195
+ if (node.devOptional && !node.dev && !node.optional) {
1196
+ lock.devOptional = true;
1197
+ }
1198
+
1199
+ if (node.dev) {
1200
+ lock.dev = true;
1201
+ }
1202
+
1203
+ if (node.optional) {
1204
+ lock.optional = true;
1205
+ }
1206
+ }
1207
+
1208
+ const depender = node.target;
1209
+ if (depender.edgesOut.size > 0) {
1210
+ if (node !== this.tree) {
1211
+ const entries = [...depender.edgesOut.entries()];
1212
+ lock.requires = entries.reduce((set, [k, v]) => {
1213
+ // omit peer deps from legacy lockfile requires field, because
1214
+ // npm v6 doesn't handle peer deps, and this triggers some bad
1215
+ // behavior if the dep can't be found in the dependencies list.
1216
+ const { spec, peer } = v;
1217
+ if (peer) {
1218
+ return set;
1219
+ }
1220
+ if (spec.startsWith("file:")) {
1221
+ // turn absolute file: paths into relative paths from the node
1222
+ // this especially shows up with workspace edges when the root
1223
+ // node is also a workspace in the set.
1224
+ const p = resolve(node.realpath, spec.slice("file:".length));
1225
+ set[k] = `file:${relpath(node.realpath, p)}`;
1226
+ } else {
1227
+ set[k] = spec;
1228
+ }
1229
+ return set;
1230
+ }, {});
1231
+ } else {
1232
+ lock.requires = true;
1233
+ }
1234
+ }
1235
+
1236
+ // now we walk the children, putting them in the 'dependencies' object
1237
+ const { children } = node.target;
1238
+ if (!children.size) {
1239
+ delete lock.dependencies;
1240
+ } else {
1241
+ const kidPath = [...path, node.realpath];
1242
+ const dependencies = {};
1243
+ // skip any that are already in the descent path, so cyclical link
1244
+ // dependencies don't blow up with ELOOP.
1245
+ let found = false;
1246
+ for (const [name, kid] of children.entries()) {
1247
+ if (path.includes(kid.realpath)) {
1248
+ continue;
1249
+ }
1250
+ dependencies[name] = this.#buildLegacyLockfile(kid, {}, kidPath);
1251
+ found = true;
1252
+ }
1253
+ if (found) {
1254
+ lock.dependencies = dependencies;
1255
+ }
1256
+ }
1257
+ return lock;
1258
+ }
1259
+
1260
+ toJSON() {
1261
+ if (!this.data) {
1262
+ throw new Error("run load() before getting or setting data");
1263
+ }
1264
+
1265
+ return this.commit();
1266
+ }
1267
+
1268
+ save(options = {}) {
1269
+ if (!this.data) {
1270
+ throw new Error("run load() before saving data");
1271
+ }
1272
+
1273
+ // commit() sets properties, so it must run before the lockfile conversion
1274
+ // check below.
1275
+ this.commit();
1276
+ if (
1277
+ !this.hiddenLockfile &&
1278
+ this.originalLockfileVersion !== undefined &&
1279
+ this.originalLockfileVersion !== this.lockfileVersion
1280
+ ) {
1281
+ log.warn(
1282
+ "shrinkwrap",
1283
+ `Converting lock file (${relative(process.cwd(), this.filename)}) from v${this.originalLockfileVersion} -> v${this.lockfileVersion}`,
1284
+ );
1285
+ }
1286
+
1287
+ return Promise.resolve([]);
1288
+ }
1289
+ }
1290
+
1291
+ export default Shrinkwrap;