@code-rag/core 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 (347) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +19 -0
  3. package/dist/auth/audit-log.d.ts +35 -0
  4. package/dist/auth/audit-log.js +110 -0
  5. package/dist/auth/audit-log.js.map +1 -0
  6. package/dist/auth/audit-log.test.d.ts +1 -0
  7. package/dist/auth/audit-log.test.js +261 -0
  8. package/dist/auth/audit-log.test.js.map +1 -0
  9. package/dist/auth/index.d.ts +6 -0
  10. package/dist/auth/index.js +5 -0
  11. package/dist/auth/index.js.map +1 -0
  12. package/dist/auth/oidc-provider.d.ts +49 -0
  13. package/dist/auth/oidc-provider.js +358 -0
  14. package/dist/auth/oidc-provider.js.map +1 -0
  15. package/dist/auth/oidc-provider.test.d.ts +1 -0
  16. package/dist/auth/oidc-provider.test.js +520 -0
  17. package/dist/auth/oidc-provider.test.js.map +1 -0
  18. package/dist/auth/rbac.d.ts +29 -0
  19. package/dist/auth/rbac.js +75 -0
  20. package/dist/auth/rbac.js.map +1 -0
  21. package/dist/auth/rbac.test.d.ts +1 -0
  22. package/dist/auth/rbac.test.js +224 -0
  23. package/dist/auth/rbac.test.js.map +1 -0
  24. package/dist/auth/saml-provider.d.ts +51 -0
  25. package/dist/auth/saml-provider.js +355 -0
  26. package/dist/auth/saml-provider.js.map +1 -0
  27. package/dist/auth/saml-provider.test.d.ts +1 -0
  28. package/dist/auth/saml-provider.test.js +422 -0
  29. package/dist/auth/saml-provider.test.js.map +1 -0
  30. package/dist/auth/types.d.ts +81 -0
  31. package/dist/auth/types.js +11 -0
  32. package/dist/auth/types.js.map +1 -0
  33. package/dist/auth/types.test.d.ts +1 -0
  34. package/dist/auth/types.test.js +147 -0
  35. package/dist/auth/types.test.js.map +1 -0
  36. package/dist/backlog/ab-reference-scanner.d.ts +10 -0
  37. package/dist/backlog/ab-reference-scanner.js +22 -0
  38. package/dist/backlog/ab-reference-scanner.js.map +1 -0
  39. package/dist/backlog/ab-reference-scanner.test.d.ts +1 -0
  40. package/dist/backlog/ab-reference-scanner.test.js +83 -0
  41. package/dist/backlog/ab-reference-scanner.test.js.map +1 -0
  42. package/dist/backlog/azure-devops-provider.d.ts +59 -0
  43. package/dist/backlog/azure-devops-provider.js +283 -0
  44. package/dist/backlog/azure-devops-provider.js.map +1 -0
  45. package/dist/backlog/backlog-provider.d.ts +13 -0
  46. package/dist/backlog/backlog-provider.js +6 -0
  47. package/dist/backlog/backlog-provider.js.map +1 -0
  48. package/dist/backlog/backlog-provider.test.d.ts +1 -0
  49. package/dist/backlog/backlog-provider.test.js +426 -0
  50. package/dist/backlog/backlog-provider.test.js.map +1 -0
  51. package/dist/backlog/clickup-provider.d.ts +55 -0
  52. package/dist/backlog/clickup-provider.js +301 -0
  53. package/dist/backlog/clickup-provider.js.map +1 -0
  54. package/dist/backlog/clickup-provider.test.d.ts +1 -0
  55. package/dist/backlog/clickup-provider.test.js +426 -0
  56. package/dist/backlog/clickup-provider.test.js.map +1 -0
  57. package/dist/backlog/clickup-reference-scanner.d.ts +10 -0
  58. package/dist/backlog/clickup-reference-scanner.js +32 -0
  59. package/dist/backlog/clickup-reference-scanner.js.map +1 -0
  60. package/dist/backlog/clickup-reference-scanner.test.d.ts +1 -0
  61. package/dist/backlog/clickup-reference-scanner.test.js +92 -0
  62. package/dist/backlog/clickup-reference-scanner.test.js.map +1 -0
  63. package/dist/backlog/code-linker.d.ts +63 -0
  64. package/dist/backlog/code-linker.js +90 -0
  65. package/dist/backlog/code-linker.js.map +1 -0
  66. package/dist/backlog/code-linker.test.d.ts +1 -0
  67. package/dist/backlog/code-linker.test.js +325 -0
  68. package/dist/backlog/code-linker.test.js.map +1 -0
  69. package/dist/backlog/index.d.ts +14 -0
  70. package/dist/backlog/index.js +8 -0
  71. package/dist/backlog/index.js.map +1 -0
  72. package/dist/backlog/jira-provider.d.ts +60 -0
  73. package/dist/backlog/jira-provider.js +272 -0
  74. package/dist/backlog/jira-provider.js.map +1 -0
  75. package/dist/backlog/jira-provider.test.d.ts +1 -0
  76. package/dist/backlog/jira-provider.test.js +449 -0
  77. package/dist/backlog/jira-provider.test.js.map +1 -0
  78. package/dist/backlog/jira-reference-scanner.d.ts +11 -0
  79. package/dist/backlog/jira-reference-scanner.js +26 -0
  80. package/dist/backlog/jira-reference-scanner.js.map +1 -0
  81. package/dist/backlog/jira-reference-scanner.test.d.ts +1 -0
  82. package/dist/backlog/jira-reference-scanner.test.js +127 -0
  83. package/dist/backlog/jira-reference-scanner.test.js.map +1 -0
  84. package/dist/backlog/types.d.ts +22 -0
  85. package/dist/backlog/types.js +1 -0
  86. package/dist/backlog/types.js.map +1 -0
  87. package/dist/chunker/ast-chunker.d.ts +45 -0
  88. package/dist/chunker/ast-chunker.js +292 -0
  89. package/dist/chunker/ast-chunker.js.map +1 -0
  90. package/dist/chunker/ast-chunker.test.d.ts +1 -0
  91. package/dist/chunker/ast-chunker.test.js +391 -0
  92. package/dist/chunker/ast-chunker.test.js.map +1 -0
  93. package/dist/chunker/chunker.d.ts +8 -0
  94. package/dist/chunker/chunker.js +1 -0
  95. package/dist/chunker/chunker.js.map +1 -0
  96. package/dist/chunker/index.d.ts +3 -0
  97. package/dist/chunker/index.js +2 -0
  98. package/dist/chunker/index.js.map +1 -0
  99. package/dist/config/config-parser.d.ts +15 -0
  100. package/dist/config/config-parser.js +283 -0
  101. package/dist/config/config-parser.js.map +1 -0
  102. package/dist/config/config-parser.test.d.ts +1 -0
  103. package/dist/config/config-parser.test.js +699 -0
  104. package/dist/config/config-parser.test.js.map +1 -0
  105. package/dist/docs/confluence-provider.d.ts +121 -0
  106. package/dist/docs/confluence-provider.js +459 -0
  107. package/dist/docs/confluence-provider.js.map +1 -0
  108. package/dist/docs/confluence-provider.test.d.ts +1 -0
  109. package/dist/docs/confluence-provider.test.js +765 -0
  110. package/dist/docs/confluence-provider.test.js.map +1 -0
  111. package/dist/docs/index.d.ts +4 -0
  112. package/dist/docs/index.js +2 -0
  113. package/dist/docs/index.js.map +1 -0
  114. package/dist/docs/sharepoint-provider.d.ts +150 -0
  115. package/dist/docs/sharepoint-provider.js +637 -0
  116. package/dist/docs/sharepoint-provider.js.map +1 -0
  117. package/dist/docs/sharepoint-provider.test.d.ts +1 -0
  118. package/dist/docs/sharepoint-provider.test.js +873 -0
  119. package/dist/docs/sharepoint-provider.test.js.map +1 -0
  120. package/dist/embedding/bm25-index.d.ts +12 -0
  121. package/dist/embedding/bm25-index.js +89 -0
  122. package/dist/embedding/bm25-index.js.map +1 -0
  123. package/dist/embedding/bm25-index.test.d.ts +1 -0
  124. package/dist/embedding/bm25-index.test.js +289 -0
  125. package/dist/embedding/bm25-index.test.js.map +1 -0
  126. package/dist/embedding/hybrid-search.d.ts +13 -0
  127. package/dist/embedding/hybrid-search.js +124 -0
  128. package/dist/embedding/hybrid-search.js.map +1 -0
  129. package/dist/embedding/hybrid-search.test.d.ts +1 -0
  130. package/dist/embedding/hybrid-search.test.js +266 -0
  131. package/dist/embedding/hybrid-search.test.js.map +1 -0
  132. package/dist/embedding/index.d.ts +11 -0
  133. package/dist/embedding/index.js +7 -0
  134. package/dist/embedding/index.js.map +1 -0
  135. package/dist/embedding/lancedb-store.d.ts +21 -0
  136. package/dist/embedding/lancedb-store.js +172 -0
  137. package/dist/embedding/lancedb-store.js.map +1 -0
  138. package/dist/embedding/lancedb-store.test.d.ts +1 -0
  139. package/dist/embedding/lancedb-store.test.js +268 -0
  140. package/dist/embedding/lancedb-store.test.js.map +1 -0
  141. package/dist/embedding/model-lifecycle-manager.d.ts +83 -0
  142. package/dist/embedding/model-lifecycle-manager.js +419 -0
  143. package/dist/embedding/model-lifecycle-manager.js.map +1 -0
  144. package/dist/embedding/model-lifecycle-manager.test.d.ts +1 -0
  145. package/dist/embedding/model-lifecycle-manager.test.js +642 -0
  146. package/dist/embedding/model-lifecycle-manager.test.js.map +1 -0
  147. package/dist/embedding/ollama-embedding-provider.d.ts +16 -0
  148. package/dist/embedding/ollama-embedding-provider.js +74 -0
  149. package/dist/embedding/ollama-embedding-provider.js.map +1 -0
  150. package/dist/embedding/ollama-embedding-provider.test.d.ts +1 -0
  151. package/dist/embedding/ollama-embedding-provider.test.js +198 -0
  152. package/dist/embedding/ollama-embedding-provider.test.js.map +1 -0
  153. package/dist/embedding/openai-compatible-embedding-provider.d.ts +19 -0
  154. package/dist/embedding/openai-compatible-embedding-provider.js +108 -0
  155. package/dist/embedding/openai-compatible-embedding-provider.js.map +1 -0
  156. package/dist/embedding/openai-compatible-embedding-provider.test.d.ts +1 -0
  157. package/dist/embedding/openai-compatible-embedding-provider.test.js +456 -0
  158. package/dist/embedding/openai-compatible-embedding-provider.test.js.map +1 -0
  159. package/dist/embedding/qdrant-store.d.ts +28 -0
  160. package/dist/embedding/qdrant-store.js +174 -0
  161. package/dist/embedding/qdrant-store.js.map +1 -0
  162. package/dist/embedding/qdrant-store.test.d.ts +1 -0
  163. package/dist/embedding/qdrant-store.test.js +359 -0
  164. package/dist/embedding/qdrant-store.test.js.map +1 -0
  165. package/dist/enrichment/index.d.ts +4 -0
  166. package/dist/enrichment/index.js +2 -0
  167. package/dist/enrichment/index.js.map +1 -0
  168. package/dist/enrichment/nl-enricher.d.ts +16 -0
  169. package/dist/enrichment/nl-enricher.js +47 -0
  170. package/dist/enrichment/nl-enricher.js.map +1 -0
  171. package/dist/enrichment/nl-enricher.test.d.ts +1 -0
  172. package/dist/enrichment/nl-enricher.test.js +154 -0
  173. package/dist/enrichment/nl-enricher.test.js.map +1 -0
  174. package/dist/enrichment/ollama-client.d.ts +18 -0
  175. package/dist/enrichment/ollama-client.js +55 -0
  176. package/dist/enrichment/ollama-client.js.map +1 -0
  177. package/dist/enrichment/ollama-client.test.d.ts +1 -0
  178. package/dist/enrichment/ollama-client.test.js +129 -0
  179. package/dist/enrichment/ollama-client.test.js.map +1 -0
  180. package/dist/git/git-client.d.ts +22 -0
  181. package/dist/git/git-client.js +6 -0
  182. package/dist/git/git-client.js.map +1 -0
  183. package/dist/git/git-client.test.d.ts +1 -0
  184. package/dist/git/git-client.test.js +200 -0
  185. package/dist/git/git-client.test.js.map +1 -0
  186. package/dist/git/ignore-filter.d.ts +2 -0
  187. package/dist/git/ignore-filter.js +31 -0
  188. package/dist/git/ignore-filter.js.map +1 -0
  189. package/dist/git/ignore-filter.test.d.ts +1 -0
  190. package/dist/git/ignore-filter.test.js +87 -0
  191. package/dist/git/ignore-filter.test.js.map +1 -0
  192. package/dist/git/index.d.ts +4 -0
  193. package/dist/git/index.js +3 -0
  194. package/dist/git/index.js.map +1 -0
  195. package/dist/git/simple-git-client.d.ts +12 -0
  196. package/dist/git/simple-git-client.js +138 -0
  197. package/dist/git/simple-git-client.js.map +1 -0
  198. package/dist/graph/cross-repo-resolver.d.ts +50 -0
  199. package/dist/graph/cross-repo-resolver.js +315 -0
  200. package/dist/graph/cross-repo-resolver.js.map +1 -0
  201. package/dist/graph/cross-repo-resolver.test.d.ts +1 -0
  202. package/dist/graph/cross-repo-resolver.test.js +548 -0
  203. package/dist/graph/cross-repo-resolver.test.js.map +1 -0
  204. package/dist/graph/dependency-graph.d.ts +44 -0
  205. package/dist/graph/dependency-graph.js +108 -0
  206. package/dist/graph/dependency-graph.js.map +1 -0
  207. package/dist/graph/dependency-graph.test.d.ts +1 -0
  208. package/dist/graph/dependency-graph.test.js +276 -0
  209. package/dist/graph/dependency-graph.test.js.map +1 -0
  210. package/dist/graph/graph-builder.d.ts +11 -0
  211. package/dist/graph/graph-builder.js +113 -0
  212. package/dist/graph/graph-builder.js.map +1 -0
  213. package/dist/graph/graph-builder.test.d.ts +1 -0
  214. package/dist/graph/graph-builder.test.js +178 -0
  215. package/dist/graph/graph-builder.test.js.map +1 -0
  216. package/dist/graph/import-resolver.d.ts +11 -0
  217. package/dist/graph/import-resolver.js +199 -0
  218. package/dist/graph/import-resolver.js.map +1 -0
  219. package/dist/graph/import-resolver.test.d.ts +1 -0
  220. package/dist/graph/import-resolver.test.js +282 -0
  221. package/dist/graph/import-resolver.test.js.map +1 -0
  222. package/dist/graph/index.d.ts +7 -0
  223. package/dist/graph/index.js +4 -0
  224. package/dist/graph/index.js.map +1 -0
  225. package/dist/index.d.ts +31 -0
  226. package/dist/index.js +15 -0
  227. package/dist/index.js.map +1 -0
  228. package/dist/indexer/file-scanner.d.ts +34 -0
  229. package/dist/indexer/file-scanner.js +69 -0
  230. package/dist/indexer/file-scanner.js.map +1 -0
  231. package/dist/indexer/file-scanner.test.d.ts +1 -0
  232. package/dist/indexer/file-scanner.test.js +110 -0
  233. package/dist/indexer/file-scanner.test.js.map +1 -0
  234. package/dist/indexer/file-watcher.d.ts +79 -0
  235. package/dist/indexer/file-watcher.js +148 -0
  236. package/dist/indexer/incremental-indexer.d.ts +67 -0
  237. package/dist/indexer/incremental-indexer.js +142 -0
  238. package/dist/indexer/incremental-indexer.js.map +1 -0
  239. package/dist/indexer/incremental-indexer.test.d.ts +1 -0
  240. package/dist/indexer/incremental-indexer.test.js +266 -0
  241. package/dist/indexer/incremental-indexer.test.js.map +1 -0
  242. package/dist/indexer/index-check.d.ts +22 -0
  243. package/dist/indexer/index-check.js +74 -0
  244. package/dist/indexer/index-check.js.map +1 -0
  245. package/dist/indexer/index-check.test.d.ts +1 -0
  246. package/dist/indexer/index-check.test.js +100 -0
  247. package/dist/indexer/index-check.test.js.map +1 -0
  248. package/dist/indexer/index-state.d.ts +61 -0
  249. package/dist/indexer/index-state.js +82 -0
  250. package/dist/indexer/index-state.js.map +1 -0
  251. package/dist/indexer/index-state.test.d.ts +1 -0
  252. package/dist/indexer/index-state.test.js +140 -0
  253. package/dist/indexer/index-state.test.js.map +1 -0
  254. package/dist/indexer/index.d.ts +12 -0
  255. package/dist/indexer/index.js +6 -0
  256. package/dist/indexer/index.js.map +1 -0
  257. package/dist/indexer/multi-repo-indexer.d.ts +63 -0
  258. package/dist/indexer/multi-repo-indexer.js +144 -0
  259. package/dist/indexer/multi-repo-indexer.js.map +1 -0
  260. package/dist/indexer/multi-repo-indexer.test.d.ts +1 -0
  261. package/dist/indexer/multi-repo-indexer.test.js +238 -0
  262. package/dist/indexer/multi-repo-indexer.test.js.map +1 -0
  263. package/dist/parser/index.d.ts +4 -0
  264. package/dist/parser/index.js +3 -0
  265. package/dist/parser/index.js.map +1 -0
  266. package/dist/parser/language-registry.d.ts +46 -0
  267. package/dist/parser/language-registry.js +219 -0
  268. package/dist/parser/language-registry.js.map +1 -0
  269. package/dist/parser/language-registry.test.d.ts +1 -0
  270. package/dist/parser/language-registry.test.js +225 -0
  271. package/dist/parser/language-registry.test.js.map +1 -0
  272. package/dist/parser/markdown-parser.d.ts +124 -0
  273. package/dist/parser/markdown-parser.js +487 -0
  274. package/dist/parser/markdown-parser.js.map +1 -0
  275. package/dist/parser/markdown-parser.test.d.ts +1 -0
  276. package/dist/parser/markdown-parser.test.js +600 -0
  277. package/dist/parser/markdown-parser.test.js.map +1 -0
  278. package/dist/parser/tree-sitter-parser.d.ts +32 -0
  279. package/dist/parser/tree-sitter-parser.js +146 -0
  280. package/dist/parser/tree-sitter-parser.js.map +1 -0
  281. package/dist/retrieval/context-expander.d.ts +51 -0
  282. package/dist/retrieval/context-expander.js +218 -0
  283. package/dist/retrieval/context-expander.js.map +1 -0
  284. package/dist/retrieval/context-expander.test.d.ts +1 -0
  285. package/dist/retrieval/context-expander.test.js +339 -0
  286. package/dist/retrieval/context-expander.test.js.map +1 -0
  287. package/dist/retrieval/cross-encoder-reranker.d.ts +16 -0
  288. package/dist/retrieval/cross-encoder-reranker.js +90 -0
  289. package/dist/retrieval/cross-encoder-reranker.js.map +1 -0
  290. package/dist/retrieval/cross-encoder-reranker.test.d.ts +1 -0
  291. package/dist/retrieval/cross-encoder-reranker.test.js +305 -0
  292. package/dist/retrieval/cross-encoder-reranker.test.js.map +1 -0
  293. package/dist/retrieval/index.d.ts +8 -0
  294. package/dist/retrieval/index.js +4 -0
  295. package/dist/retrieval/index.js.map +1 -0
  296. package/dist/retrieval/query-analyzer.d.ts +29 -0
  297. package/dist/retrieval/query-analyzer.js +238 -0
  298. package/dist/retrieval/query-analyzer.js.map +1 -0
  299. package/dist/retrieval/query-analyzer.test.d.ts +1 -0
  300. package/dist/retrieval/query-analyzer.test.js +236 -0
  301. package/dist/retrieval/query-analyzer.test.js.map +1 -0
  302. package/dist/retrieval/token-budget.d.ts +51 -0
  303. package/dist/retrieval/token-budget.js +141 -0
  304. package/dist/retrieval/token-budget.js.map +1 -0
  305. package/dist/retrieval/token-budget.test.d.ts +1 -0
  306. package/dist/retrieval/token-budget.test.js +404 -0
  307. package/dist/retrieval/token-budget.test.js.map +1 -0
  308. package/dist/storage/azure-blob-provider.d.ts +19 -0
  309. package/dist/storage/azure-blob-provider.js +199 -0
  310. package/dist/storage/azure-blob-provider.js.map +1 -0
  311. package/dist/storage/azure-blob-provider.test.d.ts +1 -0
  312. package/dist/storage/azure-blob-provider.test.js +250 -0
  313. package/dist/storage/azure-blob-provider.test.js.map +1 -0
  314. package/dist/storage/gcs-provider.d.ts +22 -0
  315. package/dist/storage/gcs-provider.js +241 -0
  316. package/dist/storage/gcs-provider.js.map +1 -0
  317. package/dist/storage/gcs-provider.test.d.ts +1 -0
  318. package/dist/storage/gcs-provider.test.js +299 -0
  319. package/dist/storage/gcs-provider.test.js.map +1 -0
  320. package/dist/storage/index.d.ts +5 -0
  321. package/dist/storage/index.js +4 -0
  322. package/dist/storage/index.js.map +1 -0
  323. package/dist/storage/s3-provider.d.ts +21 -0
  324. package/dist/storage/s3-provider.js +220 -0
  325. package/dist/storage/s3-provider.js.map +1 -0
  326. package/dist/storage/s3-provider.test.d.ts +1 -0
  327. package/dist/storage/s3-provider.test.js +329 -0
  328. package/dist/storage/s3-provider.test.js.map +1 -0
  329. package/dist/storage/types.d.ts +65 -0
  330. package/dist/storage/types.js +12 -0
  331. package/dist/storage/types.js.map +1 -0
  332. package/dist/types/chunk.d.ts +32 -0
  333. package/dist/types/chunk.js +1 -0
  334. package/dist/types/chunk.js.map +1 -0
  335. package/dist/types/config.d.ts +71 -0
  336. package/dist/types/config.js +1 -0
  337. package/dist/types/config.js.map +1 -0
  338. package/dist/types/index.d.ts +5 -0
  339. package/dist/types/index.js +1 -0
  340. package/dist/types/index.js.map +1 -0
  341. package/dist/types/provider.d.ts +54 -0
  342. package/dist/types/provider.js +36 -0
  343. package/dist/types/provider.js.map +1 -0
  344. package/dist/types/search.d.ts +27 -0
  345. package/dist/types/search.js +1 -0
  346. package/dist/types/search.js.map +1 -0
  347. package/package.json +70 -0
