kirograph 0.19.0 → 0.20.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 (658) hide show
  1. package/README.md +10 -8
  2. package/dist/architecture/layers/dart.d.ts +10 -0
  3. package/dist/architecture/layers/dart.d.ts.map +1 -0
  4. package/dist/architecture/layers/elixir.d.ts +6 -0
  5. package/dist/architecture/layers/elixir.d.ts.map +1 -0
  6. package/dist/architecture/layers/index.d.ts.map +1 -1
  7. package/dist/architecture/layers/ocaml.d.ts +6 -0
  8. package/dist/architecture/layers/ocaml.d.ts.map +1 -0
  9. package/dist/architecture/layers/scala.d.ts +6 -0
  10. package/dist/architecture/layers/scala.d.ts.map +1 -0
  11. package/dist/architecture/layers/solidity.d.ts +6 -0
  12. package/dist/architecture/layers/solidity.d.ts.map +1 -0
  13. package/dist/architecture/layers/vue.d.ts +6 -0
  14. package/dist/architecture/layers/vue.d.ts.map +1 -0
  15. package/dist/architecture/manifest/elm.d.ts +3 -0
  16. package/dist/architecture/manifest/elm.d.ts.map +1 -0
  17. package/dist/architecture/manifest/index.d.ts.map +1 -1
  18. package/dist/architecture/manifest/ocaml.d.ts +3 -0
  19. package/dist/architecture/manifest/ocaml.d.ts.map +1 -0
  20. package/dist/architecture/manifest/scala.d.ts +3 -0
  21. package/dist/architecture/manifest/scala.d.ts.map +1 -0
  22. package/dist/bin/banner.d.ts.map +1 -1
  23. package/dist/bin/commands/affected.d.ts.map +1 -1
  24. package/dist/bin/commands/attack-surface.d.ts +3 -0
  25. package/dist/bin/commands/attack-surface.d.ts.map +1 -0
  26. package/dist/bin/commands/attack-surface.js +7 -0
  27. package/dist/bin/commands/attack-surface.js.map +2 -2
  28. package/dist/bin/commands/benchmark.d.ts +9 -0
  29. package/dist/bin/commands/benchmark.d.ts.map +1 -0
  30. package/dist/bin/commands/budget.d.ts +6 -0
  31. package/dist/bin/commands/budget.d.ts.map +1 -0
  32. package/dist/bin/commands/caveman.d.ts +7 -0
  33. package/dist/bin/commands/caveman.d.ts.map +1 -0
  34. package/dist/bin/commands/communities.d.ts +3 -0
  35. package/dist/bin/commands/communities.d.ts.map +1 -0
  36. package/dist/bin/commands/compression.d.ts +7 -0
  37. package/dist/bin/commands/compression.d.ts.map +1 -0
  38. package/dist/bin/commands/context.d.ts.map +1 -1
  39. package/dist/bin/commands/data.d.ts +3 -0
  40. package/dist/bin/commands/data.d.ts.map +1 -0
  41. package/dist/bin/commands/dead-code.d.ts +3 -0
  42. package/dist/bin/commands/dead-code.d.ts.map +1 -0
  43. package/dist/bin/commands/dep-confusion.d.ts +3 -0
  44. package/dist/bin/commands/dep-confusion.d.ts.map +1 -0
  45. package/dist/bin/commands/docs.d.ts +3 -0
  46. package/dist/bin/commands/docs.d.ts.map +1 -0
  47. package/dist/bin/commands/exec.d.ts +11 -0
  48. package/dist/bin/commands/exec.d.ts.map +1 -0
  49. package/dist/bin/commands/export.d.ts +3 -0
  50. package/dist/bin/commands/export.d.ts.map +1 -0
  51. package/dist/bin/commands/flows.d.ts +3 -0
  52. package/dist/bin/commands/flows.d.ts.map +1 -0
  53. package/dist/bin/commands/gain.d.ts +6 -0
  54. package/dist/bin/commands/gain.d.ts.map +1 -0
  55. package/dist/bin/commands/help.d.ts +7 -0
  56. package/dist/bin/commands/help.d.ts.map +1 -1
  57. package/dist/bin/commands/help.js +20 -3
  58. package/dist/bin/commands/help.js.map +2 -2
  59. package/dist/bin/commands/hotspots.d.ts +3 -0
  60. package/dist/bin/commands/hotspots.d.ts.map +1 -0
  61. package/dist/bin/commands/hotspots.js +94 -1
  62. package/dist/bin/commands/hotspots.js.map +3 -3
  63. package/dist/bin/commands/install.d.ts.map +1 -1
  64. package/dist/bin/commands/install.js +3 -3
  65. package/dist/bin/commands/install.js.map +2 -2
  66. package/dist/bin/commands/licenses.d.ts +3 -0
  67. package/dist/bin/commands/licenses.d.ts.map +1 -0
  68. package/dist/bin/commands/memory.d.ts +16 -0
  69. package/dist/bin/commands/memory.d.ts.map +1 -0
  70. package/dist/bin/commands/memory.js +151 -4
  71. package/dist/bin/commands/memory.js.map +2 -2
  72. package/dist/bin/commands/path.d.ts +3 -0
  73. package/dist/bin/commands/path.d.ts.map +1 -0
  74. package/dist/bin/commands/pattern.d.ts +3 -0
  75. package/dist/bin/commands/pattern.d.ts.map +1 -0
  76. package/dist/bin/commands/pattern.js +592 -0
  77. package/dist/bin/commands/pattern.js.map +7 -0
  78. package/dist/bin/commands/query.d.ts.map +1 -1
  79. package/dist/bin/commands/reachability.d.ts +3 -0
  80. package/dist/bin/commands/reachability.d.ts.map +1 -0
  81. package/dist/bin/commands/read.d.ts +6 -0
  82. package/dist/bin/commands/read.d.ts.map +1 -0
  83. package/dist/bin/commands/refactor.d.ts +3 -0
  84. package/dist/bin/commands/refactor.d.ts.map +1 -0
  85. package/dist/bin/commands/remediation.d.ts +3 -0
  86. package/dist/bin/commands/remediation.d.ts.map +1 -0
  87. package/dist/bin/commands/sbom.d.ts +3 -0
  88. package/dist/bin/commands/sbom.d.ts.map +1 -0
  89. package/dist/bin/commands/security-ci-report.d.ts +9 -0
  90. package/dist/bin/commands/security-ci-report.d.ts.map +1 -0
  91. package/dist/bin/commands/security-export.d.ts +2 -0
  92. package/dist/bin/commands/security-export.d.ts.map +1 -0
  93. package/dist/bin/commands/security-flows.d.ts +3 -0
  94. package/dist/bin/commands/security-flows.d.ts.map +1 -0
  95. package/dist/bin/commands/security-secrets.d.ts +3 -0
  96. package/dist/bin/commands/security-secrets.d.ts.map +1 -0
  97. package/dist/bin/commands/security.d.ts +3 -0
  98. package/dist/bin/commands/security.d.ts.map +1 -0
  99. package/dist/bin/commands/security.js +15 -0
  100. package/dist/bin/commands/security.js.map +2 -2
  101. package/dist/bin/commands/snapshot.d.ts +3 -0
  102. package/dist/bin/commands/snapshot.d.ts.map +1 -0
  103. package/dist/bin/commands/staleness.d.ts +3 -0
  104. package/dist/bin/commands/staleness.d.ts.map +1 -0
  105. package/dist/bin/commands/status.d.ts.map +1 -1
  106. package/dist/bin/commands/status.js +27 -0
  107. package/dist/bin/commands/status.js.map +2 -2
  108. package/dist/bin/commands/supply-chain.d.ts +3 -0
  109. package/dist/bin/commands/supply-chain.d.ts.map +1 -0
  110. package/dist/bin/commands/surprising.d.ts +3 -0
  111. package/dist/bin/commands/surprising.d.ts.map +1 -0
  112. package/dist/bin/commands/sync.d.ts.map +1 -1
  113. package/dist/bin/commands/uninit.d.ts.map +1 -1
  114. package/dist/bin/commands/utils.d.ts +5 -0
  115. package/dist/bin/commands/utils.d.ts.map +1 -1
  116. package/dist/bin/commands/vex.d.ts +3 -0
  117. package/dist/bin/commands/vex.d.ts.map +1 -0
  118. package/dist/bin/commands/vuln-suppress.d.ts +3 -0
  119. package/dist/bin/commands/vuln-suppress.d.ts.map +1 -0
  120. package/dist/bin/commands/vulns.d.ts +3 -0
  121. package/dist/bin/commands/vulns.d.ts.map +1 -0
  122. package/dist/bin/installer/archive.d.ts +47 -0
  123. package/dist/bin/installer/archive.d.ts.map +1 -0
  124. package/dist/bin/installer/auto-detect.d.ts +16 -0
  125. package/dist/bin/installer/auto-detect.d.ts.map +1 -0
  126. package/dist/bin/installer/caveman.d.ts +12 -0
  127. package/dist/bin/installer/caveman.d.ts.map +1 -0
  128. package/dist/bin/installer/cli-agent.d.ts +7 -2
  129. package/dist/bin/installer/cli-agent.d.ts.map +1 -1
  130. package/dist/bin/installer/cli-agent.js +6 -2
  131. package/dist/bin/installer/cli-agent.js.map +2 -2
  132. package/dist/bin/installer/common.d.ts +36 -0
  133. package/dist/bin/installer/common.d.ts.map +1 -0
  134. package/dist/bin/installer/common.js +2 -1
  135. package/dist/bin/installer/common.js.map +2 -2
  136. package/dist/bin/installer/config-prompt.d.ts +1 -1
  137. package/dist/bin/installer/config-prompt.d.ts.map +1 -1
  138. package/dist/bin/installer/config-prompt.js +74 -2
  139. package/dist/bin/installer/config-prompt.js.map +2 -2
  140. package/dist/bin/installer/dashboard.d.ts.map +1 -1
  141. package/dist/bin/installer/detect.d.ts +30 -0
  142. package/dist/bin/installer/detect.d.ts.map +1 -0
  143. package/dist/bin/installer/hooks.d.ts +4 -1
  144. package/dist/bin/installer/hooks.d.ts.map +1 -1
  145. package/dist/bin/installer/hooks.js +34 -0
  146. package/dist/bin/installer/hooks.js.map +2 -2
  147. package/dist/bin/installer/index.d.ts +5 -4
  148. package/dist/bin/installer/index.d.ts.map +1 -1
  149. package/dist/bin/installer/index.js +38 -8
  150. package/dist/bin/installer/index.js.map +2 -2
  151. package/dist/bin/installer/instructions.d.ts +14 -0
  152. package/dist/bin/installer/instructions.d.ts.map +1 -0
  153. package/dist/bin/installer/instructions.js +15 -1
  154. package/dist/bin/installer/instructions.js.map +2 -2
  155. package/dist/bin/installer/mcp.d.ts.map +1 -1
  156. package/dist/bin/installer/prompts.d.ts +17 -0
  157. package/dist/bin/installer/prompts.d.ts.map +1 -1
  158. package/dist/bin/installer/qdrant-dashboard.d.ts.map +1 -1
  159. package/dist/bin/installer/steering.d.ts +14 -2
  160. package/dist/bin/installer/steering.d.ts.map +1 -1
  161. package/dist/bin/installer/steering.js +81 -0
  162. package/dist/bin/installer/steering.js.map +2 -2
  163. package/dist/bin/installer/targets/aider.d.ts +6 -0
  164. package/dist/bin/installer/targets/aider.d.ts.map +1 -0
  165. package/dist/bin/installer/targets/aider.js +3 -3
  166. package/dist/bin/installer/targets/aider.js.map +2 -2
  167. package/dist/bin/installer/targets/amp.d.ts +6 -0
  168. package/dist/bin/installer/targets/amp.d.ts.map +1 -0
  169. package/dist/bin/installer/targets/amp.js +3 -3
  170. package/dist/bin/installer/targets/amp.js.map +2 -2
  171. package/dist/bin/installer/targets/antigravity.d.ts +13 -0
  172. package/dist/bin/installer/targets/antigravity.d.ts.map +1 -0
  173. package/dist/bin/installer/targets/antigravity.js +2 -2
  174. package/dist/bin/installer/targets/antigravity.js.map +2 -2
  175. package/dist/bin/installer/targets/augment.d.ts +6 -0
  176. package/dist/bin/installer/targets/augment.d.ts.map +1 -0
  177. package/dist/bin/installer/targets/augment.js +3 -3
  178. package/dist/bin/installer/targets/augment.js.map +2 -2
  179. package/dist/bin/installer/targets/claude.d.ts +6 -0
  180. package/dist/bin/installer/targets/claude.d.ts.map +1 -0
  181. package/dist/bin/installer/targets/claude.js +2 -2
  182. package/dist/bin/installer/targets/claude.js.map +2 -2
  183. package/dist/bin/installer/targets/cline.d.ts +13 -0
  184. package/dist/bin/installer/targets/cline.d.ts.map +1 -0
  185. package/dist/bin/installer/targets/cline.js +2 -2
  186. package/dist/bin/installer/targets/cline.js.map +2 -2
  187. package/dist/bin/installer/targets/codex.d.ts +6 -0
  188. package/dist/bin/installer/targets/codex.d.ts.map +1 -0
  189. package/dist/bin/installer/targets/codex.js +2 -2
  190. package/dist/bin/installer/targets/codex.js.map +2 -2
  191. package/dist/bin/installer/targets/continue.d.ts +12 -0
  192. package/dist/bin/installer/targets/continue.d.ts.map +1 -0
  193. package/dist/bin/installer/targets/continue.js +2 -2
  194. package/dist/bin/installer/targets/continue.js.map +2 -2
  195. package/dist/bin/installer/targets/copilot-cli.d.ts +12 -0
  196. package/dist/bin/installer/targets/copilot-cli.d.ts.map +1 -0
  197. package/dist/bin/installer/targets/copilot-cli.js +2 -2
  198. package/dist/bin/installer/targets/copilot-cli.js.map +2 -2
  199. package/dist/bin/installer/targets/copilot.d.ts +6 -0
  200. package/dist/bin/installer/targets/copilot.d.ts.map +1 -0
  201. package/dist/bin/installer/targets/copilot.js +2 -2
  202. package/dist/bin/installer/targets/copilot.js.map +2 -2
  203. package/dist/bin/installer/targets/cursor.d.ts +6 -0
  204. package/dist/bin/installer/targets/cursor.d.ts.map +1 -0
  205. package/dist/bin/installer/targets/cursor.js +2 -2
  206. package/dist/bin/installer/targets/cursor.js.map +2 -2
  207. package/dist/bin/installer/targets/devin.d.ts +13 -0
  208. package/dist/bin/installer/targets/devin.d.ts.map +1 -0
  209. package/dist/bin/installer/targets/devin.js +2 -2
  210. package/dist/bin/installer/targets/devin.js.map +2 -2
  211. package/dist/bin/installer/targets/gemini-cli.d.ts +16 -0
  212. package/dist/bin/installer/targets/gemini-cli.d.ts.map +1 -0
  213. package/dist/bin/installer/targets/gemini-cli.js +2 -2
  214. package/dist/bin/installer/targets/gemini-cli.js.map +2 -2
  215. package/dist/bin/installer/targets/generic.d.ts +59 -0
  216. package/dist/bin/installer/targets/generic.d.ts.map +1 -0
  217. package/dist/bin/installer/targets/generic.js +2 -2
  218. package/dist/bin/installer/targets/generic.js.map +2 -2
  219. package/dist/bin/installer/targets/goose.d.ts +6 -0
  220. package/dist/bin/installer/targets/goose.d.ts.map +1 -0
  221. package/dist/bin/installer/targets/goose.js +3 -3
  222. package/dist/bin/installer/targets/goose.js.map +2 -2
  223. package/dist/bin/installer/targets/index.d.ts +11 -0
  224. package/dist/bin/installer/targets/index.d.ts.map +1 -0
  225. package/dist/bin/installer/targets/index.js.map +1 -1
  226. package/dist/bin/installer/targets/junie.d.ts +13 -0
  227. package/dist/bin/installer/targets/junie.d.ts.map +1 -0
  228. package/dist/bin/installer/targets/junie.js +2 -2
  229. package/dist/bin/installer/targets/junie.js.map +2 -2
  230. package/dist/bin/installer/targets/kilo.d.ts +12 -0
  231. package/dist/bin/installer/targets/kilo.d.ts.map +1 -0
  232. package/dist/bin/installer/targets/kilo.js +2 -2
  233. package/dist/bin/installer/targets/kilo.js.map +2 -2
  234. package/dist/bin/installer/targets/kiro.d.ts +5 -0
  235. package/dist/bin/installer/targets/kiro.d.ts.map +1 -0
  236. package/dist/bin/installer/targets/kiro.js +4 -4
  237. package/dist/bin/installer/targets/kiro.js.map +2 -2
  238. package/dist/bin/installer/targets/opencode.d.ts +13 -0
  239. package/dist/bin/installer/targets/opencode.d.ts.map +1 -0
  240. package/dist/bin/installer/targets/opencode.js +2 -2
  241. package/dist/bin/installer/targets/opencode.js.map +2 -2
  242. package/dist/bin/installer/targets/openhands.d.ts +6 -0
  243. package/dist/bin/installer/targets/openhands.d.ts.map +1 -0
  244. package/dist/bin/installer/targets/openhands.js +3 -3
  245. package/dist/bin/installer/targets/openhands.js.map +2 -2
  246. package/dist/bin/installer/targets/qoder.d.ts +12 -0
  247. package/dist/bin/installer/targets/qoder.d.ts.map +1 -0
  248. package/dist/bin/installer/targets/qoder.js +2 -2
  249. package/dist/bin/installer/targets/qoder.js.map +2 -2
  250. package/dist/bin/installer/targets/qwen.d.ts +12 -0
  251. package/dist/bin/installer/targets/qwen.d.ts.map +1 -0
  252. package/dist/bin/installer/targets/qwen.js +2 -2
  253. package/dist/bin/installer/targets/qwen.js.map +2 -2
  254. package/dist/bin/installer/targets/replit.d.ts +6 -0
  255. package/dist/bin/installer/targets/replit.d.ts.map +1 -0
  256. package/dist/bin/installer/targets/replit.js +3 -3
  257. package/dist/bin/installer/targets/replit.js.map +2 -2
  258. package/dist/bin/installer/targets/roo.d.ts +13 -0
  259. package/dist/bin/installer/targets/roo.d.ts.map +1 -0
  260. package/dist/bin/installer/targets/roo.js +2 -2
  261. package/dist/bin/installer/targets/roo.js.map +2 -2
  262. package/dist/bin/installer/targets/tabnine.d.ts +6 -0
  263. package/dist/bin/installer/targets/tabnine.d.ts.map +1 -0
  264. package/dist/bin/installer/targets/tabnine.js +3 -3
  265. package/dist/bin/installer/targets/tabnine.js.map +2 -2
  266. package/dist/bin/installer/targets/trae.d.ts +6 -0
  267. package/dist/bin/installer/targets/trae.d.ts.map +1 -0
  268. package/dist/bin/installer/targets/trae.js +3 -3
  269. package/dist/bin/installer/targets/trae.js.map +2 -2
  270. package/dist/bin/installer/targets/warp.d.ts +12 -0
  271. package/dist/bin/installer/targets/warp.d.ts.map +1 -0
  272. package/dist/bin/installer/targets/warp.js +2 -2
  273. package/dist/bin/installer/targets/warp.js.map +2 -2
  274. package/dist/bin/installer/targets/windsurf.d.ts +13 -0
  275. package/dist/bin/installer/targets/windsurf.d.ts.map +1 -0
  276. package/dist/bin/installer/targets/windsurf.js +2 -2
  277. package/dist/bin/installer/targets/windsurf.js.map +2 -2
  278. package/dist/bin/kirograph.js +3 -1
  279. package/dist/bin/kirograph.js.map +3 -3
  280. package/dist/bin/progress.d.ts +16 -1
  281. package/dist/bin/progress.d.ts.map +1 -1
  282. package/dist/compression/filters/aws.d.ts +9 -0
  283. package/dist/compression/filters/aws.d.ts.map +1 -0
  284. package/dist/compression/filters/docker.d.ts +6 -0
  285. package/dist/compression/filters/docker.d.ts.map +1 -0
  286. package/dist/compression/filters/files.d.ts +6 -0
  287. package/dist/compression/filters/files.d.ts.map +1 -0
  288. package/dist/compression/filters/generic.d.ts +7 -0
  289. package/dist/compression/filters/generic.d.ts.map +1 -0
  290. package/dist/compression/filters/git.d.ts +6 -0
  291. package/dist/compression/filters/git.d.ts.map +1 -0
  292. package/dist/compression/filters/github.d.ts +6 -0
  293. package/dist/compression/filters/github.d.ts.map +1 -0
  294. package/dist/compression/filters/lint.d.ts +6 -0
  295. package/dist/compression/filters/lint.d.ts.map +1 -0
  296. package/dist/compression/filters/misc.d.ts +6 -0
  297. package/dist/compression/filters/misc.d.ts.map +1 -0
  298. package/dist/compression/filters/package.d.ts +6 -0
  299. package/dist/compression/filters/package.d.ts.map +1 -0
  300. package/dist/compression/filters/test.d.ts +6 -0
  301. package/dist/compression/filters/test.d.ts.map +1 -0
  302. package/dist/compression/index.d.ts +29 -0
  303. package/dist/compression/index.d.ts.map +1 -0
  304. package/dist/compression/naive-cost.d.ts +26 -0
  305. package/dist/compression/naive-cost.d.ts.map +1 -0
  306. package/dist/compression/tracker.d.ts +155 -0
  307. package/dist/compression/tracker.d.ts.map +1 -0
  308. package/dist/compression/types.d.ts +49 -0
  309. package/dist/compression/types.d.ts.map +1 -0
  310. package/dist/config.d.ts +90 -0
  311. package/dist/config.d.ts.map +1 -1
  312. package/dist/config.js +55 -1
  313. package/dist/config.js.map +2 -2
  314. package/dist/core/lock-manager.d.ts +2 -0
  315. package/dist/core/lock-manager.d.ts.map +1 -1
  316. package/dist/core/pipeline.d.ts +4 -1
  317. package/dist/core/pipeline.d.ts.map +1 -1
  318. package/dist/core/pipeline.js +42 -0
  319. package/dist/core/pipeline.js.map +2 -2
  320. package/dist/core/snapshot.d.ts +58 -0
  321. package/dist/core/snapshot.d.ts.map +1 -0
  322. package/dist/data/filters.d.ts +23 -0
  323. package/dist/data/filters.d.ts.map +1 -0
  324. package/dist/data/indexer.d.ts +25 -0
  325. package/dist/data/indexer.d.ts.map +1 -0
  326. package/dist/data/linker.d.ts +37 -0
  327. package/dist/data/linker.d.ts.map +1 -0
  328. package/dist/data/lint.d.ts +27 -0
  329. package/dist/data/lint.d.ts.map +1 -0
  330. package/dist/data/parsers/csv.d.ts +11 -0
  331. package/dist/data/parsers/csv.d.ts.map +1 -0
  332. package/dist/data/parsers/excel.d.ts +10 -0
  333. package/dist/data/parsers/excel.d.ts.map +1 -0
  334. package/dist/data/parsers/index.d.ts +28 -0
  335. package/dist/data/parsers/index.d.ts.map +1 -0
  336. package/dist/data/parsers/json-array.d.ts +9 -0
  337. package/dist/data/parsers/json-array.d.ts.map +1 -0
  338. package/dist/data/parsers/jsonl.d.ts +9 -0
  339. package/dist/data/parsers/jsonl.d.ts.map +1 -0
  340. package/dist/data/parsers/parquet.d.ts +10 -0
  341. package/dist/data/parsers/parquet.d.ts.map +1 -0
  342. package/dist/data/profiler.d.ts +29 -0
  343. package/dist/data/profiler.d.ts.map +1 -0
  344. package/dist/data/queries.d.ts +95 -0
  345. package/dist/data/queries.d.ts.map +1 -0
  346. package/dist/data/types.d.ts +103 -0
  347. package/dist/data/types.d.ts.map +1 -0
  348. package/dist/db/database.d.ts +57 -0
  349. package/dist/db/database.d.ts.map +1 -1
  350. package/dist/db/database.js +19 -0
  351. package/dist/db/database.js.map +2 -2
  352. package/dist/db/patterns-schema.sql +23 -0
  353. package/dist/docs/formats/asciidoc.d.ts +9 -0
  354. package/dist/docs/formats/asciidoc.d.ts.map +1 -0
  355. package/dist/docs/formats/html.d.ts +10 -0
  356. package/dist/docs/formats/html.d.ts.map +1 -0
  357. package/dist/docs/formats/index.d.ts +31 -0
  358. package/dist/docs/formats/index.d.ts.map +1 -0
  359. package/dist/docs/formats/markdown.d.ts +11 -0
  360. package/dist/docs/formats/markdown.d.ts.map +1 -0
  361. package/dist/docs/formats/openapi.d.ts +17 -0
  362. package/dist/docs/formats/openapi.d.ts.map +1 -0
  363. package/dist/docs/formats/org.d.ts +9 -0
  364. package/dist/docs/formats/org.d.ts.map +1 -0
  365. package/dist/docs/formats/plaintext.d.ts +11 -0
  366. package/dist/docs/formats/plaintext.d.ts.map +1 -0
  367. package/dist/docs/formats/rdoc.d.ts +10 -0
  368. package/dist/docs/formats/rdoc.d.ts.map +1 -0
  369. package/dist/docs/formats/rst.d.ts +11 -0
  370. package/dist/docs/formats/rst.d.ts.map +1 -0
  371. package/dist/docs/indexer.d.ts +49 -0
  372. package/dist/docs/indexer.d.ts.map +1 -0
  373. package/dist/docs/linker.d.ts +30 -0
  374. package/dist/docs/linker.d.ts.map +1 -0
  375. package/dist/docs/lint.d.ts +27 -0
  376. package/dist/docs/lint.d.ts.map +1 -0
  377. package/dist/docs/queries.d.ts +78 -0
  378. package/dist/docs/queries.d.ts.map +1 -0
  379. package/dist/docs/section-id.d.ts +48 -0
  380. package/dist/docs/section-id.d.ts.map +1 -0
  381. package/dist/docs/summarizer.d.ts +13 -0
  382. package/dist/docs/summarizer.d.ts.map +1 -0
  383. package/dist/docs/types.d.ts +71 -0
  384. package/dist/docs/types.d.ts.map +1 -0
  385. package/dist/docs/vectors.d.ts +54 -0
  386. package/dist/docs/vectors.d.ts.map +1 -0
  387. package/dist/extraction/extractor.d.ts +1 -1
  388. package/dist/extraction/extractor.d.ts.map +1 -1
  389. package/dist/extraction/grammars.d.ts +6 -0
  390. package/dist/extraction/grammars.d.ts.map +1 -1
  391. package/dist/extraction/languages.d.ts.map +1 -1
  392. package/dist/extraction/notebook.d.ts +14 -0
  393. package/dist/extraction/notebook.d.ts.map +1 -0
  394. package/dist/frameworks/amplify.d.ts +9 -0
  395. package/dist/frameworks/amplify.d.ts.map +1 -0
  396. package/dist/frameworks/angular.d.ts +9 -0
  397. package/dist/frameworks/angular.d.ts.map +1 -0
  398. package/dist/frameworks/ansible.d.ts +8 -0
  399. package/dist/frameworks/ansible.d.ts.map +1 -0
  400. package/dist/frameworks/cloudformation.d.ts +9 -0
  401. package/dist/frameworks/cloudformation.d.ts.map +1 -0
  402. package/dist/frameworks/docker.d.ts +9 -0
  403. package/dist/frameworks/docker.d.ts.map +1 -0
  404. package/dist/frameworks/elixir.d.ts +6 -0
  405. package/dist/frameworks/elixir.d.ts.map +1 -0
  406. package/dist/frameworks/flutter.d.ts +12 -0
  407. package/dist/frameworks/flutter.d.ts.map +1 -0
  408. package/dist/frameworks/iac.d.ts +10 -0
  409. package/dist/frameworks/iac.d.ts.map +1 -0
  410. package/dist/frameworks/index.d.ts +14 -0
  411. package/dist/frameworks/index.d.ts.map +1 -1
  412. package/dist/frameworks/kubernetes.d.ts +9 -0
  413. package/dist/frameworks/kubernetes.d.ts.map +1 -0
  414. package/dist/frameworks/pulumi.d.ts +9 -0
  415. package/dist/frameworks/pulumi.d.ts.map +1 -0
  416. package/dist/frameworks/scala.d.ts +6 -0
  417. package/dist/frameworks/scala.d.ts.map +1 -0
  418. package/dist/frameworks/solidity.d.ts +6 -0
  419. package/dist/frameworks/solidity.d.ts.map +1 -0
  420. package/dist/frameworks/terraform.d.ts +14 -0
  421. package/dist/frameworks/terraform.d.ts.map +1 -0
  422. package/dist/frameworks/vue.d.ts +7 -0
  423. package/dist/frameworks/vue.d.ts.map +1 -0
  424. package/dist/graph/communities.d.ts +43 -0
  425. package/dist/graph/communities.d.ts.map +1 -0
  426. package/dist/graph/flows.d.ts +55 -0
  427. package/dist/graph/flows.d.ts.map +1 -0
  428. package/dist/graph/refactor.d.ts +43 -0
  429. package/dist/graph/refactor.d.ts.map +1 -0
  430. package/dist/index.d.ts +36 -4
  431. package/dist/index.d.ts.map +1 -1
  432. package/dist/mcp/cache.d.ts +69 -0
  433. package/dist/mcp/cache.d.ts.map +1 -0
  434. package/dist/mcp/read-modes.d.ts +31 -0
  435. package/dist/mcp/read-modes.d.ts.map +1 -0
  436. package/dist/mcp/server.d.ts +1 -0
  437. package/dist/mcp/server.d.ts.map +1 -1
  438. package/dist/mcp/server.js +15 -2
  439. package/dist/mcp/server.js.map +2 -2
  440. package/dist/mcp/tool-names.d.ts +2 -0
  441. package/dist/mcp/tool-names.d.ts.map +1 -0
  442. package/dist/mcp/tool-names.js +4 -1
  443. package/dist/mcp/tool-names.js.map +2 -2
  444. package/dist/mcp/tools.d.ts +12 -0
  445. package/dist/mcp/tools.d.ts.map +1 -1
  446. package/dist/mcp/tools.js +397 -0
  447. package/dist/mcp/tools.js.map +2 -2
  448. package/dist/memory/compress.d.ts +19 -0
  449. package/dist/memory/compress.d.ts.map +1 -0
  450. package/dist/memory/database.d.ts +92 -0
  451. package/dist/memory/database.d.ts.map +1 -0
  452. package/dist/memory/database.js +38 -0
  453. package/dist/memory/database.js.map +2 -2
  454. package/dist/memory/index.d.ts +71 -0
  455. package/dist/memory/index.d.ts.map +1 -0
  456. package/dist/memory/index.js +12 -2
  457. package/dist/memory/index.js.map +2 -2
  458. package/dist/memory/symbols.d.ts +21 -0
  459. package/dist/memory/symbols.d.ts.map +1 -0
  460. package/dist/memory/types.d.ts +78 -0
  461. package/dist/memory/types.d.ts.map +1 -0
  462. package/dist/memory/types.js.map +1 -1
  463. package/dist/memory/vectors.d.ts +43 -0
  464. package/dist/memory/vectors.d.ts.map +1 -0
  465. package/dist/patterns/graph.d.ts +16 -0
  466. package/dist/patterns/graph.d.ts.map +1 -0
  467. package/dist/patterns/graph.js +45 -0
  468. package/dist/patterns/graph.js.map +7 -0
  469. package/dist/patterns/index.d.ts +4 -0
  470. package/dist/patterns/index.d.ts.map +1 -0
  471. package/dist/patterns/index.js +39 -0
  472. package/dist/patterns/index.js.map +7 -0
  473. package/dist/patterns/indexer.d.ts +15 -0
  474. package/dist/patterns/indexer.d.ts.map +1 -0
  475. package/dist/patterns/indexer.js +97 -0
  476. package/dist/patterns/indexer.js.map +7 -0
  477. package/dist/patterns/library/command-injection-go.yaml +11 -0
  478. package/dist/patterns/library/dangerous-eval-js.yaml +14 -0
  479. package/dist/patterns/library/dangerous-exec-py.yaml +13 -0
  480. package/dist/patterns/library/dangerous-reflection-java.yaml +8 -0
  481. package/dist/patterns/library/path-traversal-go.yaml +11 -0
  482. package/dist/patterns/library/path-traversal-py.yaml +12 -0
  483. package/dist/patterns/library/path-traversal-readfile-js.yaml +14 -0
  484. package/dist/patterns/library/prototype-pollution-js.yaml +12 -0
  485. package/dist/patterns/library/sql-injection-concat-js.yaml +12 -0
  486. package/dist/patterns/library/sql-injection-java.yaml +13 -0
  487. package/dist/patterns/library/sql-injection-py.yaml +12 -0
  488. package/dist/patterns/library/sql-injection-template-js.yaml +13 -0
  489. package/dist/patterns/library/weak-crypto-md5-js.yaml +13 -0
  490. package/dist/patterns/library/weak-crypto-py.yaml +13 -0
  491. package/dist/patterns/loader.d.ts +18 -0
  492. package/dist/patterns/loader.d.ts.map +1 -0
  493. package/dist/patterns/loader.js +277 -0
  494. package/dist/patterns/loader.js.map +7 -0
  495. package/dist/patterns/runner.d.ts +42 -0
  496. package/dist/patterns/runner.d.ts.map +1 -0
  497. package/dist/patterns/runner.js +277 -0
  498. package/dist/patterns/runner.js.map +7 -0
  499. package/dist/patterns/types.d.ts +27 -0
  500. package/dist/patterns/types.d.ts.map +1 -0
  501. package/dist/patterns/types.js +34 -0
  502. package/dist/patterns/types.js.map +7 -0
  503. package/dist/resolution/bridges/android-rn.d.ts +13 -0
  504. package/dist/resolution/bridges/android-rn.d.ts.map +1 -0
  505. package/dist/resolution/bridges/expo-modules.d.ts +10 -0
  506. package/dist/resolution/bridges/expo-modules.d.ts.map +1 -0
  507. package/dist/resolution/bridges/flutter-channel.d.ts +14 -0
  508. package/dist/resolution/bridges/flutter-channel.d.ts.map +1 -0
  509. package/dist/resolution/bridges/index.d.ts +40 -0
  510. package/dist/resolution/bridges/index.d.ts.map +1 -0
  511. package/dist/resolution/bridges/native-events.d.ts +10 -0
  512. package/dist/resolution/bridges/native-events.d.ts.map +1 -0
  513. package/dist/resolution/bridges/native-views.d.ts +13 -0
  514. package/dist/resolution/bridges/native-views.d.ts.map +1 -0
  515. package/dist/resolution/bridges/react-native.d.ts +9 -0
  516. package/dist/resolution/bridges/react-native.d.ts.map +1 -0
  517. package/dist/resolution/bridges/swift-objc.d.ts +14 -0
  518. package/dist/resolution/bridges/swift-objc.d.ts.map +1 -0
  519. package/dist/resolution/bridges/turbomodules.d.ts +10 -0
  520. package/dist/resolution/bridges/turbomodules.d.ts.map +1 -0
  521. package/dist/resolution/index.d.ts +28 -3
  522. package/dist/resolution/index.d.ts.map +1 -1
  523. package/dist/security/attack-surface.d.ts +46 -0
  524. package/dist/security/attack-surface.d.ts.map +1 -0
  525. package/dist/security/attack-surface.js +43 -1
  526. package/dist/security/attack-surface.js.map +2 -2
  527. package/dist/security/context-warnings.d.ts +40 -0
  528. package/dist/security/context-warnings.d.ts.map +1 -0
  529. package/dist/security/data-flows.d.ts +33 -0
  530. package/dist/security/data-flows.d.ts.map +1 -0
  531. package/dist/security/data-flows.js +65 -7
  532. package/dist/security/data-flows.js.map +2 -2
  533. package/dist/security/dep-confusion.d.ts +23 -0
  534. package/dist/security/dep-confusion.d.ts.map +1 -0
  535. package/dist/security/errors.d.ts +16 -0
  536. package/dist/security/errors.d.ts.map +1 -0
  537. package/dist/security/export/fix-suggestions.d.ts +21 -0
  538. package/dist/security/export/fix-suggestions.d.ts.map +1 -0
  539. package/dist/security/export/sbom.d.ts +33 -0
  540. package/dist/security/export/sbom.d.ts.map +1 -0
  541. package/dist/security/export/serialization.d.ts +62 -0
  542. package/dist/security/export/serialization.d.ts.map +1 -0
  543. package/dist/security/export/vex.d.ts +58 -0
  544. package/dist/security/export/vex.d.ts.map +1 -0
  545. package/dist/security/index.d.ts +21 -0
  546. package/dist/security/index.d.ts.map +1 -0
  547. package/dist/security/integrator.d.ts +63 -0
  548. package/dist/security/integrator.d.ts.map +1 -0
  549. package/dist/security/license.d.ts +33 -0
  550. package/dist/security/license.d.ts.map +1 -0
  551. package/dist/security/manifest/adapter.d.ts +92 -0
  552. package/dist/security/manifest/adapter.d.ts.map +1 -0
  553. package/dist/security/manifest/parser.d.ts +73 -0
  554. package/dist/security/manifest/parser.d.ts.map +1 -0
  555. package/dist/security/manifest/plugins/cargo.d.ts +11 -0
  556. package/dist/security/manifest/plugins/cargo.d.ts.map +1 -0
  557. package/dist/security/manifest/plugins/composer.d.ts +11 -0
  558. package/dist/security/manifest/plugins/composer.d.ts.map +1 -0
  559. package/dist/security/manifest/plugins/go.d.ts +12 -0
  560. package/dist/security/manifest/plugins/go.d.ts.map +1 -0
  561. package/dist/security/manifest/plugins/gradle.d.ts +12 -0
  562. package/dist/security/manifest/plugins/gradle.d.ts.map +1 -0
  563. package/dist/security/manifest/plugins/hex.d.ts +11 -0
  564. package/dist/security/manifest/plugins/hex.d.ts.map +1 -0
  565. package/dist/security/manifest/plugins/maven.d.ts +11 -0
  566. package/dist/security/manifest/plugins/maven.d.ts.map +1 -0
  567. package/dist/security/manifest/plugins/npm.d.ts +11 -0
  568. package/dist/security/manifest/plugins/npm.d.ts.map +1 -0
  569. package/dist/security/manifest/plugins/nuget.d.ts +12 -0
  570. package/dist/security/manifest/plugins/nuget.d.ts.map +1 -0
  571. package/dist/security/manifest/plugins/pip.d.ts +11 -0
  572. package/dist/security/manifest/plugins/pip.d.ts.map +1 -0
  573. package/dist/security/manifest/plugins/pubspec.d.ts +11 -0
  574. package/dist/security/manifest/plugins/pubspec.d.ts.map +1 -0
  575. package/dist/security/manifest/plugins/pyproject.d.ts +3 -0
  576. package/dist/security/manifest/plugins/pyproject.d.ts.map +1 -0
  577. package/dist/security/manifest/plugins/rubygems.d.ts +11 -0
  578. package/dist/security/manifest/plugins/rubygems.d.ts.map +1 -0
  579. package/dist/security/manifest/plugins/swift.d.ts +11 -0
  580. package/dist/security/manifest/plugins/swift.d.ts.map +1 -0
  581. package/dist/security/owasp.d.ts +16 -0
  582. package/dist/security/owasp.d.ts.map +1 -0
  583. package/dist/security/pipeline.d.ts +37 -0
  584. package/dist/security/pipeline.d.ts.map +1 -0
  585. package/dist/security/reachability.d.ts +67 -0
  586. package/dist/security/reachability.d.ts.map +1 -0
  587. package/dist/security/remediation.d.ts +51 -0
  588. package/dist/security/remediation.d.ts.map +1 -0
  589. package/dist/security/secrets.d.ts +38 -0
  590. package/dist/security/secrets.d.ts.map +1 -0
  591. package/dist/security/staleness.d.ts +43 -0
  592. package/dist/security/staleness.d.ts.map +1 -0
  593. package/dist/security/supply-chain.d.ts +34 -0
  594. package/dist/security/supply-chain.d.ts.map +1 -0
  595. package/dist/security/suppressions.d.ts +18 -0
  596. package/dist/security/suppressions.d.ts.map +1 -0
  597. package/dist/security/types.d.ts +144 -0
  598. package/dist/security/types.d.ts.map +1 -0
  599. package/dist/security/vuln/client.d.ts +90 -0
  600. package/dist/security/vuln/client.d.ts.map +1 -0
  601. package/dist/security/vuln/client.js.map +2 -2
  602. package/dist/security/vuln/epss-client.d.ts +26 -0
  603. package/dist/security/vuln/epss-client.d.ts.map +1 -0
  604. package/dist/security/vuln/index.d.ts +6 -0
  605. package/dist/security/vuln/index.d.ts.map +1 -0
  606. package/dist/security/vuln/osv-adapter.d.ts +58 -0
  607. package/dist/security/vuln/osv-adapter.d.ts.map +1 -0
  608. package/dist/security/vuln/types.d.ts +29 -0
  609. package/dist/security/vuln/types.d.ts.map +1 -0
  610. package/dist/sync/index.d.ts +4 -2
  611. package/dist/sync/index.d.ts.map +1 -1
  612. package/dist/types.d.ts +10 -4
  613. package/dist/types.d.ts.map +1 -1
  614. package/dist/types.js.map +1 -1
  615. package/dist/vectors/index.d.ts +11 -3
  616. package/dist/vectors/index.d.ts.map +1 -1
  617. package/dist/vectors/qdrant-index.d.ts +10 -3
  618. package/dist/vectors/qdrant-index.d.ts.map +1 -1
  619. package/dist/vectors/typesense-index.d.ts.map +1 -1
  620. package/dist/watchmen/index.js +83 -0
  621. package/dist/watchmen/index.js.map +7 -0
  622. package/dist/watchmen/synthesize.js +475 -0
  623. package/dist/watchmen/synthesize.js.map +7 -0
  624. package/package.json +5 -2
  625. package/dist/security/context-warnings.test.js +0 -300
  626. package/dist/security/context-warnings.test.js.map +0 -7
  627. package/dist/security/export/fix-suggestions.test.js +0 -74
  628. package/dist/security/export/fix-suggestions.test.js.map +0 -7
  629. package/dist/security/export/sbom.test.js +0 -288
  630. package/dist/security/export/sbom.test.js.map +0 -7
  631. package/dist/security/export/serialization.test.js +0 -310
  632. package/dist/security/export/serialization.test.js.map +0 -7
  633. package/dist/security/export/vex.test.js +0 -278
  634. package/dist/security/export/vex.test.js.map +0 -7
  635. package/dist/security/integrator-transitives.test.js +0 -359
  636. package/dist/security/integrator-transitives.test.js.map +0 -7
  637. package/dist/security/integrator.test.js +0 -237
  638. package/dist/security/integrator.test.js.map +0 -7
  639. package/dist/security/manifest/adapter.test.js +0 -272
  640. package/dist/security/manifest/adapter.test.js.map +0 -7
  641. package/dist/security/manifest/parser.test.js +0 -110
  642. package/dist/security/manifest/parser.test.js.map +0 -7
  643. package/dist/security/manifest/plugins/cargo.test.js +0 -304
  644. package/dist/security/manifest/plugins/cargo.test.js.map +0 -7
  645. package/dist/security/manifest/plugins/go.test.js +0 -341
  646. package/dist/security/manifest/plugins/go.test.js.map +0 -7
  647. package/dist/security/manifest/plugins/maven.test.js +0 -389
  648. package/dist/security/manifest/plugins/maven.test.js.map +0 -7
  649. package/dist/security/manifest/plugins/npm.test.js +0 -298
  650. package/dist/security/manifest/plugins/npm.test.js.map +0 -7
  651. package/dist/security/manifest/plugins/pip.test.js +0 -208
  652. package/dist/security/manifest/plugins/pip.test.js.map +0 -7
  653. package/dist/security/reachability.test.js +0 -394
  654. package/dist/security/reachability.test.js.map +0 -7
  655. package/dist/security/vuln/client.test.js +0 -288
  656. package/dist/security/vuln/client.test.js.map +0 -7
  657. package/dist/security/vuln/osv-adapter.test.js +0 -391
  658. package/dist/security/vuln/osv-adapter.test.js.map +0 -7
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/security/integrator.test.ts"],
4
- "sourcesContent": ["/**\n * Tests for DependencyGraphIntegrator.cleanup()\n *\n * Verifies that orphaned Dependency_Nodes are correctly identified and removed\n * when their source manifests no longer exist on disk or when they have no\n * declared_in edges.\n */\nimport { describe, it, expect, beforeEach, afterEach } from 'vitest';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { DependencyGraphIntegrator } from './integrator';\nimport { GraphDatabase } from '../db/database';\nimport type { Node, Edge } from '../types';\n\ndescribe('DependencyGraphIntegrator.cleanup()', () => {\n let db: GraphDatabase;\n let integrator: DependencyGraphIntegrator;\n let tmpDir: string;\n const projectRoot = '/tmp/test-project';\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kirograph-integrator-test-'));\n db = new GraphDatabase(tmpDir);\n db.applySecuritySchema();\n integrator = new DependencyGraphIntegrator(db, projectRoot);\n });\n\n afterEach(() => {\n db.close();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function createDependencyNode(\n name: string,\n ecosystem: string,\n sourceManifests: string[],\n options?: { addDeclaredInEdge?: boolean },\n ): string {\n const nodeId = `dep:${ecosystem}:${name}`;\n const rawDb = db.getRawDb();\n\n const node: Node = {\n id: nodeId,\n kind: 'dependency',\n name,\n qualifiedName: `${ecosystem}/${name}`,\n filePath: sourceManifests[0] ?? '',\n language: 'unknown',\n startLine: 0,\n endLine: 0,\n startColumn: 0,\n endColumn: 0,\n isExported: false,\n isAsync: false,\n isStatic: false,\n isAbstract: false,\n updatedAt: Date.now(),\n };\n\n db.upsertNode(node);\n\n rawDb.run(\n `INSERT OR REPLACE INTO sec_dependencies\n (node_id, ecosystem, package_name, declared_constraint, resolved_version, scope, source_manifests)\n VALUES (?, ?, ?, ?, ?, ?, ?)`,\n [nodeId, ecosystem, name, '^1.0.0', '1.0.0', 'production', JSON.stringify(sourceManifests)],\n );\n\n // Optionally add declared_in edge (simulates a manifest that still declares this dep)\n if (options?.addDeclaredInEdge !== false) {\n for (const manifest of sourceManifests) {\n const edge: Edge = {\n source: nodeId,\n target: manifest,\n kind: 'declared_in',\n };\n db.insertEdge(edge);\n }\n }\n\n return nodeId;\n }\n\n function createEdge(source: string, target: string, kind: string): void {\n const edge: Edge = {\n source,\n target,\n kind: kind as Edge['kind'],\n };\n db.insertEdge(edge);\n }\n\n it('should return zero counts when no dependencies exist', async () => {\n const result = await integrator.cleanup(() => true);\n expect(result.nodesRemoved).toBe(0);\n expect(result.edgesRemoved).toBe(0);\n });\n\n it('should not remove dependencies whose manifests still exist and have declared_in edges', async () => {\n const manifestPath = 'package.json';\n const nodeId = createDependencyNode('express', 'npm', [manifestPath]);\n\n const manifestExists = () => true;\n\n const result = await integrator.cleanup(manifestExists);\n expect(result.nodesRemoved).toBe(0);\n expect(result.edgesRemoved).toBe(0);\n\n const node = db.getNode(nodeId);\n expect(node).not.toBeNull();\n });\n\n it('should remove dependencies with no declared_in edges', async () => {\n const manifestPath = 'package.json';\n const nodeId = createDependencyNode('express', 'npm', [manifestPath], {\n addDeclaredInEdge: false,\n });\n\n const manifestExists = () => true;\n\n const result = await integrator.cleanup(manifestExists);\n expect(result.nodesRemoved).toBe(1);\n\n const node = db.getNode(nodeId);\n expect(node).toBeNull();\n });\n\n it('should remove dependencies whose manifests no longer exist on disk', async () => {\n const manifestPath = 'package.json';\n const nodeId = createDependencyNode('express', 'npm', [manifestPath]);\n\n const manifestExists = () => false;\n\n const result = await integrator.cleanup(manifestExists);\n expect(result.nodesRemoved).toBe(1);\n\n const node = db.getNode(nodeId);\n expect(node).toBeNull();\n });\n\n it('should remove edges connected to orphaned nodes', async () => {\n const manifestPath = 'package.json';\n const depNodeId = createDependencyNode('lodash', 'npm', [manifestPath], {\n addDeclaredInEdge: false,\n });\n\n const codeNode: Node = {\n id: 'file:src/index.ts:import:lodash',\n kind: 'import',\n name: 'lodash',\n qualifiedName: 'src/index.ts:lodash',\n filePath: 'src/index.ts',\n language: 'typescript',\n startLine: 1,\n endLine: 1,\n startColumn: 0,\n endColumn: 20,\n updatedAt: Date.now(),\n };\n db.upsertNode(codeNode);\n createEdge(codeNode.id, depNodeId, 'imports');\n\n const manifestExists = () => true;\n const result = await integrator.cleanup(manifestExists);\n expect(result.nodesRemoved).toBe(1);\n expect(result.edgesRemoved).toBe(1);\n });\n\n it('should keep dependency if at least one source manifest exists on disk', async () => {\n const manifests = ['packages/a/package.json', 'packages/b/package.json'];\n const nodeId = createDependencyNode('react', 'npm', manifests);\n\n const manifestExists = (p: string) => p.includes('packages/a/package.json');\n\n const result = await integrator.cleanup(manifestExists);\n expect(result.nodesRemoved).toBe(0);\n\n const node = db.getNode(nodeId);\n expect(node).not.toBeNull();\n });\n\n it('should remove transitive dependencies no longer reachable from direct deps', async () => {\n const manifest = 'package.json';\n\n // Direct dependency (manifest exists, has declared_in edge)\n const directId = createDependencyNode('express', 'npm', [manifest]);\n\n // Transitive dependency reachable from express\n const reachableTransId = createDependencyNode('accepts', 'npm', [manifest]);\n createEdge(directId, reachableTransId, 'depends_on');\n\n // Orphaned direct dependency (no declared_in edge)\n const orphanedDirectId = createDependencyNode('lodash', 'npm', ['old-package.json'], {\n addDeclaredInEdge: false,\n });\n\n // Transitive dependency ONLY reachable from orphaned direct (no declared_in edge)\n const unreachableTransId = createDependencyNode('lodash.merge', 'npm', ['old-package.json'], {\n addDeclaredInEdge: false,\n });\n createEdge(orphanedDirectId, unreachableTransId, 'depends_on');\n\n const manifestExists = () => true;\n\n const result = await integrator.cleanup(manifestExists);\n\n // lodash and lodash.merge should be removed\n expect(result.nodesRemoved).toBe(2);\n\n // express and accepts should remain\n expect(db.getNode(directId)).not.toBeNull();\n expect(db.getNode(reachableTransId)).not.toBeNull();\n\n // orphaned nodes should be gone\n expect(db.getNode(orphanedDirectId)).toBeNull();\n expect(db.getNode(unreachableTransId)).toBeNull();\n });\n\n it('should handle transitive chains correctly \u2014 all reachable from direct dep', async () => {\n const manifest = 'package.json';\n\n const directId = createDependencyNode('express', 'npm', [manifest]);\n\n // Chain: express \u2192 body-parser \u2192 raw-body \u2192 bytes\n const bp = createDependencyNode('body-parser', 'npm', [manifest]);\n const rb = createDependencyNode('raw-body', 'npm', [manifest]);\n const bytes = createDependencyNode('bytes', 'npm', [manifest]);\n\n createEdge(directId, bp, 'depends_on');\n createEdge(bp, rb, 'depends_on');\n createEdge(rb, bytes, 'depends_on');\n\n const manifestExists = () => true;\n\n const result = await integrator.cleanup(manifestExists);\n\n expect(result.nodesRemoved).toBe(0);\n expect(result.edgesRemoved).toBe(0);\n });\n\n it('should count edges correctly when multiple edges connect to orphaned node', async () => {\n const orphanedManifest = 'removed/package.json';\n const depId = createDependencyNode('old-pkg', 'npm', [orphanedManifest], {\n addDeclaredInEdge: false,\n });\n\n const codeNode1: Node = {\n id: 'node:a',\n kind: 'function',\n name: 'funcA',\n qualifiedName: 'funcA',\n filePath: 'src/a.ts',\n language: 'typescript',\n startLine: 1,\n endLine: 5,\n startColumn: 0,\n endColumn: 0,\n updatedAt: Date.now(),\n };\n const codeNode2: Node = {\n id: 'node:b',\n kind: 'function',\n name: 'funcB',\n qualifiedName: 'funcB',\n filePath: 'src/b.ts',\n language: 'typescript',\n startLine: 1,\n endLine: 5,\n startColumn: 0,\n endColumn: 0,\n updatedAt: Date.now(),\n };\n db.upsertNode(codeNode1);\n db.upsertNode(codeNode2);\n\n createEdge(codeNode1.id, depId, 'imports');\n createEdge(codeNode2.id, depId, 'references');\n createEdge(depId, 'some-manifest', 'declared_in');\n\n // No manifests exist on disk\n const manifestExists = () => false;\n\n const result = await integrator.cleanup(manifestExists);\n expect(result.nodesRemoved).toBe(1);\n // 2 incoming (imports, references) + 1 outgoing (declared_in) = 3\n expect(result.edgesRemoved).toBe(3);\n });\n});\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAOA,oBAA4D;AAC5D,SAAoB;AACpB,WAAsB;AACtB,SAAoB;AACpB,wBAA0C;AAC1C,sBAA8B;AAAA,IAG9B,wBAAS,uCAAuC,MAAM;AACpD,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,QAAM,cAAc;AAEpB,gCAAW,MAAM;AACf,aAAS,GAAG,YAAY,KAAK,KAAK,GAAG,OAAO,GAAG,4BAA4B,CAAC;AAC5E,SAAK,IAAI,8BAAc,MAAM;AAC7B,OAAG,oBAAoB;AACvB,iBAAa,IAAI,4CAA0B,IAAI,WAAW;AAAA,EAC5D,CAAC;AAED,+BAAU,MAAM;AACd,OAAG,MAAM;AACT,OAAG,OAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACpD,CAAC;AAED,WAAS,qBACP,MACA,WACA,iBACA,SACQ;AACR,UAAM,SAAS,OAAO,SAAS,IAAI,IAAI;AACvC,UAAM,QAAQ,GAAG,SAAS;AAE1B,UAAM,OAAa;AAAA,MACjB,IAAI;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA,eAAe,GAAG,SAAS,IAAI,IAAI;AAAA,MACnC,UAAU,gBAAgB,CAAC,KAAK;AAAA,MAChC,UAAU;AAAA,MACV,WAAW;AAAA,MACX,SAAS;AAAA,MACT,aAAa;AAAA,MACb,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,WAAW,KAAK,IAAI;AAAA,IACtB;AAEA,OAAG,WAAW,IAAI;AAElB,UAAM;AAAA,MACJ;AAAA;AAAA;AAAA,MAGA,CAAC,QAAQ,WAAW,MAAM,UAAU,SAAS,cAAc,KAAK,UAAU,eAAe,CAAC;AAAA,IAC5F;AAGA,QAAI,SAAS,sBAAsB,OAAO;AACxC,iBAAW,YAAY,iBAAiB;AACtC,cAAM,OAAa;AAAA,UACjB,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,MAAM;AAAA,QACR;AACA,WAAG,WAAW,IAAI;AAAA,MACpB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,WAAW,QAAgB,QAAgB,MAAoB;AACtE,UAAM,OAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,OAAG,WAAW,IAAI;AAAA,EACpB;AAEA,wBAAG,wDAAwD,YAAY;AACrE,UAAM,SAAS,MAAM,WAAW,QAAQ,MAAM,IAAI;AAClD,8BAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAClC,8BAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAAA,EACpC,CAAC;AAED,wBAAG,yFAAyF,YAAY;AACtG,UAAM,eAAe;AACrB,UAAM,SAAS,qBAAqB,WAAW,OAAO,CAAC,YAAY,CAAC;AAEpE,UAAM,iBAAiB,MAAM;AAE7B,UAAM,SAAS,MAAM,WAAW,QAAQ,cAAc;AACtD,8BAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAClC,8BAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAElC,UAAM,OAAO,GAAG,QAAQ,MAAM;AAC9B,8BAAO,IAAI,EAAE,IAAI,SAAS;AAAA,EAC5B,CAAC;AAED,wBAAG,wDAAwD,YAAY;AACrE,UAAM,eAAe;AACrB,UAAM,SAAS,qBAAqB,WAAW,OAAO,CAAC,YAAY,GAAG;AAAA,MACpE,mBAAmB;AAAA,IACrB,CAAC;AAED,UAAM,iBAAiB,MAAM;AAE7B,UAAM,SAAS,MAAM,WAAW,QAAQ,cAAc;AACtD,8BAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAElC,UAAM,OAAO,GAAG,QAAQ,MAAM;AAC9B,8BAAO,IAAI,EAAE,SAAS;AAAA,EACxB,CAAC;AAED,wBAAG,sEAAsE,YAAY;AACnF,UAAM,eAAe;AACrB,UAAM,SAAS,qBAAqB,WAAW,OAAO,CAAC,YAAY,CAAC;AAEpE,UAAM,iBAAiB,MAAM;AAE7B,UAAM,SAAS,MAAM,WAAW,QAAQ,cAAc;AACtD,8BAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAElC,UAAM,OAAO,GAAG,QAAQ,MAAM;AAC9B,8BAAO,IAAI,EAAE,SAAS;AAAA,EACxB,CAAC;AAED,wBAAG,mDAAmD,YAAY;AAChE,UAAM,eAAe;AACrB,UAAM,YAAY,qBAAqB,UAAU,OAAO,CAAC,YAAY,GAAG;AAAA,MACtE,mBAAmB;AAAA,IACrB,CAAC;AAED,UAAM,WAAiB;AAAA,MACrB,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,eAAe;AAAA,MACf,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MACX,SAAS;AAAA,MACT,aAAa;AAAA,MACb,WAAW;AAAA,MACX,WAAW,KAAK,IAAI;AAAA,IACtB;AACA,OAAG,WAAW,QAAQ;AACtB,eAAW,SAAS,IAAI,WAAW,SAAS;AAE5C,UAAM,iBAAiB,MAAM;AAC7B,UAAM,SAAS,MAAM,WAAW,QAAQ,cAAc;AACtD,8BAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAClC,8BAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAAA,EACpC,CAAC;AAED,wBAAG,yEAAyE,YAAY;AACtF,UAAM,YAAY,CAAC,2BAA2B,yBAAyB;AACvE,UAAM,SAAS,qBAAqB,SAAS,OAAO,SAAS;AAE7D,UAAM,iBAAiB,CAAC,MAAc,EAAE,SAAS,yBAAyB;AAE1E,UAAM,SAAS,MAAM,WAAW,QAAQ,cAAc;AACtD,8BAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAElC,UAAM,OAAO,GAAG,QAAQ,MAAM;AAC9B,8BAAO,IAAI,EAAE,IAAI,SAAS;AAAA,EAC5B,CAAC;AAED,wBAAG,8EAA8E,YAAY;AAC3F,UAAM,WAAW;AAGjB,UAAM,WAAW,qBAAqB,WAAW,OAAO,CAAC,QAAQ,CAAC;AAGlE,UAAM,mBAAmB,qBAAqB,WAAW,OAAO,CAAC,QAAQ,CAAC;AAC1E,eAAW,UAAU,kBAAkB,YAAY;AAGnD,UAAM,mBAAmB,qBAAqB,UAAU,OAAO,CAAC,kBAAkB,GAAG;AAAA,MACnF,mBAAmB;AAAA,IACrB,CAAC;AAGD,UAAM,qBAAqB,qBAAqB,gBAAgB,OAAO,CAAC,kBAAkB,GAAG;AAAA,MAC3F,mBAAmB;AAAA,IACrB,CAAC;AACD,eAAW,kBAAkB,oBAAoB,YAAY;AAE7D,UAAM,iBAAiB,MAAM;AAE7B,UAAM,SAAS,MAAM,WAAW,QAAQ,cAAc;AAGtD,8BAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAGlC,8BAAO,GAAG,QAAQ,QAAQ,CAAC,EAAE,IAAI,SAAS;AAC1C,8BAAO,GAAG,QAAQ,gBAAgB,CAAC,EAAE,IAAI,SAAS;AAGlD,8BAAO,GAAG,QAAQ,gBAAgB,CAAC,EAAE,SAAS;AAC9C,8BAAO,GAAG,QAAQ,kBAAkB,CAAC,EAAE,SAAS;AAAA,EAClD,CAAC;AAED,wBAAG,kFAA6E,YAAY;AAC1F,UAAM,WAAW;AAEjB,UAAM,WAAW,qBAAqB,WAAW,OAAO,CAAC,QAAQ,CAAC;AAGlE,UAAM,KAAK,qBAAqB,eAAe,OAAO,CAAC,QAAQ,CAAC;AAChE,UAAM,KAAK,qBAAqB,YAAY,OAAO,CAAC,QAAQ,CAAC;AAC7D,UAAM,QAAQ,qBAAqB,SAAS,OAAO,CAAC,QAAQ,CAAC;AAE7D,eAAW,UAAU,IAAI,YAAY;AACrC,eAAW,IAAI,IAAI,YAAY;AAC/B,eAAW,IAAI,OAAO,YAAY;AAElC,UAAM,iBAAiB,MAAM;AAE7B,UAAM,SAAS,MAAM,WAAW,QAAQ,cAAc;AAEtD,8BAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAClC,8BAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAAA,EACpC,CAAC;AAED,wBAAG,6EAA6E,YAAY;AAC1F,UAAM,mBAAmB;AACzB,UAAM,QAAQ,qBAAqB,WAAW,OAAO,CAAC,gBAAgB,GAAG;AAAA,MACvE,mBAAmB;AAAA,IACrB,CAAC;AAED,UAAM,YAAkB;AAAA,MACtB,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,eAAe;AAAA,MACf,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MACX,SAAS;AAAA,MACT,aAAa;AAAA,MACb,WAAW;AAAA,MACX,WAAW,KAAK,IAAI;AAAA,IACtB;AACA,UAAM,YAAkB;AAAA,MACtB,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,eAAe;AAAA,MACf,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MACX,SAAS;AAAA,MACT,aAAa;AAAA,MACb,WAAW;AAAA,MACX,WAAW,KAAK,IAAI;AAAA,IACtB;AACA,OAAG,WAAW,SAAS;AACvB,OAAG,WAAW,SAAS;AAEvB,eAAW,UAAU,IAAI,OAAO,SAAS;AACzC,eAAW,UAAU,IAAI,OAAO,YAAY;AAC5C,eAAW,OAAO,iBAAiB,aAAa;AAGhD,UAAM,iBAAiB,MAAM;AAE7B,UAAM,SAAS,MAAM,WAAW,QAAQ,cAAc;AACtD,8BAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAElC,8BAAO,OAAO,YAAY,EAAE,KAAK,CAAC;AAAA,EACpC,CAAC;AACH,CAAC;",
6
- "names": []
7
- }
@@ -1,272 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __copyProps = (to, from, except, desc) => {
9
- if (from && typeof from === "object" || typeof from === "function") {
10
- for (let key of __getOwnPropNames(from))
11
- if (!__hasOwnProp.call(to, key) && key !== except)
12
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
- }
14
- return to;
15
- };
16
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
- // If the importer is in node compatibility mode or this is not an ESM
18
- // file that has been converted to a CommonJS file using a Babel-
19
- // compatible transform (i.e. "__esModule" has not been set), then set
20
- // "default" to the CommonJS "module.exports" for node compatibility.
21
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
- mod
23
- ));
24
- var import_vitest = require("vitest");
25
- var fs = __toESM(require("fs"));
26
- var path = __toESM(require("path"));
27
- var os = __toESM(require("os"));
28
- var import_adapter = require("./adapter");
29
- (0, import_vitest.describe)("SecurityManifestAdapter", () => {
30
- let tmpDir;
31
- (0, import_vitest.beforeEach)(() => {
32
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "sec-adapter-test-"));
33
- });
34
- (0, import_vitest.afterEach)(() => {
35
- fs.rmSync(tmpDir, { recursive: true, force: true });
36
- });
37
- (0, import_vitest.describe)("constructor", () => {
38
- (0, import_vitest.it)("should initialize with architecture parsers", () => {
39
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
40
- const parsers = adapter.getArchParsers();
41
- (0, import_vitest.expect)(parsers.length).toBeGreaterThan(0);
42
- const names = parsers.map((p) => p.name);
43
- (0, import_vitest.expect)(names).toContain("npm");
44
- (0, import_vitest.expect)(names).toContain("cargo");
45
- (0, import_vitest.expect)(names).toContain("go");
46
- (0, import_vitest.expect)(names).toContain("maven");
47
- (0, import_vitest.expect)(names).toContain("python");
48
- });
49
- });
50
- (0, import_vitest.describe)("registerPlugin", () => {
51
- (0, import_vitest.it)("should register and retrieve a version extraction plugin", () => {
52
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
53
- const plugin = {
54
- ecosystem: "npm",
55
- manifestFiles: ["package.json"],
56
- canExtract: (p) => path.basename(p) === "package.json",
57
- extract: async () => []
58
- };
59
- adapter.registerPlugin(plugin);
60
- const plugins = adapter.getPlugins();
61
- (0, import_vitest.expect)(plugins).toHaveLength(1);
62
- (0, import_vitest.expect)(plugins[0].ecosystem).toBe("npm");
63
- });
64
- (0, import_vitest.it)("should overwrite plugin for same ecosystem", () => {
65
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
66
- const plugin1 = {
67
- ecosystem: "npm",
68
- manifestFiles: ["package.json"],
69
- canExtract: () => true,
70
- extract: async () => [{ name: "a", declaredConstraint: "1.0", scope: "production", ecosystem: "npm", sourceManifest: "package.json" }]
71
- };
72
- const plugin2 = {
73
- ecosystem: "npm",
74
- manifestFiles: ["package.json"],
75
- canExtract: () => true,
76
- extract: async () => [{ name: "b", declaredConstraint: "2.0", scope: "development", ecosystem: "npm", sourceManifest: "package.json" }]
77
- };
78
- adapter.registerPlugin(plugin1);
79
- adapter.registerPlugin(plugin2);
80
- const plugins = adapter.getPlugins();
81
- (0, import_vitest.expect)(plugins).toHaveLength(1);
82
- (0, import_vitest.expect)(plugins[0]).toBe(plugin2);
83
- });
84
- });
85
- (0, import_vitest.describe)("discoverManifests", () => {
86
- (0, import_vitest.it)("should discover package.json files", () => {
87
- fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({ name: "test", dependencies: { express: "^4.0.0" } }));
88
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
89
- const manifests = adapter.discoverManifests();
90
- (0, import_vitest.expect)(manifests).toHaveLength(1);
91
- (0, import_vitest.expect)(manifests[0]).toBe(path.join(tmpDir, "package.json"));
92
- });
93
- (0, import_vitest.it)("should discover nested manifest files", () => {
94
- fs.mkdirSync(path.join(tmpDir, "sub"));
95
- fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({ name: "root" }));
96
- fs.writeFileSync(path.join(tmpDir, "sub", "package.json"), JSON.stringify({ name: "sub" }));
97
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
98
- const manifests = adapter.discoverManifests();
99
- (0, import_vitest.expect)(manifests).toHaveLength(2);
100
- });
101
- (0, import_vitest.it)("should skip node_modules directory", () => {
102
- fs.mkdirSync(path.join(tmpDir, "node_modules"));
103
- fs.writeFileSync(path.join(tmpDir, "node_modules", "package.json"), JSON.stringify({ name: "dep" }));
104
- fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({ name: "root" }));
105
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
106
- const manifests = adapter.discoverManifests();
107
- (0, import_vitest.expect)(manifests).toHaveLength(1);
108
- (0, import_vitest.expect)(manifests[0]).toBe(path.join(tmpDir, "package.json"));
109
- });
110
- (0, import_vitest.it)("should skip .git directory", () => {
111
- fs.mkdirSync(path.join(tmpDir, ".git"));
112
- fs.writeFileSync(path.join(tmpDir, ".git", "package.json"), JSON.stringify({ name: "git" }));
113
- fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({ name: "root" }));
114
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
115
- const manifests = adapter.discoverManifests();
116
- (0, import_vitest.expect)(manifests).toHaveLength(1);
117
- });
118
- (0, import_vitest.it)("should skip dist and build directories", () => {
119
- fs.mkdirSync(path.join(tmpDir, "dist"));
120
- fs.mkdirSync(path.join(tmpDir, "build"));
121
- fs.writeFileSync(path.join(tmpDir, "dist", "package.json"), JSON.stringify({ name: "dist" }));
122
- fs.writeFileSync(path.join(tmpDir, "build", "package.json"), JSON.stringify({ name: "build" }));
123
- fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({ name: "root" }));
124
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
125
- const manifests = adapter.discoverManifests();
126
- (0, import_vitest.expect)(manifests).toHaveLength(1);
127
- });
128
- (0, import_vitest.it)("should discover multiple ecosystem manifests", () => {
129
- fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({ name: "js-project" }));
130
- fs.writeFileSync(path.join(tmpDir, "Cargo.toml"), '[package]\nname = "rust-project"\nversion = "0.1.0"');
131
- fs.writeFileSync(path.join(tmpDir, "go.mod"), "module example.com/mymod\n\ngo 1.21");
132
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
133
- const manifests = adapter.discoverManifests();
134
- (0, import_vitest.expect)(manifests).toHaveLength(3);
135
- });
136
- (0, import_vitest.it)("should return empty array for empty directory", () => {
137
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
138
- const manifests = adapter.discoverManifests();
139
- (0, import_vitest.expect)(manifests).toHaveLength(0);
140
- });
141
- });
142
- (0, import_vitest.describe)("getEcosystem", () => {
143
- (0, import_vitest.it)("should return npm for package.json", () => {
144
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
145
- (0, import_vitest.expect)(adapter.getEcosystem("/some/path/package.json")).toBe("npm");
146
- });
147
- (0, import_vitest.it)("should return cargo for Cargo.toml", () => {
148
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
149
- (0, import_vitest.expect)(adapter.getEcosystem("/some/path/Cargo.toml")).toBe("cargo");
150
- });
151
- (0, import_vitest.it)("should return go for go.mod", () => {
152
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
153
- (0, import_vitest.expect)(adapter.getEcosystem("/some/path/go.mod")).toBe("go");
154
- });
155
- (0, import_vitest.it)("should return maven for pom.xml", () => {
156
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
157
- (0, import_vitest.expect)(adapter.getEcosystem("/some/path/pom.xml")).toBe("maven");
158
- });
159
- (0, import_vitest.it)("should return undefined for unknown files", () => {
160
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
161
- (0, import_vitest.expect)(adapter.getEcosystem("/some/path/unknown.txt")).toBeUndefined();
162
- });
163
- });
164
- (0, import_vitest.describe)("extractAll", () => {
165
- (0, import_vitest.it)("should use registered plugin for extraction", async () => {
166
- fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({
167
- name: "test-project",
168
- dependencies: { express: "^4.18.0", lodash: "~4.17.21" },
169
- devDependencies: { vitest: "^1.0.0" }
170
- }));
171
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
172
- const mockDeps = [
173
- { name: "express", declaredConstraint: "^4.18.0", scope: "production", ecosystem: "npm", sourceManifest: "package.json" },
174
- { name: "lodash", declaredConstraint: "~4.17.21", scope: "production", ecosystem: "npm", sourceManifest: "package.json" },
175
- { name: "vitest", declaredConstraint: "^1.0.0", scope: "development", ecosystem: "npm", sourceManifest: "package.json" }
176
- ];
177
- const plugin = {
178
- ecosystem: "npm",
179
- manifestFiles: ["package.json"],
180
- canExtract: (p) => path.basename(p) === "package.json",
181
- extract: async () => mockDeps
182
- };
183
- adapter.registerPlugin(plugin);
184
- const result = await adapter.extractAll();
185
- (0, import_vitest.expect)(result.dependenciesCreated).toBe(3);
186
- (0, import_vitest.expect)(result.manifestsParsed).toBe(1);
187
- (0, import_vitest.expect)(result.warnings).toHaveLength(0);
188
- (0, import_vitest.expect)(result.errors).toHaveLength(0);
189
- });
190
- (0, import_vitest.it)("should fall back to architecture parser when no plugin registered", async () => {
191
- fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({
192
- name: "test-project",
193
- dependencies: { express: "^4.18.0", lodash: "~4.17.21" }
194
- }));
195
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
196
- const result = await adapter.extractAll();
197
- (0, import_vitest.expect)(result.dependenciesCreated).toBe(2);
198
- (0, import_vitest.expect)(result.manifestsParsed).toBe(1);
199
- (0, import_vitest.expect)(result.warnings.length).toBeGreaterThan(0);
200
- (0, import_vitest.expect)(result.warnings[0].message).toContain("No version extraction plugin");
201
- });
202
- (0, import_vitest.it)("should handle plugin extraction errors gracefully", async () => {
203
- fs.writeFileSync(path.join(tmpDir, "package.json"), JSON.stringify({
204
- name: "test-project",
205
- dependencies: { express: "^4.18.0" }
206
- }));
207
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
208
- const plugin = {
209
- ecosystem: "npm",
210
- manifestFiles: ["package.json"],
211
- canExtract: () => true,
212
- extract: async () => {
213
- throw new Error("Parse failed");
214
- }
215
- };
216
- adapter.registerPlugin(plugin);
217
- const result = await adapter.extractAll();
218
- (0, import_vitest.expect)(result.dependenciesCreated).toBe(0);
219
- (0, import_vitest.expect)(result.errors).toHaveLength(1);
220
- (0, import_vitest.expect)(result.errors[0].message).toBe("Parse failed");
221
- });
222
- (0, import_vitest.it)("should handle empty project with no manifests", async () => {
223
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
224
- const result = await adapter.extractAll();
225
- (0, import_vitest.expect)(result.dependenciesCreated).toBe(0);
226
- (0, import_vitest.expect)(result.manifestsParsed).toBe(0);
227
- (0, import_vitest.expect)(result.warnings).toHaveLength(0);
228
- (0, import_vitest.expect)(result.errors).toHaveLength(0);
229
- });
230
- });
231
- (0, import_vitest.describe)("extractFromManifest", () => {
232
- (0, import_vitest.it)("should use plugin when available", async () => {
233
- const manifestPath = path.join(tmpDir, "package.json");
234
- fs.writeFileSync(manifestPath, JSON.stringify({
235
- name: "test",
236
- dependencies: { express: "^4.0.0" }
237
- }));
238
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
239
- const expectedDeps = [
240
- { name: "express", declaredConstraint: "^4.0.0", scope: "production", ecosystem: "npm", sourceManifest: "package.json" }
241
- ];
242
- adapter.registerPlugin({
243
- ecosystem: "npm",
244
- manifestFiles: ["package.json"],
245
- canExtract: (p) => path.basename(p) === "package.json",
246
- extract: async () => expectedDeps
247
- });
248
- const deps = await adapter.extractFromManifest(manifestPath);
249
- (0, import_vitest.expect)(deps).toEqual(expectedDeps);
250
- });
251
- (0, import_vitest.it)("should fall back to architecture parser when no plugin", async () => {
252
- const manifestPath = path.join(tmpDir, "package.json");
253
- fs.writeFileSync(manifestPath, JSON.stringify({
254
- name: "test",
255
- dependencies: { express: "^4.0.0", lodash: "~4.17.0" }
256
- }));
257
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
258
- const deps = await adapter.extractFromManifest(manifestPath);
259
- (0, import_vitest.expect)(deps).toHaveLength(2);
260
- (0, import_vitest.expect)(deps[0].declaredConstraint).toBe("*");
261
- (0, import_vitest.expect)(deps[0].scope).toBe("production");
262
- });
263
- (0, import_vitest.it)("should return empty array for unknown manifest type", async () => {
264
- const manifestPath = path.join(tmpDir, "unknown.txt");
265
- fs.writeFileSync(manifestPath, "some content");
266
- const adapter = new import_adapter.SecurityManifestAdapter(tmpDir);
267
- const deps = await adapter.extractFromManifest(manifestPath);
268
- (0, import_vitest.expect)(deps).toHaveLength(0);
269
- });
270
- });
271
- });
272
- //# sourceMappingURL=adapter.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/security/manifest/adapter.test.ts"],
4
- "sourcesContent": ["/**\n * Unit tests for SecurityManifestAdapter\n */\nimport { describe, it, expect, beforeEach, afterEach } from 'vitest';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { SecurityManifestAdapter, type VersionExtractionPlugin } from './adapter';\nimport type { ParsedDependency } from '../types';\n\ndescribe('SecurityManifestAdapter', () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'sec-adapter-test-'));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n describe('constructor', () => {\n it('should initialize with architecture parsers', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n const parsers = adapter.getArchParsers();\n expect(parsers.length).toBeGreaterThan(0);\n // Should include the known parsers\n const names = parsers.map(p => p.name);\n expect(names).toContain('npm');\n expect(names).toContain('cargo');\n expect(names).toContain('go');\n expect(names).toContain('maven');\n expect(names).toContain('python');\n });\n });\n\n describe('registerPlugin', () => {\n it('should register and retrieve a version extraction plugin', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n const plugin: VersionExtractionPlugin = {\n ecosystem: 'npm',\n manifestFiles: ['package.json'],\n canExtract: (p) => path.basename(p) === 'package.json',\n extract: async () => [],\n };\n adapter.registerPlugin(plugin);\n const plugins = adapter.getPlugins();\n expect(plugins).toHaveLength(1);\n expect(plugins[0].ecosystem).toBe('npm');\n });\n\n it('should overwrite plugin for same ecosystem', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n const plugin1: VersionExtractionPlugin = {\n ecosystem: 'npm',\n manifestFiles: ['package.json'],\n canExtract: () => true,\n extract: async () => [{ name: 'a', declaredConstraint: '1.0', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' }],\n };\n const plugin2: VersionExtractionPlugin = {\n ecosystem: 'npm',\n manifestFiles: ['package.json'],\n canExtract: () => true,\n extract: async () => [{ name: 'b', declaredConstraint: '2.0', scope: 'development', ecosystem: 'npm', sourceManifest: 'package.json' }],\n };\n adapter.registerPlugin(plugin1);\n adapter.registerPlugin(plugin2);\n const plugins = adapter.getPlugins();\n expect(plugins).toHaveLength(1);\n expect(plugins[0]).toBe(plugin2);\n });\n });\n\n describe('discoverManifests', () => {\n it('should discover package.json files', () => {\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({ name: 'test', dependencies: { express: '^4.0.0' } }));\n const adapter = new SecurityManifestAdapter(tmpDir);\n const manifests = adapter.discoverManifests();\n expect(manifests).toHaveLength(1);\n expect(manifests[0]).toBe(path.join(tmpDir, 'package.json'));\n });\n\n it('should discover nested manifest files', () => {\n fs.mkdirSync(path.join(tmpDir, 'sub'));\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({ name: 'root' }));\n fs.writeFileSync(path.join(tmpDir, 'sub', 'package.json'), JSON.stringify({ name: 'sub' }));\n const adapter = new SecurityManifestAdapter(tmpDir);\n const manifests = adapter.discoverManifests();\n expect(manifests).toHaveLength(2);\n });\n\n it('should skip node_modules directory', () => {\n fs.mkdirSync(path.join(tmpDir, 'node_modules'));\n fs.writeFileSync(path.join(tmpDir, 'node_modules', 'package.json'), JSON.stringify({ name: 'dep' }));\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({ name: 'root' }));\n const adapter = new SecurityManifestAdapter(tmpDir);\n const manifests = adapter.discoverManifests();\n expect(manifests).toHaveLength(1);\n expect(manifests[0]).toBe(path.join(tmpDir, 'package.json'));\n });\n\n it('should skip .git directory', () => {\n fs.mkdirSync(path.join(tmpDir, '.git'));\n fs.writeFileSync(path.join(tmpDir, '.git', 'package.json'), JSON.stringify({ name: 'git' }));\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({ name: 'root' }));\n const adapter = new SecurityManifestAdapter(tmpDir);\n const manifests = adapter.discoverManifests();\n expect(manifests).toHaveLength(1);\n });\n\n it('should skip dist and build directories', () => {\n fs.mkdirSync(path.join(tmpDir, 'dist'));\n fs.mkdirSync(path.join(tmpDir, 'build'));\n fs.writeFileSync(path.join(tmpDir, 'dist', 'package.json'), JSON.stringify({ name: 'dist' }));\n fs.writeFileSync(path.join(tmpDir, 'build', 'package.json'), JSON.stringify({ name: 'build' }));\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({ name: 'root' }));\n const adapter = new SecurityManifestAdapter(tmpDir);\n const manifests = adapter.discoverManifests();\n expect(manifests).toHaveLength(1);\n });\n\n it('should discover multiple ecosystem manifests', () => {\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({ name: 'js-project' }));\n fs.writeFileSync(path.join(tmpDir, 'Cargo.toml'), '[package]\\nname = \"rust-project\"\\nversion = \"0.1.0\"');\n fs.writeFileSync(path.join(tmpDir, 'go.mod'), 'module example.com/mymod\\n\\ngo 1.21');\n const adapter = new SecurityManifestAdapter(tmpDir);\n const manifests = adapter.discoverManifests();\n expect(manifests).toHaveLength(3);\n });\n\n it('should return empty array for empty directory', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n const manifests = adapter.discoverManifests();\n expect(manifests).toHaveLength(0);\n });\n });\n\n describe('getEcosystem', () => {\n it('should return npm for package.json', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n expect(adapter.getEcosystem('/some/path/package.json')).toBe('npm');\n });\n\n it('should return cargo for Cargo.toml', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n expect(adapter.getEcosystem('/some/path/Cargo.toml')).toBe('cargo');\n });\n\n it('should return go for go.mod', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n expect(adapter.getEcosystem('/some/path/go.mod')).toBe('go');\n });\n\n it('should return maven for pom.xml', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n expect(adapter.getEcosystem('/some/path/pom.xml')).toBe('maven');\n });\n\n it('should return undefined for unknown files', () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n expect(adapter.getEcosystem('/some/path/unknown.txt')).toBeUndefined();\n });\n });\n\n describe('extractAll', () => {\n it('should use registered plugin for extraction', async () => {\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({\n name: 'test-project',\n dependencies: { express: '^4.18.0', lodash: '~4.17.21' },\n devDependencies: { vitest: '^1.0.0' },\n }));\n\n const adapter = new SecurityManifestAdapter(tmpDir);\n const mockDeps: ParsedDependency[] = [\n { name: 'express', declaredConstraint: '^4.18.0', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n { name: 'lodash', declaredConstraint: '~4.17.21', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n { name: 'vitest', declaredConstraint: '^1.0.0', scope: 'development', ecosystem: 'npm', sourceManifest: 'package.json' },\n ];\n\n const plugin: VersionExtractionPlugin = {\n ecosystem: 'npm',\n manifestFiles: ['package.json'],\n canExtract: (p) => path.basename(p) === 'package.json',\n extract: async () => mockDeps,\n };\n adapter.registerPlugin(plugin);\n\n const result = await adapter.extractAll();\n expect(result.dependenciesCreated).toBe(3);\n expect(result.manifestsParsed).toBe(1);\n expect(result.warnings).toHaveLength(0);\n expect(result.errors).toHaveLength(0);\n });\n\n it('should fall back to architecture parser when no plugin registered', async () => {\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({\n name: 'test-project',\n dependencies: { express: '^4.18.0', lodash: '~4.17.21' },\n }));\n\n const adapter = new SecurityManifestAdapter(tmpDir);\n const result = await adapter.extractAll();\n\n // Should extract deps from architecture parser (names only)\n expect(result.dependenciesCreated).toBe(2);\n expect(result.manifestsParsed).toBe(1);\n // Should warn about missing plugin\n expect(result.warnings.length).toBeGreaterThan(0);\n expect(result.warnings[0].message).toContain('No version extraction plugin');\n });\n\n it('should handle plugin extraction errors gracefully', async () => {\n fs.writeFileSync(path.join(tmpDir, 'package.json'), JSON.stringify({\n name: 'test-project',\n dependencies: { express: '^4.18.0' },\n }));\n\n const adapter = new SecurityManifestAdapter(tmpDir);\n const plugin: VersionExtractionPlugin = {\n ecosystem: 'npm',\n manifestFiles: ['package.json'],\n canExtract: () => true,\n extract: async () => { throw new Error('Parse failed'); },\n };\n adapter.registerPlugin(plugin);\n\n const result = await adapter.extractAll();\n expect(result.dependenciesCreated).toBe(0);\n expect(result.errors).toHaveLength(1);\n expect(result.errors[0].message).toBe('Parse failed');\n });\n\n it('should handle empty project with no manifests', async () => {\n const adapter = new SecurityManifestAdapter(tmpDir);\n const result = await adapter.extractAll();\n expect(result.dependenciesCreated).toBe(0);\n expect(result.manifestsParsed).toBe(0);\n expect(result.warnings).toHaveLength(0);\n expect(result.errors).toHaveLength(0);\n });\n });\n\n describe('extractFromManifest', () => {\n it('should use plugin when available', async () => {\n const manifestPath = path.join(tmpDir, 'package.json');\n fs.writeFileSync(manifestPath, JSON.stringify({\n name: 'test',\n dependencies: { express: '^4.0.0' },\n }));\n\n const adapter = new SecurityManifestAdapter(tmpDir);\n const expectedDeps: ParsedDependency[] = [\n { name: 'express', declaredConstraint: '^4.0.0', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n ];\n\n adapter.registerPlugin({\n ecosystem: 'npm',\n manifestFiles: ['package.json'],\n canExtract: (p) => path.basename(p) === 'package.json',\n extract: async () => expectedDeps,\n });\n\n const deps = await adapter.extractFromManifest(manifestPath);\n expect(deps).toEqual(expectedDeps);\n });\n\n it('should fall back to architecture parser when no plugin', async () => {\n const manifestPath = path.join(tmpDir, 'package.json');\n fs.writeFileSync(manifestPath, JSON.stringify({\n name: 'test',\n dependencies: { express: '^4.0.0', lodash: '~4.17.0' },\n }));\n\n const adapter = new SecurityManifestAdapter(tmpDir);\n const deps = await adapter.extractFromManifest(manifestPath);\n expect(deps).toHaveLength(2);\n // Fallback uses '*' as constraint and 'production' as default scope\n expect(deps[0].declaredConstraint).toBe('*');\n expect(deps[0].scope).toBe('production');\n });\n\n it('should return empty array for unknown manifest type', async () => {\n const manifestPath = path.join(tmpDir, 'unknown.txt');\n fs.writeFileSync(manifestPath, 'some content');\n\n const adapter = new SecurityManifestAdapter(tmpDir);\n const deps = await adapter.extractFromManifest(manifestPath);\n expect(deps).toHaveLength(0);\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,110 +0,0 @@
1
- "use strict";
2
- var import_vitest = require("vitest");
3
- var import_parser = require("./parser");
4
- (0, import_vitest.describe)("compareVersions", () => {
5
- (0, import_vitest.it)("should compare simple semver versions", () => {
6
- (0, import_vitest.expect)((0, import_parser.compareVersions)("1.0.0", "2.0.0")).toBeLessThan(0);
7
- (0, import_vitest.expect)((0, import_parser.compareVersions)("2.0.0", "1.0.0")).toBeGreaterThan(0);
8
- (0, import_vitest.expect)((0, import_parser.compareVersions)("1.0.0", "1.0.0")).toBe(0);
9
- });
10
- (0, import_vitest.it)("should compare versions with different patch levels", () => {
11
- (0, import_vitest.expect)((0, import_parser.compareVersions)("1.2.3", "1.2.4")).toBeLessThan(0);
12
- (0, import_vitest.expect)((0, import_parser.compareVersions)("1.2.10", "1.2.9")).toBeGreaterThan(0);
13
- });
14
- (0, import_vitest.it)("should compare versions with different minor levels", () => {
15
- (0, import_vitest.expect)((0, import_parser.compareVersions)("1.1.0", "1.2.0")).toBeLessThan(0);
16
- (0, import_vitest.expect)((0, import_parser.compareVersions)("1.10.0", "1.9.0")).toBeGreaterThan(0);
17
- });
18
- (0, import_vitest.it)("should handle versions with leading v", () => {
19
- (0, import_vitest.expect)((0, import_parser.compareVersions)("v1.2.3", "v1.2.4")).toBeLessThan(0);
20
- (0, import_vitest.expect)((0, import_parser.compareVersions)("v2.0.0", "1.0.0")).toBeGreaterThan(0);
21
- });
22
- (0, import_vitest.it)("should handle constraint prefixes (^, ~, >=)", () => {
23
- (0, import_vitest.expect)((0, import_parser.compareVersions)("^1.2.3", "^1.2.4")).toBeLessThan(0);
24
- (0, import_vitest.expect)((0, import_parser.compareVersions)("~2.0.0", "~1.0.0")).toBeGreaterThan(0);
25
- (0, import_vitest.expect)((0, import_parser.compareVersions)(">=1.0.0", ">=2.0.0")).toBeLessThan(0);
26
- });
27
- (0, import_vitest.it)("should handle versions with different segment counts", () => {
28
- (0, import_vitest.expect)((0, import_parser.compareVersions)("1.2", "1.2.1")).toBeLessThan(0);
29
- (0, import_vitest.expect)((0, import_parser.compareVersions)("1.2.0", "1.2")).toBe(0);
30
- });
31
- (0, import_vitest.it)("should handle wildcard constraint as lowest", () => {
32
- (0, import_vitest.expect)((0, import_parser.compareVersions)("1.0.0", "*")).toBeGreaterThan(0);
33
- });
34
- });
35
- (0, import_vitest.describe)("deduplicateDependencies", () => {
36
- (0, import_vitest.it)("should return unique dependencies when no duplicates exist", () => {
37
- const deps = [
38
- { name: "express", declaredConstraint: "^4.18.0", resolvedVersion: "4.18.2", scope: "production", ecosystem: "npm", sourceManifest: "package.json" },
39
- { name: "lodash", declaredConstraint: "^4.17.0", resolvedVersion: "4.17.21", scope: "production", ecosystem: "npm", sourceManifest: "package.json" }
40
- ];
41
- const result = (0, import_parser.deduplicateDependencies)(deps);
42
- (0, import_vitest.expect)(result).toHaveLength(2);
43
- });
44
- (0, import_vitest.it)("should deduplicate same (name, ecosystem) keeping highest version", () => {
45
- const deps = [
46
- { name: "express", declaredConstraint: "^4.17.0", resolvedVersion: "4.17.1", scope: "production", ecosystem: "npm", sourceManifest: "packages/a/package.json" },
47
- { name: "express", declaredConstraint: "^4.18.0", resolvedVersion: "4.18.2", scope: "production", ecosystem: "npm", sourceManifest: "packages/b/package.json" }
48
- ];
49
- const result = (0, import_parser.deduplicateDependencies)(deps);
50
- (0, import_vitest.expect)(result).toHaveLength(1);
51
- (0, import_vitest.expect)(result[0].name).toBe("express");
52
- (0, import_vitest.expect)(result[0].resolvedVersion).toBe("4.18.2");
53
- (0, import_vitest.expect)(result[0].declaredConstraint).toBe("^4.18.0");
54
- (0, import_vitest.expect)(result[0].sourceManifests).toEqual(["packages/a/package.json", "packages/b/package.json"]);
55
- });
56
- (0, import_vitest.it)("should keep both when same name but different ecosystems", () => {
57
- const deps = [
58
- { name: "serde", declaredConstraint: "1.0.0", resolvedVersion: "1.0.0", scope: "production", ecosystem: "cargo", sourceManifest: "Cargo.toml" },
59
- { name: "serde", declaredConstraint: "1.0.0", resolvedVersion: "1.0.0", scope: "production", ecosystem: "npm", sourceManifest: "package.json" }
60
- ];
61
- const result = (0, import_parser.deduplicateDependencies)(deps);
62
- (0, import_vitest.expect)(result).toHaveLength(2);
63
- });
64
- (0, import_vitest.it)("should collect all source manifests for duplicates", () => {
65
- const deps = [
66
- { name: "lodash", declaredConstraint: "^4.17.0", resolvedVersion: "4.17.21", scope: "production", ecosystem: "npm", sourceManifest: "package.json" },
67
- { name: "lodash", declaredConstraint: "^4.17.0", resolvedVersion: "4.17.21", scope: "development", ecosystem: "npm", sourceManifest: "packages/lib/package.json" },
68
- { name: "lodash", declaredConstraint: "^4.17.0", resolvedVersion: "4.17.21", scope: "production", ecosystem: "npm", sourceManifest: "packages/app/package.json" }
69
- ];
70
- const result = (0, import_parser.deduplicateDependencies)(deps);
71
- (0, import_vitest.expect)(result).toHaveLength(1);
72
- (0, import_vitest.expect)(result[0].sourceManifests).toHaveLength(3);
73
- (0, import_vitest.expect)(result[0].sourceManifests).toContain("package.json");
74
- (0, import_vitest.expect)(result[0].sourceManifests).toContain("packages/lib/package.json");
75
- (0, import_vitest.expect)(result[0].sourceManifests).toContain("packages/app/package.json");
76
- });
77
- (0, import_vitest.it)("should not duplicate source manifests when same manifest appears twice", () => {
78
- const deps = [
79
- { name: "express", declaredConstraint: "^4.17.0", scope: "production", ecosystem: "npm", sourceManifest: "package.json" },
80
- { name: "express", declaredConstraint: "^4.18.0", scope: "production", ecosystem: "npm", sourceManifest: "package.json" }
81
- ];
82
- const result = (0, import_parser.deduplicateDependencies)(deps);
83
- (0, import_vitest.expect)(result).toHaveLength(1);
84
- (0, import_vitest.expect)(result[0].sourceManifests).toEqual(["package.json"]);
85
- });
86
- (0, import_vitest.it)("should use declaredConstraint for comparison when resolvedVersion is missing", () => {
87
- const deps = [
88
- { name: "django", declaredConstraint: "3.2.0", scope: "production", ecosystem: "python", sourceManifest: "requirements.txt" },
89
- { name: "django", declaredConstraint: "4.2.0", scope: "production", ecosystem: "python", sourceManifest: "packages/api/requirements.txt" }
90
- ];
91
- const result = (0, import_parser.deduplicateDependencies)(deps);
92
- (0, import_vitest.expect)(result).toHaveLength(1);
93
- (0, import_vitest.expect)(result[0].declaredConstraint).toBe("4.2.0");
94
- });
95
- (0, import_vitest.it)("should handle empty input", () => {
96
- const result = (0, import_parser.deduplicateDependencies)([]);
97
- (0, import_vitest.expect)(result).toHaveLength(0);
98
- });
99
- (0, import_vitest.it)("should prefer resolvedVersion over declaredConstraint for comparison", () => {
100
- const deps = [
101
- { name: "express", declaredConstraint: "^4.0.0", resolvedVersion: "4.18.2", scope: "production", ecosystem: "npm", sourceManifest: "a/package.json" },
102
- { name: "express", declaredConstraint: "^5.0.0", resolvedVersion: "5.0.0", scope: "production", ecosystem: "npm", sourceManifest: "b/package.json" }
103
- ];
104
- const result = (0, import_parser.deduplicateDependencies)(deps);
105
- (0, import_vitest.expect)(result).toHaveLength(1);
106
- (0, import_vitest.expect)(result[0].resolvedVersion).toBe("5.0.0");
107
- (0, import_vitest.expect)(result[0].declaredConstraint).toBe("^5.0.0");
108
- });
109
- });
110
- //# sourceMappingURL=parser.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/security/manifest/parser.test.ts"],
4
- "sourcesContent": ["/**\n * Unit tests for ManifestParser orchestrator\n */\nimport { describe, it, expect } from 'vitest';\nimport { compareVersions, deduplicateDependencies } from './parser';\nimport type { ParsedDependency } from '../types';\n\ndescribe('compareVersions', () => {\n it('should compare simple semver versions', () => {\n expect(compareVersions('1.0.0', '2.0.0')).toBeLessThan(0);\n expect(compareVersions('2.0.0', '1.0.0')).toBeGreaterThan(0);\n expect(compareVersions('1.0.0', '1.0.0')).toBe(0);\n });\n\n it('should compare versions with different patch levels', () => {\n expect(compareVersions('1.2.3', '1.2.4')).toBeLessThan(0);\n expect(compareVersions('1.2.10', '1.2.9')).toBeGreaterThan(0);\n });\n\n it('should compare versions with different minor levels', () => {\n expect(compareVersions('1.1.0', '1.2.0')).toBeLessThan(0);\n expect(compareVersions('1.10.0', '1.9.0')).toBeGreaterThan(0);\n });\n\n it('should handle versions with leading v', () => {\n expect(compareVersions('v1.2.3', 'v1.2.4')).toBeLessThan(0);\n expect(compareVersions('v2.0.0', '1.0.0')).toBeGreaterThan(0);\n });\n\n it('should handle constraint prefixes (^, ~, >=)', () => {\n expect(compareVersions('^1.2.3', '^1.2.4')).toBeLessThan(0);\n expect(compareVersions('~2.0.0', '~1.0.0')).toBeGreaterThan(0);\n expect(compareVersions('>=1.0.0', '>=2.0.0')).toBeLessThan(0);\n });\n\n it('should handle versions with different segment counts', () => {\n expect(compareVersions('1.2', '1.2.1')).toBeLessThan(0);\n expect(compareVersions('1.2.0', '1.2')).toBe(0);\n });\n\n it('should handle wildcard constraint as lowest', () => {\n // '*' is not numeric, so it falls to lexicographic comparison\n // but in practice we compare effective versions\n expect(compareVersions('1.0.0', '*')).toBeGreaterThan(0);\n });\n});\n\ndescribe('deduplicateDependencies', () => {\n it('should return unique dependencies when no duplicates exist', () => {\n const deps: ParsedDependency[] = [\n { name: 'express', declaredConstraint: '^4.18.0', resolvedVersion: '4.18.2', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n { name: 'lodash', declaredConstraint: '^4.17.0', resolvedVersion: '4.17.21', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n ];\n\n const result = deduplicateDependencies(deps);\n expect(result).toHaveLength(2);\n });\n\n it('should deduplicate same (name, ecosystem) keeping highest version', () => {\n const deps: ParsedDependency[] = [\n { name: 'express', declaredConstraint: '^4.17.0', resolvedVersion: '4.17.1', scope: 'production', ecosystem: 'npm', sourceManifest: 'packages/a/package.json' },\n { name: 'express', declaredConstraint: '^4.18.0', resolvedVersion: '4.18.2', scope: 'production', ecosystem: 'npm', sourceManifest: 'packages/b/package.json' },\n ];\n\n const result = deduplicateDependencies(deps);\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe('express');\n expect(result[0].resolvedVersion).toBe('4.18.2');\n expect(result[0].declaredConstraint).toBe('^4.18.0');\n expect(result[0].sourceManifests).toEqual(['packages/a/package.json', 'packages/b/package.json']);\n });\n\n it('should keep both when same name but different ecosystems', () => {\n const deps: ParsedDependency[] = [\n { name: 'serde', declaredConstraint: '1.0.0', resolvedVersion: '1.0.0', scope: 'production', ecosystem: 'cargo', sourceManifest: 'Cargo.toml' },\n { name: 'serde', declaredConstraint: '1.0.0', resolvedVersion: '1.0.0', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n ];\n\n const result = deduplicateDependencies(deps);\n expect(result).toHaveLength(2);\n });\n\n it('should collect all source manifests for duplicates', () => {\n const deps: ParsedDependency[] = [\n { name: 'lodash', declaredConstraint: '^4.17.0', resolvedVersion: '4.17.21', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n { name: 'lodash', declaredConstraint: '^4.17.0', resolvedVersion: '4.17.21', scope: 'development', ecosystem: 'npm', sourceManifest: 'packages/lib/package.json' },\n { name: 'lodash', declaredConstraint: '^4.17.0', resolvedVersion: '4.17.21', scope: 'production', ecosystem: 'npm', sourceManifest: 'packages/app/package.json' },\n ];\n\n const result = deduplicateDependencies(deps);\n expect(result).toHaveLength(1);\n expect(result[0].sourceManifests).toHaveLength(3);\n expect(result[0].sourceManifests).toContain('package.json');\n expect(result[0].sourceManifests).toContain('packages/lib/package.json');\n expect(result[0].sourceManifests).toContain('packages/app/package.json');\n });\n\n it('should not duplicate source manifests when same manifest appears twice', () => {\n const deps: ParsedDependency[] = [\n { name: 'express', declaredConstraint: '^4.17.0', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n { name: 'express', declaredConstraint: '^4.18.0', scope: 'production', ecosystem: 'npm', sourceManifest: 'package.json' },\n ];\n\n const result = deduplicateDependencies(deps);\n expect(result).toHaveLength(1);\n expect(result[0].sourceManifests).toEqual(['package.json']);\n });\n\n it('should use declaredConstraint for comparison when resolvedVersion is missing', () => {\n const deps: ParsedDependency[] = [\n { name: 'django', declaredConstraint: '3.2.0', scope: 'production', ecosystem: 'python', sourceManifest: 'requirements.txt' },\n { name: 'django', declaredConstraint: '4.2.0', scope: 'production', ecosystem: 'python', sourceManifest: 'packages/api/requirements.txt' },\n ];\n\n const result = deduplicateDependencies(deps);\n expect(result).toHaveLength(1);\n expect(result[0].declaredConstraint).toBe('4.2.0');\n });\n\n it('should handle empty input', () => {\n const result = deduplicateDependencies([]);\n expect(result).toHaveLength(0);\n });\n\n it('should prefer resolvedVersion over declaredConstraint for comparison', () => {\n const deps: ParsedDependency[] = [\n { name: 'express', declaredConstraint: '^4.0.0', resolvedVersion: '4.18.2', scope: 'production', ecosystem: 'npm', sourceManifest: 'a/package.json' },\n { name: 'express', declaredConstraint: '^5.0.0', resolvedVersion: '5.0.0', scope: 'production', ecosystem: 'npm', sourceManifest: 'b/package.json' },\n ];\n\n const result = deduplicateDependencies(deps);\n expect(result).toHaveLength(1);\n expect(result[0].resolvedVersion).toBe('5.0.0');\n expect(result[0].declaredConstraint).toBe('^5.0.0');\n });\n});\n"],
5
- "mappings": "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",
6
- "names": []
7
- }