scip-query 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. package/README.md +16 -43
  2. package/dist/chunk-2UELLEBI.js +1 -0
  3. package/dist/chunk-34JPTNRN.js +601 -0
  4. package/dist/{chunk-NDSQYIWT.js → chunk-3566TKJ5.js} +3 -3
  5. package/dist/{chunk-LB7OS35Q.js → chunk-4ACRRQC4.js} +8 -4
  6. package/dist/{chunk-3E2X7RIE.js → chunk-4BQFSNFI.js} +10 -6
  7. package/dist/{chunk-BP2ATLK2.js → chunk-6QSHLFSL.js} +4 -4
  8. package/dist/{chunk-5FGUEU7N.js → chunk-6WVR5K46.js} +18 -10
  9. package/dist/{chunk-XFXDXEUN.js → chunk-74RFWB5T.js} +2 -2
  10. package/dist/{chunk-MBVNHJVN.js → chunk-75RQSBTK.js} +2 -2
  11. package/dist/{chunk-YZAA4LYG.js → chunk-7HK5ZLOE.js} +30 -48
  12. package/dist/{chunk-T6ARFSBZ.js → chunk-7JFZSOJ7.js} +7 -7
  13. package/dist/{chunk-6SXADWLW.js → chunk-AKMBBKWV.js} +2 -2
  14. package/dist/{chunk-ZJRYBOEE.js → chunk-AMNISGYR.js} +5 -5
  15. package/dist/{chunk-CM454WL3.js → chunk-BFLULBEU.js} +3 -3
  16. package/dist/{chunk-Z73NYSBZ.js → chunk-CU62ZDHI.js} +2 -2
  17. package/dist/{chunk-TBP6BICL.js → chunk-DY4AFG2W.js} +13 -11
  18. package/dist/{chunk-2QZ23IBN.js → chunk-F7XU27LU.js} +4 -4
  19. package/dist/{chunk-KCBMVQL5.js → chunk-GPJVPT3U.js} +2 -2
  20. package/dist/{chunk-NUZ4OMU3.js → chunk-GU2H5QRN.js} +2 -2
  21. package/dist/{chunk-TSPZOMHC.js → chunk-H6WCPKCX.js} +6 -3
  22. package/dist/{chunk-KVSW5KYP.js → chunk-HDSRORNV.js} +4 -4
  23. package/dist/{chunk-LUSIFBXO.js → chunk-HMYJJ3HY.js} +9 -6
  24. package/dist/chunk-IJKLB2JW.js +69 -0
  25. package/dist/{chunk-6NBLIDF4.js → chunk-ITZ3DDOG.js} +2 -2
  26. package/dist/{chunk-GTILYBH6.js → chunk-IXPHLF6K.js} +6 -6
  27. package/dist/{chunk-BFSCMC22.js → chunk-KBOQX573.js} +3 -3
  28. package/dist/{chunk-FUHJCHS4.js → chunk-LLMPAG56.js} +95 -32
  29. package/dist/{chunk-FFSWWE5O.js → chunk-LTJC5ZQL.js} +3 -3
  30. package/dist/{chunk-LAWMH22O.js → chunk-M3NPW3FC.js} +2 -2
  31. package/dist/{chunk-VRUJH4BO.js → chunk-M4QGEKKD.js} +6 -28
  32. package/dist/{chunk-7OZPA5OO.js → chunk-MVH45PYK.js} +21 -41
  33. package/dist/chunk-N4C3H7LH.js +37 -0
  34. package/dist/chunk-NG5F43OU.js +200 -0
  35. package/dist/{chunk-6VJ6Q7IE.js → chunk-NVIIM34O.js} +4 -4
  36. package/dist/{chunk-GJFURBEW.js → chunk-ORINICIZ.js} +4 -4
  37. package/dist/{chunk-TDNNOR6D.js → chunk-PMJKOXOT.js} +7 -7
  38. package/dist/{chunk-QOV2R2WT.js → chunk-QIXNAB5K.js} +42 -2
  39. package/dist/{chunk-JKP5GH6T.js → chunk-R2I3M5B4.js} +2 -2
  40. package/dist/{chunk-36OMT7ZJ.js → chunk-R56FJU3E.js} +35 -14
  41. package/dist/{chunk-VZ7AMAFL.js → chunk-RFMT7UAZ.js} +3 -3
  42. package/dist/{chunk-SEFSL2GF.js → chunk-TOIEB3LG.js} +2 -2
  43. package/dist/chunk-VO4QI3LS.js +84 -0
  44. package/dist/{chunk-EMDQWNYR.js → chunk-WVK7AASK.js} +8 -8
  45. package/dist/{chunk-5WTJAXY2.js → chunk-Y3M323OX.js} +2 -2
  46. package/dist/{chunk-DCKMSTJ4.js → chunk-Y4JFVQ7C.js} +2 -2
  47. package/dist/{chunk-UNTPVD36.js → chunk-YAFWL3RA.js} +4 -4
  48. package/dist/{chunk-FGXRVW7G.js → chunk-YZ6L7GFO.js} +2 -2
  49. package/dist/cli.js +1401 -717
  50. package/dist/{db-BxaevAyc.d.ts → db-BHYam4BK.d.ts} +7 -19
  51. package/dist/index.d.ts +15 -15
  52. package/dist/index.js +263 -234
  53. package/dist/postinstall.js +5 -76
  54. package/dist/queries/affected.d.ts +1 -1
  55. package/dist/queries/affected.js +3 -3
  56. package/dist/queries/bottlenecks.d.ts +1 -1
  57. package/dist/queries/bottlenecks.js +2 -2
  58. package/dist/queries/by-kind.d.ts +1 -1
  59. package/dist/queries/by-kind.js +2 -2
  60. package/dist/queries/call-graph.d.ts +1 -1
  61. package/dist/queries/call-graph.js +3 -3
  62. package/dist/queries/change-surface.d.ts +2 -2
  63. package/dist/queries/change-surface.js +2 -3
  64. package/dist/queries/code.d.ts +1 -1
  65. package/dist/queries/code.js +3 -3
  66. package/dist/queries/complexity-hotspots.d.ts +1 -1
  67. package/dist/queries/complexity-hotspots.js +3 -3
  68. package/dist/queries/complexity.d.ts +1 -1
  69. package/dist/queries/complexity.js +3 -3
  70. package/dist/queries/convergence.d.ts +1 -1
  71. package/dist/queries/convergence.js +3 -3
  72. package/dist/queries/coupling.d.ts +1 -1
  73. package/dist/queries/coupling.js +1 -1
  74. package/dist/queries/cycles.d.ts +1 -1
  75. package/dist/queries/cycles.js +3 -2
  76. package/dist/queries/dataflow.d.ts +1 -1
  77. package/dist/queries/dataflow.js +3 -3
  78. package/dist/queries/dead.d.ts +1 -1
  79. package/dist/queries/dead.js +4 -3
  80. package/dist/queries/deep-chains.d.ts +1 -1
  81. package/dist/queries/deep-chains.js +3 -2
  82. package/dist/queries/deps.d.ts +1 -1
  83. package/dist/queries/diff-impact.d.ts +2 -2
  84. package/dist/queries/diff-impact.js +2 -3
  85. package/dist/queries/doc-coverage.d.ts +1 -1
  86. package/dist/queries/doc-coverage.js +2 -2
  87. package/dist/queries/drift.d.ts +1 -1
  88. package/dist/queries/drift.js +3 -2
  89. package/dist/queries/extract-candidates.d.ts +1 -1
  90. package/dist/queries/extract-candidates.js +3 -3
  91. package/dist/queries/fan.d.ts +1 -1
  92. package/dist/queries/fan.js +2 -2
  93. package/dist/queries/files.d.ts +1 -1
  94. package/dist/queries/health.d.ts +1 -1
  95. package/dist/queries/health.js +15 -15
  96. package/dist/queries/hierarchy.d.ts +1 -1
  97. package/dist/queries/hierarchy.js +3 -2
  98. package/dist/queries/hotspots.d.ts +1 -1
  99. package/dist/queries/hotspots.js +2 -2
  100. package/dist/queries/imports.d.ts +1 -1
  101. package/dist/queries/imports.js +3 -2
  102. package/dist/queries/index.d.ts +1 -2
  103. package/dist/queries/index.js +46 -51
  104. package/dist/queries/isolated.d.ts +1 -1
  105. package/dist/queries/isolated.js +4 -3
  106. package/dist/queries/members.d.ts +2 -2
  107. package/dist/queries/members.js +3 -2
  108. package/dist/queries/methods.d.ts +1 -1
  109. package/dist/queries/methods.js +2 -2
  110. package/dist/queries/outline.d.ts +1 -1
  111. package/dist/queries/outline.js +2 -2
  112. package/dist/queries/passthrough-candidates.d.ts +1 -1
  113. package/dist/queries/passthrough-candidates.js +3 -3
  114. package/dist/queries/redundant-reexports.d.ts +1 -1
  115. package/dist/queries/redundant-reexports.js +4 -2
  116. package/dist/queries/refs.d.ts +1 -1
  117. package/dist/queries/refs.js +1 -1
  118. package/dist/queries/similar-chains.d.ts +1 -1
  119. package/dist/queries/similar-chains.js +3 -2
  120. package/dist/queries/similar-files.d.ts +1 -1
  121. package/dist/queries/similar-files.js +3 -2
  122. package/dist/queries/similar-signatures.d.ts +1 -1
  123. package/dist/queries/similar-signatures.js +2 -2
  124. package/dist/queries/similar.d.ts +1 -1
  125. package/dist/queries/similar.js +3 -3
  126. package/dist/queries/slice.d.ts +1 -1
  127. package/dist/queries/slice.js +3 -3
  128. package/dist/queries/stale-abstractions.d.ts +1 -1
  129. package/dist/queries/stale-abstractions.js +3 -3
  130. package/dist/queries/stats.d.ts +1 -1
  131. package/dist/queries/stats.js +1 -1
  132. package/dist/queries/surface.d.ts +1 -1
  133. package/dist/queries/surface.js +2 -2
  134. package/dist/queries/symbols.d.ts +1 -1
  135. package/dist/queries/symbols.js +2 -2
  136. package/dist/queries/system.d.ts +1 -1
  137. package/dist/queries/system.js +2 -2
  138. package/dist/queries/trace.d.ts +1 -1
  139. package/dist/queries/trace.js +3 -1
  140. package/dist/queries/wrapper-candidates.d.ts +1 -1
  141. package/dist/queries/wrapper-candidates.js +3 -3
  142. package/dist/reindex-worker.js +24 -12
  143. package/package.json +6 -1
  144. package/IMPROVEMENTS.md +0 -143
  145. package/PLAN.md +0 -320
  146. package/dist/chunk-2QZ23IBN.js.map +0 -1
  147. package/dist/chunk-36OMT7ZJ.js.map +0 -1
  148. package/dist/chunk-3E2X7RIE.js.map +0 -1
  149. package/dist/chunk-3UOUTZQT.js +0 -45
  150. package/dist/chunk-3UOUTZQT.js.map +0 -1
  151. package/dist/chunk-3ZZJVBIO.js +0 -88
  152. package/dist/chunk-3ZZJVBIO.js.map +0 -1
  153. package/dist/chunk-4TYLS5XX.js.map +0 -1
  154. package/dist/chunk-5FGUEU7N.js.map +0 -1
  155. package/dist/chunk-5WTJAXY2.js.map +0 -1
  156. package/dist/chunk-6NBLIDF4.js.map +0 -1
  157. package/dist/chunk-6SXADWLW.js.map +0 -1
  158. package/dist/chunk-6VJ6Q7IE.js.map +0 -1
  159. package/dist/chunk-7OZPA5OO.js.map +0 -1
  160. package/dist/chunk-BEPIEVLR.js +0 -76
  161. package/dist/chunk-BEPIEVLR.js.map +0 -1
  162. package/dist/chunk-BFSCMC22.js.map +0 -1
  163. package/dist/chunk-BP2ATLK2.js.map +0 -1
  164. package/dist/chunk-CM454WL3.js.map +0 -1
  165. package/dist/chunk-DCKMSTJ4.js.map +0 -1
  166. package/dist/chunk-DEZKCZXD.js +0 -40
  167. package/dist/chunk-DEZKCZXD.js.map +0 -1
  168. package/dist/chunk-DVWGWHFW.js +0 -99
  169. package/dist/chunk-DVWGWHFW.js.map +0 -1
  170. package/dist/chunk-EMDQWNYR.js.map +0 -1
  171. package/dist/chunk-FFSWWE5O.js.map +0 -1
  172. package/dist/chunk-FGXRVW7G.js.map +0 -1
  173. package/dist/chunk-FUHJCHS4.js.map +0 -1
  174. package/dist/chunk-GJFURBEW.js.map +0 -1
  175. package/dist/chunk-GTILYBH6.js.map +0 -1
  176. package/dist/chunk-JJP7KQND.js +0 -1
  177. package/dist/chunk-JJP7KQND.js.map +0 -1
  178. package/dist/chunk-JKP5GH6T.js.map +0 -1
  179. package/dist/chunk-KCBMVQL5.js.map +0 -1
  180. package/dist/chunk-KVSW5KYP.js.map +0 -1
  181. package/dist/chunk-LAWMH22O.js.map +0 -1
  182. package/dist/chunk-LB7OS35Q.js.map +0 -1
  183. package/dist/chunk-LUSIFBXO.js.map +0 -1
  184. package/dist/chunk-MBVNHJVN.js.map +0 -1
  185. package/dist/chunk-MGNMHKX3.js.map +0 -1
  186. package/dist/chunk-N5KEREIA.js.map +0 -1
  187. package/dist/chunk-NDSQYIWT.js.map +0 -1
  188. package/dist/chunk-NUZ4OMU3.js.map +0 -1
  189. package/dist/chunk-QOV2R2WT.js.map +0 -1
  190. package/dist/chunk-SEFSL2GF.js.map +0 -1
  191. package/dist/chunk-T6ARFSBZ.js.map +0 -1
  192. package/dist/chunk-TBP6BICL.js.map +0 -1
  193. package/dist/chunk-TDNNOR6D.js.map +0 -1
  194. package/dist/chunk-TSPZOMHC.js.map +0 -1
  195. package/dist/chunk-UNTPVD36.js.map +0 -1
  196. package/dist/chunk-VRUJH4BO.js.map +0 -1
  197. package/dist/chunk-VZ7AMAFL.js.map +0 -1
  198. package/dist/chunk-XFXDXEUN.js.map +0 -1
  199. package/dist/chunk-YZAA4LYG.js.map +0 -1
  200. package/dist/chunk-Z73NYSBZ.js.map +0 -1
  201. package/dist/chunk-ZJRYBOEE.js.map +0 -1
  202. package/dist/cli.js.map +0 -1
  203. package/dist/index.js.map +0 -1
  204. package/dist/postinstall.js.map +0 -1
  205. package/dist/queries/affected.js.map +0 -1
  206. package/dist/queries/bottlenecks.js.map +0 -1
  207. package/dist/queries/by-kind.js.map +0 -1
  208. package/dist/queries/call-graph.js.map +0 -1
  209. package/dist/queries/change-surface.js.map +0 -1
  210. package/dist/queries/clean-signature.js.map +0 -1
  211. package/dist/queries/code.js.map +0 -1
  212. package/dist/queries/complexity-hotspots.js.map +0 -1
  213. package/dist/queries/complexity.js.map +0 -1
  214. package/dist/queries/convergence.js.map +0 -1
  215. package/dist/queries/coupling.js.map +0 -1
  216. package/dist/queries/cycles.js.map +0 -1
  217. package/dist/queries/dataflow.js.map +0 -1
  218. package/dist/queries/dead.js.map +0 -1
  219. package/dist/queries/deep-chains.js.map +0 -1
  220. package/dist/queries/deps.js.map +0 -1
  221. package/dist/queries/diff-impact.js.map +0 -1
  222. package/dist/queries/doc-coverage.js.map +0 -1
  223. package/dist/queries/drift.js.map +0 -1
  224. package/dist/queries/extract-candidates.js.map +0 -1
  225. package/dist/queries/fan.js.map +0 -1
  226. package/dist/queries/files.js.map +0 -1
  227. package/dist/queries/health.js.map +0 -1
  228. package/dist/queries/hierarchy.js.map +0 -1
  229. package/dist/queries/hotspots.js.map +0 -1
  230. package/dist/queries/imports.js.map +0 -1
  231. package/dist/queries/index.js.map +0 -1
  232. package/dist/queries/isolated.js.map +0 -1
  233. package/dist/queries/members.js.map +0 -1
  234. package/dist/queries/methods.js.map +0 -1
  235. package/dist/queries/outline.js.map +0 -1
  236. package/dist/queries/passthrough-candidates.js.map +0 -1
  237. package/dist/queries/redundant-reexports.js.map +0 -1
  238. package/dist/queries/refs.js.map +0 -1
  239. package/dist/queries/similar-chains.js.map +0 -1
  240. package/dist/queries/similar-files.js.map +0 -1
  241. package/dist/queries/similar-signatures.js.map +0 -1
  242. package/dist/queries/similar.js.map +0 -1
  243. package/dist/queries/slice.js.map +0 -1
  244. package/dist/queries/stale-abstractions.js.map +0 -1
  245. package/dist/queries/stats.js.map +0 -1
  246. package/dist/queries/surface.js.map +0 -1
  247. package/dist/queries/symbols.js.map +0 -1
  248. package/dist/queries/system.js.map +0 -1
  249. package/dist/queries/test-coverage.d.ts +0 -22
  250. package/dist/queries/test-coverage.js +0 -11
  251. package/dist/queries/test-coverage.js.map +0 -1
  252. package/dist/queries/trace.js.map +0 -1
  253. package/dist/queries/wrapper-candidates.js.map +0 -1
  254. package/dist/reindex-worker.js.map +0 -1
  255. package/docs/AGENT_GUIDE.md +0 -359
  256. package/reports/debloat/2026-04-10-scip-query-self-audit.md +0 -161
  257. package/src/cli.ts +0 -1480
  258. package/src/config.ts +0 -117
  259. package/src/db.ts +0 -127
  260. package/src/gitignore-filter.ts +0 -143
  261. package/src/index.ts +0 -11
  262. package/src/postinstall.ts +0 -8
  263. package/src/queries/affected.ts +0 -86
  264. package/src/queries/bottlenecks.ts +0 -67
  265. package/src/queries/by-kind.ts +0 -204
  266. package/src/queries/call-graph.ts +0 -66
  267. package/src/queries/change-surface.ts +0 -110
  268. package/src/queries/clean-signature.ts +0 -22
  269. package/src/queries/code.ts +0 -101
  270. package/src/queries/complexity-hotspots.ts +0 -119
  271. package/src/queries/complexity.ts +0 -152
  272. package/src/queries/convergence.ts +0 -82
  273. package/src/queries/coupling.ts +0 -99
  274. package/src/queries/cycles.ts +0 -78
  275. package/src/queries/dataflow.ts +0 -128
  276. package/src/queries/dead.ts +0 -122
  277. package/src/queries/deep-chains.ts +0 -59
  278. package/src/queries/deps.ts +0 -46
  279. package/src/queries/diff-impact.ts +0 -204
  280. package/src/queries/doc-coverage.ts +0 -86
  281. package/src/queries/drift.ts +0 -224
  282. package/src/queries/extract-candidates.ts +0 -167
  283. package/src/queries/fan.ts +0 -148
  284. package/src/queries/files.ts +0 -16
  285. package/src/queries/health.ts +0 -324
  286. package/src/queries/hierarchy.ts +0 -49
  287. package/src/queries/hotspots.ts +0 -53
  288. package/src/queries/imports.ts +0 -95
  289. package/src/queries/index.ts +0 -45
  290. package/src/queries/isolated.ts +0 -67
  291. package/src/queries/members.ts +0 -54
  292. package/src/queries/methods.ts +0 -27
  293. package/src/queries/outline.ts +0 -52
  294. package/src/queries/passthrough-candidates.ts +0 -94
  295. package/src/queries/redundant-reexports.ts +0 -170
  296. package/src/queries/refs.ts +0 -27
  297. package/src/queries/similar-chains.ts +0 -314
  298. package/src/queries/similar-files.ts +0 -140
  299. package/src/queries/similar-signatures.ts +0 -151
  300. package/src/queries/similar.ts +0 -305
  301. package/src/queries/slice.ts +0 -154
  302. package/src/queries/stale-abstractions.ts +0 -82
  303. package/src/queries/stats.ts +0 -22
  304. package/src/queries/surface.ts +0 -34
  305. package/src/queries/symbols.ts +0 -39
  306. package/src/queries/system.ts +0 -86
  307. package/src/queries/test-coverage.ts +0 -106
  308. package/src/queries/trace.ts +0 -55
  309. package/src/queries/wrapper-candidates.ts +0 -112
  310. package/src/query-support.ts +0 -226
  311. package/src/reindex/detect.ts +0 -58
  312. package/src/reindex/index.ts +0 -153
  313. package/src/reindex/indexers.ts +0 -220
  314. package/src/reindex/install.ts +0 -125
  315. package/src/reindex-worker.ts +0 -35
  316. package/src/setup.ts +0 -202
  317. package/src/symbol-parser.ts +0 -278
  318. package/src/types.ts +0 -654
  319. package/src/watch.ts +0 -274
  320. package/tests/gitignore-filter.test.ts +0 -48
  321. package/tests/queries.test.ts +0 -300
  322. package/tests/symbol-parser.test.ts +0 -157
  323. package/tsconfig.json +0 -20
  324. package/tsup.config.ts +0 -40
  325. package/vitest.config.ts +0 -7