@@ -0,0 +1,282 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { extractImports } from './import-resolver.js';
3
+ describe('extractImports', () => {
4
+ describe('ES6 named imports', () => {
5
+ it('should extract named imports', () => {
6
+ const code = `import { foo, bar } from './module';`;
7
+ const result = extractImports(code, 'typescript');
8
+ expect(result).toContainEqual(expect.objectContaining({
9
+ source: './module',
10
+ specifiers: ['foo', 'bar'],
11
+ isDefault: false,
12
+ isDynamic: false,
13
+ }));
14
+ });
15
+ it('should handle aliased named imports', () => {
16
+ const code = `import { foo as f, bar as b } from './module';`;
17
+ const result = extractImports(code, 'typescript');
18
+ expect(result).toContainEqual(expect.objectContaining({
19
+ source: './module',
20
+ specifiers: ['foo', 'bar'],
21
+ }));
22
+ });
23
+ it('should handle single named import', () => {
24
+ const code = `import { Result } from 'neverthrow';`;
25
+ const result = extractImports(code, 'typescript');
26
+ expect(result).toContainEqual(expect.objectContaining({
27
+ source: 'neverthrow',
28
+ specifiers: ['Result'],
29
+ isDefault: false,
30
+ }));
31
+ });
32
+ });
33
+ describe('ES6 default imports', () => {
34
+ it('should extract default imports', () => {
35
+ const code = `import React from 'react';`;
36
+ const result = extractImports(code, 'javascript');
37
+ expect(result).toContainEqual(expect.objectContaining({
38
+ source: 'react',
39
+ specifiers: ['React'],
40
+ isDefault: true,
41
+ isDynamic: false,
42
+ }));
43
+ });
44
+ it('should not confuse default with type imports', () => {
45
+ const code = `import type { Foo } from './types';`;
46
+ const result = extractImports(code, 'typescript');
47
+ // Should be captured as named, not default
48
+ const defaultImports = result.filter((r) => r.isDefault);
49
+ expect(defaultImports).toHaveLength(0);
50
+ });
51
+ });
52
+ describe('TypeScript type imports', () => {
53
+ it('should extract type-only imports', () => {
54
+ const code = `import type { ParsedFile } from '../types/provider.js';`;
55
+ const result = extractImports(code, 'typescript');
56
+ expect(result).toContainEqual(expect.objectContaining({
57
+ source: '../types/provider.js',
58
+ specifiers: ['ParsedFile'],
59
+ isDefault: false,
60
+ }));
61
+ });
62
+ it('should handle multiple type imports', () => {
63
+ const code = `import type { Chunk, ChunkMetadata } from './chunk.js';`;
64
+ const result = extractImports(code, 'typescript');
65
+ expect(result).toContainEqual(expect.objectContaining({
66
+ source: './chunk.js',
67
+ specifiers: ['Chunk', 'ChunkMetadata'],
68
+ }));
69
+ });
70
+ });
71
+ describe('default + named imports combo', () => {
72
+ it('should extract default and named imports together', () => {
73
+ const code = `import React, { useState, useEffect } from 'react';`;
74
+ const result = extractImports(code, 'javascript');
75
+ expect(result).toContainEqual(expect.objectContaining({
76
+ source: 'react',
77
+ specifiers: ['React', 'useState', 'useEffect'],
78
+ isDefault: true,
79
+ isDynamic: false,
80
+ }));
81
+ });
82
+ });
83
+ describe('side-effect imports', () => {
84
+ it('should extract side-effect imports', () => {
85
+ const code = `import './polyfill';`;
86
+ const result = extractImports(code, 'javascript');
87
+ expect(result).toContainEqual(expect.objectContaining({
88
+ source: './polyfill',
89
+ specifiers: [],
90
+ isDefault: false,
91
+ isDynamic: false,
92
+ }));
93
+ });
94
+ it('should extract side-effect import with double quotes', () => {
95
+ const code = `import "reflect-metadata";`;
96
+ const result = extractImports(code, 'typescript');
97
+ expect(result).toContainEqual(expect.objectContaining({
98
+ source: 'reflect-metadata',
99
+ specifiers: [],
100
+ isDefault: false,
101
+ }));
102
+ });
103
+ });
104
+ describe('Python imports', () => {
105
+ it('should extract simple Python imports', () => {
106
+ const code = `import os`;
107
+ const result = extractImports(code, 'python');
108
+ expect(result).toContainEqual(expect.objectContaining({
109
+ source: 'os',
110
+ specifiers: ['os'],
111
+ isDefault: true,
112
+ }));
113
+ });
114
+ it('should extract from...import statements', () => {
115
+ const code = `from os.path import join, dirname`;
116
+ const result = extractImports(code, 'python');
117
+ expect(result).toContainEqual(expect.objectContaining({
118
+ source: 'os.path',
119
+ specifiers: ['join', 'dirname'],
120
+ isDefault: false,
121
+ }));
122
+ });
123
+ it('should handle aliased Python imports', () => {
124
+ const code = `import numpy as np`;
125
+ const result = extractImports(code, 'python');
126
+ expect(result).toContainEqual(expect.objectContaining({
127
+ source: 'numpy',
128
+ specifiers: ['numpy'],
129
+ isDefault: true,
130
+ }));
131
+ });
132
+ it('should handle from...import with alias', () => {
133
+ const code = `from collections import OrderedDict as OD, defaultdict`;
134
+ const result = extractImports(code, 'python');
135
+ expect(result).toContainEqual(expect.objectContaining({
136
+ source: 'collections',
137
+ specifiers: ['OrderedDict', 'defaultdict'],
138
+ }));
139
+ });
140
+ });
141
+ describe('Go imports', () => {
142
+ it('should extract single Go import', () => {
143
+ const code = `import "fmt"`;
144
+ const result = extractImports(code, 'go');
145
+ expect(result).toContainEqual(expect.objectContaining({
146
+ source: 'fmt',
147
+ specifiers: ['fmt'],
148
+ isDefault: true,
149
+ }));
150
+ });
151
+ it('should extract Go import block', () => {
152
+ const code = `
153
+ import (
154
+ "fmt"
155
+ "os"
156
+ "path/filepath"
157
+ )`;
158
+ const result = extractImports(code, 'go');
159
+ expect(result).toContainEqual(expect.objectContaining({ source: 'fmt', specifiers: ['fmt'] }));
160
+ expect(result).toContainEqual(expect.objectContaining({ source: 'os', specifiers: ['os'] }));
161
+ expect(result).toContainEqual(expect.objectContaining({ source: 'path/filepath', specifiers: ['filepath'] }));
162
+ });
163
+ it('should handle aliased Go imports', () => {
164
+ const code = `
165
+ import (
166
+ pb "github.com/example/proto"
167
+ )`;
168
+ const result = extractImports(code, 'go');
169
+ expect(result).toContainEqual(expect.objectContaining({
170
+ source: 'github.com/example/proto',
171
+ specifiers: ['pb'],
172
+ }));
173
+ });
174
+ });
175
+ describe('require() calls', () => {
176
+ it('should extract require calls', () => {
177
+ const code = `const fs = require('fs');`;
178
+ const result = extractImports(code, 'javascript');
179
+ expect(result).toContainEqual(expect.objectContaining({
180
+ source: 'fs',
181
+ specifiers: [],
182
+ isDynamic: false,
183
+ }));
184
+ });
185
+ it('should handle require with double quotes', () => {
186
+ const code = `const path = require("path");`;
187
+ const result = extractImports(code, 'javascript');
188
+ expect(result).toContainEqual(expect.objectContaining({ source: 'path' }));
189
+ });
190
+ });
191
+ describe('dynamic import()', () => {
192
+ it('should extract dynamic imports', () => {
193
+ const code = `const mod = await import('./lazy-module');`;
194
+ const result = extractImports(code, 'typescript');
195
+ expect(result).toContainEqual(expect.objectContaining({
196
+ source: './lazy-module',
197
+ specifiers: [],
198
+ isDynamic: true,
199
+ }));
200
+ });
201
+ it('should extract dynamic import with double quotes', () => {
202
+ const code = `const mod = import("./other");`;
203
+ const result = extractImports(code, 'javascript');
204
+ expect(result).toContainEqual(expect.objectContaining({
205
+ source: './other',
206
+ isDynamic: true,
207
+ }));
208
+ });
209
+ });
210
+ describe('re-exports', () => {
211
+ it('should extract named re-exports', () => {
212
+ const code = `export { foo, bar } from './module';`;
213
+ const result = extractImports(code, 'typescript');
214
+ expect(result).toContainEqual(expect.objectContaining({
215
+ source: './module',
216
+ specifiers: ['foo', 'bar'],
217
+ isDefault: false,
218
+ }));
219
+ });
220
+ it('should extract wildcard re-exports', () => {
221
+ const code = `export * from './module';`;
222
+ const result = extractImports(code, 'typescript');
223
+ expect(result).toContainEqual(expect.objectContaining({
224
+ source: './module',
225
+ specifiers: [],
226
+ isDefault: false,
227
+ }));
228
+ });
229
+ it('should extract aliased re-exports', () => {
230
+ const code = `export { default as Foo } from './foo';`;
231
+ const result = extractImports(code, 'typescript');
232
+ expect(result).toContainEqual(expect.objectContaining({
233
+ source: './foo',
234
+ specifiers: ['default'],
235
+ }));
236
+ });
237
+ });
238
+ describe('namespace imports', () => {
239
+ it('should extract namespace imports', () => {
240
+ const code = `import * as path from 'path';`;
241
+ const result = extractImports(code, 'typescript');
242
+ expect(result).toContainEqual(expect.objectContaining({
243
+ source: 'path',
244
+ specifiers: ['path'],
245
+ isDefault: false,
246
+ }));
247
+ });
248
+ });
249
+ describe('multiple imports in one file', () => {
250
+ it('should extract all imports from a multi-import file', () => {
251
+ const code = `
252
+ import { ok, err } from 'neverthrow';
253
+ import type { Result } from 'neverthrow';
254
+ import { join } from 'node:path';
255
+ import type { ParsedFile } from '../types/provider.js';
256
+ export { GraphError } from './graph-builder.js';
257
+ `;
258
+ const result = extractImports(code, 'typescript');
259
+ const sources = result.map((r) => r.source);
260
+ expect(sources).toContain('neverthrow');
261
+ expect(sources).toContain('node:path');
262
+ expect(sources).toContain('../types/provider.js');
263
+ expect(sources).toContain('./graph-builder.js');
264
+ });
265
+ });
266
+ describe('edge cases', () => {
267
+ it('should return empty array for empty content', () => {
268
+ expect(extractImports('', 'typescript')).toEqual([]);
269
+ });
270
+ it('should return empty array for content without imports', () => {
271
+ const code = `const x = 42;\nconsole.log(x);`;
272
+ expect(extractImports(code, 'typescript')).toEqual([]);
273
+ });
274
+ it('should use JS parser for unknown language', () => {
275
+ const code = `import { foo } from './bar';`;
276
+ const result = extractImports(code, 'rust');
277
+ expect(result).toHaveLength(1);
278
+ expect(result[0]?.source).toBe('./bar');
279
+ });
280
+ });
281
+ });
282
+ //# sourceMappingURL=import-resolver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-resolver.test.js","sourceRoot":"","sources":["../../src/graph/import-resolver.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type { GraphNode, GraphEdge } from './dependency-graph.js';
2
+ export { DependencyGraph } from './dependency-graph.js';
3
+ export type { ImportInfo } from './import-resolver.js';
4
+ export { extractImports } from './import-resolver.js';
5
+ export { GraphBuilder, GraphError } from './graph-builder.js';
6
+ export type { CrossRepoDependency, PackageManifest, DependencyType } from './cross-repo-resolver.js';
7
+ export { CrossRepoResolver, CrossRepoError, parsePackageJson, parseGoMod, parseCargoToml } from './cross-repo-resolver.js';
@@ -0,0 +1,4 @@
1
+ export { DependencyGraph } from './dependency-graph.js';
2
+ export { extractImports } from './import-resolver.js';
3
+ export { GraphBuilder, GraphError } from './graph-builder.js';
4
+ export { CrossRepoResolver, CrossRepoError, parsePackageJson, parseGoMod, parseCargoToml } from './cross-repo-resolver.js';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/graph/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,31 @@
1
+ export type { Chunk, ChunkMetadata, ChunkType, ChunkWithEmbedding, CodeRAGConfig, EmbeddingConfig, OpenAICompatibleConfig, EmbeddingDockerConfig, LLMConfig, IngestionConfig, SearchConfig, StorageConfig, QdrantStorageConfig, ProjectConfig, RepoConfig, EmbeddingProvider, VectorStore, LLMProvider, Parser, Chunker, ParsedFile, SearchQuery, SearchFilters, SearchOptions, SearchResult, SearchMethod, } from './types/index.js';
2
+ export { EmbedError, StoreError, LLMError, ParseError, ChunkError, } from './types/index.js';
3
+ export { loadConfig, ConfigError, repoConfigSchema } from './config/config-parser.js';
4
+ export type { RepoConfigSchema } from './config/config-parser.js';
5
+ export type { FileChange, FileChangeStatus, FileMetadata, GitClient, IgnoreFilter, } from './git/index.js';
6
+ export { GitError, SimpleGitClient, createIgnoreFilter } from './git/index.js';
7
+ export type { SupportedLanguage, MarkdownFrontmatter, ParsedMarkdown, MarkdownParserConfig } from './parser/index.js';
8
+ export { TreeSitterParser, LanguageRegistry, MarkdownParser, parseFrontmatter, extractWikilinks, extractTags, } from './parser/index.js';
9
+ export type { ASTChunkerConfig } from './chunker/index.js';
10
+ export { ASTChunker } from './chunker/index.js';
11
+ export type { GraphNode, GraphEdge, ImportInfo, CrossRepoDependency, PackageManifest, DependencyType } from './graph/index.js';
12
+ export { DependencyGraph, extractImports, GraphBuilder, GraphError, CrossRepoResolver, CrossRepoError, parsePackageJson, parseGoMod, parseCargoToml } from './graph/index.js';
13
+ export type { OllamaConfig, EnrichBatchResult } from './enrichment/index.js';
14
+ export { OllamaClient, OllamaError, NLEnricher, EnrichmentError } from './enrichment/index.js';
15
+ export type { IndexedFileState, ScannedFile, IndexerConfig, ChangeSet, IndexerResult, RepoIndexResult, MultiRepoIndexResult, MultiRepoProgressCallback, MultiRepoIndexOptions, RepoProcessor, IndexCheckResult, FileWatcherConfig, FileWatcherEvents, } from './indexer/index.js';
16
+ export { IndexState, computeFileHash, FileScanner, ScanError, IncrementalIndexer, IndexerError, MultiRepoIndexer, MultiRepoIndexerError, checkIndexExists, FileWatcher, } from './indexer/index.js';
17
+ export type { OllamaEmbeddingConfig, OpenAICompatibleEmbeddingConfig, QdrantConfig, ModelLifecycleConfig, BackendInfo, BackendType, GpuMode, DockerConfig, ProgressCallback, ProcessExecutor, FetchFn, } from './embedding/index.js';
18
+ export { OllamaEmbeddingProvider, OpenAICompatibleEmbeddingProvider, ModelLifecycleManager, ModelLifecycleError, LanceDBStore, QdrantVectorStore, BM25Index, HybridSearch, } from './embedding/index.js';
19
+ export type { AnalyzedQuery, QueryIntent, QueryEntity, ReadonlyGraph, RelationshipType, RelatedChunk, GraphExcerpt, ExpandedContext, TokenBudgetConfig, AssembledContext, CrossEncoderConfig, } from './retrieval/index.js';
20
+ export { QueryAnalyzer, ContextExpander, TokenBudgetOptimizer, CrossEncoderReRanker, ReRankerError, } from './retrieval/index.js';
21
+ export type { ReRankerConfig, ReRanker, BacklogConfig } from './types/index.js';
22
+ export type { BacklogItemType, BacklogItem, BacklogQuery, BacklogProvider, AzureDevOpsConfig, ClickUpConfig, JiraConfig, BacklogCodeMap, CoverageReport, } from './backlog/index.js';
23
+ export { BacklogError, AzureDevOpsProvider, ClickUpProvider, scanForABReferences, scanForClickUpReferences, JiraProvider, scanForJiraReferences, CodeLinker, } from './backlog/index.js';
24
+ export type { ConfluenceConfig, ConfluencePage, ConfluenceContentType, ConfluenceChangedItem, DocsProvider, } from './docs/index.js';
25
+ export { ConfluenceError, ConfluenceProvider, confluenceStorageToPlainText, } from './docs/index.js';
26
+ export type { SharePointConfig, SharePointPage, SharePointDocument, SharePointItemType, SharePointChangedItem, } from './docs/index.js';
27
+ export { SharePointError, SharePointProvider, extractTextFromDocx, extractTextFromPdf, } from './docs/index.js';
28
+ export type { Role, Action, RepoAccessLevel, RepoPermission, User, AuthToken, AuditEntry, AuditQuery, AuthProvider, OIDCConfig, OIDCDiscoveryDocument, SAMLConfig, SAMLIdPMetadata, } from './auth/index.js';
29
+ export { ROLE_HIERARCHY, AuthError, RBACManager, OIDCProvider, SAMLProvider, AuditLogger } from './auth/index.js';
30
+ export type { CloudStorageProvider, CloudStorageConfig, S3Config, AzureBlobConfig, GCSConfig, GCSCredentials, } from './storage/index.js';
31
+ export { StorageError, S3StorageProvider, AzureBlobStorageProvider, GCSStorageProvider, } from './storage/index.js';
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ export { EmbedError, StoreError, LLMError, ParseError, ChunkError, } from './types/index.js';
2
+ export { loadConfig, ConfigError, repoConfigSchema } from './config/config-parser.js';
3
+ export { GitError, SimpleGitClient, createIgnoreFilter } from './git/index.js';
4
+ export { TreeSitterParser, LanguageRegistry, MarkdownParser, parseFrontmatter, extractWikilinks, extractTags, } from './parser/index.js';
5
+ export { ASTChunker } from './chunker/index.js';
6
+ export { DependencyGraph, extractImports, GraphBuilder, GraphError, CrossRepoResolver, CrossRepoError, parsePackageJson, parseGoMod, parseCargoToml } from './graph/index.js';
7
+ export { OllamaClient, OllamaError, NLEnricher, EnrichmentError } from './enrichment/index.js';
8
+ export { IndexState, computeFileHash, FileScanner, ScanError, IncrementalIndexer, IndexerError, MultiRepoIndexer, MultiRepoIndexerError, checkIndexExists, FileWatcher, } from './indexer/index.js';
9
+ export { OllamaEmbeddingProvider, OpenAICompatibleEmbeddingProvider, ModelLifecycleManager, ModelLifecycleError, LanceDBStore, QdrantVectorStore, BM25Index, HybridSearch, } from './embedding/index.js';
10
+ export { QueryAnalyzer, ContextExpander, TokenBudgetOptimizer, CrossEncoderReRanker, ReRankerError, } from './retrieval/index.js';
11
+ export { BacklogError, AzureDevOpsProvider, ClickUpProvider, scanForABReferences, scanForClickUpReferences, JiraProvider, scanForJiraReferences, CodeLinker, } from './backlog/index.js';
12
+ export { ConfluenceError, ConfluenceProvider, confluenceStorageToPlainText, } from './docs/index.js';
13
+ export { SharePointError, SharePointProvider, extractTextFromDocx, extractTextFromPdf, } from './docs/index.js';
14
+ export { ROLE_HIERARCHY, AuthError, RBACManager, OIDCProvider, SAMLProvider, AuditLogger } from './auth/index.js';
15
+ export { StorageError, S3StorageProvider, AzureBlobStorageProvider, GCSStorageProvider, } from './storage/index.js';
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA6BA,OAAO,EACL,UAAU,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EACV,UAAU,GACX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAUtF,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAG/E,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAG9K,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAe/F,OAAO,EACL,UAAU,EACV,eAAe,EACf,WAAW,EACX,SAAS,EACT,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAe5B,OAAO,EACL,uBAAuB,EACvB,iCAAiC,EACjC,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,YAAY,GACb,MAAM,sBAAsB,CAAC;AAe9B,OAAO,EACL,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAe9B,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,YAAY,EACZ,qBAAqB,EACrB,UAAU,GACX,MAAM,oBAAoB,CAAC;AAS5B,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,iBAAiB,CAAC;AASzB,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAiBzB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAUlH,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { type Result } from 'neverthrow';
2
+ /**
3
+ * Represents a file discovered during a directory scan, including its
4
+ * content and a precomputed content hash.
5
+ */
6
+ export interface ScannedFile {
7
+ filePath: string;
8
+ content: string;
9
+ contentHash: string;
10
+ }
11
+ /**
12
+ * Error type for file scanning operations.
13
+ */
14
+ export declare class ScanError extends Error {
15
+ constructor(message: string);
16
+ }
17
+ /**
18
+ * Walks a directory tree to discover indexable source files,
19
+ * respecting an ignore filter (e.g., .gitignore patterns).
20
+ */
21
+ export declare class FileScanner {
22
+ private readonly rootDir;
23
+ private readonly ignoreFilter;
24
+ constructor(rootDir: string, ignoreFilter: (path: string) => boolean);
25
+ /**
26
+ * Recursively scan the root directory for files, filtering out ignored paths.
27
+ * Returns a list of ScannedFile objects with content and content hashes.
28
+ */
29
+ scanFiles(): Promise<Result<ScannedFile[], ScanError>>;
30
+ /**
31
+ * Recursively walk a directory, accumulating non-ignored files.
32
+ */
33
+ private walkDirectory;
34
+ }
@@ -0,0 +1,69 @@
1
+ import { readdir, readFile } from 'node:fs/promises';
2
+ import { join, relative } from 'node:path';
3
+ import { ok, err } from 'neverthrow';
4
+ import { computeFileHash } from './index-state.js';
5
+ /**
6
+ * Error type for file scanning operations.
7
+ */
8
+ export class ScanError extends Error {
9
+ constructor(message) {
10
+ super(message);
11
+ this.name = 'ScanError';
12
+ }
13
+ }
14
+ /**
15
+ * Walks a directory tree to discover indexable source files,
16
+ * respecting an ignore filter (e.g., .gitignore patterns).
17
+ */
18
+ export class FileScanner {
19
+ rootDir;
20
+ ignoreFilter;
21
+ constructor(rootDir, ignoreFilter) {
22
+ this.rootDir = rootDir;
23
+ this.ignoreFilter = ignoreFilter;
24
+ }
25
+ /**
26
+ * Recursively scan the root directory for files, filtering out ignored paths.
27
+ * Returns a list of ScannedFile objects with content and content hashes.
28
+ */
29
+ async scanFiles() {
30
+ try {
31
+ const files = [];
32
+ await this.walkDirectory(this.rootDir, files);
33
+ return ok(files);
34
+ }
35
+ catch (error) {
36
+ const message = error instanceof Error ? error.message : String(error);
37
+ return err(new ScanError(`Failed to scan directory: ${message}`));
38
+ }
39
+ }
40
+ /**
41
+ * Recursively walk a directory, accumulating non-ignored files.
42
+ */
43
+ async walkDirectory(dir, accumulator) {
44
+ const entries = await readdir(dir, { withFileTypes: true });
45
+ for (const entry of entries) {
46
+ const fullPath = join(dir, entry.name);
47
+ const relativePath = relative(this.rootDir, fullPath);
48
+ if (this.ignoreFilter(relativePath)) {
49
+ continue;
50
+ }
51
+ if (entry.isDirectory()) {
52
+ // Check if the directory itself is ignored (with trailing separator hint)
53
+ if (this.ignoreFilter(relativePath + '/')) {
54
+ continue;
55
+ }
56
+ await this.walkDirectory(fullPath, accumulator);
57
+ }
58
+ else if (entry.isFile()) {
59
+ const content = await readFile(fullPath, 'utf-8');
60
+ const contentHash = computeFileHash(content);
61
+ accumulator.push({
62
+ filePath: relativePath,
63
+ content,
64
+ contentHash,
65
+ });
66
+ }
67
+ }
68
+ }
69
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-scanner.js","sourceRoot":"","sources":["../../src/indexer/file-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,EAAE,EAAE,GAAG,EAAe,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAYnD;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,WAAW;IACL,OAAO,CAAS;IAChB,YAAY,CAA4B;IAEzD,YAAY,OAAe,EAAE,YAAuC;QAClE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,MAAM,KAAK,GAAkB,EAAE,CAAC;YAChC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,GAAG,CAAC,IAAI,SAAS,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,GAAW,EAAE,WAA0B;QACjE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAEtD,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;gBACpC,SAAS;YACX,CAAC;YAED,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,0EAA0E;gBAC1E,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,GAAG,CAAC,EAAE,CAAC;oBAC1C,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAClD,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;gBAC7C,WAAW,CAAC,IAAI,CAAC;oBACf,QAAQ,EAAE,YAAY;oBACtB,OAAO;oBACP,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,110 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdtempSync, writeFileSync, mkdirSync, rmSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { FileScanner, ScanError } from './file-scanner.js';
6
+ import { computeFileHash } from './index-state.js';
7
+ describe('FileScanner', () => {
8
+ let tempDir;
9
+ beforeEach(() => {
10
+ tempDir = mkdtempSync(join(tmpdir(), 'coderag-scanner-test-'));
11
+ });
12
+ afterEach(() => {
13
+ rmSync(tempDir, { recursive: true, force: true });
14
+ });
15
+ describe('scanFiles', () => {
16
+ it('should find all files in a directory tree', async () => {
17
+ writeFileSync(join(tempDir, 'main.ts'), 'export const x = 1;');
18
+ mkdirSync(join(tempDir, 'src'));
19
+ writeFileSync(join(tempDir, 'src', 'util.ts'), 'export function add(a: number, b: number) { return a + b; }');
20
+ writeFileSync(join(tempDir, 'src', 'types.ts'), 'export interface Foo { bar: string; }');
21
+ const scanner = new FileScanner(tempDir, () => false);
22
+ const result = await scanner.scanFiles();
23
+ expect(result.isOk()).toBe(true);
24
+ if (result.isOk()) {
25
+ const filePaths = result.value.map((f) => f.filePath).sort();
26
+ expect(filePaths).toHaveLength(3);
27
+ expect(filePaths).toContain('main.ts');
28
+ expect(filePaths).toContain(join('src', 'util.ts'));
29
+ expect(filePaths).toContain(join('src', 'types.ts'));
30
+ }
31
+ });
32
+ it('should respect the ignore filter', async () => {
33
+ writeFileSync(join(tempDir, 'keep.ts'), 'keep me');
34
+ writeFileSync(join(tempDir, 'ignore-me.ts'), 'ignore me');
35
+ mkdirSync(join(tempDir, 'node_modules'));
36
+ writeFileSync(join(tempDir, 'node_modules', 'dep.js'), 'dependency');
37
+ const ignoreFilter = (path) => {
38
+ return path.includes('ignore-me') || path.startsWith('node_modules');
39
+ };
40
+ const scanner = new FileScanner(tempDir, ignoreFilter);
41
+ const result = await scanner.scanFiles();
42
+ expect(result.isOk()).toBe(true);
43
+ if (result.isOk()) {
44
+ const filePaths = result.value.map((f) => f.filePath);
45
+ expect(filePaths).toHaveLength(1);
46
+ expect(filePaths).toContain('keep.ts');
47
+ }
48
+ });
49
+ it('should handle an empty directory', async () => {
50
+ const scanner = new FileScanner(tempDir, () => false);
51
+ const result = await scanner.scanFiles();
52
+ expect(result.isOk()).toBe(true);
53
+ if (result.isOk()) {
54
+ expect(result.value).toHaveLength(0);
55
+ }
56
+ });
57
+ it('should compute correct content hashes', async () => {
58
+ const content = 'export const greeting = "hello";';
59
+ writeFileSync(join(tempDir, 'hello.ts'), content);
60
+ const expectedHash = computeFileHash(content);
61
+ const scanner = new FileScanner(tempDir, () => false);
62
+ const result = await scanner.scanFiles();
63
+ expect(result.isOk()).toBe(true);
64
+ if (result.isOk()) {
65
+ expect(result.value).toHaveLength(1);
66
+ expect(result.value[0]?.contentHash).toBe(expectedHash);
67
+ expect(result.value[0]?.content).toBe(content);
68
+ }
69
+ });
70
+ it('should return file content as string', async () => {
71
+ const content = 'const a = 42;\nconst b = "hello";\n';
72
+ writeFileSync(join(tempDir, 'data.ts'), content);
73
+ const scanner = new FileScanner(tempDir, () => false);
74
+ const result = await scanner.scanFiles();
75
+ expect(result.isOk()).toBe(true);
76
+ if (result.isOk()) {
77
+ expect(result.value[0]?.content).toBe(content);
78
+ expect(result.value[0]?.filePath).toBe('data.ts');
79
+ }
80
+ });
81
+ it('should return ScanError for non-existent directory', async () => {
82
+ const scanner = new FileScanner('/nonexistent/path/coderag-test', () => false);
83
+ const result = await scanner.scanFiles();
84
+ expect(result.isErr()).toBe(true);
85
+ if (result.isErr()) {
86
+ expect(result.error).toBeInstanceOf(ScanError);
87
+ expect(result.error.message).toContain('Failed to scan directory');
88
+ }
89
+ });
90
+ it('should handle nested directories with mixed ignored and non-ignored files', async () => {
91
+ mkdirSync(join(tempDir, 'src'));
92
+ mkdirSync(join(tempDir, 'src', 'utils'));
93
+ mkdirSync(join(tempDir, 'dist'));
94
+ writeFileSync(join(tempDir, 'src', 'index.ts'), 'export {}');
95
+ writeFileSync(join(tempDir, 'src', 'utils', 'helper.ts'), 'export function help() {}');
96
+ writeFileSync(join(tempDir, 'dist', 'bundle.js'), 'compiled code');
97
+ const ignoreFilter = (path) => path.startsWith('dist');
98
+ const scanner = new FileScanner(tempDir, ignoreFilter);
99
+ const result = await scanner.scanFiles();
100
+ expect(result.isOk()).toBe(true);
101
+ if (result.isOk()) {
102
+ const filePaths = result.value.map((f) => f.filePath).sort();
103
+ expect(filePaths).toHaveLength(2);
104
+ expect(filePaths).toContain(join('src', 'index.ts'));
105
+ expect(filePaths).toContain(join('src', 'utils', 'helper.ts'));
106
+ }
107
+ });
108
+ });
109
+ });
110
+ //# sourceMappingURL=file-scanner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-scanner.test.js","sourceRoot":"","sources":["../../src/indexer/file-scanner.test.ts"],"names":[],"mappings":"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"}