@opencodehub/ingestion 0.1.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 (563) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +69 -0
  3. package/dist/extract/index.d.ts +8 -0
  4. package/dist/extract/index.d.ts.map +1 -0
  5. package/dist/extract/index.js +6 -0
  6. package/dist/extract/index.js.map +1 -0
  7. package/dist/extract/orm-detector.d.ts +19 -0
  8. package/dist/extract/orm-detector.d.ts.map +1 -0
  9. package/dist/extract/orm-detector.js +209 -0
  10. package/dist/extract/orm-detector.js.map +1 -0
  11. package/dist/extract/property-access.d.ts +76 -0
  12. package/dist/extract/property-access.d.ts.map +1 -0
  13. package/dist/extract/property-access.js +260 -0
  14. package/dist/extract/property-access.js.map +1 -0
  15. package/dist/extract/receiver-resolver.d.ts +86 -0
  16. package/dist/extract/receiver-resolver.d.ts.map +1 -0
  17. package/dist/extract/receiver-resolver.js +77 -0
  18. package/dist/extract/receiver-resolver.js.map +1 -0
  19. package/dist/extract/route-detector-java.d.ts +29 -0
  20. package/dist/extract/route-detector-java.d.ts.map +1 -0
  21. package/dist/extract/route-detector-java.js +190 -0
  22. package/dist/extract/route-detector-java.js.map +1 -0
  23. package/dist/extract/route-detector-nestjs.d.ts +30 -0
  24. package/dist/extract/route-detector-nestjs.d.ts.map +1 -0
  25. package/dist/extract/route-detector-nestjs.js +134 -0
  26. package/dist/extract/route-detector-nestjs.js.map +1 -0
  27. package/dist/extract/route-detector-python.d.ts +28 -0
  28. package/dist/extract/route-detector-python.d.ts.map +1 -0
  29. package/dist/extract/route-detector-python.js +100 -0
  30. package/dist/extract/route-detector-python.js.map +1 -0
  31. package/dist/extract/route-detector-rails.d.ts +28 -0
  32. package/dist/extract/route-detector-rails.d.ts.map +1 -0
  33. package/dist/extract/route-detector-rails.js +162 -0
  34. package/dist/extract/route-detector-rails.js.map +1 -0
  35. package/dist/extract/route-detector.d.ts +45 -0
  36. package/dist/extract/route-detector.d.ts.map +1 -0
  37. package/dist/extract/route-detector.js +467 -0
  38. package/dist/extract/route-detector.js.map +1 -0
  39. package/dist/extract/tool-detector.d.ts +26 -0
  40. package/dist/extract/tool-detector.d.ts.map +1 -0
  41. package/dist/extract/tool-detector.js +364 -0
  42. package/dist/extract/tool-detector.js.map +1 -0
  43. package/dist/extract/types.d.ts +89 -0
  44. package/dist/extract/types.d.ts.map +1 -0
  45. package/dist/extract/types.js +11 -0
  46. package/dist/extract/types.js.map +1 -0
  47. package/dist/index.d.ts +10 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +10 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/parse/cobol-regex.d.ts +85 -0
  52. package/dist/parse/cobol-regex.d.ts.map +1 -0
  53. package/dist/parse/cobol-regex.js +355 -0
  54. package/dist/parse/cobol-regex.js.map +1 -0
  55. package/dist/parse/grammar-registry.d.ts +115 -0
  56. package/dist/parse/grammar-registry.d.ts.map +1 -0
  57. package/dist/parse/grammar-registry.js +278 -0
  58. package/dist/parse/grammar-registry.js.map +1 -0
  59. package/dist/parse/index.d.ts +14 -0
  60. package/dist/parse/index.d.ts.map +1 -0
  61. package/dist/parse/index.js +10 -0
  62. package/dist/parse/index.js.map +1 -0
  63. package/dist/parse/language-detector.d.ts +17 -0
  64. package/dist/parse/language-detector.d.ts.map +1 -0
  65. package/dist/parse/language-detector.js +104 -0
  66. package/dist/parse/language-detector.js.map +1 -0
  67. package/dist/parse/parse-worker.d.ts +24 -0
  68. package/dist/parse/parse-worker.d.ts.map +1 -0
  69. package/dist/parse/parse-worker.js +230 -0
  70. package/dist/parse/parse-worker.js.map +1 -0
  71. package/dist/parse/types.d.ts +49 -0
  72. package/dist/parse/types.d.ts.map +1 -0
  73. package/dist/parse/types.js +11 -0
  74. package/dist/parse/types.js.map +1 -0
  75. package/dist/parse/unified-queries.d.ts +37 -0
  76. package/dist/parse/unified-queries.d.ts.map +1 -0
  77. package/dist/parse/unified-queries.js +623 -0
  78. package/dist/parse/unified-queries.js.map +1 -0
  79. package/dist/parse/wasm-fallback.d.ts +88 -0
  80. package/dist/parse/wasm-fallback.d.ts.map +1 -0
  81. package/dist/parse/wasm-fallback.js +258 -0
  82. package/dist/parse/wasm-fallback.js.map +1 -0
  83. package/dist/parse/worker-pool.d.ts +48 -0
  84. package/dist/parse/worker-pool.d.ts.map +1 -0
  85. package/dist/parse/worker-pool.js +97 -0
  86. package/dist/parse/worker-pool.js.map +1 -0
  87. package/dist/pipeline/dep-parsers/go.d.ts +25 -0
  88. package/dist/pipeline/dep-parsers/go.d.ts.map +1 -0
  89. package/dist/pipeline/dep-parsers/go.js +146 -0
  90. package/dist/pipeline/dep-parsers/go.js.map +1 -0
  91. package/dist/pipeline/dep-parsers/index.d.ts +17 -0
  92. package/dist/pipeline/dep-parsers/index.d.ts.map +1 -0
  93. package/dist/pipeline/dep-parsers/index.js +16 -0
  94. package/dist/pipeline/dep-parsers/index.js.map +1 -0
  95. package/dist/pipeline/dep-parsers/maven.d.ts +24 -0
  96. package/dist/pipeline/dep-parsers/maven.d.ts.map +1 -0
  97. package/dist/pipeline/dep-parsers/maven.js +131 -0
  98. package/dist/pipeline/dep-parsers/maven.js.map +1 -0
  99. package/dist/pipeline/dep-parsers/npm.d.ts +30 -0
  100. package/dist/pipeline/dep-parsers/npm.d.ts.map +1 -0
  101. package/dist/pipeline/dep-parsers/npm.js +309 -0
  102. package/dist/pipeline/dep-parsers/npm.js.map +1 -0
  103. package/dist/pipeline/dep-parsers/nuget.d.ts +24 -0
  104. package/dist/pipeline/dep-parsers/nuget.d.ts.map +1 -0
  105. package/dist/pipeline/dep-parsers/nuget.js +178 -0
  106. package/dist/pipeline/dep-parsers/nuget.js.map +1 -0
  107. package/dist/pipeline/dep-parsers/python.d.ts +21 -0
  108. package/dist/pipeline/dep-parsers/python.d.ts.map +1 -0
  109. package/dist/pipeline/dep-parsers/python.js +369 -0
  110. package/dist/pipeline/dep-parsers/python.js.map +1 -0
  111. package/dist/pipeline/dep-parsers/rust.d.ts +18 -0
  112. package/dist/pipeline/dep-parsers/rust.d.ts.map +1 -0
  113. package/dist/pipeline/dep-parsers/rust.js +134 -0
  114. package/dist/pipeline/dep-parsers/rust.js.map +1 -0
  115. package/dist/pipeline/dep-parsers/spdx-normalize.d.ts +15 -0
  116. package/dist/pipeline/dep-parsers/spdx-normalize.d.ts.map +1 -0
  117. package/dist/pipeline/dep-parsers/spdx-normalize.js +31 -0
  118. package/dist/pipeline/dep-parsers/spdx-normalize.js.map +1 -0
  119. package/dist/pipeline/dep-parsers/types.d.ts +63 -0
  120. package/dist/pipeline/dep-parsers/types.d.ts.map +1 -0
  121. package/dist/pipeline/dep-parsers/types.js +56 -0
  122. package/dist/pipeline/dep-parsers/types.js.map +1 -0
  123. package/dist/pipeline/gitignore-stack.d.ts +44 -0
  124. package/dist/pipeline/gitignore-stack.d.ts.map +1 -0
  125. package/dist/pipeline/gitignore-stack.js +69 -0
  126. package/dist/pipeline/gitignore-stack.js.map +1 -0
  127. package/dist/pipeline/gitignore.d.ts +67 -0
  128. package/dist/pipeline/gitignore.d.ts.map +1 -0
  129. package/dist/pipeline/gitignore.js +210 -0
  130. package/dist/pipeline/gitignore.js.map +1 -0
  131. package/dist/pipeline/index.d.ts +53 -0
  132. package/dist/pipeline/index.d.ts.map +1 -0
  133. package/dist/pipeline/index.js +29 -0
  134. package/dist/pipeline/index.js.map +1 -0
  135. package/dist/pipeline/orchestrator.d.ts +105 -0
  136. package/dist/pipeline/orchestrator.d.ts.map +1 -0
  137. package/dist/pipeline/orchestrator.js +175 -0
  138. package/dist/pipeline/orchestrator.js.map +1 -0
  139. package/dist/pipeline/ownership-helpers/drift.d.ts +41 -0
  140. package/dist/pipeline/ownership-helpers/drift.d.ts.map +1 -0
  141. package/dist/pipeline/ownership-helpers/drift.js +122 -0
  142. package/dist/pipeline/ownership-helpers/drift.js.map +1 -0
  143. package/dist/pipeline/ownership-helpers/gini-community.d.ts +24 -0
  144. package/dist/pipeline/ownership-helpers/gini-community.d.ts.map +1 -0
  145. package/dist/pipeline/ownership-helpers/gini-community.js +32 -0
  146. package/dist/pipeline/ownership-helpers/gini-community.js.map +1 -0
  147. package/dist/pipeline/ownership-helpers/git-blame-batcher.d.ts +71 -0
  148. package/dist/pipeline/ownership-helpers/git-blame-batcher.d.ts.map +1 -0
  149. package/dist/pipeline/ownership-helpers/git-blame-batcher.js +178 -0
  150. package/dist/pipeline/ownership-helpers/git-blame-batcher.js.map +1 -0
  151. package/dist/pipeline/ownership-helpers/line-overlap.d.ts +35 -0
  152. package/dist/pipeline/ownership-helpers/line-overlap.d.ts.map +1 -0
  153. package/dist/pipeline/ownership-helpers/line-overlap.js +62 -0
  154. package/dist/pipeline/ownership-helpers/line-overlap.js.map +1 -0
  155. package/dist/pipeline/ownership-helpers/orphan.d.ts +73 -0
  156. package/dist/pipeline/ownership-helpers/orphan.d.ts.map +1 -0
  157. package/dist/pipeline/ownership-helpers/orphan.js +117 -0
  158. package/dist/pipeline/ownership-helpers/orphan.js.map +1 -0
  159. package/dist/pipeline/phases/accesses.d.ts +44 -0
  160. package/dist/pipeline/phases/accesses.d.ts.map +1 -0
  161. package/dist/pipeline/phases/accesses.js +194 -0
  162. package/dist/pipeline/phases/accesses.js.map +1 -0
  163. package/dist/pipeline/phases/annotate.d.ts +28 -0
  164. package/dist/pipeline/phases/annotate.d.ts.map +1 -0
  165. package/dist/pipeline/phases/annotate.js +60 -0
  166. package/dist/pipeline/phases/annotate.js.map +1 -0
  167. package/dist/pipeline/phases/cochange.d.ts +42 -0
  168. package/dist/pipeline/phases/cochange.d.ts.map +1 -0
  169. package/dist/pipeline/phases/cochange.js +0 -0
  170. package/dist/pipeline/phases/cochange.js.map +1 -0
  171. package/dist/pipeline/phases/communities.d.ts +34 -0
  172. package/dist/pipeline/phases/communities.d.ts.map +1 -0
  173. package/dist/pipeline/phases/communities.js +412 -0
  174. package/dist/pipeline/phases/communities.js.map +1 -0
  175. package/dist/pipeline/phases/complexity.d.ts +50 -0
  176. package/dist/pipeline/phases/complexity.d.ts.map +1 -0
  177. package/dist/pipeline/phases/complexity.js +794 -0
  178. package/dist/pipeline/phases/complexity.js.map +1 -0
  179. package/dist/pipeline/phases/confidence-demote.d.ts +23 -0
  180. package/dist/pipeline/phases/confidence-demote.d.ts.map +1 -0
  181. package/dist/pipeline/phases/confidence-demote.js +113 -0
  182. package/dist/pipeline/phases/confidence-demote.js.map +1 -0
  183. package/dist/pipeline/phases/content-cache.d.ts +166 -0
  184. package/dist/pipeline/phases/content-cache.d.ts.map +1 -0
  185. package/dist/pipeline/phases/content-cache.js +323 -0
  186. package/dist/pipeline/phases/content-cache.js.map +1 -0
  187. package/dist/pipeline/phases/coverage-parsers/cobertura.d.ts +25 -0
  188. package/dist/pipeline/phases/coverage-parsers/cobertura.d.ts.map +1 -0
  189. package/dist/pipeline/phases/coverage-parsers/cobertura.js +139 -0
  190. package/dist/pipeline/phases/coverage-parsers/cobertura.js.map +1 -0
  191. package/dist/pipeline/phases/coverage-parsers/coverage-py.d.ts +25 -0
  192. package/dist/pipeline/phases/coverage-parsers/coverage-py.d.ts.map +1 -0
  193. package/dist/pipeline/phases/coverage-parsers/coverage-py.js +51 -0
  194. package/dist/pipeline/phases/coverage-parsers/coverage-py.js.map +1 -0
  195. package/dist/pipeline/phases/coverage-parsers/jacoco.d.ts +32 -0
  196. package/dist/pipeline/phases/coverage-parsers/jacoco.d.ts.map +1 -0
  197. package/dist/pipeline/phases/coverage-parsers/jacoco.js +98 -0
  198. package/dist/pipeline/phases/coverage-parsers/jacoco.js.map +1 -0
  199. package/dist/pipeline/phases/coverage-parsers/lcov.d.ts +21 -0
  200. package/dist/pipeline/phases/coverage-parsers/lcov.d.ts.map +1 -0
  201. package/dist/pipeline/phases/coverage-parsers/lcov.js +104 -0
  202. package/dist/pipeline/phases/coverage-parsers/lcov.js.map +1 -0
  203. package/dist/pipeline/phases/coverage-parsers/types.d.ts +27 -0
  204. package/dist/pipeline/phases/coverage-parsers/types.d.ts.map +1 -0
  205. package/dist/pipeline/phases/coverage-parsers/types.js +39 -0
  206. package/dist/pipeline/phases/coverage-parsers/types.js.map +1 -0
  207. package/dist/pipeline/phases/coverage.d.ts +39 -0
  208. package/dist/pipeline/phases/coverage.d.ts.map +1 -0
  209. package/dist/pipeline/phases/coverage.js +154 -0
  210. package/dist/pipeline/phases/coverage.js.map +1 -0
  211. package/dist/pipeline/phases/cross-file.d.ts +40 -0
  212. package/dist/pipeline/phases/cross-file.d.ts.map +1 -0
  213. package/dist/pipeline/phases/cross-file.js +411 -0
  214. package/dist/pipeline/phases/cross-file.js.map +1 -0
  215. package/dist/pipeline/phases/dead-code.d.ts +28 -0
  216. package/dist/pipeline/phases/dead-code.d.ts.map +1 -0
  217. package/dist/pipeline/phases/dead-code.js +157 -0
  218. package/dist/pipeline/phases/dead-code.js.map +1 -0
  219. package/dist/pipeline/phases/default-set.d.ts +24 -0
  220. package/dist/pipeline/phases/default-set.d.ts.map +1 -0
  221. package/dist/pipeline/phases/default-set.js +133 -0
  222. package/dist/pipeline/phases/default-set.js.map +1 -0
  223. package/dist/pipeline/phases/dependencies.d.ts +59 -0
  224. package/dist/pipeline/phases/dependencies.d.ts.map +1 -0
  225. package/dist/pipeline/phases/dependencies.js +281 -0
  226. package/dist/pipeline/phases/dependencies.js.map +1 -0
  227. package/dist/pipeline/phases/embedder-pool.d.ts +31 -0
  228. package/dist/pipeline/phases/embedder-pool.d.ts.map +1 -0
  229. package/dist/pipeline/phases/embedder-pool.js +79 -0
  230. package/dist/pipeline/phases/embedder-pool.js.map +1 -0
  231. package/dist/pipeline/phases/embedder-worker.d.ts +28 -0
  232. package/dist/pipeline/phases/embedder-worker.d.ts.map +1 -0
  233. package/dist/pipeline/phases/embedder-worker.js +43 -0
  234. package/dist/pipeline/phases/embedder-worker.js.map +1 -0
  235. package/dist/pipeline/phases/embeddings.d.ts +117 -0
  236. package/dist/pipeline/phases/embeddings.d.ts.map +1 -0
  237. package/dist/pipeline/phases/embeddings.js +697 -0
  238. package/dist/pipeline/phases/embeddings.js.map +1 -0
  239. package/dist/pipeline/phases/fetches.d.ts +47 -0
  240. package/dist/pipeline/phases/fetches.d.ts.map +1 -0
  241. package/dist/pipeline/phases/fetches.js +207 -0
  242. package/dist/pipeline/phases/fetches.js.map +1 -0
  243. package/dist/pipeline/phases/incremental-helper.d.ts +96 -0
  244. package/dist/pipeline/phases/incremental-helper.d.ts.map +1 -0
  245. package/dist/pipeline/phases/incremental-helper.js +125 -0
  246. package/dist/pipeline/phases/incremental-helper.js.map +1 -0
  247. package/dist/pipeline/phases/incremental-scope.d.ts +67 -0
  248. package/dist/pipeline/phases/incremental-scope.d.ts.map +1 -0
  249. package/dist/pipeline/phases/incremental-scope.js +225 -0
  250. package/dist/pipeline/phases/incremental-scope.js.map +1 -0
  251. package/dist/pipeline/phases/markdown.d.ts +29 -0
  252. package/dist/pipeline/phases/markdown.d.ts.map +1 -0
  253. package/dist/pipeline/phases/markdown.js +298 -0
  254. package/dist/pipeline/phases/markdown.js.map +1 -0
  255. package/dist/pipeline/phases/mro.d.ts +24 -0
  256. package/dist/pipeline/phases/mro.d.ts.map +1 -0
  257. package/dist/pipeline/phases/mro.js +303 -0
  258. package/dist/pipeline/phases/mro.js.map +1 -0
  259. package/dist/pipeline/phases/openapi.d.ts +52 -0
  260. package/dist/pipeline/phases/openapi.d.ts.map +1 -0
  261. package/dist/pipeline/phases/openapi.js +285 -0
  262. package/dist/pipeline/phases/openapi.js.map +1 -0
  263. package/dist/pipeline/phases/orm.d.ts +26 -0
  264. package/dist/pipeline/phases/orm.d.ts.map +1 -0
  265. package/dist/pipeline/phases/orm.js +183 -0
  266. package/dist/pipeline/phases/orm.js.map +1 -0
  267. package/dist/pipeline/phases/ownership.d.ts +88 -0
  268. package/dist/pipeline/phases/ownership.d.ts.map +1 -0
  269. package/dist/pipeline/phases/ownership.js +479 -0
  270. package/dist/pipeline/phases/ownership.js.map +1 -0
  271. package/dist/pipeline/phases/parse.d.ts +63 -0
  272. package/dist/pipeline/phases/parse.d.ts.map +1 -0
  273. package/dist/pipeline/phases/parse.js +994 -0
  274. package/dist/pipeline/phases/parse.js.map +1 -0
  275. package/dist/pipeline/phases/processes.d.ts +47 -0
  276. package/dist/pipeline/phases/processes.d.ts.map +1 -0
  277. package/dist/pipeline/phases/processes.js +620 -0
  278. package/dist/pipeline/phases/processes.js.map +1 -0
  279. package/dist/pipeline/phases/profile.d.ts +33 -0
  280. package/dist/pipeline/phases/profile.d.ts.map +1 -0
  281. package/dist/pipeline/phases/profile.js +91 -0
  282. package/dist/pipeline/phases/profile.js.map +1 -0
  283. package/dist/pipeline/phases/repo-node.d.ts +112 -0
  284. package/dist/pipeline/phases/repo-node.d.ts.map +1 -0
  285. package/dist/pipeline/phases/repo-node.js +272 -0
  286. package/dist/pipeline/phases/repo-node.js.map +1 -0
  287. package/dist/pipeline/phases/risk-snapshot.d.ts +34 -0
  288. package/dist/pipeline/phases/risk-snapshot.d.ts.map +1 -0
  289. package/dist/pipeline/phases/risk-snapshot.js +63 -0
  290. package/dist/pipeline/phases/risk-snapshot.js.map +1 -0
  291. package/dist/pipeline/phases/routes.d.ts +31 -0
  292. package/dist/pipeline/phases/routes.d.ts.map +1 -0
  293. package/dist/pipeline/phases/routes.js +262 -0
  294. package/dist/pipeline/phases/routes.js.map +1 -0
  295. package/dist/pipeline/phases/sbom.d.ts +45 -0
  296. package/dist/pipeline/phases/sbom.d.ts.map +1 -0
  297. package/dist/pipeline/phases/sbom.js +289 -0
  298. package/dist/pipeline/phases/sbom.js.map +1 -0
  299. package/dist/pipeline/phases/scan.d.ts +54 -0
  300. package/dist/pipeline/phases/scan.d.ts.map +1 -0
  301. package/dist/pipeline/phases/scan.js +340 -0
  302. package/dist/pipeline/phases/scan.js.map +1 -0
  303. package/dist/pipeline/phases/scip-index.d.ts +54 -0
  304. package/dist/pipeline/phases/scip-index.d.ts.map +1 -0
  305. package/dist/pipeline/phases/scip-index.js +469 -0
  306. package/dist/pipeline/phases/scip-index.js.map +1 -0
  307. package/dist/pipeline/phases/structure.d.ts +21 -0
  308. package/dist/pipeline/phases/structure.d.ts.map +1 -0
  309. package/dist/pipeline/phases/structure.js +115 -0
  310. package/dist/pipeline/phases/structure.js.map +1 -0
  311. package/dist/pipeline/phases/summarize.d.ts +126 -0
  312. package/dist/pipeline/phases/summarize.d.ts.map +1 -0
  313. package/dist/pipeline/phases/summarize.js +401 -0
  314. package/dist/pipeline/phases/summarize.js.map +1 -0
  315. package/dist/pipeline/phases/temporal-helpers/branch-divergence.d.ts +42 -0
  316. package/dist/pipeline/phases/temporal-helpers/branch-divergence.d.ts.map +1 -0
  317. package/dist/pipeline/phases/temporal-helpers/branch-divergence.js +96 -0
  318. package/dist/pipeline/phases/temporal-helpers/branch-divergence.js.map +1 -0
  319. package/dist/pipeline/phases/temporal-helpers/churn-decay.d.ts +22 -0
  320. package/dist/pipeline/phases/temporal-helpers/churn-decay.d.ts.map +1 -0
  321. package/dist/pipeline/phases/temporal-helpers/churn-decay.js +32 -0
  322. package/dist/pipeline/phases/temporal-helpers/churn-decay.js.map +1 -0
  323. package/dist/pipeline/phases/temporal-helpers/conventional-commits.d.ts +21 -0
  324. package/dist/pipeline/phases/temporal-helpers/conventional-commits.d.ts.map +1 -0
  325. package/dist/pipeline/phases/temporal-helpers/conventional-commits.js +37 -0
  326. package/dist/pipeline/phases/temporal-helpers/conventional-commits.js.map +1 -0
  327. package/dist/pipeline/phases/temporal-helpers/gini.d.ts +32 -0
  328. package/dist/pipeline/phases/temporal-helpers/gini.d.ts.map +1 -0
  329. package/dist/pipeline/phases/temporal-helpers/gini.js +78 -0
  330. package/dist/pipeline/phases/temporal-helpers/gini.js.map +1 -0
  331. package/dist/pipeline/phases/temporal-helpers/revert-detect.d.ts +14 -0
  332. package/dist/pipeline/phases/temporal-helpers/revert-detect.d.ts.map +1 -0
  333. package/dist/pipeline/phases/temporal-helpers/revert-detect.js +25 -0
  334. package/dist/pipeline/phases/temporal-helpers/revert-detect.js.map +1 -0
  335. package/dist/pipeline/phases/temporal-helpers/test-pair.d.ts +18 -0
  336. package/dist/pipeline/phases/temporal-helpers/test-pair.d.ts.map +1 -0
  337. package/dist/pipeline/phases/temporal-helpers/test-pair.js +119 -0
  338. package/dist/pipeline/phases/temporal-helpers/test-pair.js.map +1 -0
  339. package/dist/pipeline/phases/temporal.d.ts +65 -0
  340. package/dist/pipeline/phases/temporal.d.ts.map +1 -0
  341. package/dist/pipeline/phases/temporal.js +621 -0
  342. package/dist/pipeline/phases/temporal.js.map +1 -0
  343. package/dist/pipeline/phases/tools.d.ts +21 -0
  344. package/dist/pipeline/phases/tools.d.ts.map +1 -0
  345. package/dist/pipeline/phases/tools.js +118 -0
  346. package/dist/pipeline/phases/tools.js.map +1 -0
  347. package/dist/pipeline/profile-detectors/api-contracts.d.ts +18 -0
  348. package/dist/pipeline/profile-detectors/api-contracts.d.ts.map +1 -0
  349. package/dist/pipeline/profile-detectors/api-contracts.js +78 -0
  350. package/dist/pipeline/profile-detectors/api-contracts.js.map +1 -0
  351. package/dist/pipeline/profile-detectors/framework-detector.d.ts +11 -0
  352. package/dist/pipeline/profile-detectors/framework-detector.d.ts.map +1 -0
  353. package/dist/pipeline/profile-detectors/framework-detector.js +11 -0
  354. package/dist/pipeline/profile-detectors/framework-detector.js.map +1 -0
  355. package/dist/pipeline/profile-detectors/frameworks-catalog.d.ts +7 -0
  356. package/dist/pipeline/profile-detectors/frameworks-catalog.d.ts.map +1 -0
  357. package/dist/pipeline/profile-detectors/frameworks-catalog.js +7 -0
  358. package/dist/pipeline/profile-detectors/frameworks-catalog.js.map +1 -0
  359. package/dist/pipeline/profile-detectors/frameworks.d.ts +7 -0
  360. package/dist/pipeline/profile-detectors/frameworks.d.ts.map +1 -0
  361. package/dist/pipeline/profile-detectors/frameworks.js +7 -0
  362. package/dist/pipeline/profile-detectors/frameworks.js.map +1 -0
  363. package/dist/pipeline/profile-detectors/iac.d.ts +22 -0
  364. package/dist/pipeline/profile-detectors/iac.d.ts.map +1 -0
  365. package/dist/pipeline/profile-detectors/iac.js +97 -0
  366. package/dist/pipeline/profile-detectors/iac.js.map +1 -0
  367. package/dist/pipeline/profile-detectors/languages.d.ts +18 -0
  368. package/dist/pipeline/profile-detectors/languages.d.ts.map +1 -0
  369. package/dist/pipeline/profile-detectors/languages.js +60 -0
  370. package/dist/pipeline/profile-detectors/languages.js.map +1 -0
  371. package/dist/pipeline/profile-detectors/manifests.d.ts +7 -0
  372. package/dist/pipeline/profile-detectors/manifests.d.ts.map +1 -0
  373. package/dist/pipeline/profile-detectors/manifests.js +7 -0
  374. package/dist/pipeline/profile-detectors/manifests.js.map +1 -0
  375. package/dist/pipeline/profile-detectors/src-dirs.d.ts +17 -0
  376. package/dist/pipeline/profile-detectors/src-dirs.d.ts.map +1 -0
  377. package/dist/pipeline/profile-detectors/src-dirs.js +89 -0
  378. package/dist/pipeline/profile-detectors/src-dirs.js.map +1 -0
  379. package/dist/pipeline/profile-detectors/variant-detectors.d.ts +7 -0
  380. package/dist/pipeline/profile-detectors/variant-detectors.d.ts.map +1 -0
  381. package/dist/pipeline/profile-detectors/variant-detectors.js +7 -0
  382. package/dist/pipeline/profile-detectors/variant-detectors.js.map +1 -0
  383. package/dist/pipeline/runner.d.ts +54 -0
  384. package/dist/pipeline/runner.d.ts.map +1 -0
  385. package/dist/pipeline/runner.js +247 -0
  386. package/dist/pipeline/runner.js.map +1 -0
  387. package/dist/pipeline/types.d.ts +235 -0
  388. package/dist/pipeline/types.d.ts.map +1 -0
  389. package/dist/pipeline/types.js +15 -0
  390. package/dist/pipeline/types.js.map +1 -0
  391. package/dist/providers/c.d.ts +3 -0
  392. package/dist/providers/c.d.ts.map +1 -0
  393. package/dist/providers/c.js +162 -0
  394. package/dist/providers/c.js.map +1 -0
  395. package/dist/providers/cobol.d.ts +19 -0
  396. package/dist/providers/cobol.d.ts.map +1 -0
  397. package/dist/providers/cobol.js +44 -0
  398. package/dist/providers/cobol.js.map +1 -0
  399. package/dist/providers/cpp.d.ts +3 -0
  400. package/dist/providers/cpp.d.ts.map +1 -0
  401. package/dist/providers/cpp.js +200 -0
  402. package/dist/providers/cpp.js.map +1 -0
  403. package/dist/providers/csharp.d.ts +3 -0
  404. package/dist/providers/csharp.d.ts.map +1 -0
  405. package/dist/providers/csharp.js +292 -0
  406. package/dist/providers/csharp.js.map +1 -0
  407. package/dist/providers/dart.d.ts +3 -0
  408. package/dist/providers/dart.d.ts.map +1 -0
  409. package/dist/providers/dart.js +214 -0
  410. package/dist/providers/dart.js.map +1 -0
  411. package/dist/providers/definition-ids.d.ts +18 -0
  412. package/dist/providers/definition-ids.d.ts.map +1 -0
  413. package/dist/providers/definition-ids.js +23 -0
  414. package/dist/providers/definition-ids.js.map +1 -0
  415. package/dist/providers/extract-helpers.d.ts +60 -0
  416. package/dist/providers/extract-helpers.d.ts.map +1 -0
  417. package/dist/providers/extract-helpers.js +296 -0
  418. package/dist/providers/extract-helpers.js.map +1 -0
  419. package/dist/providers/extraction-types.d.ts +85 -0
  420. package/dist/providers/extraction-types.d.ts.map +1 -0
  421. package/dist/providers/extraction-types.js +13 -0
  422. package/dist/providers/extraction-types.js.map +1 -0
  423. package/dist/providers/go.d.ts +3 -0
  424. package/dist/providers/go.d.ts.map +1 -0
  425. package/dist/providers/go.js +359 -0
  426. package/dist/providers/go.js.map +1 -0
  427. package/dist/providers/http-detect.d.ts +44 -0
  428. package/dist/providers/http-detect.d.ts.map +1 -0
  429. package/dist/providers/http-detect.js +307 -0
  430. package/dist/providers/http-detect.js.map +1 -0
  431. package/dist/providers/index.d.ts +38 -0
  432. package/dist/providers/index.d.ts.map +1 -0
  433. package/dist/providers/index.js +33 -0
  434. package/dist/providers/index.js.map +1 -0
  435. package/dist/providers/java.d.ts +3 -0
  436. package/dist/providers/java.d.ts.map +1 -0
  437. package/dist/providers/java.js +259 -0
  438. package/dist/providers/java.js.map +1 -0
  439. package/dist/providers/javascript.d.ts +3 -0
  440. package/dist/providers/javascript.d.ts.map +1 -0
  441. package/dist/providers/javascript.js +139 -0
  442. package/dist/providers/javascript.js.map +1 -0
  443. package/dist/providers/kotlin.d.ts +3 -0
  444. package/dist/providers/kotlin.d.ts.map +1 -0
  445. package/dist/providers/kotlin.js +175 -0
  446. package/dist/providers/kotlin.js.map +1 -0
  447. package/dist/providers/php.d.ts +3 -0
  448. package/dist/providers/php.d.ts.map +1 -0
  449. package/dist/providers/php.js +218 -0
  450. package/dist/providers/php.js.map +1 -0
  451. package/dist/providers/python-accesses.d.ts +9 -0
  452. package/dist/providers/python-accesses.d.ts.map +1 -0
  453. package/dist/providers/python-accesses.js +22 -0
  454. package/dist/providers/python-accesses.js.map +1 -0
  455. package/dist/providers/python.d.ts +3 -0
  456. package/dist/providers/python.d.ts.map +1 -0
  457. package/dist/providers/python.js +323 -0
  458. package/dist/providers/python.js.map +1 -0
  459. package/dist/providers/registry.d.ts +4 -0
  460. package/dist/providers/registry.d.ts.map +1 -0
  461. package/dist/providers/registry.js +46 -0
  462. package/dist/providers/registry.js.map +1 -0
  463. package/dist/providers/resolution/c3.d.ts +6 -0
  464. package/dist/providers/resolution/c3.d.ts.map +1 -0
  465. package/dist/providers/resolution/c3.js +76 -0
  466. package/dist/providers/resolution/c3.js.map +1 -0
  467. package/dist/providers/resolution/context.d.ts +38 -0
  468. package/dist/providers/resolution/context.d.ts.map +1 -0
  469. package/dist/providers/resolution/context.js +45 -0
  470. package/dist/providers/resolution/context.js.map +1 -0
  471. package/dist/providers/resolution/first-wins.d.ts +3 -0
  472. package/dist/providers/resolution/first-wins.d.ts.map +1 -0
  473. package/dist/providers/resolution/first-wins.js +27 -0
  474. package/dist/providers/resolution/first-wins.js.map +1 -0
  475. package/dist/providers/resolution/mro.d.ts +16 -0
  476. package/dist/providers/resolution/mro.d.ts.map +1 -0
  477. package/dist/providers/resolution/mro.js +14 -0
  478. package/dist/providers/resolution/mro.js.map +1 -0
  479. package/dist/providers/resolution/none.d.ts +3 -0
  480. package/dist/providers/resolution/none.d.ts.map +1 -0
  481. package/dist/providers/resolution/none.js +11 -0
  482. package/dist/providers/resolution/none.js.map +1 -0
  483. package/dist/providers/resolution/python-all-filter.d.ts +25 -0
  484. package/dist/providers/resolution/python-all-filter.d.ts.map +1 -0
  485. package/dist/providers/resolution/python-all-filter.js +64 -0
  486. package/dist/providers/resolution/python-all-filter.js.map +1 -0
  487. package/dist/providers/resolution/resolver-strategy.d.ts +42 -0
  488. package/dist/providers/resolution/resolver-strategy.d.ts.map +1 -0
  489. package/dist/providers/resolution/resolver-strategy.js +50 -0
  490. package/dist/providers/resolution/resolver-strategy.js.map +1 -0
  491. package/dist/providers/resolution/single-inheritance.d.ts +3 -0
  492. package/dist/providers/resolution/single-inheritance.d.ts.map +1 -0
  493. package/dist/providers/resolution/single-inheritance.js +21 -0
  494. package/dist/providers/resolution/single-inheritance.js.map +1 -0
  495. package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.d.ts +16 -0
  496. package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.d.ts.map +1 -0
  497. package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.js +50 -0
  498. package/dist/providers/resolution/stack-graphs/__fixtures__/mock-tree.js.map +1 -0
  499. package/dist/providers/resolution/stack-graphs/glue.d.ts +15 -0
  500. package/dist/providers/resolution/stack-graphs/glue.d.ts.map +1 -0
  501. package/dist/providers/resolution/stack-graphs/glue.js +44 -0
  502. package/dist/providers/resolution/stack-graphs/glue.js.map +1 -0
  503. package/dist/providers/resolution/stack-graphs/node-edge-builder.d.ts +30 -0
  504. package/dist/providers/resolution/stack-graphs/node-edge-builder.d.ts.map +1 -0
  505. package/dist/providers/resolution/stack-graphs/node-edge-builder.js +366 -0
  506. package/dist/providers/resolution/stack-graphs/node-edge-builder.js.map +1 -0
  507. package/dist/providers/resolution/stack-graphs/partial-path-engine.d.ts +9 -0
  508. package/dist/providers/resolution/stack-graphs/partial-path-engine.d.ts.map +1 -0
  509. package/dist/providers/resolution/stack-graphs/partial-path-engine.js +152 -0
  510. package/dist/providers/resolution/stack-graphs/partial-path-engine.js.map +1 -0
  511. package/dist/providers/resolution/stack-graphs/rule-parser.d.ts +11 -0
  512. package/dist/providers/resolution/stack-graphs/rule-parser.d.ts.map +1 -0
  513. package/dist/providers/resolution/stack-graphs/rule-parser.js +247 -0
  514. package/dist/providers/resolution/stack-graphs/rule-parser.js.map +1 -0
  515. package/dist/providers/resolution/stack-graphs/types.d.ts +93 -0
  516. package/dist/providers/resolution/stack-graphs/types.d.ts.map +1 -0
  517. package/dist/providers/resolution/stack-graphs/types.js +11 -0
  518. package/dist/providers/resolution/stack-graphs/types.js.map +1 -0
  519. package/dist/providers/resolution/stack-graphs-python.d.ts +27 -0
  520. package/dist/providers/resolution/stack-graphs-python.d.ts.map +1 -0
  521. package/dist/providers/resolution/stack-graphs-python.js +104 -0
  522. package/dist/providers/resolution/stack-graphs-python.js.map +1 -0
  523. package/dist/providers/resolution/stack-graphs-ts.d.ts +134 -0
  524. package/dist/providers/resolution/stack-graphs-ts.d.ts.map +1 -0
  525. package/dist/providers/resolution/stack-graphs-ts.js +372 -0
  526. package/dist/providers/resolution/stack-graphs-ts.js.map +1 -0
  527. package/dist/providers/ruby.d.ts +3 -0
  528. package/dist/providers/ruby.d.ts.map +1 -0
  529. package/dist/providers/ruby.js +259 -0
  530. package/dist/providers/ruby.js.map +1 -0
  531. package/dist/providers/rust.d.ts +3 -0
  532. package/dist/providers/rust.d.ts.map +1 -0
  533. package/dist/providers/rust.js +318 -0
  534. package/dist/providers/rust.js.map +1 -0
  535. package/dist/providers/swift.d.ts +3 -0
  536. package/dist/providers/swift.d.ts.map +1 -0
  537. package/dist/providers/swift.js +177 -0
  538. package/dist/providers/swift.js.map +1 -0
  539. package/dist/providers/test-helpers.d.ts +24 -0
  540. package/dist/providers/test-helpers.d.ts.map +1 -0
  541. package/dist/providers/test-helpers.js +33 -0
  542. package/dist/providers/test-helpers.js.map +1 -0
  543. package/dist/providers/ts-shared.d.ts +30 -0
  544. package/dist/providers/ts-shared.d.ts.map +1 -0
  545. package/dist/providers/ts-shared.js +328 -0
  546. package/dist/providers/ts-shared.js.map +1 -0
  547. package/dist/providers/tsx.d.ts +7 -0
  548. package/dist/providers/tsx.d.ts.map +1 -0
  549. package/dist/providers/tsx.js +79 -0
  550. package/dist/providers/tsx.js.map +1 -0
  551. package/dist/providers/types.d.ts +166 -0
  552. package/dist/providers/types.d.ts.map +1 -0
  553. package/dist/providers/types.js +7 -0
  554. package/dist/providers/types.js.map +1 -0
  555. package/dist/providers/typescript-family-accesses.d.ts +14 -0
  556. package/dist/providers/typescript-family-accesses.d.ts.map +1 -0
  557. package/dist/providers/typescript-family-accesses.js +27 -0
  558. package/dist/providers/typescript-family-accesses.js.map +1 -0
  559. package/dist/providers/typescript.d.ts +9 -0
  560. package/dist/providers/typescript.d.ts.map +1 -0
  561. package/dist/providers/typescript.js +84 -0
  562. package/dist/providers/typescript.js.map +1 -0
  563. package/package.json +108 -0