@@ -0,0 +1,601 @@
1
+ import {
2
+ findFirstSymbolMatch
3
+ } from "./chunk-LLMPAG56.js";
4
+ import {
5
+ isModuleLikeSymbol,
6
+ leafName,
7
+ shortenSymbol
8
+ } from "./chunk-QIXNAB5K.js";
9
+
10
+ // src/source-analysis.ts
11
+ import {
12
+ existsSync,
13
+ readFileSync
14
+ } from "fs";
15
+ import {
16
+ dirname,
17
+ extname,
18
+ join,
19
+ relative,
20
+ resolve
21
+ } from "path";
22
+ var SOURCE_IMPORT_CACHE = /* @__PURE__ */ new WeakMap();
23
+ var INDEXED_PATH_CACHE = /* @__PURE__ */ new WeakMap();
24
+ var SOURCE_EXTENSIONS = [".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs"];
25
+ var PYTHON_SOURCE_EXTENSIONS = [".py", ".pyi"];
26
+ function getSourceImports(db, relativePath) {
27
+ const cache = getCachedMap(SOURCE_IMPORT_CACHE, db);
28
+ const normalized = normalizePath(relativePath);
29
+ const cached = cache.get(normalized);
30
+ if (cached) {
31
+ return cached;
32
+ }
33
+ const fullPath = join(db.config.projectRoot, normalized);
34
+ if (!existsSync(fullPath)) {
35
+ cache.set(normalized, []);
36
+ return [];
37
+ }
38
+ const source = readFileSync(fullPath, "utf-8");
39
+ const parsed = isPythonSourcePath(normalized) ? parsePythonImports(db, normalized, source) : parseJavaScriptImports(db, normalized, source);
40
+ cache.set(normalized, parsed);
41
+ return parsed;
42
+ }
43
+ function parseJavaScriptImports(db, importerPath, source) {
44
+ return parseJavaScriptImportStatements(source).flatMap((statement) => parseJavaScriptImportStatement(
45
+ db,
46
+ importerPath,
47
+ statement.clause,
48
+ statement.specifier,
49
+ statement.start,
50
+ statement.end,
51
+ source
52
+ ));
53
+ }
54
+ function parseJavaScriptImportStatements(source) {
55
+ const statements = [];
56
+ const importFromRegex = /^[ \t]*import\s+([\s\S]*?)\s+from\s+['"]([^'"]+)['"]\s*;?/gm;
57
+ for (const match of source.matchAll(importFromRegex)) {
58
+ const full = match[0];
59
+ const clause = match[1];
60
+ const specifier = match[2];
61
+ if (!full || !specifier || typeof match.index !== "number") continue;
62
+ statements.push({
63
+ clause,
64
+ specifier,
65
+ start: match.index,
66
+ end: match.index + full.length
67
+ });
68
+ }
69
+ const sideEffectRegex = /^[ \t]*import\s+['"]([^'"]+)['"]\s*;?/gm;
70
+ for (const match of source.matchAll(sideEffectRegex)) {
71
+ const full = match[0];
72
+ const specifier = match[1];
73
+ if (!full || !specifier || typeof match.index !== "number") continue;
74
+ statements.push({
75
+ clause: null,
76
+ specifier,
77
+ start: match.index,
78
+ end: match.index + full.length
79
+ });
80
+ }
81
+ return statements.sort((a, b) => a.start - b.start);
82
+ }
83
+ function parseJavaScriptImportStatement(db, importerPath, clause, specifier, start, end, source) {
84
+ const resolvedSource = resolveImportPath(db, importerPath, specifier);
85
+ const body = buildUsageBody(source, start, end);
86
+ if (!clause) {
87
+ return [{
88
+ importedName: "*",
89
+ localName: null,
90
+ sourcePath: resolvedSource,
91
+ kind: "side-effect",
92
+ used: true,
93
+ usedMembers: []
94
+ }];
95
+ }
96
+ const bindings = parseImportClause(clause).map((binding) => ({
97
+ ...binding,
98
+ sourcePath: resolvedSource
99
+ }));
100
+ return bindings.map((binding) => {
101
+ if (binding.kind === "namespace") {
102
+ const usedMembers = collectNamespaceMembers(body, binding.localName);
103
+ return {
104
+ ...binding,
105
+ used: usedMembers.length > 0 || hasIdentifierUsage(body, binding.localName),
106
+ usedMembers
107
+ };
108
+ }
109
+ if (binding.kind === "side-effect") {
110
+ return { ...binding, used: true, usedMembers: [] };
111
+ }
112
+ return {
113
+ ...binding,
114
+ used: binding.localName ? hasIdentifierUsage(body, binding.localName) : false,
115
+ usedMembers: []
116
+ };
117
+ });
118
+ }
119
+ function parsePythonImports(db, importerPath, source) {
120
+ return collectPythonImportStatements(source).flatMap(
121
+ (statement) => parsePythonImportStatement(db, importerPath, statement, source)
122
+ );
123
+ }
124
+ function collectPythonImportStatements(source) {
125
+ const lines = source.split("\n");
126
+ const statements = [];
127
+ let offset = 0;
128
+ for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
129
+ const line = lines[lineIndex];
130
+ const trimmed = line.trimStart();
131
+ const lineStart = offset;
132
+ offset += line.length + 1;
133
+ if (!trimmed.startsWith("import ") && !trimmed.startsWith("from ")) {
134
+ continue;
135
+ }
136
+ let statement = line;
137
+ let statementEnd = lineStart + line.length;
138
+ let balance = pythonParenBalance(line);
139
+ while (lineIndex + 1 < lines.length && (balance > 0 || statement.trimEnd().endsWith("\\"))) {
140
+ lineIndex++;
141
+ const nextLine = lines[lineIndex];
142
+ statement += `
143
+ ${nextLine}`;
144
+ statementEnd += 1 + nextLine.length;
145
+ balance += pythonParenBalance(nextLine);
146
+ offset += nextLine.length + 1;
147
+ }
148
+ const parsed = parsePythonStatementHeader(statement);
149
+ if (parsed) {
150
+ statements.push({
151
+ ...parsed,
152
+ start: lineStart,
153
+ end: statementEnd
154
+ });
155
+ }
156
+ }
157
+ return statements;
158
+ }
159
+ function parsePythonStatementHeader(statement) {
160
+ const normalized = statement.replace(/\\\s*\n/g, " ").trim();
161
+ if (normalized.startsWith("import ")) {
162
+ return {
163
+ kind: "import",
164
+ module: null,
165
+ clause: normalized.slice("import ".length).trim()
166
+ };
167
+ }
168
+ const fromMatch = normalized.match(/^from\s+([.\w]+)\s+import\s+([\s\S]+)$/);
169
+ if (!fromMatch) {
170
+ return null;
171
+ }
172
+ let clause = fromMatch[2].trim();
173
+ if (clause.startsWith("(") && clause.endsWith(")")) {
174
+ clause = clause.slice(1, -1).trim();
175
+ }
176
+ return {
177
+ kind: "from",
178
+ module: fromMatch[1],
179
+ clause
180
+ };
181
+ }
182
+ function parsePythonImportStatement(db, importerPath, statement, source) {
183
+ const body = buildUsageBody(source, statement.start, statement.end);
184
+ const normalizedClause = statement.clause.replace(/\n/g, " ").trim();
185
+ if (statement.kind === "import") {
186
+ return splitTopLevel(normalizedClause).flatMap((entry) => {
187
+ const cleaned = entry.trim().replace(/,$/, "");
188
+ if (!cleaned) return [];
189
+ const [moduleName, alias] = cleaned.split(/\s+as\s+/);
190
+ const importedName = moduleName.trim();
191
+ const localName = (alias ?? importedName.split(".")[0] ?? importedName).trim();
192
+ const sourcePath2 = resolvePythonImportPath(db, importerPath, importedName);
193
+ const usedMembers = collectNamespaceMembers(body, localName);
194
+ return [{
195
+ importedName,
196
+ localName,
197
+ sourcePath: sourcePath2,
198
+ kind: "namespace",
199
+ used: hasIdentifierUsage(body, localName) || usedMembers.length > 0,
200
+ usedMembers
201
+ }];
202
+ });
203
+ }
204
+ const sourcePath = statement.module ? resolvePythonImportPath(db, importerPath, statement.module) : null;
205
+ const results = [];
206
+ for (const entry of splitTopLevel(normalizedClause)) {
207
+ const cleaned = entry.trim().replace(/,$/, "");
208
+ if (!cleaned) continue;
209
+ if (cleaned === "*") {
210
+ results.push({
211
+ importedName: "*",
212
+ localName: null,
213
+ sourcePath,
214
+ kind: "side-effect",
215
+ used: true,
216
+ usedMembers: []
217
+ });
218
+ continue;
219
+ }
220
+ const [importedName, alias] = cleaned.split(/\s+as\s+/);
221
+ const localName = (alias ?? importedName).trim();
222
+ results.push({
223
+ importedName: importedName.trim(),
224
+ localName,
225
+ sourcePath,
226
+ kind: "named",
227
+ used: hasIdentifierUsage(body, localName),
228
+ usedMembers: []
229
+ });
230
+ }
231
+ return results;
232
+ }
233
+ function parseImportClause(clause) {
234
+ const trimmed = clause.trim().replace(/^type\s+/, "");
235
+ const [first, second] = splitImportClause(trimmed);
236
+ const entries = [];
237
+ if (first) {
238
+ entries.push(...parseImportBinding(first));
239
+ }
240
+ if (second) {
241
+ entries.push(...parseImportBinding(second));
242
+ }
243
+ return entries;
244
+ }
245
+ function parseImportBinding(binding) {
246
+ const trimmed = binding.trim();
247
+ if (!trimmed) return [];
248
+ if (trimmed.startsWith("{")) {
249
+ const inner = trimmed.slice(1, -1).trim();
250
+ if (!inner) return [];
251
+ return splitTopLevel(inner).map((entry) => {
252
+ const cleaned = entry.trim().replace(/^type\s+/, "");
253
+ const [importedName, alias] = cleaned.split(/\s+as\s+/);
254
+ return {
255
+ importedName: importedName.trim(),
256
+ localName: (alias ?? importedName).trim(),
257
+ kind: "named"
258
+ };
259
+ });
260
+ }
261
+ if (trimmed.startsWith("* as ")) {
262
+ return [{
263
+ importedName: "*",
264
+ localName: trimmed.slice(5).trim(),
265
+ kind: "namespace"
266
+ }];
267
+ }
268
+ return [{
269
+ importedName: "default",
270
+ localName: trimmed,
271
+ kind: "default"
272
+ }];
273
+ }
274
+ function splitImportClause(clause) {
275
+ let depth = 0;
276
+ for (let i = 0; i < clause.length; i++) {
277
+ const char = clause[i];
278
+ if (char === "{") depth++;
279
+ if (char === "}") depth--;
280
+ if (char === "," && depth === 0) {
281
+ return [clause.slice(0, i).trim(), clause.slice(i + 1).trim()];
282
+ }
283
+ }
284
+ return [clause.trim(), null];
285
+ }
286
+ function splitTopLevel(input) {
287
+ const parts = [];
288
+ let depth = 0;
289
+ let start = 0;
290
+ for (let i = 0; i < input.length; i++) {
291
+ const char = input[i];
292
+ if (char === "{" || char === "[" || char === "(") depth++;
293
+ if (char === "}" || char === "]" || char === ")") depth--;
294
+ if (char === "," && depth === 0) {
295
+ parts.push(input.slice(start, i));
296
+ start = i + 1;
297
+ }
298
+ }
299
+ parts.push(input.slice(start));
300
+ return parts;
301
+ }
302
+ function buildUsageBody(source, start, end) {
303
+ const masked = `${source.slice(0, start)}${" ".repeat(end - start)}${source.slice(end)}`;
304
+ return stripCommentsAndStrings(masked);
305
+ }
306
+ function stripCommentsAndStrings(source) {
307
+ return source.replace(/'''[\s\S]*?'''/g, " ").replace(/"""[\s\S]*?"""/g, " ").replace(/#.*$/gm, " ").replace(/\/\/.*$/gm, " ").replace(/\/\*[\s\S]*?\*\//g, " ").replace(/`(?:\\[\s\S]|[^`])*`/g, " ").replace(/'(?:\\.|[^'\\\r\n])*'/g, " ").replace(/"(?:\\.|[^"\\\r\n])*"/g, " ");
308
+ }
309
+ function hasIdentifierUsage(body, identifier) {
310
+ return new RegExp(`\\b${escapeRegex(identifier)}\\b`, "m").test(body);
311
+ }
312
+ function collectNamespaceMembers(body, namespaceName) {
313
+ const members = /* @__PURE__ */ new Set();
314
+ const regex = new RegExp(`\\b${escapeRegex(namespaceName)}\\s*\\.\\s*([A-Za-z_$][\\w$]*)`, "g");
315
+ for (const match of body.matchAll(regex)) {
316
+ const member = match[1];
317
+ if (member) {
318
+ members.add(member);
319
+ }
320
+ }
321
+ return [...members];
322
+ }
323
+ function resolveImportPath(db, importerPath, specifier) {
324
+ if (isPythonSourcePath(importerPath)) {
325
+ return resolvePythonImportPath(db, importerPath, specifier);
326
+ }
327
+ return resolveJavaScriptImportPath(db, importerPath, specifier);
328
+ }
329
+ function resolveJavaScriptImportPath(db, importerPath, specifier) {
330
+ if (!specifier.startsWith(".") && !specifier.startsWith("/")) {
331
+ return null;
332
+ }
333
+ const importerDir = dirname(join(db.config.projectRoot, importerPath));
334
+ const absolute = resolve(importerDir, specifier);
335
+ const indexedPaths = getIndexedPaths(db);
336
+ for (const candidate of candidateImportPaths(absolute)) {
337
+ const relativeCandidate = normalizePath(relative(db.config.projectRoot, candidate));
338
+ if (indexedPaths.has(relativeCandidate) || existsSync(candidate)) {
339
+ return relativeCandidate;
340
+ }
341
+ }
342
+ return normalizePath(relative(db.config.projectRoot, absolute));
343
+ }
344
+ function resolvePythonImportPath(db, importerPath, specifier) {
345
+ const indexedPaths = getIndexedPaths(db);
346
+ let basePath;
347
+ if (specifier.startsWith(".")) {
348
+ const match = specifier.match(/^(\.+)(.*)$/);
349
+ if (!match) return null;
350
+ const dots = match[1].length;
351
+ const remainder = match[2].replace(/^\./, "");
352
+ let baseDir = dirname(join(db.config.projectRoot, importerPath));
353
+ for (let i = 1; i < dots; i++) {
354
+ baseDir = dirname(baseDir);
355
+ }
356
+ basePath = remainder ? resolve(baseDir, remainder.replace(/\./g, "/")) : baseDir;
357
+ } else {
358
+ basePath = resolve(db.config.projectRoot, specifier.replace(/\./g, "/"));
359
+ }
360
+ for (const candidate of pythonCandidateImportPaths(basePath)) {
361
+ const relativeCandidate = normalizePath(relative(db.config.projectRoot, candidate));
362
+ if (indexedPaths.has(relativeCandidate) || existsSync(candidate)) {
363
+ return relativeCandidate;
364
+ }
365
+ }
366
+ return null;
367
+ }
368
+ function pythonCandidateImportPaths(basePath) {
369
+ const ext = extname(basePath);
370
+ if (PYTHON_SOURCE_EXTENSIONS.includes(ext)) {
371
+ return [basePath];
372
+ }
373
+ return [
374
+ `${basePath}.py`,
375
+ `${basePath}.pyi`,
376
+ join(basePath, "__init__.py"),
377
+ join(basePath, "__init__.pyi")
378
+ ];
379
+ }
380
+ function candidateImportPaths(absolute) {
381
+ const ext = extname(absolute);
382
+ const candidates = /* @__PURE__ */ new Set();
383
+ if (ext) {
384
+ candidates.add(absolute);
385
+ for (const sourceExt of SOURCE_EXTENSIONS) {
386
+ candidates.add(absolute.slice(0, -ext.length) + sourceExt);
387
+ }
388
+ } else {
389
+ for (const sourceExt of SOURCE_EXTENSIONS) {
390
+ candidates.add(`${absolute}${sourceExt}`);
391
+ candidates.add(join(absolute, `index${sourceExt}`));
392
+ }
393
+ }
394
+ return [...candidates];
395
+ }
396
+ function getIndexedPaths(db) {
397
+ const cached = INDEXED_PATH_CACHE.get(db);
398
+ if (cached) {
399
+ return cached;
400
+ }
401
+ const paths = new Set(
402
+ db.all(
403
+ `SELECT relative_path
404
+ FROM documents
405
+ WHERE 1 = 1
406
+ ${db.pathExclusionsFor("documents")}`
407
+ ).map((row) => normalizePath(row.relative_path)).filter((relativePath) => !db.isIgnored(relativePath))
408
+ );
409
+ INDEXED_PATH_CACHE.set(db, paths);
410
+ return paths;
411
+ }
412
+ function getCachedMap(cache, db) {
413
+ let map = cache.get(db);
414
+ if (!map) {
415
+ map = /* @__PURE__ */ new Map();
416
+ cache.set(db, map);
417
+ }
418
+ return map;
419
+ }
420
+ function normalizePath(path) {
421
+ return path.replace(/\\/g, "/");
422
+ }
423
+ function isPythonSourcePath(relativePath) {
424
+ return PYTHON_SOURCE_EXTENSIONS.includes(extname(relativePath).toLowerCase());
425
+ }
426
+ function pythonParenBalance(value) {
427
+ let balance = 0;
428
+ for (const char of value) {
429
+ if (char === "(") balance++;
430
+ if (char === ")") balance--;
431
+ }
432
+ return balance;
433
+ }
434
+ function escapeRegex(value) {
435
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
436
+ }
437
+
438
+ // src/queries/imports.ts
439
+ function imports(db, filePattern) {
440
+ const rows = db.all(
441
+ `SELECT DISTINCT gs.symbol, def_d.relative_path AS from_file, imp_d.relative_path AS importer
442
+ FROM mentions m
443
+ JOIN chunks c ON m.chunk_id = c.id
444
+ JOIN documents imp_d ON c.document_id = imp_d.id
445
+ JOIN global_symbols gs ON m.symbol_id = gs.id
446
+ LEFT JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
447
+ LEFT JOIN documents def_d ON der.document_id = def_d.id
448
+ WHERE imp_d.relative_path LIKE ?
449
+ AND m.role = 2
450
+ ORDER BY def_d.relative_path, gs.symbol`,
451
+ `%${filePattern}%`
452
+ );
453
+ const indexedResults = rows.filter((row) => !db.isIgnored(row.importer)).map((r) => ({
454
+ symbol: r.symbol,
455
+ shortName: shortenSymbol(r.symbol),
456
+ fromFile: r.from_file ?? "(external)"
457
+ }));
458
+ if (indexedResults.length > 0) {
459
+ return indexedResults;
460
+ }
461
+ const importer = findIndexedFile(db, filePattern);
462
+ if (!importer) return [];
463
+ return getSourceImports(db, importer).map((entry) => ({
464
+ symbol: renderImportSymbol(entry.importedName, entry.localName, entry.kind),
465
+ shortName: renderImportSymbol(entry.importedName, entry.localName, entry.kind),
466
+ fromFile: entry.sourcePath ?? "(external)"
467
+ }));
468
+ }
469
+ function importedBy(db, symbolPattern) {
470
+ const rows = db.all(
471
+ `SELECT DISTINCT gs.symbol, d.relative_path AS importer
472
+ FROM mentions m
473
+ JOIN chunks c ON m.chunk_id = c.id
474
+ JOIN documents d ON c.document_id = d.id
475
+ JOIN global_symbols gs ON m.symbol_id = gs.id
476
+ WHERE gs.symbol LIKE ?
477
+ AND m.role = 2
478
+ ORDER BY d.relative_path`,
479
+ `%${symbolPattern}%`
480
+ );
481
+ const indexedResults = rows.filter((r) => !db.isIgnored(r.importer)).map((r) => ({
482
+ symbol: r.symbol,
483
+ shortName: shortenSymbol(r.symbol),
484
+ fromFile: r.importer
485
+ }));
486
+ if (indexedResults.length > 0) {
487
+ return indexedResults;
488
+ }
489
+ const target = findFirstSymbolMatch(db, symbolPattern);
490
+ const targetFile = target?.relativePath ?? null;
491
+ const targetLeaf = target ? leafName(target.symbol) : symbolPattern.replace(/\(\)$/, "");
492
+ const targetIsModule = target ? isModuleLikeSymbol(target.symbol) : false;
493
+ const files = db.all(
494
+ `SELECT relative_path
495
+ FROM documents
496
+ WHERE 1 = 1
497
+ ${db.pathExclusionsFor("documents")}
498
+ ORDER BY relative_path`
499
+ );
500
+ const importers = /* @__PURE__ */ new Set();
501
+ for (const row of files) {
502
+ if (db.isIgnored(row.relative_path)) continue;
503
+ for (const entry of getSourceImports(db, row.relative_path)) {
504
+ if (!entry.sourcePath) continue;
505
+ if (targetFile && normalizePath2(entry.sourcePath) !== normalizePath2(targetFile)) {
506
+ continue;
507
+ }
508
+ if (targetIsModule) {
509
+ importers.add(row.relative_path);
510
+ continue;
511
+ }
512
+ if (entry.kind === "named" && entry.importedName === targetLeaf) {
513
+ importers.add(row.relative_path);
514
+ continue;
515
+ }
516
+ if (entry.kind === "namespace" && entry.usedMembers.includes(targetLeaf)) {
517
+ importers.add(row.relative_path);
518
+ }
519
+ }
520
+ }
521
+ return [...importers].sort().map((importer) => ({
522
+ symbol: target?.symbol ?? targetLeaf,
523
+ shortName: target ? shortenSymbol(target.symbol) : targetLeaf,
524
+ fromFile: importer
525
+ }));
526
+ }
527
+ function unusedImports(db, filePattern) {
528
+ const rows = db.all(
529
+ `SELECT gs.symbol, d.relative_path AS imported_in, d.relative_path AS importer
530
+ FROM mentions m
531
+ JOIN chunks c ON m.chunk_id = c.id
532
+ JOIN documents d ON c.document_id = d.id
533
+ JOIN global_symbols gs ON m.symbol_id = gs.id
534
+ WHERE d.relative_path LIKE ?
535
+ AND m.role = 2
536
+ AND NOT EXISTS (
537
+ SELECT 1
538
+ FROM mentions ref_m
539
+ JOIN chunks ref_c ON ref_m.chunk_id = ref_c.id
540
+ WHERE ref_m.symbol_id = gs.id
541
+ AND ref_m.role != 1
542
+ AND ref_c.document_id = d.id
543
+ )
544
+ ORDER BY d.relative_path, gs.symbol`,
545
+ `%${filePattern}%`
546
+ );
547
+ const indexedResults = rows.filter((row) => !db.isIgnored(row.importer)).map((r) => ({
548
+ symbol: r.symbol,
549
+ shortName: shortenSymbol(r.symbol),
550
+ importedIn: r.imported_in
551
+ }));
552
+ if (indexedResults.length > 0) {
553
+ return indexedResults;
554
+ }
555
+ const importer = findIndexedFile(db, filePattern);
556
+ if (!importer) return [];
557
+ return getSourceImports(db, importer).filter((entry) => entry.kind !== "side-effect" && !entry.used).map((entry) => ({
558
+ symbol: renderImportSymbol(entry.importedName, entry.localName, entry.kind),
559
+ shortName: renderImportSymbol(entry.importedName, entry.localName, entry.kind),
560
+ importedIn: importer
561
+ }));
562
+ }
563
+ function findIndexedFile(db, filePattern) {
564
+ const doc = db.get(
565
+ `SELECT relative_path
566
+ FROM documents
567
+ WHERE relative_path LIKE ?
568
+ ${db.pathExclusionsFor("documents")}
569
+ LIMIT 1`,
570
+ `%${filePattern}%`
571
+ );
572
+ if (!doc || db.isIgnored(doc.relative_path)) {
573
+ return null;
574
+ }
575
+ return doc.relative_path;
576
+ }
577
+ function renderImportSymbol(importedName, localName, kind) {
578
+ if (kind === "namespace" && importedName === "*" && localName) {
579
+ return `* as ${localName}`;
580
+ }
581
+ if (kind === "default" && localName) {
582
+ return `default as ${localName}`;
583
+ }
584
+ if (kind === "side-effect") {
585
+ return "(side effect import)";
586
+ }
587
+ if (localName && localName !== importedName) {
588
+ return `${importedName} as ${localName}`;
589
+ }
590
+ return importedName;
591
+ }
592
+ function normalizePath2(path) {
593
+ return path.replace(/\\/g, "/");
594
+ }
595
+
596
+ export {
597
+ imports,
598
+ importedBy,
599
+ unusedImports
600
+ };
601
+ //# sourceMappingURL=chunk-34JPTNRN.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  getCalleeRowsForSymbol,
3
3
  testFileExclusionSql
4
- } from "./chunk-FUHJCHS4.js";
4
+ } from "./chunk-LLMPAG56.js";
5
5
  import {
6
6
  shortenSymbol
7
- } from "./chunk-QOV2R2WT.js";
7
+ } from "./chunk-QIXNAB5K.js";
8
8
 
