@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,303 @@
1
+ /**
2
+ * MRO phase — emit `METHOD_OVERRIDES` / `METHOD_IMPLEMENTS` edges by
3
+ * linearising each class's ancestor chain with its language-specific
4
+ * strategy.
5
+ *
6
+ * Strategy-per-language table:
7
+ * - `python` → `c3` (raises on ambiguity; caught + skipped per-class).
8
+ * - `typescript`, `tsx`, `javascript`, `rust` → `first-wins`.
9
+ * - `java`, `csharp` → `single-inheritance`; interfaces drive
10
+ * `METHOD_IMPLEMENTS` edges separately.
11
+ * - `go` → `none`; no class-based inheritance. Skipped entirely.
12
+ *
13
+ * Determinism: parents and methods are iterated in sorted-id order, so the
14
+ * edge set is byte-identical across runs.
15
+ */
16
+ import { getProvider } from "../../providers/registry.js";
17
+ import { MroConflictError } from "../../providers/resolution/c3.js";
18
+ import { getMroStrategy } from "../../providers/resolution/mro.js";
19
+ import { CROSS_FILE_PHASE_NAME } from "./cross-file.js";
20
+ import { buildFilePathLookup, partitionPriorEdges, resolveIncrementalView, } from "./incremental-helper.js";
21
+ import { INCREMENTAL_SCOPE_PHASE_NAME } from "./incremental-scope.js";
22
+ import { STRUCTURE_PHASE_NAME } from "./structure.js";
23
+ export const MRO_PHASE_NAME = "mro";
24
+ /**
25
+ * Kinds that own methods and participate in the MRO walk.
26
+ */
27
+ const OWNER_KINDS = new Set(["Class", "Interface", "Struct", "Trait"]);
28
+ export const mroPhase = {
29
+ name: MRO_PHASE_NAME,
30
+ deps: [CROSS_FILE_PHASE_NAME, STRUCTURE_PHASE_NAME, INCREMENTAL_SCOPE_PHASE_NAME],
31
+ async run(ctx) {
32
+ return runMro(ctx);
33
+ },
34
+ };
35
+ function runMro(ctx) {
36
+ // ---- : incremental carry-forward. -----------------------------
37
+ //
38
+ // When the incremental view is active we replay every prior-graph
39
+ // METHOD_OVERRIDES / METHOD_IMPLEMENTS edge whose both endpoints live
40
+ // outside the closure. The closure already pulled in a 1-hop heritage
41
+ // expansion (incremental-scope.ts lines 31-32), so any class whose
42
+ // ancestor moved is already in scope and will re-linearise below. Carry-
43
+ // forward for the rest keeps the graph hash byte-identical to a full
44
+ // run at the same commit (see `incremental-determinism.test.ts`).
45
+ const view = resolveIncrementalView(ctx);
46
+ if (view.active &&
47
+ view.previousGraph?.edges !== undefined &&
48
+ view.previousGraph.nodes !== undefined) {
49
+ const filePathByNodeId = buildFilePathLookup(view.previousGraph.nodes);
50
+ const carried = partitionPriorEdges(view.previousGraph.edges, filePathByNodeId, view.closure, new Set(["METHOD_OVERRIDES", "METHOD_IMPLEMENTS"]));
51
+ for (const e of carried) {
52
+ ctx.graph.addEdge({
53
+ from: e.from,
54
+ to: e.to,
55
+ type: e.type,
56
+ confidence: e.confidence,
57
+ ...(e.reason !== undefined ? { reason: e.reason } : {}),
58
+ });
59
+ }
60
+ }
61
+ // ---- Collect owner nodes + their methods + their heritage. -------------
62
+ //
63
+ // We always collect metadata for EVERY owner in the graph — linearisation
64
+ // walks ancestor chains that may reach owners outside the closure, and
65
+ // those still need their methods + heritage loaded so the walk terminates
66
+ // correctly. The incremental gate applies at edge-emission time.
67
+ const ownerIds = [];
68
+ const ownerFilePath = new Map();
69
+ for (const n of ctx.graph.nodes()) {
70
+ if (OWNER_KINDS.has(n.kind)) {
71
+ ownerIds.push(n.id);
72
+ ownerFilePath.set(n.id, n.filePath);
73
+ }
74
+ }
75
+ ownerIds.sort();
76
+ // Per-owner method map: name → method node id (one entry per name; if a
77
+ // class declares two overloads with the same name the last id wins for the
78
+ // MRO walk, which matches the `HAS_METHOD` edge set emitted at parse time).
79
+ const methodsByOwner = new Map();
80
+ const extendsByOwner = new Map();
81
+ const implementsByOwner = new Map();
82
+ for (const id of ownerIds) {
83
+ methodsByOwner.set(id, new Map());
84
+ extendsByOwner.set(id, []);
85
+ implementsByOwner.set(id, []);
86
+ }
87
+ const nodeKindById = new Map();
88
+ const nodeNameById = new Map();
89
+ for (const n of ctx.graph.nodes()) {
90
+ nodeKindById.set(n.id, n.kind);
91
+ nodeNameById.set(n.id, n.name);
92
+ }
93
+ for (const edge of ctx.graph.edges()) {
94
+ if (edge.type === "HAS_METHOD") {
95
+ const owner = edge.from;
96
+ const methodId = edge.to;
97
+ const name = nodeNameById.get(methodId);
98
+ if (name === undefined)
99
+ continue;
100
+ const map = methodsByOwner.get(owner);
101
+ if (map !== undefined)
102
+ map.set(name, methodId);
103
+ }
104
+ else if (edge.type === "EXTENDS") {
105
+ const list = extendsByOwner.get(edge.from);
106
+ if (list !== undefined)
107
+ list.push(edge.to);
108
+ }
109
+ else if (edge.type === "IMPLEMENTS") {
110
+ const list = implementsByOwner.get(edge.from);
111
+ if (list !== undefined)
112
+ list.push(edge.to);
113
+ }
114
+ }
115
+ for (const list of extendsByOwner.values())
116
+ list.sort();
117
+ for (const list of implementsByOwner.values())
118
+ list.sort();
119
+ // ---- Linearize each owner using its provider's MRO strategy. -----------
120
+ const linearizationCache = new Map();
121
+ function linearizeFor(id) {
122
+ const cached = linearizationCache.get(id);
123
+ if (cached !== undefined)
124
+ return cached;
125
+ // Placeholder to break cycles — the strategies do not recurse into
126
+ // indirect ancestors through this lookup, but belt-and-suspenders.
127
+ linearizationCache.set(id, [id]);
128
+ const filePath = ownerFilePath.get(id) ?? "";
129
+ const lang = inferLanguageFromFile(filePath);
130
+ if (lang === undefined) {
131
+ linearizationCache.set(id, [id]);
132
+ return [id];
133
+ }
134
+ const provider = getProvider(lang);
135
+ const strategy = getMroStrategy(provider.mroStrategy);
136
+ if (provider.mroStrategy === "none") {
137
+ linearizationCache.set(id, [id]);
138
+ return [id];
139
+ }
140
+ const bases = extendsByOwner.get(id) ?? [];
141
+ try {
142
+ const linearization = strategy.linearize(id, bases, (baseId) => linearizeFor(baseId));
143
+ linearizationCache.set(id, linearization);
144
+ return linearization;
145
+ }
146
+ catch (err) {
147
+ if (err instanceof MroConflictError) {
148
+ ctx.onProgress?.({
149
+ phase: MRO_PHASE_NAME,
150
+ kind: "warn",
151
+ message: `mro: conflict linearising ${id}: ${err.message}`,
152
+ });
153
+ linearizationCache.set(id, [id]);
154
+ conflictCount += 1;
155
+ return [id];
156
+ }
157
+ throw err;
158
+ }
159
+ }
160
+ let conflictCount = 0;
161
+ let overridesCount = 0;
162
+ let implementsCount = 0;
163
+ for (const id of ownerIds) {
164
+ const ownerPath = ownerFilePath.get(id) ?? "";
165
+ const lang = inferLanguageFromFile(ownerPath);
166
+ if (lang === undefined)
167
+ continue;
168
+ const provider = getProvider(lang);
169
+ if (provider.mroStrategy === "none")
170
+ continue;
171
+ const ownerMethods = methodsByOwner.get(id) ?? new Map();
172
+ if (ownerMethods.size === 0)
173
+ continue;
174
+ // Incremental gate: owners outside the closure keep their prior-graph
175
+ // MRO edges (carried forward above). Correctness for the in-closure
176
+ // case holds because incremental-scope already widened the closure by
177
+ // one heritage hop.
178
+ if (view.active && !view.closure.has(ownerPath))
179
+ continue;
180
+ // Sort method names for deterministic iteration.
181
+ const sortedNames = [...ownerMethods.keys()].sort();
182
+ // `METHOD_OVERRIDES`: walk the class's linearization; the first ancestor
183
+ // with a matching method wins. Skip the class itself (index 0).
184
+ const linearization = linearizeFor(id);
185
+ for (const name of sortedNames) {
186
+ const childMethodId = ownerMethods.get(name);
187
+ if (childMethodId === undefined)
188
+ continue;
189
+ for (let i = 1; i < linearization.length; i += 1) {
190
+ const ancestor = linearization[i];
191
+ if (ancestor === undefined)
192
+ continue;
193
+ // Skip interface/trait ancestors — they produce METHOD_IMPLEMENTS
194
+ // instead. We detect by kind.
195
+ const ancestorKind = nodeKindById.get(ancestor);
196
+ if (ancestorKind === "Interface" || ancestorKind === "Trait")
197
+ continue;
198
+ const ancestorMethods = methodsByOwner.get(ancestor);
199
+ if (ancestorMethods === undefined)
200
+ continue;
201
+ const parentMethodId = ancestorMethods.get(name);
202
+ if (parentMethodId === undefined)
203
+ continue;
204
+ ctx.graph.addEdge({
205
+ from: childMethodId,
206
+ to: parentMethodId,
207
+ type: "METHOD_OVERRIDES",
208
+ confidence: 0.9,
209
+ reason: "mro-linearization",
210
+ });
211
+ overridesCount += 1;
212
+ break; // first hit wins in the linearization.
213
+ }
214
+ }
215
+ // `METHOD_IMPLEMENTS`: direct `IMPLEMENTS` edges identify interfaces /
216
+ // traits whose contract the class claims. For each same-name method on
217
+ // those interfaces emit the edge.
218
+ const interfaces = implementsByOwner.get(id) ?? [];
219
+ for (const name of sortedNames) {
220
+ const childMethodId = ownerMethods.get(name);
221
+ if (childMethodId === undefined)
222
+ continue;
223
+ for (const ifaceId of interfaces) {
224
+ const ifaceMethods = methodsByOwner.get(ifaceId);
225
+ if (ifaceMethods === undefined)
226
+ continue;
227
+ const interfaceMethodId = ifaceMethods.get(name);
228
+ if (interfaceMethodId === undefined)
229
+ continue;
230
+ ctx.graph.addEdge({
231
+ from: childMethodId,
232
+ to: interfaceMethodId,
233
+ type: "METHOD_IMPLEMENTS",
234
+ confidence: 0.95,
235
+ reason: "interface-contract",
236
+ });
237
+ implementsCount += 1;
238
+ }
239
+ }
240
+ }
241
+ return { overridesCount, implementsCount, conflictCount };
242
+ }
243
+ function inferLanguageFromFile(filePath) {
244
+ const idx = filePath.lastIndexOf(".");
245
+ if (idx < 0)
246
+ return undefined;
247
+ const ext = filePath.slice(idx).toLowerCase();
248
+ switch (ext) {
249
+ case ".ts":
250
+ case ".mts":
251
+ case ".cts":
252
+ return "typescript";
253
+ case ".tsx":
254
+ return "tsx";
255
+ case ".js":
256
+ case ".mjs":
257
+ case ".cjs":
258
+ case ".jsx":
259
+ return "javascript";
260
+ case ".py":
261
+ case ".pyi":
262
+ return "python";
263
+ case ".go":
264
+ return "go";
265
+ case ".rs":
266
+ return "rust";
267
+ case ".java":
268
+ return "java";
269
+ case ".cs":
270
+ return "csharp";
271
+ case ".c":
272
+ case ".h":
273
+ // .h is ambiguous between C/C++; default to C. A dedicated C++ header
274
+ // detector can upgrade the classification later.
275
+ return "c";
276
+ case ".cpp":
277
+ case ".cc":
278
+ case ".cxx":
279
+ case ".hpp":
280
+ case ".hh":
281
+ case ".hxx":
282
+ return "cpp";
283
+ case ".rb":
284
+ return "ruby";
285
+ case ".kt":
286
+ case ".kts":
287
+ return "kotlin";
288
+ case ".swift":
289
+ return "swift";
290
+ case ".php":
291
+ case ".php3":
292
+ case ".php4":
293
+ case ".php5":
294
+ case ".php7":
295
+ case ".phtml":
296
+ return "php";
297
+ case ".dart":
298
+ return "dart";
299
+ default:
300
+ return undefined;
301
+ }
302
+ }
303
+ //# sourceMappingURL=mro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mro.js","sourceRoot":"","sources":["../../../src/pipeline/phases/mro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * OpenAPI phase — materialises HTTP operations described by OpenAPI /
3
+ * Swagger specs as `Operation` nodes and links them to existing `Route`
4
+ * nodes whose method + templated path match.
5
+ *
6
+ * Pipeline placement:
7
+ * - deps: [routes, profile]
8
+ * - If the ProjectProfile's `apiContracts` list does NOT include
9
+ * "openapi", the phase is a no-op (skips all spec discovery).
10
+ *
11
+ * What the phase does:
12
+ * 1. Walks scan output for every file whose basename matches
13
+ * `openapi.{yaml,json}` / `swagger.{yaml,json}`, sorted by relPath.
14
+ * 2. For each spec, invokes `SwaggerParser.dereference(absPath, { resolve: { external: false } })`
15
+ * which resolves internal `$ref`s inline while refusing any HTTP or
16
+ * external file lookups (hard offline posture).
17
+ * 3. For each (method, path) pair, emits one `Operation` node with id
18
+ * `Operation:<specRelPath>:<METHOD>:<path>` plus optional `summary`
19
+ * and `operationId` properties.
20
+ * 4. Looks up an existing `Route` node whose method + normalised path
21
+ * matches the operation. Matches exact strings first, then falls
22
+ * back to path-parameter normalisation:
23
+ * OpenAPI `{id}` → `:id`
24
+ * Next.js `[id]` → `:id`
25
+ * Express `:id` unchanged
26
+ * Both sides are normalised before comparison so any combination of
27
+ * the three notations produces a single canonical key.
28
+ * 5. On a match, emits a `HANDLES_ROUTE` edge Operation → Route with
29
+ * confidence 0.95 and reason `openapi-spec`. The direction encodes
30
+ * "this spec describes this route handler".
31
+ *
32
+ * Determinism:
33
+ * - Spec files are processed in scan-sorted order (same order scan emits).
34
+ * - Operations are materialised in `(METHOD, path)` lex order so edge
35
+ * insertion and graphHash byte-stability hold across runs.
36
+ *
37
+ * Error handling:
38
+ * - Any swagger-parser throw (malformed spec, unresolved $ref, circular
39
+ * references without handling) is caught and surfaced as a `warn`
40
+ * progress event. The offending spec is skipped; the phase continues.
41
+ * - No network calls: `resolve.external = false` disables the HTTP and
42
+ * file-based external resolvers.
43
+ */
44
+ import type { PipelinePhase } from "../types.js";
45
+ export declare const OPENAPI_PHASE_NAME: "openapi";
46
+ export interface OpenApiOutput {
47
+ readonly operationsEmitted: number;
48
+ readonly routesLinked: number;
49
+ readonly specsProcessed: number;
50
+ }
51
+ export declare const openapiPhase: PipelinePhase<OpenApiOutput>;
52
+ //# sourceMappingURL=openapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../../src/pipeline/phases/openapi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAUH,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAKlE,eAAO,MAAM,kBAAkB,EAAG,SAAkB,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAsCD,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,aAAa,CAUrD,CAAC"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * OpenAPI phase — materialises HTTP operations described by OpenAPI /
3
+ * Swagger specs as `Operation` nodes and links them to existing `Route`
4
+ * nodes whose method + templated path match.
5
+ *
6
+ * Pipeline placement:
7
+ * - deps: [routes, profile]
8
+ * - If the ProjectProfile's `apiContracts` list does NOT include
9
+ * "openapi", the phase is a no-op (skips all spec discovery).
10
+ *
11
+ * What the phase does:
12
+ * 1. Walks scan output for every file whose basename matches
13
+ * `openapi.{yaml,json}` / `swagger.{yaml,json}`, sorted by relPath.
14
+ * 2. For each spec, invokes `SwaggerParser.dereference(absPath, { resolve: { external: false } })`
15
+ * which resolves internal `$ref`s inline while refusing any HTTP or
16
+ * external file lookups (hard offline posture).
17
+ * 3. For each (method, path) pair, emits one `Operation` node with id
18
+ * `Operation:<specRelPath>:<METHOD>:<path>` plus optional `summary`
19
+ * and `operationId` properties.
20
+ * 4. Looks up an existing `Route` node whose method + normalised path
21
+ * matches the operation. Matches exact strings first, then falls
22
+ * back to path-parameter normalisation:
23
+ * OpenAPI `{id}` → `:id`
24
+ * Next.js `[id]` → `:id`
25
+ * Express `:id` unchanged
26
+ * Both sides are normalised before comparison so any combination of
27
+ * the three notations produces a single canonical key.
28
+ * 5. On a match, emits a `HANDLES_ROUTE` edge Operation → Route with
29
+ * confidence 0.95 and reason `openapi-spec`. The direction encodes
30
+ * "this spec describes this route handler".
31
+ *
32
+ * Determinism:
33
+ * - Spec files are processed in scan-sorted order (same order scan emits).
34
+ * - Operations are materialised in `(METHOD, path)` lex order so edge
35
+ * insertion and graphHash byte-stability hold across runs.
36
+ *
37
+ * Error handling:
38
+ * - Any swagger-parser throw (malformed spec, unresolved $ref, circular
39
+ * references without handling) is caught and surfaced as a `warn`
40
+ * progress event. The offending spec is skipped; the phase continues.
41
+ * - No network calls: `resolve.external = false` disables the HTTP and
42
+ * file-based external resolvers.
43
+ */
44
+ import { makeNodeId } from "@opencodehub/core-types";
45
+ import { PROFILE_PHASE_NAME } from "./profile.js";
46
+ import { ROUTES_PHASE_NAME } from "./routes.js";
47
+ import { SCAN_PHASE_NAME } from "./scan.js";
48
+ export const OPENAPI_PHASE_NAME = "openapi";
49
+ /**
50
+ * HTTP verbs recognised by the OpenAPI spec, upper-cased for the Operation
51
+ * node `method` property. `trace` is in OpenAPI 3.x even though few runtime
52
+ * servers implement it — we surface it anyway so our operations mirror the
53
+ * authored spec.
54
+ */
55
+ const HTTP_METHODS = ["get", "post", "put", "patch", "delete", "head", "options", "trace"];
56
+ /** Basenames that flag a file as an OpenAPI / Swagger spec unambiguously. */
57
+ const SPEC_BASENAME_RE = /^(openapi|swagger)\.(ya?ml|json)$/i;
58
+ export const openapiPhase = {
59
+ name: OPENAPI_PHASE_NAME,
60
+ deps: [ROUTES_PHASE_NAME, PROFILE_PHASE_NAME],
61
+ async run(ctx) {
62
+ const scan = ctx.phaseOutputs.get(SCAN_PHASE_NAME);
63
+ if (scan === undefined) {
64
+ throw new Error("openapi: scan output missing from phase outputs");
65
+ }
66
+ return runOpenApi(ctx, scan);
67
+ },
68
+ };
69
+ async function runOpenApi(ctx, scan) {
70
+ // Skip unless profile phase detected openapi.
71
+ const profile = findProjectProfile(ctx.graph);
72
+ if (!profile?.apiContracts.includes("openapi")) {
73
+ return { operationsEmitted: 0, routesLinked: 0, specsProcessed: 0 };
74
+ }
75
+ const specs = selectSpecFiles(scan.files);
76
+ if (specs.length === 0) {
77
+ return { operationsEmitted: 0, routesLinked: 0, specsProcessed: 0 };
78
+ }
79
+ // Build a method + normalised-path → Route node id lookup once, so per-
80
+ // operation matches stay O(1).
81
+ const routeIndex = indexRoutesByMethodAndPath(ctx.graph);
82
+ let operationsEmitted = 0;
83
+ let routesLinked = 0;
84
+ let specsProcessed = 0;
85
+ for (const spec of specs) {
86
+ const parsedOps = await dereferenceSpec(ctx, spec);
87
+ if (parsedOps === null) {
88
+ // Already warned in dereferenceSpec; skip spec, keep pipeline alive.
89
+ continue;
90
+ }
91
+ specsProcessed += 1;
92
+ // Sort operations deterministically before insertion.
93
+ const sorted = [...parsedOps].sort(compareParsedOperation);
94
+ for (const op of sorted) {
95
+ const opId = operationNodeId(spec.relPath, op.method, op.path);
96
+ const node = {
97
+ id: opId,
98
+ kind: "Operation",
99
+ name: `${op.method} ${op.path}`,
100
+ filePath: spec.relPath,
101
+ method: op.method,
102
+ path: op.path,
103
+ ...(op.summary !== undefined ? { summary: op.summary } : {}),
104
+ ...(op.operationId !== undefined ? { operationId: op.operationId } : {}),
105
+ };
106
+ ctx.graph.addNode(node);
107
+ operationsEmitted += 1;
108
+ const routeKey = routeLookupKey(op.method, op.path);
109
+ const routeId = routeIndex.get(routeKey);
110
+ if (routeId !== undefined) {
111
+ ctx.graph.addEdge({
112
+ from: opId,
113
+ to: routeId,
114
+ type: "HANDLES_ROUTE",
115
+ confidence: 0.95,
116
+ reason: "openapi-spec",
117
+ });
118
+ routesLinked += 1;
119
+ }
120
+ }
121
+ }
122
+ return { operationsEmitted, routesLinked, specsProcessed };
123
+ }
124
+ /** Look up the singleton ProjectProfile node in the graph, if any. */
125
+ function findProjectProfile(graph) {
126
+ for (const n of graph.nodes()) {
127
+ if (n.kind === "ProjectProfile")
128
+ return n;
129
+ }
130
+ return undefined;
131
+ }
132
+ function selectSpecFiles(files) {
133
+ const out = [];
134
+ for (const f of files) {
135
+ const basename = basenameOf(f.relPath);
136
+ if (SPEC_BASENAME_RE.test(basename))
137
+ out.push(f);
138
+ }
139
+ // scan output is already sorted by relPath, but sort defensively so
140
+ // tests that construct ScannedFile[] directly still get a stable order.
141
+ return out.slice().sort((a, b) => (a.relPath < b.relPath ? -1 : a.relPath > b.relPath ? 1 : 0));
142
+ }
143
+ /**
144
+ * Invoke swagger-parser's `dereference` with external resolution disabled
145
+ * and walk the resulting paths object. Returns `null` on any parser throw
146
+ * (after emitting a warn event); otherwise returns the list of operations
147
+ * found on the spec.
148
+ */
149
+ async function dereferenceSpec(ctx, spec) {
150
+ let SwaggerParser;
151
+ try {
152
+ const mod = (await import("@apidevtools/swagger-parser"));
153
+ SwaggerParser = mod.default;
154
+ }
155
+ catch (err) {
156
+ ctx.onProgress?.({
157
+ phase: OPENAPI_PHASE_NAME,
158
+ kind: "warn",
159
+ message: `openapi: @apidevtools/swagger-parser not available: ${errMessage(err)}`,
160
+ });
161
+ return null;
162
+ }
163
+ let api;
164
+ try {
165
+ api = await SwaggerParser.dereference(spec.absPath, {
166
+ resolve: { external: false },
167
+ });
168
+ }
169
+ catch (err) {
170
+ ctx.onProgress?.({
171
+ phase: OPENAPI_PHASE_NAME,
172
+ kind: "warn",
173
+ message: `openapi: failed to parse ${spec.relPath}: ${errMessage(err)}`,
174
+ });
175
+ return null;
176
+ }
177
+ const paths = extractPaths(api);
178
+ if (paths === undefined) {
179
+ ctx.onProgress?.({
180
+ phase: OPENAPI_PHASE_NAME,
181
+ kind: "warn",
182
+ message: `openapi: ${spec.relPath} has no paths object`,
183
+ });
184
+ return [];
185
+ }
186
+ const ops = [];
187
+ for (const [pathTemplate, pathItemRaw] of Object.entries(paths)) {
188
+ if (!isRecord(pathItemRaw))
189
+ continue;
190
+ const pathItem = pathItemRaw;
191
+ for (const method of HTTP_METHODS) {
192
+ const opRaw = pathItem[method];
193
+ if (!isRecord(opRaw))
194
+ continue;
195
+ const opRecord = opRaw;
196
+ const summary = stringOrUndefined(opRecord["summary"]);
197
+ const operationId = stringOrUndefined(opRecord["operationId"]);
198
+ ops.push({
199
+ method: method.toUpperCase(),
200
+ path: pathTemplate,
201
+ ...(summary !== undefined ? { summary } : {}),
202
+ ...(operationId !== undefined ? { operationId } : {}),
203
+ });
204
+ }
205
+ }
206
+ return ops;
207
+ }
208
+ function extractPaths(api) {
209
+ if (!isRecord(api))
210
+ return undefined;
211
+ const paths = api["paths"];
212
+ if (!isRecord(paths))
213
+ return undefined;
214
+ return paths;
215
+ }
216
+ /**
217
+ * Walk the graph and build a method+normalisedPath → NodeId index of
218
+ * existing Route nodes. We snapshot the node set at call time; later
219
+ * Operation emissions don't invalidate the map because Route nodes are
220
+ * populated by the routes phase which strictly precedes this one.
221
+ */
222
+ function indexRoutesByMethodAndPath(graph) {
223
+ const index = new Map();
224
+ for (const n of graph.nodes()) {
225
+ if (n.kind !== "Route")
226
+ continue;
227
+ const route = n;
228
+ // Routes without a method are rare (catch-all `app.use`) — they can't
229
+ // match a method-specific OpenAPI operation.
230
+ const method = route.method;
231
+ if (method === undefined)
232
+ continue;
233
+ const key = routeLookupKey(method.toUpperCase(), route.url);
234
+ // First-write wins; routes are emitted in a deterministic order so the
235
+ // winner is stable across runs.
236
+ if (!index.has(key)) {
237
+ index.set(key, route.id);
238
+ }
239
+ }
240
+ return index;
241
+ }
242
+ function routeLookupKey(method, path) {
243
+ return `${method.toUpperCase()}\u0000${normalisePath(path)}`;
244
+ }
245
+ /**
246
+ * Normalise route path templates so OpenAPI `/users/{id}`, Express
247
+ * `/users/:id`, and Next.js `/users/[id]` all collapse onto the same
248
+ * canonical form (`/users/:id`). The transformation is purely syntactic:
249
+ * we rewrite brace- and bracket-style parameters in place and otherwise
250
+ * leave the path untouched.
251
+ */
252
+ function normalisePath(path) {
253
+ if (path.length === 0)
254
+ return path;
255
+ let out = path;
256
+ // `{param}` → `:param`
257
+ out = out.replace(/\{([^}]+)\}/g, ":$1");
258
+ // `[param]` → `:param`
259
+ out = out.replace(/\[([^\]]+)\]/g, ":$1");
260
+ return out;
261
+ }
262
+ function operationNodeId(specPath, method, pathTemplate) {
263
+ return makeNodeId("Operation", specPath, `${method}:${pathTemplate}`);
264
+ }
265
+ function compareParsedOperation(a, b) {
266
+ if (a.method !== b.method)
267
+ return a.method < b.method ? -1 : 1;
268
+ if (a.path !== b.path)
269
+ return a.path < b.path ? -1 : 1;
270
+ return 0;
271
+ }
272
+ function basenameOf(relPath) {
273
+ const idx = relPath.lastIndexOf("/");
274
+ return idx < 0 ? relPath : relPath.slice(idx + 1);
275
+ }
276
+ function isRecord(v) {
277
+ return typeof v === "object" && v !== null && !Array.isArray(v);
278
+ }
279
+ function stringOrUndefined(v) {
280
+ return typeof v === "string" && v.length > 0 ? v : undefined;
281
+ }
282
+ function errMessage(err) {
283
+ return err instanceof Error ? err.message : String(err);
284
+ }
285
+ //# sourceMappingURL=openapi.js.map