@@ -0,0 +1,262 @@
1
+ /**
2
+ * Routes phase — materialises HTTP route metadata emitted by the static
3
+ * detectors (Next.js, Express, FastAPI, NestJS, Spring MVC, Rails) as
4
+ * graph nodes and edges.
5
+ *
6
+ * The phase:
7
+ * 1. Feeds the scanned files through every detector that matches the
8
+ * active {@link ProjectProfileNode.frameworks} list. Next.js +
9
+ * Express always run when TS/JS files are present. FastAPI runs on
10
+ * `fastapi`, NestJS on `nestjs`, Spring on any `spring-*` variant,
11
+ * Rails on `rails`.
12
+ * 2. Creates one `Route` node per unique `(url, method)` pair, keyed
13
+ * by the handler file so two frameworks declaring the same URL on
14
+ * the same file reuse the node.
15
+ * 3. Emits `HANDLES_ROUTE` edges from the declaring File node to the
16
+ * Route node with a fixed confidence of 0.9.
17
+ * 4. Detects cross-file duplicates for the same `(url, method)` and
18
+ * surfaces them as warnings via the progress callback — but keeps
19
+ * one edge per handler file (the route *is* re-declared).
20
+ *
21
+ * Depends on `parse` to order the DAG; the profile node is read from
22
+ * the in-memory graph.
23
+ */
24
+ import { promises as fs } from "node:fs";
25
+ import { makeNodeId } from "@opencodehub/core-types";
26
+ import { importsMapFromExtracted } from "../../extract/receiver-resolver.js";
27
+ import { detectExpressRoutes, detectNextJsRoutes, populateNextJsResponseKeys, } from "../../extract/route-detector.js";
28
+ import { detectSpringRoutes } from "../../extract/route-detector-java.js";
29
+ import { detectNestJsRoutes } from "../../extract/route-detector-nestjs.js";
30
+ import { detectFastApiRoutes } from "../../extract/route-detector-python.js";
31
+ import { detectRailsRoutes } from "../../extract/route-detector-rails.js";
32
+ import { PARSE_PHASE_NAME } from "./parse.js";
33
+ import { SCAN_PHASE_NAME } from "./scan.js";
34
+ /** Extensions that could plausibly host a Next.js route or Express code. */
35
+ const JS_TS_EXTS = new Set([
36
+ ".ts",
37
+ ".tsx",
38
+ ".mts",
39
+ ".cts",
40
+ ".js",
41
+ ".jsx",
42
+ ".mjs",
43
+ ".cjs",
44
+ ]);
45
+ /** Extensions the FastAPI detector scans. */
46
+ const PYTHON_EXTS = new Set([".py"]);
47
+ /** Extensions the Spring detector scans. */
48
+ const JAVA_EXTS = new Set([".java"]);
49
+ export const ROUTES_PHASE_NAME = "routes";
50
+ export const routesPhase = {
51
+ name: ROUTES_PHASE_NAME,
52
+ // `profile` is a dependency so the detected-frameworks gating can
53
+ // read the ProjectProfile node out of the graph without a race.
54
+ deps: [PARSE_PHASE_NAME, "profile"],
55
+ async run(ctx, deps) {
56
+ const scan = ctx.phaseOutputs.get(SCAN_PHASE_NAME);
57
+ if (scan === undefined) {
58
+ throw new Error("routes: scan output missing from phase outputs");
59
+ }
60
+ const parse = deps.get(PARSE_PHASE_NAME);
61
+ if (parse === undefined) {
62
+ throw new Error("routes: parse output missing from dependency map");
63
+ }
64
+ return runRoutes(ctx, scan, parse);
65
+ },
66
+ };
67
+ async function runRoutes(ctx, scan, parse) {
68
+ const frameworks = readDetectedFrameworks(ctx);
69
+ const importsByFile = importsMapFromExtracted(parse.importsByFile);
70
+ const strictDetectors = ctx.options.strictDetectors === true;
71
+ // Bundle files we might hand to TS/JS detectors (Next.js, Express,
72
+ // NestJS). Each entry is read once so all three detectors share the
73
+ // same buffer.
74
+ const jsTsCandidates = scan.files.filter((f) => JS_TS_EXTS.has(extLower(f.relPath)));
75
+ const bundle = await readBundle(ctx, jsTsCandidates);
76
+ // Next.js App Router is filesystem-routed — pass the full bundle.
77
+ const nextRoutesRaw = detectNextJsRoutes(bundle, ctx.repoPath);
78
+ // Walk each verb handler's body for `NextResponse.json({...})` /
79
+ // `Response.json({...})` literals and promote the keys onto `responseKeys`.
80
+ const nextRoutes = populateNextJsResponseKeys(nextRoutesRaw, bundle);
81
+ // Express is file-local.
82
+ const expressRoutes = [];
83
+ for (const entry of bundle) {
84
+ for (const r of detectExpressRoutes({
85
+ filePath: entry.filePath,
86
+ content: entry.content,
87
+ importsByFile,
88
+ strictDetectors,
89
+ })) {
90
+ expressRoutes.push(r);
91
+ }
92
+ }
93
+ // NestJS — profile-gated.
94
+ const nestRoutes = [];
95
+ if (frameworks.has("nestjs")) {
96
+ for (const entry of bundle) {
97
+ for (const r of detectNestJsRoutes({ filePath: entry.filePath, content: entry.content })) {
98
+ nestRoutes.push(r);
99
+ }
100
+ }
101
+ }
102
+ // FastAPI — profile-gated. Reads `.py` candidates from the scan.
103
+ const fastApiRoutes = [];
104
+ if (frameworks.has("fastapi")) {
105
+ const pyFiles = scan.files.filter((f) => PYTHON_EXTS.has(extLower(f.relPath)));
106
+ const pyBundle = await readBundle(ctx, pyFiles);
107
+ for (const entry of pyBundle) {
108
+ for (const r of detectFastApiRoutes({ filePath: entry.filePath, content: entry.content })) {
109
+ fastApiRoutes.push(r);
110
+ }
111
+ }
112
+ }
113
+ // Spring — profile-gated on any `spring-*` detected framework.
114
+ const springRoutes = [];
115
+ const hasSpring = [...frameworks].some((f) => f === "spring" || f.startsWith("spring-"));
116
+ if (hasSpring) {
117
+ const javaFiles = scan.files.filter((f) => JAVA_EXTS.has(extLower(f.relPath)));
118
+ const javaBundle = await readBundle(ctx, javaFiles);
119
+ for (const entry of javaBundle) {
120
+ for (const r of detectSpringRoutes({ filePath: entry.filePath, content: entry.content })) {
121
+ springRoutes.push(r);
122
+ }
123
+ }
124
+ }
125
+ // Rails — profile-gated. Only scans `config/routes*.rb`.
126
+ const railsRoutes = [];
127
+ if (frameworks.has("rails")) {
128
+ const routeFiles = scan.files.filter((f) => /(^|\/)config\/routes(?:\.[\w-]+)?\.rb$/.test(f.relPath));
129
+ const routesBundle = await readBundle(ctx, routeFiles);
130
+ for (const entry of routesBundle) {
131
+ for (const r of detectRailsRoutes(entry.filePath, entry.content)) {
132
+ railsRoutes.push(r);
133
+ }
134
+ }
135
+ }
136
+ // Stable ordering so edge insertion is deterministic.
137
+ const all = [
138
+ ...nextRoutes,
139
+ ...expressRoutes,
140
+ ...nestRoutes,
141
+ ...fastApiRoutes,
142
+ ...springRoutes,
143
+ ...railsRoutes,
144
+ ]
145
+ .slice()
146
+ .sort(compareRoute);
147
+ // Dedupe (url, method) to count duplicates while still emitting one edge
148
+ // per (handlerFile, url, method). Multiple files claiming the same URL
149
+ // is a warning; multiple edges from the same file to the same route
150
+ // collapse in addEdge.
151
+ const globalKeyCounts = new Map();
152
+ for (const r of all) {
153
+ const key = globalKey(r);
154
+ globalKeyCounts.set(key, (globalKeyCounts.get(key) ?? 0) + 1);
155
+ }
156
+ let duplicateCount = 0;
157
+ const warnedKeys = new Set();
158
+ const emittedEdgeKeys = new Set();
159
+ let routeCount = 0;
160
+ for (const r of all) {
161
+ const method = r.method ?? "ANY";
162
+ const routeId = makeNodeId("Route", r.handlerFile, `${method}:${r.url}`);
163
+ const routeNode = {
164
+ id: routeId,
165
+ kind: "Route",
166
+ name: `${method} ${r.url}`,
167
+ filePath: r.handlerFile,
168
+ url: r.url,
169
+ ...(r.method !== undefined ? { method: r.method } : {}),
170
+ ...(r.responseKeys !== undefined ? { responseKeys: r.responseKeys } : {}),
171
+ };
172
+ ctx.graph.addNode(routeNode);
173
+ routeCount += 1;
174
+ const fileId = makeNodeId("File", r.handlerFile, r.handlerFile);
175
+ const edgeKey = `${r.handlerFile}\u0000${method}\u0000${r.url}`;
176
+ if (!emittedEdgeKeys.has(edgeKey)) {
177
+ emittedEdgeKeys.add(edgeKey);
178
+ ctx.graph.addEdge({
179
+ from: fileId,
180
+ to: routeId,
181
+ type: "HANDLES_ROUTE",
182
+ confidence: 0.9,
183
+ reason: `${r.framework}-handler`,
184
+ });
185
+ }
186
+ const gKey = globalKey(r);
187
+ if ((globalKeyCounts.get(gKey) ?? 0) > 1 && !warnedKeys.has(gKey)) {
188
+ warnedKeys.add(gKey);
189
+ duplicateCount += 1;
190
+ ctx.onProgress?.({
191
+ phase: ROUTES_PHASE_NAME,
192
+ kind: "warn",
193
+ message: `routes: duplicate registration for ${method} ${r.url}`,
194
+ });
195
+ }
196
+ }
197
+ return { routeCount, duplicateCount };
198
+ }
199
+ function globalKey(r) {
200
+ const method = r.method ?? "ANY";
201
+ return `${method}\u0000${r.url}`;
202
+ }
203
+ function compareRoute(a, b) {
204
+ if (a.handlerFile !== b.handlerFile)
205
+ return a.handlerFile < b.handlerFile ? -1 : 1;
206
+ const am = a.method ?? "";
207
+ const bm = b.method ?? "";
208
+ if (am !== bm)
209
+ return am < bm ? -1 : 1;
210
+ if (a.url !== b.url)
211
+ return a.url < b.url ? -1 : 1;
212
+ return 0;
213
+ }
214
+ function extLower(relPath) {
215
+ const idx = relPath.lastIndexOf(".");
216
+ if (idx < 0)
217
+ return "";
218
+ return relPath.slice(idx).toLowerCase();
219
+ }
220
+ /**
221
+ * Read a list of scan files into a [path, content] bundle for a
222
+ * detector. Errors are logged as warnings; affected files simply don't
223
+ * appear in the returned bundle.
224
+ */
225
+ async function readBundle(ctx, files) {
226
+ const out = [];
227
+ for (const f of files) {
228
+ try {
229
+ const buf = await fs.readFile(f.absPath);
230
+ out.push({ filePath: f.relPath, content: buf.toString("utf8") });
231
+ }
232
+ catch (err) {
233
+ ctx.onProgress?.({
234
+ phase: ROUTES_PHASE_NAME,
235
+ kind: "warn",
236
+ message: `routes: cannot read ${f.relPath}: ${err.message}`,
237
+ });
238
+ }
239
+ }
240
+ return out;
241
+ }
242
+ /**
243
+ * Pull the detected framework set from the in-memory graph's singleton
244
+ * `ProjectProfile` node. Returns an empty set when the profile phase
245
+ * has not yet populated the node — which is also the default when the
246
+ * profile phase is disabled.
247
+ */
248
+ function readDetectedFrameworks(ctx) {
249
+ const out = new Set();
250
+ for (const n of ctx.graph.nodes()) {
251
+ if (n.kind !== "ProjectProfile")
252
+ continue;
253
+ const profile = n;
254
+ for (const name of profile.frameworks ?? [])
255
+ out.add(name);
256
+ for (const d of profile.frameworksDetected ?? [])
257
+ out.add(d.name);
258
+ break;
259
+ }
260
+ return out;
261
+ }
262
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/pipeline/phases/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * SBOM phase — emit CycloneDX 1.5 + SPDX 2.3 from Dependency nodes.
3
+ *
4
+ * Responsibilities
5
+ * 1. Collect every DependencyNode the `dependencies` phase produced.
6
+ * 2. Emit a CycloneDX 1.5 JSON document to
7
+ * `.codehub/sbom.cyclonedx.json` via `@cyclonedx/cyclonedx-library`.
8
+ * 3. Emit a SPDX 2.3 JSON document (DIY emitter) to
9
+ * `.codehub/sbom.spdx.json`.
10
+ *
11
+ * Opt-in: the phase is a no-op unless `options.sbom === true` (default
12
+ * false). This keeps `codehub analyze` quiet for repos where supply-chain
13
+ * documentation is not part of the flow.
14
+ *
15
+ * Determinism
16
+ * - Components and packages are emitted in canonical order
17
+ * (ecosystem, name, version).
18
+ * - When `options.reproducibleSbom` is `true` (default), the CycloneDX
19
+ * `metadata.timestamp` is fixed to the Unix epoch, the CycloneDX
20
+ * serialNumber is derived from a sha256 hash of the dependency
21
+ * fingerprint, and the SPDX `creationInfo.created` is fixed to the
22
+ * epoch. The SPDX `documentNamespace` is `urn:uuid:<sha256[0..32]>` of
23
+ * the same fingerprint — a stable URN, still globally unique for a
24
+ * given dependency set.
25
+ * - When `reproducibleSbom === false`, timestamps become `Date.now()`
26
+ * (floored to the second) and the namespace becomes a random v4 UUID.
27
+ * We still sort components.
28
+ *
29
+ * Licensing
30
+ * - `@cyclonedx/cyclonedx-library@10.0.0` is Apache-2.0 (bundle-safe for
31
+ * our Apache-2.0 host).
32
+ * - The SPDX emitter is a ~150 LOC DIY transform of Dependency nodes
33
+ * into JSON — no third-party SPDX library is linked.
34
+ *
35
+ * No network: PURLs and IDs are synthesised from Dependency fields only.
36
+ */
37
+ import type { PipelinePhase } from "../types.js";
38
+ export declare const SBOM_PHASE_NAME: "sbom";
39
+ export interface SbomOutput {
40
+ readonly cyclonedxPath: string | null;
41
+ readonly spdxPath: string | null;
42
+ readonly componentCount: number;
43
+ }
44
+ export declare const sbomPhase: PipelinePhase<SbomOutput>;
45
+ //# sourceMappingURL=sbom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sbom.d.ts","sourceRoot":"","sources":["../../../src/pipeline/phases/sbom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AASH,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAGlE,eAAO,MAAM,eAAe,EAAG,MAAe,CAAC;AAS/C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,eAAO,MAAM,SAAS,EAAE,aAAa,CAAC,UAAU,CAS/C,CAAC"}
@@ -0,0 +1,289 @@
1
+ /**
2
+ * SBOM phase — emit CycloneDX 1.5 + SPDX 2.3 from Dependency nodes.
3
+ *
4
+ * Responsibilities
5
+ * 1. Collect every DependencyNode the `dependencies` phase produced.
6
+ * 2. Emit a CycloneDX 1.5 JSON document to
7
+ * `.codehub/sbom.cyclonedx.json` via `@cyclonedx/cyclonedx-library`.
8
+ * 3. Emit a SPDX 2.3 JSON document (DIY emitter) to
9
+ * `.codehub/sbom.spdx.json`.
10
+ *
11
+ * Opt-in: the phase is a no-op unless `options.sbom === true` (default
12
+ * false). This keeps `codehub analyze` quiet for repos where supply-chain
13
+ * documentation is not part of the flow.
14
+ *
15
+ * Determinism
16
+ * - Components and packages are emitted in canonical order
17
+ * (ecosystem, name, version).
18
+ * - When `options.reproducibleSbom` is `true` (default), the CycloneDX
19
+ * `metadata.timestamp` is fixed to the Unix epoch, the CycloneDX
20
+ * serialNumber is derived from a sha256 hash of the dependency
21
+ * fingerprint, and the SPDX `creationInfo.created` is fixed to the
22
+ * epoch. The SPDX `documentNamespace` is `urn:uuid:<sha256[0..32]>` of
23
+ * the same fingerprint — a stable URN, still globally unique for a
24
+ * given dependency set.
25
+ * - When `reproducibleSbom === false`, timestamps become `Date.now()`
26
+ * (floored to the second) and the namespace becomes a random v4 UUID.
27
+ * We still sort components.
28
+ *
29
+ * Licensing
30
+ * - `@cyclonedx/cyclonedx-library@10.0.0` is Apache-2.0 (bundle-safe for
31
+ * our Apache-2.0 host).
32
+ * - The SPDX emitter is a ~150 LOC DIY transform of Dependency nodes
33
+ * into JSON — no third-party SPDX library is linked.
34
+ *
35
+ * No network: PURLs and IDs are synthesised from Dependency fields only.
36
+ */
37
+ import { createHash, randomUUID } from "node:crypto";
38
+ import { mkdir } from "node:fs/promises";
39
+ import path from "node:path";
40
+ import { Enums, Models, Serialize, Spec } from "@cyclonedx/cyclonedx-library";
41
+ import { META_DIR_NAME } from "@opencodehub/storage";
42
+ import wfa from "write-file-atomic";
43
+ import { DEPENDENCIES_PHASE_NAME } from "./dependencies.js";
44
+ export const SBOM_PHASE_NAME = "sbom";
45
+ const CYCLONEDX_FILE = "sbom.cyclonedx.json";
46
+ const SPDX_FILE = "sbom.spdx.json";
47
+ const TOOL_NAME = "opencodehub";
48
+ const TOOL_VERSION = "1.1.0";
49
+ // Stable epoch = 0 (1970-01-01T00:00:00Z) for reproducible builds.
50
+ const REPRODUCIBLE_EPOCH = new Date(0);
51
+ export const sbomPhase = {
52
+ name: SBOM_PHASE_NAME,
53
+ deps: [DEPENDENCIES_PHASE_NAME],
54
+ async run(ctx) {
55
+ if (ctx.options.sbom !== true) {
56
+ return { cyclonedxPath: null, spdxPath: null, componentCount: 0 };
57
+ }
58
+ return runSbom(ctx);
59
+ },
60
+ };
61
+ async function runSbom(ctx) {
62
+ const reproducible = ctx.options.reproducibleSbom !== false;
63
+ // Collect and sort Dependency nodes. Sorting by (ecosystem, name,
64
+ // version) is the contract that makes SBOM output byte-identical
65
+ // across runs; node insertion order is already canonical per the
66
+ // dependencies phase but we sort again defensively.
67
+ const deps = [];
68
+ for (const n of ctx.graph.nodes()) {
69
+ if (n.kind === "Dependency")
70
+ deps.push(n);
71
+ }
72
+ deps.sort(compareDeps);
73
+ const repoMeta = path.join(ctx.repoPath, META_DIR_NAME);
74
+ await mkdir(repoMeta, { recursive: true });
75
+ const cyclonedxPath = path.join(repoMeta, CYCLONEDX_FILE);
76
+ const spdxPath = path.join(repoMeta, SPDX_FILE);
77
+ const fingerprint = fingerprintDeps(deps);
78
+ const timestamp = reproducible ? REPRODUCIBLE_EPOCH : new Date(floorMs(Date.now()));
79
+ const cycloneDxJson = emitCycloneDx(deps, {
80
+ reproducible,
81
+ timestamp,
82
+ fingerprint,
83
+ });
84
+ await wfa(cyclonedxPath, cycloneDxJson, { encoding: "utf8", fsync: false });
85
+ const spdxJson = emitSpdx(deps, {
86
+ reproducible,
87
+ timestamp,
88
+ fingerprint,
89
+ });
90
+ await wfa(spdxPath, spdxJson, { encoding: "utf8", fsync: false });
91
+ return {
92
+ cyclonedxPath,
93
+ spdxPath,
94
+ componentCount: deps.length,
95
+ };
96
+ }
97
+ function compareDeps(a, b) {
98
+ if (a.ecosystem !== b.ecosystem)
99
+ return a.ecosystem < b.ecosystem ? -1 : 1;
100
+ if (a.name !== b.name)
101
+ return a.name < b.name ? -1 : 1;
102
+ if (a.version !== b.version)
103
+ return a.version < b.version ? -1 : 1;
104
+ return 0;
105
+ }
106
+ function floorMs(ms) {
107
+ return Math.floor(ms / 1000) * 1000;
108
+ }
109
+ /**
110
+ * Content-addressed hash of the Dependency set. Used as the CycloneDX
111
+ * serialNumber and SPDX documentNamespace so byte-identical Dependency
112
+ * graphs produce byte-identical SBOM documents.
113
+ */
114
+ function fingerprintDeps(deps) {
115
+ const h = createHash("sha256");
116
+ for (const d of deps) {
117
+ h.update(`${d.ecosystem}\x1f${d.name}\x1f${d.version}\x1f${d.license ?? ""}\x1e`);
118
+ }
119
+ return h.digest("hex");
120
+ }
121
+ function emitCycloneDx(deps, emit) {
122
+ const bom = new Models.Bom();
123
+ bom.metadata.timestamp = emit.timestamp;
124
+ // Tool that generated the SBOM. Using `.components.add` rather than the
125
+ // legacy `.tools.tools` set — `Tools.components` is the modern 1.5+ path.
126
+ // `bomRef` is set to a stable string so serialized output is byte-stable
127
+ // across runs; unset, the library generates a random address-backed ref.
128
+ const toolComponent = new Models.Component(Enums.ComponentType.Application, TOOL_NAME, {
129
+ version: TOOL_VERSION,
130
+ bomRef: `tool-${TOOL_NAME}-${TOOL_VERSION}`,
131
+ });
132
+ bom.metadata.tools.components.add(toolComponent);
133
+ // Deterministic serialNumber from the fingerprint. CycloneDX requires
134
+ // `urn:uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX`; we map the first 32
135
+ // hex chars of the fingerprint into a v4-shaped UUID string.
136
+ bom.serialNumber = emit.reproducible
137
+ ? `urn:uuid:${fingerprintToUuid(emit.fingerprint)}`
138
+ : `urn:uuid:${randomUUID()}`;
139
+ for (const d of deps) {
140
+ const purl = buildPurl(d.ecosystem, d.name, d.version);
141
+ // Use PURL as the bomRef so two Dependency sets with the same
142
+ // (ecosystem, name, version) trio yield byte-identical serialised
143
+ // SBOMs. PURLs are unique by construction of the dependencies phase.
144
+ const comp = new Models.Component(Enums.ComponentType.Library, d.name, {
145
+ version: d.version,
146
+ purl,
147
+ bomRef: purl,
148
+ });
149
+ if (d.license && d.license !== "UNKNOWN") {
150
+ // Use a NamedLicense so we do not inadvertently emit invalid SPDX
151
+ // IDs; CycloneDX validators reject unknown IDs on SpdxLicense.
152
+ comp.licenses.add(new Models.NamedLicense(d.license));
153
+ }
154
+ bom.components.add(comp);
155
+ }
156
+ const spec = Spec.Spec1dot5;
157
+ // `@cyclonedx/cyclonedx-library@10` relocated the JSON normalizer factory
158
+ // from `Serialize.JSON.Factory` to `Serialize.JSON.Normalize.Factory`.
159
+ const factory = new Serialize.JSON.Normalize.Factory(spec);
160
+ const serializer = new Serialize.JsonSerializer(factory);
161
+ // sortLists=true so repository iteration order never affects output.
162
+ // space=2 so the emitted file is human-reviewable.
163
+ return serializer.serialize(bom, { sortLists: true, space: 2 });
164
+ }
165
+ /**
166
+ * Map a 64-hex-char sha256 fingerprint into a UUID-shaped string.
167
+ * The output is a well-formed UUID (hex + dashes) but is NOT a true RFC
168
+ * 4122 UUID — callers MUST treat it as an opaque content fingerprint, not
169
+ * a unique identifier.
170
+ */
171
+ function fingerprintToUuid(fingerprint) {
172
+ const hex = fingerprint.slice(0, 32);
173
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
174
+ }
175
+ /**
176
+ * Build a PURL (https://github.com/package-url/purl-spec).
177
+ * Centralises ecosystem-specific quirks so both CycloneDX and SPDX
178
+ * emitters agree.
179
+ */
180
+ function buildPurl(ecosystem, name, version) {
181
+ switch (ecosystem) {
182
+ case "npm":
183
+ return `pkg:npm/${encodePurlName(name)}@${encodePurlVersion(version)}`;
184
+ case "pypi":
185
+ // PURL spec §Known types — PyPI normalises names to lowercase, dashes.
186
+ return `pkg:pypi/${encodePurlName(name.toLowerCase().replace(/_/g, "-"))}@${encodePurlVersion(version)}`;
187
+ case "go":
188
+ // Go module paths may contain `/`. The PURL spec treats the path
189
+ // as-is inside the name segment but spec requires `/` to mark the
190
+ // namespace, so embedded slashes stay literal. We do percent-encode
191
+ // only the few illegal chars (space, `#`, `?`).
192
+ return `pkg:golang/${encodePurlGoName(name)}@${encodePurlVersion(version)}`;
193
+ case "cargo":
194
+ return `pkg:cargo/${encodePurlName(name)}@${encodePurlVersion(version)}`;
195
+ case "maven": {
196
+ // Maven names are `groupId:artifactId`.
197
+ const colon = name.indexOf(":");
198
+ if (colon === -1) {
199
+ return `pkg:maven/${encodePurlName(name)}@${encodePurlVersion(version)}`;
200
+ }
201
+ const group = name.slice(0, colon);
202
+ const artifact = name.slice(colon + 1);
203
+ return `pkg:maven/${encodePurlName(group)}/${encodePurlName(artifact)}@${encodePurlVersion(version)}`;
204
+ }
205
+ case "nuget":
206
+ return `pkg:nuget/${encodePurlName(name)}@${encodePurlVersion(version)}`;
207
+ default: {
208
+ // Exhaustiveness check: if a new ecosystem shows up, TypeScript will
209
+ // flag it at build time and we fall back to a best-effort PURL.
210
+ const _exhaustive = ecosystem;
211
+ return `pkg:generic/${encodePurlName(String(_exhaustive ?? name))}@${encodePurlVersion(version)}`;
212
+ }
213
+ }
214
+ }
215
+ function encodePurlName(raw) {
216
+ // PURL spec: name must be percent-encoded except for unreserved chars.
217
+ // encodeURIComponent handles this correctly for single-segment names.
218
+ return encodeURIComponent(raw);
219
+ }
220
+ function encodePurlGoName(raw) {
221
+ // Preserve path separators in Go module paths; encode each segment.
222
+ return raw
223
+ .split("/")
224
+ .map((seg) => encodeURIComponent(seg))
225
+ .join("/");
226
+ }
227
+ function encodePurlVersion(raw) {
228
+ return encodeURIComponent(raw);
229
+ }
230
+ function emitSpdx(deps, emit) {
231
+ const packages = deps.map((d) => ({
232
+ SPDXID: makeSpdxId(d),
233
+ name: d.name,
234
+ versionInfo: d.version,
235
+ downloadLocation: "NOASSERTION",
236
+ filesAnalyzed: false,
237
+ licenseConcluded: "NOASSERTION",
238
+ licenseDeclared: d.license && d.license !== "UNKNOWN" ? d.license : "NOASSERTION",
239
+ copyrightText: "NOASSERTION",
240
+ externalRefs: [
241
+ {
242
+ referenceCategory: "PACKAGE-MANAGER",
243
+ referenceType: "purl",
244
+ referenceLocator: buildPurl(d.ecosystem, d.name, d.version),
245
+ },
246
+ ],
247
+ }));
248
+ // Stable sort by SPDXID — the SPDX spec mandates uniqueness but not a
249
+ // specific order; we pick ID-ascending so diff-based review stays quiet.
250
+ packages.sort((a, b) => (a.SPDXID < b.SPDXID ? -1 : a.SPDXID > b.SPDXID ? 1 : 0));
251
+ const doc = {
252
+ spdxVersion: "SPDX-2.3",
253
+ dataLicense: "CC0-1.0",
254
+ SPDXID: "SPDXRef-DOCUMENT",
255
+ name: "opencodehub-sbom",
256
+ documentNamespace: emit.reproducible
257
+ ? `urn:uuid:${fingerprintToUuid(emit.fingerprint)}`
258
+ : `urn:uuid:${randomUUID()}`,
259
+ creationInfo: {
260
+ created: toSpdxTimestamp(emit.timestamp),
261
+ creators: [`Tool: ${TOOL_NAME}-${TOOL_VERSION}`],
262
+ },
263
+ packages,
264
+ };
265
+ return `${JSON.stringify(doc, null, 2)}\n`;
266
+ }
267
+ /**
268
+ * SPDX timestamps are ISO-8601 with second precision: `YYYY-MM-DDThh:mm:ssZ`.
269
+ */
270
+ function toSpdxTimestamp(d) {
271
+ // `Date.prototype.toISOString` returns millisecond precision. Strip the
272
+ // `.xxxZ` tail and replace with `Z`.
273
+ const iso = d.toISOString();
274
+ return iso.replace(/\.\d{3}Z$/, "Z");
275
+ }
276
+ /**
277
+ * SPDXID grammar (§3.2 spec): `SPDXRef-` + [A-Za-z0-9.-]+.
278
+ * We derive deterministic IDs from (ecosystem, name, version) and replace
279
+ * every illegal char with `-`. Ambiguity is acceptable because SPDX only
280
+ * requires IDs be unique within the document, which holds as long as
281
+ * (ecosystem, name, version) is unique — which is the Dependency phase's
282
+ * invariant.
283
+ */
284
+ function makeSpdxId(d) {
285
+ const raw = `Pkg-${d.ecosystem}-${d.name}-${d.version}`;
286
+ const safe = raw.replace(/[^A-Za-z0-9.-]/g, "-");
287
+ return `SPDXRef-${safe}`;
288
+ }
289
+ //# sourceMappingURL=sbom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sbom.js","sourceRoot":"","sources":["../../../src/pipeline/phases/sbom.ts"],"names":[],"mappings":"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"}