9
9
  // src/queries/passthrough-candidates.ts
10
10
  function passthroughCandidates(db, opts) {
@@ -68,4 +68,4 @@ function passthroughCandidates(db, opts) {
68
68
  export {
69
69
  passthroughCandidates
70
70
  };
71
- //# sourceMappingURL=chunk-NDSQYIWT.js.map
71
+ //# sourceMappingURL=chunk-3566TKJ5.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  findFirstSymbolMatch,
3
3
  getCalleeRowsForSymbol
4
- } from "./chunk-FUHJCHS4.js";
4
+ } from "./chunk-LLMPAG56.js";
5
5
  import {
6
6
  shortenSymbol
7
- } from "./chunk-QOV2R2WT.js";
7
+ } from "./chunk-QIXNAB5K.js";
8
8
 
9
9
  // src/queries/convergence.ts
10
10
  function convergence(db, symbolPatternA, symbolPatternB) {
@@ -32,7 +32,11 @@ function convergence(db, symbolPatternA, symbolPatternB) {
32
32
  const union = /* @__PURE__ */ new Set([...calleesA, ...calleesB]);
33
33
  const similarity = union.size > 0 ? shared.length / union.size : 0;
34
34
  let strategy;
35
- if (uniqueA.length === 0 && uniqueB.length === 0) {
35
+ if (union.size === 0) {
36
+ strategy = "Neither function calls other tracked symbols. There is no callee-pattern evidence for consolidation; inspect the source bodies directly.";
37
+ } else if (shared.length === 0) {
38
+ strategy = "These functions do not share any callees. They are not a callee-based consolidation candidate.";
39
+ } else if (uniqueA.length === 0 && uniqueB.length === 0) {
36
40
  strategy = "These functions have identical callee sets. One can replace the other directly.";
37
41
  } else if (uniqueA.length === 0) {
38
42
  strategy = `A is a subset of B. A can be replaced by calling B (B does everything A does plus more).`;
@@ -69,4 +73,4 @@ function convergence(db, symbolPatternA, symbolPatternB) {
69
73
  export {
70
74
  convergence
71
75
  };
72
- //# sourceMappingURL=chunk-LB7OS35Q.js.map
76
+ //# sourceMappingURL=chunk-4ACRRQC4.js.map
@@ -1,6 +1,9 @@
1
+ import {
2
+ isLiveBarrel
3
+ } from "./chunk-VO4QI3LS.js";
1
4
  import {
2
5
  shortenSymbol
3
- } from "./chunk-QOV2R2WT.js";
6
+ } from "./chunk-QIXNAB5K.js";
4
7
 
5
8
  // src/queries/redundant-reexports.ts
6
9
  function redundantReexports(db, opts = {}) {
@@ -20,7 +23,7 @@ function redundantReexports(db, opts = {}) {
20
23
  JOIN global_symbols gs ON m.symbol_id = gs.id
21
24
  JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
22
25
  JOIN documents orig_d ON der.document_id = orig_d.id
23
- WHERE m.role = 0
26
+ WHERE m.role != 1
24
27
  AND (barrel_d.relative_path LIKE '%/index.ts'
25
28
  OR barrel_d.relative_path LIKE '%/index.js'
26
29
  OR barrel_d.relative_path = 'index.ts'
@@ -36,6 +39,7 @@ function redundantReexports(db, opts = {}) {
36
39
  const results = [];
37
40
  for (const row of reexportRows) {
38
41
  if (db.isIgnored(row.barrel_path) || db.isIgnored(row.original_path)) continue;
42
+ if (isLiveBarrel(db, row.barrel_path)) continue;
39
43
  const consumerCounts = db.get(
40
44
  `SELECT
41
45
  SUM(CASE WHEN uses_barrel = 1 THEN 1 ELSE 0 END) AS barrel_consumers,
@@ -48,20 +52,20 @@ function redundantReexports(db, opts = {}) {
48
52
  FROM mentions barrel_m
49
53
  JOIN chunks barrel_c ON barrel_m.chunk_id = barrel_c.id
50
54
  WHERE barrel_c.document_id = consumer_d.id
51
- AND barrel_m.role = 0
55
+ AND barrel_m.role != 1
52
56
  AND barrel_m.symbol_id IN (
53
57
  SELECT m2.symbol_id
54
58
  FROM mentions m2
55
59
  JOIN chunks c2 ON m2.chunk_id = c2.id
56
60
  WHERE c2.document_id = ?
57
- AND m2.role = 0
61
+ AND m2.role != 1
58
62
  )
59
63
  ) THEN 1 ELSE 0 END) AS uses_barrel
60
64
  FROM mentions ref_m
61
65
  JOIN chunks ref_c ON ref_m.chunk_id = ref_c.id
62
66
  JOIN documents consumer_d ON ref_c.document_id = consumer_d.id
63
67
  WHERE ref_m.symbol_id = ?
64
- AND ref_m.role = 0
68
+ AND ref_m.role != 1
65
69
  AND consumer_d.id != ?
66
70
  AND consumer_d.id != ?
67
71
  ${db.pathExclusionsFor("consumer_d")}
@@ -98,4 +102,4 @@ function redundantReexports(db, opts = {}) {
98
102
  export {
99
103
  redundantReexports
100
104
  };
101
- //# sourceMappingURL=chunk-3E2X7RIE.js.map
105
+ //# sourceMappingURL=chunk-4BQFSNFI.js.map