@quolu/lattice 0.69.5 → 0.71.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 (605) hide show
  1. package/README.ja.md +5 -1
  2. package/package.json +1 -1
  3. package/sensor/dist/bin/lattice-sensor.js +746 -323
  4. package/sensor/dist/bin/viewer-gate.d.ts +17 -0
  5. package/sensor/dist/bin/viewer-gate.d.ts.map +1 -0
  6. package/sensor/dist/bin/viewer-gate.js +31 -0
  7. package/sensor/dist/bin/viewer-gate.js.map +1 -0
  8. package/sensor/dist/context/formatter.d.ts +7 -1
  9. package/sensor/dist/context/formatter.d.ts.map +1 -1
  10. package/sensor/dist/context/formatter.js +12 -6
  11. package/sensor/dist/context/formatter.js.map +1 -1
  12. package/sensor/dist/context/index.d.ts +12 -0
  13. package/sensor/dist/context/index.d.ts.map +1 -1
  14. package/sensor/dist/context/index.js +103 -16
  15. package/sensor/dist/context/index.js.map +1 -1
  16. package/sensor/dist/db/index.d.ts +23 -2
  17. package/sensor/dist/db/index.d.ts.map +1 -1
  18. package/sensor/dist/db/index.js +109 -31
  19. package/sensor/dist/db/index.js.map +1 -1
  20. package/sensor/dist/db/migrations.d.ts +1 -1
  21. package/sensor/dist/db/migrations.d.ts.map +1 -1
  22. package/sensor/dist/db/migrations.js +68 -1
  23. package/sensor/dist/db/migrations.js.map +1 -1
  24. package/sensor/dist/db/queries.d.ts +583 -6
  25. package/sensor/dist/db/queries.d.ts.map +1 -1
  26. package/sensor/dist/db/queries.js +1425 -57
  27. package/sensor/dist/db/queries.js.map +1 -1
  28. package/sensor/dist/db/schema.sql +27 -4
  29. package/sensor/dist/db/sqlite-adapter.d.ts +2 -0
  30. package/sensor/dist/db/sqlite-adapter.d.ts.map +1 -1
  31. package/sensor/dist/db/sqlite-adapter.js +56 -7
  32. package/sensor/dist/db/sqlite-adapter.js.map +1 -1
  33. package/sensor/dist/db/synthesis-stage.d.ts +12 -0
  34. package/sensor/dist/db/synthesis-stage.d.ts.map +1 -0
  35. package/sensor/dist/db/synthesis-stage.js +93 -0
  36. package/sensor/dist/db/synthesis-stage.js.map +1 -0
  37. package/sensor/dist/db/wal-valve.d.ts +32 -12
  38. package/sensor/dist/db/wal-valve.d.ts.map +1 -1
  39. package/sensor/dist/db/wal-valve.js +65 -22
  40. package/sensor/dist/db/wal-valve.js.map +1 -1
  41. package/sensor/dist/db/wsl-shared-index.d.ts +53 -0
  42. package/sensor/dist/db/wsl-shared-index.d.ts.map +1 -0
  43. package/sensor/dist/db/wsl-shared-index.js +121 -0
  44. package/sensor/dist/db/wsl-shared-index.js.map +1 -0
  45. package/sensor/dist/directory.d.ts +126 -2
  46. package/sensor/dist/directory.d.ts.map +1 -1
  47. package/sensor/dist/directory.js +285 -16
  48. package/sensor/dist/directory.js.map +1 -1
  49. package/sensor/dist/errors.d.ts +14 -0
  50. package/sensor/dist/errors.d.ts.map +1 -1
  51. package/sensor/dist/errors.js +16 -1
  52. package/sensor/dist/errors.js.map +1 -1
  53. package/sensor/dist/extraction/cfml-extractor.d.ts +1 -0
  54. package/sensor/dist/extraction/cfml-extractor.d.ts.map +1 -1
  55. package/sensor/dist/extraction/cfml-extractor.js +15 -3
  56. package/sensor/dist/extraction/cfml-extractor.js.map +1 -1
  57. package/sensor/dist/extraction/dfm-extractor.d.ts.map +1 -1
  58. package/sensor/dist/extraction/dfm-extractor.js +14 -10
  59. package/sensor/dist/extraction/dfm-extractor.js.map +1 -1
  60. package/sensor/dist/extraction/extraction-version.d.ts +1 -1
  61. package/sensor/dist/extraction/extraction-version.d.ts.map +1 -1
  62. package/sensor/dist/extraction/extraction-version.js +3 -1
  63. package/sensor/dist/extraction/extraction-version.js.map +1 -1
  64. package/sensor/dist/extraction/function-ref.d.ts +6 -4
  65. package/sensor/dist/extraction/function-ref.d.ts.map +1 -1
  66. package/sensor/dist/extraction/function-ref.js +35 -14
  67. package/sensor/dist/extraction/function-ref.js.map +1 -1
  68. package/sensor/dist/extraction/generated-detection.d.ts +48 -12
  69. package/sensor/dist/extraction/generated-detection.d.ts.map +1 -1
  70. package/sensor/dist/extraction/generated-detection.js +176 -11
  71. package/sensor/dist/extraction/generated-detection.js.map +1 -1
  72. package/sensor/dist/extraction/grammars.d.ts +38 -0
  73. package/sensor/dist/extraction/grammars.d.ts.map +1 -1
  74. package/sensor/dist/extraction/grammars.js +115 -3
  75. package/sensor/dist/extraction/grammars.js.map +1 -1
  76. package/sensor/dist/extraction/index.d.ts +218 -14
  77. package/sensor/dist/extraction/index.d.ts.map +1 -1
  78. package/sensor/dist/extraction/index.js +887 -175
  79. package/sensor/dist/extraction/index.js.map +1 -1
  80. package/sensor/dist/extraction/languages/c-cpp.d.ts +58 -0
  81. package/sensor/dist/extraction/languages/c-cpp.d.ts.map +1 -1
  82. package/sensor/dist/extraction/languages/c-cpp.js +310 -19
  83. package/sensor/dist/extraction/languages/c-cpp.js.map +1 -1
  84. package/sensor/dist/extraction/languages/dart.d.ts.map +1 -1
  85. package/sensor/dist/extraction/languages/dart.js +8 -3
  86. package/sensor/dist/extraction/languages/dart.js.map +1 -1
  87. package/sensor/dist/extraction/languages/erlang.d.ts.map +1 -1
  88. package/sensor/dist/extraction/languages/erlang.js +58 -22
  89. package/sensor/dist/extraction/languages/erlang.js.map +1 -1
  90. package/sensor/dist/extraction/languages/javascript.js +1 -1
  91. package/sensor/dist/extraction/languages/javascript.js.map +1 -1
  92. package/sensor/dist/extraction/languages/kotlin.d.ts.map +1 -1
  93. package/sensor/dist/extraction/languages/kotlin.js +169 -36
  94. package/sensor/dist/extraction/languages/kotlin.js.map +1 -1
  95. package/sensor/dist/extraction/languages/lua.d.ts.map +1 -1
  96. package/sensor/dist/extraction/languages/lua.js +4 -1
  97. package/sensor/dist/extraction/languages/lua.js.map +1 -1
  98. package/sensor/dist/extraction/languages/objc.d.ts.map +1 -1
  99. package/sensor/dist/extraction/languages/objc.js +4 -0
  100. package/sensor/dist/extraction/languages/objc.js.map +1 -1
  101. package/sensor/dist/extraction/languages/python.d.ts.map +1 -1
  102. package/sensor/dist/extraction/languages/python.js +71 -0
  103. package/sensor/dist/extraction/languages/python.js.map +1 -1
  104. package/sensor/dist/extraction/languages/rust.d.ts +20 -0
  105. package/sensor/dist/extraction/languages/rust.d.ts.map +1 -1
  106. package/sensor/dist/extraction/languages/rust.js +50 -20
  107. package/sensor/dist/extraction/languages/rust.js.map +1 -1
  108. package/sensor/dist/extraction/languages/scala.d.ts.map +1 -1
  109. package/sensor/dist/extraction/languages/scala.js +18 -3
  110. package/sensor/dist/extraction/languages/scala.js.map +1 -1
  111. package/sensor/dist/extraction/languages/swift.d.ts +15 -0
  112. package/sensor/dist/extraction/languages/swift.d.ts.map +1 -1
  113. package/sensor/dist/extraction/languages/swift.js +50 -0
  114. package/sensor/dist/extraction/languages/swift.js.map +1 -1
  115. package/sensor/dist/extraction/languages/typescript.d.ts.map +1 -1
  116. package/sensor/dist/extraction/languages/typescript.js +9 -2
  117. package/sensor/dist/extraction/languages/typescript.js.map +1 -1
  118. package/sensor/dist/extraction/liquid-extractor.d.ts +18 -0
  119. package/sensor/dist/extraction/liquid-extractor.d.ts.map +1 -1
  120. package/sensor/dist/extraction/liquid-extractor.js +98 -22
  121. package/sensor/dist/extraction/liquid-extractor.js.map +1 -1
  122. package/sensor/dist/extraction/mybatis-extractor.d.ts.map +1 -1
  123. package/sensor/dist/extraction/mybatis-extractor.js +6 -4
  124. package/sensor/dist/extraction/mybatis-extractor.js.map +1 -1
  125. package/sensor/dist/extraction/parse-pool.d.ts +7 -0
  126. package/sensor/dist/extraction/parse-pool.d.ts.map +1 -1
  127. package/sensor/dist/extraction/parse-pool.js +20 -1
  128. package/sensor/dist/extraction/parse-pool.js.map +1 -1
  129. package/sensor/dist/extraction/syntax-tokens.d.ts +103 -0
  130. package/sensor/dist/extraction/syntax-tokens.d.ts.map +1 -0
  131. package/sensor/dist/extraction/syntax-tokens.js +381 -0
  132. package/sensor/dist/extraction/syntax-tokens.js.map +1 -0
  133. package/sensor/dist/extraction/tree-sitter-helpers.d.ts +5 -0
  134. package/sensor/dist/extraction/tree-sitter-helpers.d.ts.map +1 -1
  135. package/sensor/dist/extraction/tree-sitter-helpers.js +17 -0
  136. package/sensor/dist/extraction/tree-sitter-helpers.js.map +1 -1
  137. package/sensor/dist/extraction/tree-sitter-types.d.ts +31 -3
  138. package/sensor/dist/extraction/tree-sitter-types.d.ts.map +1 -1
  139. package/sensor/dist/extraction/tree-sitter.d.ts +101 -18
  140. package/sensor/dist/extraction/tree-sitter.d.ts.map +1 -1
  141. package/sensor/dist/extraction/tree-sitter.js +928 -134
  142. package/sensor/dist/extraction/tree-sitter.js.map +1 -1
  143. package/sensor/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
  144. package/sensor/dist/file-limits.d.ts +40 -0
  145. package/sensor/dist/file-limits.d.ts.map +1 -0
  146. package/sensor/dist/file-limits.js +147 -0
  147. package/sensor/dist/file-limits.js.map +1 -0
  148. package/sensor/dist/graph/branch-guards.d.ts +265 -0
  149. package/sensor/dist/graph/branch-guards.d.ts.map +1 -0
  150. package/sensor/dist/graph/branch-guards.js +2325 -0
  151. package/sensor/dist/graph/branch-guards.js.map +1 -0
  152. package/sensor/dist/graph/dead-code.d.ts +251 -0
  153. package/sensor/dist/graph/dead-code.d.ts.map +1 -0
  154. package/sensor/dist/graph/dead-code.js +776 -0
  155. package/sensor/dist/graph/dead-code.js.map +1 -0
  156. package/sensor/dist/graph/dynamic-boundary-report.d.ts +121 -0
  157. package/sensor/dist/graph/dynamic-boundary-report.d.ts.map +1 -0
  158. package/sensor/dist/graph/dynamic-boundary-report.js +283 -0
  159. package/sensor/dist/graph/dynamic-boundary-report.js.map +1 -0
  160. package/sensor/dist/graph/index.d.ts +4 -0
  161. package/sensor/dist/graph/index.d.ts.map +1 -1
  162. package/sensor/dist/graph/index.js +16 -1
  163. package/sensor/dist/graph/index.js.map +1 -1
  164. package/sensor/dist/graph/named-symbol-flow.d.ts +125 -0
  165. package/sensor/dist/graph/named-symbol-flow.d.ts.map +1 -0
  166. package/sensor/dist/graph/named-symbol-flow.js +552 -0
  167. package/sensor/dist/graph/named-symbol-flow.js.map +1 -0
  168. package/sensor/dist/graph/queries.d.ts.map +1 -1
  169. package/sensor/dist/graph/queries.js +2 -0
  170. package/sensor/dist/graph/queries.js.map +1 -1
  171. package/sensor/dist/graph/symbol-lookup.d.ts +83 -0
  172. package/sensor/dist/graph/symbol-lookup.d.ts.map +1 -0
  173. package/sensor/dist/graph/symbol-lookup.js +181 -0
  174. package/sensor/dist/graph/symbol-lookup.js.map +1 -0
  175. package/sensor/dist/graph/traversal.d.ts +9 -0
  176. package/sensor/dist/graph/traversal.d.ts.map +1 -1
  177. package/sensor/dist/graph/traversal.js +62 -36
  178. package/sensor/dist/graph/traversal.js.map +1 -1
  179. package/sensor/dist/graph/type-hierarchy.d.ts +155 -0
  180. package/sensor/dist/graph/type-hierarchy.d.ts.map +1 -0
  181. package/sensor/dist/graph/type-hierarchy.js +382 -0
  182. package/sensor/dist/graph/type-hierarchy.js.map +1 -0
  183. package/sensor/dist/index.d.ts +272 -10
  184. package/sensor/dist/index.d.ts.map +1 -1
  185. package/sensor/dist/index.js +510 -34
  186. package/sensor/dist/index.js.map +1 -1
  187. package/sensor/dist/mcp/answer-freshness.d.ts +10 -0
  188. package/sensor/dist/mcp/answer-freshness.d.ts.map +1 -0
  189. package/sensor/dist/mcp/answer-freshness.js +68 -0
  190. package/sensor/dist/mcp/answer-freshness.js.map +1 -0
  191. package/sensor/dist/mcp/daemon-manager.d.ts +1 -1
  192. package/sensor/dist/mcp/daemon-manager.d.ts.map +1 -1
  193. package/sensor/dist/mcp/daemon-manager.js +17 -1
  194. package/sensor/dist/mcp/daemon-manager.js.map +1 -1
  195. package/sensor/dist/mcp/daemon-paths.d.ts +8 -0
  196. package/sensor/dist/mcp/daemon-paths.d.ts.map +1 -1
  197. package/sensor/dist/mcp/daemon-paths.js +65 -2
  198. package/sensor/dist/mcp/daemon-paths.js.map +1 -1
  199. package/sensor/dist/mcp/daemon-registry.d.ts +17 -4
  200. package/sensor/dist/mcp/daemon-registry.d.ts.map +1 -1
  201. package/sensor/dist/mcp/daemon-registry.js +133 -23
  202. package/sensor/dist/mcp/daemon-registry.js.map +1 -1
  203. package/sensor/dist/mcp/daemon.d.ts +26 -13
  204. package/sensor/dist/mcp/daemon.d.ts.map +1 -1
  205. package/sensor/dist/mcp/daemon.js +126 -32
  206. package/sensor/dist/mcp/daemon.js.map +1 -1
  207. package/sensor/dist/mcp/dynamic-boundaries.d.ts +1 -10
  208. package/sensor/dist/mcp/dynamic-boundaries.d.ts.map +1 -1
  209. package/sensor/dist/mcp/dynamic-boundaries.js +46 -42
  210. package/sensor/dist/mcp/dynamic-boundaries.js.map +1 -1
  211. package/sensor/dist/mcp/engine.d.ts +31 -9
  212. package/sensor/dist/mcp/engine.d.ts.map +1 -1
  213. package/sensor/dist/mcp/engine.js +190 -79
  214. package/sensor/dist/mcp/engine.js.map +1 -1
  215. package/sensor/dist/mcp/explore-dedup.d.ts +140 -0
  216. package/sensor/dist/mcp/explore-dedup.d.ts.map +1 -0
  217. package/sensor/dist/mcp/explore-dedup.js +239 -0
  218. package/sensor/dist/mcp/explore-dedup.js.map +1 -0
  219. package/sensor/dist/mcp/explore-diagnostics.d.ts +289 -0
  220. package/sensor/dist/mcp/explore-diagnostics.d.ts.map +1 -0
  221. package/sensor/dist/mcp/explore-diagnostics.js +558 -0
  222. package/sensor/dist/mcp/explore-diagnostics.js.map +1 -0
  223. package/sensor/dist/mcp/explore-session-state.d.ts +217 -0
  224. package/sensor/dist/mcp/explore-session-state.d.ts.map +1 -0
  225. package/sensor/dist/mcp/explore-session-state.js +322 -0
  226. package/sensor/dist/mcp/explore-session-state.js.map +1 -0
  227. package/sensor/dist/mcp/index-freshness-worker.d.ts +2 -0
  228. package/sensor/dist/mcp/index-freshness-worker.d.ts.map +1 -0
  229. package/sensor/dist/mcp/index-freshness-worker.js +30 -0
  230. package/sensor/dist/mcp/index-freshness-worker.js.map +1 -0
  231. package/sensor/dist/mcp/index-freshness.d.ts +7 -0
  232. package/sensor/dist/mcp/index-freshness.d.ts.map +1 -0
  233. package/sensor/dist/mcp/index-freshness.js +94 -0
  234. package/sensor/dist/mcp/index-freshness.js.map +1 -0
  235. package/sensor/dist/mcp/index.d.ts +3 -1
  236. package/sensor/dist/mcp/index.d.ts.map +1 -1
  237. package/sensor/dist/mcp/index.js +109 -12
  238. package/sensor/dist/mcp/index.js.map +1 -1
  239. package/sensor/dist/mcp/liveness-watchdog.d.ts +4 -1
  240. package/sensor/dist/mcp/liveness-watchdog.d.ts.map +1 -1
  241. package/sensor/dist/mcp/liveness-watchdog.js +11 -2
  242. package/sensor/dist/mcp/liveness-watchdog.js.map +1 -1
  243. package/sensor/dist/mcp/project-lifecycle.d.ts +9 -0
  244. package/sensor/dist/mcp/project-lifecycle.d.ts.map +1 -0
  245. package/sensor/dist/mcp/project-lifecycle.js +182 -0
  246. package/sensor/dist/mcp/project-lifecycle.js.map +1 -0
  247. package/sensor/dist/mcp/proxy.d.ts.map +1 -1
  248. package/sensor/dist/mcp/proxy.js +15 -1
  249. package/sensor/dist/mcp/proxy.js.map +1 -1
  250. package/sensor/dist/mcp/query-pool.d.ts +2 -2
  251. package/sensor/dist/mcp/query-pool.d.ts.map +1 -1
  252. package/sensor/dist/mcp/query-pool.js +9 -7
  253. package/sensor/dist/mcp/query-pool.js.map +1 -1
  254. package/sensor/dist/mcp/query-worker.js +2 -2
  255. package/sensor/dist/mcp/query-worker.js.map +1 -1
  256. package/sensor/dist/mcp/server-instructions.d.ts +2 -2
  257. package/sensor/dist/mcp/server-instructions.d.ts.map +1 -1
  258. package/sensor/dist/mcp/server-instructions.js +13 -6
  259. package/sensor/dist/mcp/server-instructions.js.map +1 -1
  260. package/sensor/dist/mcp/session.d.ts +16 -0
  261. package/sensor/dist/mcp/session.d.ts.map +1 -1
  262. package/sensor/dist/mcp/session.js +36 -13
  263. package/sensor/dist/mcp/session.js.map +1 -1
  264. package/sensor/dist/mcp/startup-handshake.d.ts +3 -1
  265. package/sensor/dist/mcp/startup-handshake.d.ts.map +1 -1
  266. package/sensor/dist/mcp/startup-handshake.js +10 -2
  267. package/sensor/dist/mcp/startup-handshake.js.map +1 -1
  268. package/sensor/dist/mcp/tools.d.ts +496 -38
  269. package/sensor/dist/mcp/tools.d.ts.map +1 -1
  270. package/sensor/dist/mcp/tools.js +4021 -772
  271. package/sensor/dist/mcp/tools.js.map +1 -1
  272. package/sensor/dist/mcp/writer-lock.d.ts +61 -0
  273. package/sensor/dist/mcp/writer-lock.d.ts.map +1 -0
  274. package/sensor/dist/mcp/writer-lock.js +260 -0
  275. package/sensor/dist/mcp/writer-lock.js.map +1 -0
  276. package/sensor/dist/project-config.d.ts +23 -0
  277. package/sensor/dist/project-config.d.ts.map +1 -1
  278. package/sensor/dist/project-config.js +39 -2
  279. package/sensor/dist/project-config.js.map +1 -1
  280. package/sensor/dist/resolution/alias-binding.d.ts +56 -0
  281. package/sensor/dist/resolution/alias-binding.d.ts.map +1 -0
  282. package/sensor/dist/resolution/alias-binding.js +127 -0
  283. package/sensor/dist/resolution/alias-binding.js.map +1 -0
  284. package/sensor/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -1
  285. package/sensor/dist/resolution/c-fnptr-synthesizer.js +21 -19
  286. package/sensor/dist/resolution/c-fnptr-synthesizer.js.map +1 -1
  287. package/sensor/dist/resolution/callback-synthesizer.d.ts +23 -1
  288. package/sensor/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  289. package/sensor/dist/resolution/callback-synthesizer.js +356 -155
  290. package/sensor/dist/resolution/callback-synthesizer.js.map +1 -1
  291. package/sensor/dist/resolution/cpp-constructor.d.ts +4 -0
  292. package/sensor/dist/resolution/cpp-constructor.d.ts.map +1 -0
  293. package/sensor/dist/resolution/cpp-constructor.js +123 -0
  294. package/sensor/dist/resolution/cpp-constructor.js.map +1 -0
  295. package/sensor/dist/resolution/cpp-macro-visibility.d.ts +12 -0
  296. package/sensor/dist/resolution/cpp-macro-visibility.d.ts.map +1 -0
  297. package/sensor/dist/resolution/cpp-macro-visibility.js +342 -0
  298. package/sensor/dist/resolution/cpp-macro-visibility.js.map +1 -0
  299. package/sensor/dist/resolution/expo-router-synthesizer.d.ts +32 -0
  300. package/sensor/dist/resolution/expo-router-synthesizer.d.ts.map +1 -0
  301. package/sensor/dist/resolution/expo-router-synthesizer.js +189 -0
  302. package/sensor/dist/resolution/expo-router-synthesizer.js.map +1 -0
  303. package/sensor/dist/resolution/frameworks/csharp.d.ts.map +1 -1
  304. package/sensor/dist/resolution/frameworks/csharp.js +96 -2
  305. package/sensor/dist/resolution/frameworks/csharp.js.map +1 -1
  306. package/sensor/dist/resolution/frameworks/expo-router.d.ts +189 -0
  307. package/sensor/dist/resolution/frameworks/expo-router.d.ts.map +1 -0
  308. package/sensor/dist/resolution/frameworks/expo-router.js +785 -0
  309. package/sensor/dist/resolution/frameworks/expo-router.js.map +1 -0
  310. package/sensor/dist/resolution/frameworks/express.d.ts.map +1 -1
  311. package/sensor/dist/resolution/frameworks/express.js +251 -16
  312. package/sensor/dist/resolution/frameworks/express.js.map +1 -1
  313. package/sensor/dist/resolution/frameworks/index.d.ts +5 -0
  314. package/sensor/dist/resolution/frameworks/index.d.ts.map +1 -1
  315. package/sensor/dist/resolution/frameworks/index.js +29 -1
  316. package/sensor/dist/resolution/frameworks/index.js.map +1 -1
  317. package/sensor/dist/resolution/frameworks/java.d.ts.map +1 -1
  318. package/sensor/dist/resolution/frameworks/java.js +79 -47
  319. package/sensor/dist/resolution/frameworks/java.js.map +1 -1
  320. package/sensor/dist/resolution/frameworks/laravel.d.ts.map +1 -1
  321. package/sensor/dist/resolution/frameworks/laravel.js +294 -4
  322. package/sensor/dist/resolution/frameworks/laravel.js.map +1 -1
  323. package/sensor/dist/resolution/frameworks/nestjs.d.ts.map +1 -1
  324. package/sensor/dist/resolution/frameworks/nestjs.js +6 -14
  325. package/sensor/dist/resolution/frameworks/nestjs.js.map +1 -1
  326. package/sensor/dist/resolution/frameworks/nextjs.d.ts +76 -0
  327. package/sensor/dist/resolution/frameworks/nextjs.d.ts.map +1 -0
  328. package/sensor/dist/resolution/frameworks/nextjs.js +328 -0
  329. package/sensor/dist/resolution/frameworks/nextjs.js.map +1 -0
  330. package/sensor/dist/resolution/frameworks/object-literal.d.ts +32 -0
  331. package/sensor/dist/resolution/frameworks/object-literal.d.ts.map +1 -0
  332. package/sensor/dist/resolution/frameworks/object-literal.js +139 -0
  333. package/sensor/dist/resolution/frameworks/object-literal.js.map +1 -0
  334. package/sensor/dist/resolution/frameworks/package-deps.d.ts +14 -0
  335. package/sensor/dist/resolution/frameworks/package-deps.d.ts.map +1 -0
  336. package/sensor/dist/resolution/frameworks/package-deps.js +78 -0
  337. package/sensor/dist/resolution/frameworks/package-deps.js.map +1 -0
  338. package/sensor/dist/resolution/frameworks/python.d.ts.map +1 -1
  339. package/sensor/dist/resolution/frameworks/python.js +166 -0
  340. package/sensor/dist/resolution/frameworks/python.js.map +1 -1
  341. package/sensor/dist/resolution/frameworks/react-native.d.ts +26 -0
  342. package/sensor/dist/resolution/frameworks/react-native.d.ts.map +1 -1
  343. package/sensor/dist/resolution/frameworks/react-native.js +153 -14
  344. package/sensor/dist/resolution/frameworks/react-native.js.map +1 -1
  345. package/sensor/dist/resolution/frameworks/react-router.d.ts +46 -0
  346. package/sensor/dist/resolution/frameworks/react-router.d.ts.map +1 -0
  347. package/sensor/dist/resolution/frameworks/react-router.js +187 -0
  348. package/sensor/dist/resolution/frameworks/react-router.js.map +1 -0
  349. package/sensor/dist/resolution/frameworks/react.d.ts +2 -1
  350. package/sensor/dist/resolution/frameworks/react.d.ts.map +1 -1
  351. package/sensor/dist/resolution/frameworks/react.js +188 -139
  352. package/sensor/dist/resolution/frameworks/react.js.map +1 -1
  353. package/sensor/dist/resolution/frameworks/svelte.d.ts.map +1 -1
  354. package/sensor/dist/resolution/frameworks/svelte.js +6 -1
  355. package/sensor/dist/resolution/frameworks/svelte.js.map +1 -1
  356. package/sensor/dist/resolution/frameworks/sveltekit-router.d.ts +36 -0
  357. package/sensor/dist/resolution/frameworks/sveltekit-router.d.ts.map +1 -0
  358. package/sensor/dist/resolution/frameworks/sveltekit-router.js +156 -0
  359. package/sensor/dist/resolution/frameworks/sveltekit-router.js.map +1 -0
  360. package/sensor/dist/resolution/frameworks/swift.d.ts.map +1 -1
  361. package/sensor/dist/resolution/frameworks/swift.js +140 -99
  362. package/sensor/dist/resolution/frameworks/swift.js.map +1 -1
  363. package/sensor/dist/resolution/frameworks/tanstack-router.d.ts +84 -0
  364. package/sensor/dist/resolution/frameworks/tanstack-router.d.ts.map +1 -0
  365. package/sensor/dist/resolution/frameworks/tanstack-router.js +437 -0
  366. package/sensor/dist/resolution/frameworks/tanstack-router.js.map +1 -0
  367. package/sensor/dist/resolution/frameworks/vue-router.d.ts +82 -0
  368. package/sensor/dist/resolution/frameworks/vue-router.d.ts.map +1 -0
  369. package/sensor/dist/resolution/frameworks/vue-router.js +377 -0
  370. package/sensor/dist/resolution/frameworks/vue-router.js.map +1 -0
  371. package/sensor/dist/resolution/import-resolver.d.ts +38 -0
  372. package/sensor/dist/resolution/import-resolver.d.ts.map +1 -1
  373. package/sensor/dist/resolution/import-resolver.js +394 -28
  374. package/sensor/dist/resolution/import-resolver.js.map +1 -1
  375. package/sensor/dist/resolution/index.d.ts +89 -25
  376. package/sensor/dist/resolution/index.d.ts.map +1 -1
  377. package/sensor/dist/resolution/index.js +573 -148
  378. package/sensor/dist/resolution/index.js.map +1 -1
  379. package/sensor/dist/resolution/js-builtins.d.ts +13 -0
  380. package/sensor/dist/resolution/js-builtins.d.ts.map +1 -0
  381. package/sensor/dist/resolution/js-builtins.js +46 -0
  382. package/sensor/dist/resolution/js-builtins.js.map +1 -0
  383. package/sensor/dist/resolution/name-matcher.d.ts +99 -22
  384. package/sensor/dist/resolution/name-matcher.d.ts.map +1 -1
  385. package/sensor/dist/resolution/name-matcher.js +2220 -86
  386. package/sensor/dist/resolution/name-matcher.js.map +1 -1
  387. package/sensor/dist/resolution/next-router-synthesizer.d.ts +27 -0
  388. package/sensor/dist/resolution/next-router-synthesizer.d.ts.map +1 -0
  389. package/sensor/dist/resolution/next-router-synthesizer.js +113 -0
  390. package/sensor/dist/resolution/next-router-synthesizer.js.map +1 -0
  391. package/sensor/dist/resolution/path-aliases.d.ts +6 -4
  392. package/sensor/dist/resolution/path-aliases.d.ts.map +1 -1
  393. package/sensor/dist/resolution/path-aliases.js +125 -17
  394. package/sensor/dist/resolution/path-aliases.js.map +1 -1
  395. package/sensor/dist/resolution/react-router-synthesizer.d.ts +33 -0
  396. package/sensor/dist/resolution/react-router-synthesizer.d.ts.map +1 -0
  397. package/sensor/dist/resolution/react-router-synthesizer.js +126 -0
  398. package/sensor/dist/resolution/react-router-synthesizer.js.map +1 -0
  399. package/sensor/dist/resolution/resolver-pool.d.ts +2 -0
  400. package/sensor/dist/resolution/resolver-pool.d.ts.map +1 -1
  401. package/sensor/dist/resolution/resolver-pool.js +4 -0
  402. package/sensor/dist/resolution/resolver-pool.js.map +1 -1
  403. package/sensor/dist/resolution/strip-comments.d.ts +6 -0
  404. package/sensor/dist/resolution/strip-comments.d.ts.map +1 -1
  405. package/sensor/dist/resolution/strip-comments.js +58 -0
  406. package/sensor/dist/resolution/strip-comments.js.map +1 -1
  407. package/sensor/dist/resolution/sveltekit-synthesizer.d.ts +58 -0
  408. package/sensor/dist/resolution/sveltekit-synthesizer.d.ts.map +1 -0
  409. package/sensor/dist/resolution/sveltekit-synthesizer.js +173 -0
  410. package/sensor/dist/resolution/sveltekit-synthesizer.js.map +1 -0
  411. package/sensor/dist/resolution/swift-type-visibility.d.ts +52 -0
  412. package/sensor/dist/resolution/swift-type-visibility.d.ts.map +1 -0
  413. package/sensor/dist/resolution/swift-type-visibility.js +328 -0
  414. package/sensor/dist/resolution/swift-type-visibility.js.map +1 -0
  415. package/sensor/dist/resolution/synth-utils.d.ts +26 -0
  416. package/sensor/dist/resolution/synth-utils.d.ts.map +1 -0
  417. package/sensor/dist/resolution/synth-utils.js +75 -0
  418. package/sensor/dist/resolution/synth-utils.js.map +1 -0
  419. package/sensor/dist/resolution/tanstack-router-synthesizer.d.ts +31 -0
  420. package/sensor/dist/resolution/tanstack-router-synthesizer.d.ts.map +1 -0
  421. package/sensor/dist/resolution/tanstack-router-synthesizer.js +114 -0
  422. package/sensor/dist/resolution/tanstack-router-synthesizer.js.map +1 -0
  423. package/sensor/dist/resolution/tier-synthesizer.d.ts +54 -0
  424. package/sensor/dist/resolution/tier-synthesizer.d.ts.map +1 -0
  425. package/sensor/dist/resolution/tier-synthesizer.js +1294 -0
  426. package/sensor/dist/resolution/tier-synthesizer.js.map +1 -0
  427. package/sensor/dist/resolution/types.d.ts +78 -2
  428. package/sensor/dist/resolution/types.d.ts.map +1 -1
  429. package/sensor/dist/resolution/types.js +64 -0
  430. package/sensor/dist/resolution/types.js.map +1 -1
  431. package/sensor/dist/resolution/vue-router-synthesizer.d.ts +30 -0
  432. package/sensor/dist/resolution/vue-router-synthesizer.d.ts.map +1 -0
  433. package/sensor/dist/resolution/vue-router-synthesizer.js +115 -0
  434. package/sensor/dist/resolution/vue-router-synthesizer.js.map +1 -0
  435. package/sensor/dist/search/identifier-segments.d.ts +10 -0
  436. package/sensor/dist/search/identifier-segments.d.ts.map +1 -1
  437. package/sensor/dist/search/identifier-segments.js +29 -0
  438. package/sensor/dist/search/identifier-segments.js.map +1 -1
  439. package/sensor/dist/search/query-paths.d.ts +106 -0
  440. package/sensor/dist/search/query-paths.d.ts.map +1 -0
  441. package/sensor/dist/search/query-paths.js +513 -0
  442. package/sensor/dist/search/query-paths.js.map +1 -0
  443. package/sensor/dist/search/query-utils.d.ts +22 -2
  444. package/sensor/dist/search/query-utils.d.ts.map +1 -1
  445. package/sensor/dist/search/query-utils.js +56 -16
  446. package/sensor/dist/search/query-utils.js.map +1 -1
  447. package/sensor/dist/sync/watch-policy.d.ts +14 -0
  448. package/sensor/dist/sync/watch-policy.d.ts.map +1 -1
  449. package/sensor/dist/sync/watch-policy.js +19 -0
  450. package/sensor/dist/sync/watch-policy.js.map +1 -1
  451. package/sensor/dist/sync/watcher.d.ts +74 -35
  452. package/sensor/dist/sync/watcher.d.ts.map +1 -1
  453. package/sensor/dist/sync/watcher.js +281 -99
  454. package/sensor/dist/sync/watcher.js.map +1 -1
  455. package/sensor/dist/telemetry/index.d.ts +4 -2
  456. package/sensor/dist/telemetry/index.d.ts.map +1 -1
  457. package/sensor/dist/telemetry/index.js +92 -41
  458. package/sensor/dist/telemetry/index.js.map +1 -1
  459. package/sensor/dist/types.d.ts +18 -2
  460. package/sensor/dist/types.d.ts.map +1 -1
  461. package/sensor/dist/types.js +2 -0
  462. package/sensor/dist/types.js.map +1 -1
  463. package/sensor/dist/ui-server/api/deadcode.d.ts +84 -0
  464. package/sensor/dist/ui-server/api/deadcode.d.ts.map +1 -0
  465. package/sensor/dist/ui-server/api/deadcode.js +136 -0
  466. package/sensor/dist/ui-server/api/deadcode.js.map +1 -0
  467. package/sensor/dist/ui-server/api/effects.d.ts +94 -0
  468. package/sensor/dist/ui-server/api/effects.d.ts.map +1 -0
  469. package/sensor/dist/ui-server/api/effects.js +527 -0
  470. package/sensor/dist/ui-server/api/effects.js.map +1 -0
  471. package/sensor/dist/ui-server/api/entrypoints.d.ts +92 -0
  472. package/sensor/dist/ui-server/api/entrypoints.d.ts.map +1 -0
  473. package/sensor/dist/ui-server/api/entrypoints.js +361 -0
  474. package/sensor/dist/ui-server/api/entrypoints.js.map +1 -0
  475. package/sensor/dist/ui-server/api/events.d.ts +183 -0
  476. package/sensor/dist/ui-server/api/events.d.ts.map +1 -0
  477. package/sensor/dist/ui-server/api/events.js +430 -0
  478. package/sensor/dist/ui-server/api/events.js.map +1 -0
  479. package/sensor/dist/ui-server/api/file.d.ts +66 -0
  480. package/sensor/dist/ui-server/api/file.d.ts.map +1 -0
  481. package/sensor/dist/ui-server/api/file.js +235 -0
  482. package/sensor/dist/ui-server/api/file.js.map +1 -0
  483. package/sensor/dist/ui-server/api/filecode.d.ts +126 -0
  484. package/sensor/dist/ui-server/api/filecode.d.ts.map +1 -0
  485. package/sensor/dist/ui-server/api/filecode.js +205 -0
  486. package/sensor/dist/ui-server/api/filecode.js.map +1 -0
  487. package/sensor/dist/ui-server/api/flow.d.ts +226 -0
  488. package/sensor/dist/ui-server/api/flow.d.ts.map +1 -0
  489. package/sensor/dist/ui-server/api/flow.js +612 -0
  490. package/sensor/dist/ui-server/api/flow.js.map +1 -0
  491. package/sensor/dist/ui-server/api/hierarchy.d.ts +81 -0
  492. package/sensor/dist/ui-server/api/hierarchy.d.ts.map +1 -0
  493. package/sensor/dist/ui-server/api/hierarchy.js +92 -0
  494. package/sensor/dist/ui-server/api/hierarchy.js.map +1 -0
  495. package/sensor/dist/ui-server/api/index.d.ts +90 -0
  496. package/sensor/dist/ui-server/api/index.d.ts.map +1 -0
  497. package/sensor/dist/ui-server/api/index.js +332 -0
  498. package/sensor/dist/ui-server/api/index.js.map +1 -0
  499. package/sensor/dist/ui-server/api/map.d.ts +256 -0
  500. package/sensor/dist/ui-server/api/map.d.ts.map +1 -0
  501. package/sensor/dist/ui-server/api/map.js +760 -0
  502. package/sensor/dist/ui-server/api/map.js.map +1 -0
  503. package/sensor/dist/ui-server/api/node.d.ts +81 -0
  504. package/sensor/dist/ui-server/api/node.d.ts.map +1 -0
  505. package/sensor/dist/ui-server/api/node.js +388 -0
  506. package/sensor/dist/ui-server/api/node.js.map +1 -0
  507. package/sensor/dist/ui-server/api/nodes.d.ts +25 -0
  508. package/sensor/dist/ui-server/api/nodes.d.ts.map +1 -0
  509. package/sensor/dist/ui-server/api/nodes.js +45 -0
  510. package/sensor/dist/ui-server/api/nodes.js.map +1 -0
  511. package/sensor/dist/ui-server/api/program.d.ts +139 -0
  512. package/sensor/dist/ui-server/api/program.d.ts.map +1 -0
  513. package/sensor/dist/ui-server/api/program.js +315 -0
  514. package/sensor/dist/ui-server/api/program.js.map +1 -0
  515. package/sensor/dist/ui-server/api/respond.d.ts +76 -0
  516. package/sensor/dist/ui-server/api/respond.d.ts.map +1 -0
  517. package/sensor/dist/ui-server/api/respond.js +186 -0
  518. package/sensor/dist/ui-server/api/respond.js.map +1 -0
  519. package/sensor/dist/ui-server/api/route-roots.d.ts +39 -0
  520. package/sensor/dist/ui-server/api/route-roots.d.ts.map +1 -0
  521. package/sensor/dist/ui-server/api/route-roots.js +96 -0
  522. package/sensor/dist/ui-server/api/route-roots.js.map +1 -0
  523. package/sensor/dist/ui-server/api/routes.d.ts +59 -0
  524. package/sensor/dist/ui-server/api/routes.d.ts.map +1 -0
  525. package/sensor/dist/ui-server/api/routes.js +108 -0
  526. package/sensor/dist/ui-server/api/routes.js.map +1 -0
  527. package/sensor/dist/ui-server/api/screens.d.ts +117 -0
  528. package/sensor/dist/ui-server/api/screens.d.ts.map +1 -0
  529. package/sensor/dist/ui-server/api/screens.js +611 -0
  530. package/sensor/dist/ui-server/api/screens.js.map +1 -0
  531. package/sensor/dist/ui-server/api/search.d.ts +29 -0
  532. package/sensor/dist/ui-server/api/search.d.ts.map +1 -0
  533. package/sensor/dist/ui-server/api/search.js +232 -0
  534. package/sensor/dist/ui-server/api/search.js.map +1 -0
  535. package/sensor/dist/ui-server/api/session.d.ts +52 -0
  536. package/sensor/dist/ui-server/api/session.d.ts.map +1 -0
  537. package/sensor/dist/ui-server/api/session.js +196 -0
  538. package/sensor/dist/ui-server/api/session.js.map +1 -0
  539. package/sensor/dist/ui-server/api/source.d.ts +200 -0
  540. package/sensor/dist/ui-server/api/source.d.ts.map +1 -0
  541. package/sensor/dist/ui-server/api/source.js +422 -0
  542. package/sensor/dist/ui-server/api/source.js.map +1 -0
  543. package/sensor/dist/ui-server/api/stats.d.ts +27 -0
  544. package/sensor/dist/ui-server/api/stats.d.ts.map +1 -0
  545. package/sensor/dist/ui-server/api/stats.js +164 -0
  546. package/sensor/dist/ui-server/api/stats.js.map +1 -0
  547. package/sensor/dist/ui-server/api/steps.d.ts +274 -0
  548. package/sensor/dist/ui-server/api/steps.d.ts.map +1 -0
  549. package/sensor/dist/ui-server/api/steps.js +1544 -0
  550. package/sensor/dist/ui-server/api/steps.js.map +1 -0
  551. package/sensor/dist/ui-server/api/trail-store.d.ts +142 -0
  552. package/sensor/dist/ui-server/api/trail-store.d.ts.map +1 -0
  553. package/sensor/dist/ui-server/api/trail-store.js +325 -0
  554. package/sensor/dist/ui-server/api/trail-store.js.map +1 -0
  555. package/sensor/dist/ui-server/api/trails.d.ts +163 -0
  556. package/sensor/dist/ui-server/api/trails.d.ts.map +1 -0
  557. package/sensor/dist/ui-server/api/trails.js +369 -0
  558. package/sensor/dist/ui-server/api/trails.js.map +1 -0
  559. package/sensor/dist/ui-server/api/when.d.ts +133 -0
  560. package/sensor/dist/ui-server/api/when.d.ts.map +1 -0
  561. package/sensor/dist/ui-server/api/when.js +275 -0
  562. package/sensor/dist/ui-server/api/when.js.map +1 -0
  563. package/sensor/dist/ui-server/api/wire.d.ts +179 -0
  564. package/sensor/dist/ui-server/api/wire.d.ts.map +1 -0
  565. package/sensor/dist/ui-server/api/wire.js +231 -0
  566. package/sensor/dist/ui-server/api/wire.js.map +1 -0
  567. package/sensor/dist/ui-server/assets.d.ts +40 -0
  568. package/sensor/dist/ui-server/assets.d.ts.map +1 -0
  569. package/sensor/dist/ui-server/assets.js +110 -0
  570. package/sensor/dist/ui-server/assets.js.map +1 -0
  571. package/sensor/dist/ui-server/constants.d.ts +32 -0
  572. package/sensor/dist/ui-server/constants.d.ts.map +1 -0
  573. package/sensor/dist/ui-server/constants.js +35 -0
  574. package/sensor/dist/ui-server/constants.js.map +1 -0
  575. package/sensor/dist/ui-server/highlight/index.d.ts +113 -0
  576. package/sensor/dist/ui-server/highlight/index.d.ts.map +1 -0
  577. package/sensor/dist/ui-server/highlight/index.js +307 -0
  578. package/sensor/dist/ui-server/highlight/index.js.map +1 -0
  579. package/sensor/dist/ui-server/highlight/languages.d.ts +36 -0
  580. package/sensor/dist/ui-server/highlight/languages.d.ts.map +1 -0
  581. package/sensor/dist/ui-server/highlight/languages.js +50 -0
  582. package/sensor/dist/ui-server/highlight/languages.js.map +1 -0
  583. package/sensor/dist/ui-server/index.d.ts +92 -0
  584. package/sensor/dist/ui-server/index.d.ts.map +1 -0
  585. package/sensor/dist/ui-server/index.js +399 -0
  586. package/sensor/dist/ui-server/index.js.map +1 -0
  587. package/sensor/dist/ui-server/open-browser.d.ts +31 -0
  588. package/sensor/dist/ui-server/open-browser.d.ts.map +1 -0
  589. package/sensor/dist/ui-server/open-browser.js +79 -0
  590. package/sensor/dist/ui-server/open-browser.js.map +1 -0
  591. package/sensor/dist/ui-server/security.d.ts +127 -0
  592. package/sensor/dist/ui-server/security.d.ts.map +1 -0
  593. package/sensor/dist/ui-server/security.js +332 -0
  594. package/sensor/dist/ui-server/security.js.map +1 -0
  595. package/sensor/dist/ui-server/static.d.ts +45 -0
  596. package/sensor/dist/ui-server/static.d.ts.map +1 -0
  597. package/sensor/dist/ui-server/static.js +165 -0
  598. package/sensor/dist/ui-server/static.js.map +1 -0
  599. package/sensor/dist/utils.d.ts +14 -2
  600. package/sensor/dist/utils.d.ts.map +1 -1
  601. package/sensor/dist/utils.js +25 -10
  602. package/sensor/dist/utils.js.map +1 -1
  603. package/src/cli-help.mjs +4 -2
  604. package/src/sensor-adapter.mjs +5 -1
  605. package/src/todo-cli.mjs +88 -11
@@ -50,10 +50,13 @@ exports.extractImportMappings = extractImportMappings;
50
50
  exports.clearImportMappingCache = clearImportMappingCache;
51
51
  exports.extractReExports = extractReExports;
52
52
  exports.resolveJvmImport = resolveJvmImport;
53
+ exports.resolvePhpImportedStaticCall = resolvePhpImportedStaticCall;
53
54
  exports.resolveViaImport = resolveViaImport;
55
+ exports.isBoundToOutOfRepoImport = isBoundToOutOfRepoImport;
54
56
  const fs = __importStar(require("fs"));
55
57
  const path = __importStar(require("path"));
56
58
  const path_aliases_1 = require("./path-aliases");
59
+ const alias_binding_1 = require("./alias-binding");
57
60
  const workspace_packages_1 = require("./workspace-packages");
58
61
  const name_matcher_1 = require("./name-matcher");
59
62
  /**
@@ -73,7 +76,7 @@ exports.EXTENSION_RESOLUTION = {
73
76
  // module-entry convention, hit when a bare workspace import ("data") is
74
77
  // rewritten to the member's directory; lowercase variants for safety.
75
78
  arkts: ['.ets', '.ts', '.d.ts', '.js', '/Index.ets', '/index.ets', '/index.ts', '/index.js'],
76
- javascript: ['.js', '.jsx', '.mjs', '.cjs', '/index.js', '/index.jsx'],
79
+ javascript: ['.js', '.jsx', '.mjs', '.cjs', '.xsjs', '.xsjslib', '/index.js', '/index.jsx'],
77
80
  tsx: ['.tsx', '.ts', '.d.ts', '.js', '.jsx', '/index.tsx', '/index.ts', '/index.js'],
78
81
  jsx: ['.jsx', '.js', '/index.jsx', '/index.js'],
79
82
  // SFC consumers import plain TS/JS, sibling components, and barrels
@@ -110,6 +113,18 @@ function isNixPathImportRef(ref) {
110
113
  // there, so the staleness discipline matches the resolver's own caches.
111
114
  const importPathMemos = new WeakMap();
112
115
  const exportedSymbolMemos = new WeakMap();
116
+ const DEFAULT_BINDING_KINDS = new Set(['function', 'class', 'component', 'constant', 'variable']);
117
+ const DEFAULT_EXPORT_BINDING_RE = /^[ \t]*export\s+default\s+([A-Za-z_$][\w$]*)\s*;?[ \t]*$/m;
118
+ const JS_FAMILY_FILE = /\.(?:[cm]?[jt]sx?)$/;
119
+ /** The identifier `export default NAME` names in a JS-family file, or null. */
120
+ function defaultExportBinding(filePath, context) {
121
+ if (!JS_FAMILY_FILE.test(filePath))
122
+ return null;
123
+ const source = context.readFile(filePath);
124
+ if (!source || !source.includes('export default'))
125
+ return null;
126
+ return source.match(DEFAULT_EXPORT_BINDING_RE)?.[1] ?? null;
127
+ }
113
128
  const fileExportIndexes = new WeakMap();
114
129
  function getFileExportIndex(filePath, context) {
115
130
  let perFile = fileExportIndexes.get(context);
@@ -120,9 +135,8 @@ function getFileExportIndex(filePath, context) {
120
135
  let idx = perFile.get(filePath);
121
136
  if (!idx) {
122
137
  idx = { byName: new Map(), defaultComponent: undefined, defaultFnClass: undefined };
123
- for (const n of context.getNodesInFile(filePath)) {
124
- if (!n.isExported)
125
- continue;
138
+ const exported = context.getExportedNodesInFile?.(filePath) ?? context.getNodesInFile(filePath).filter((n) => n.isExported);
139
+ for (const n of exported) {
126
140
  if (!idx.byName.has(n.name))
127
141
  idx.byName.set(n.name, n);
128
142
  if (idx.defaultComponent === undefined && n.kind === 'component')
@@ -134,6 +148,47 @@ function getFileExportIndex(filePath, context) {
134
148
  }
135
149
  return idx;
136
150
  }
151
+ /** The file's nodes named `name`, in `getNodesInFile` order. */
152
+ function nodesInFileNamed(filePath, name, context) {
153
+ return context.getNodesInFileNamed?.(filePath, name) ?? context.getNodesInFile(filePath).filter((n) => n.name === name);
154
+ }
155
+ /** The declaration `export default NAME` names in this file (see FileExportIndex.defaultBinding). */
156
+ function defaultExportBindingNode(filePath, idx, context) {
157
+ if (idx.defaultBinding === undefined) {
158
+ const bound = defaultExportBinding(filePath, context);
159
+ idx.defaultBinding =
160
+ bound === null
161
+ ? null
162
+ : (nodesInFileNamed(filePath, bound, context)
163
+ .filter((n) => DEFAULT_BINDING_KINDS.has(n.kind))
164
+ .sort((a, b) => a.startLine - b.startLine || a.startColumn - b.startColumn)[0] ?? null);
165
+ }
166
+ return idx.defaultBinding ?? undefined;
167
+ }
168
+ /** What this file exports as `name`: an exported declaration, else a local export clause's binding. */
169
+ function exportedByName(filePath, idx, name, context) {
170
+ const direct = idx.byName.get(name);
171
+ if (direct)
172
+ return direct;
173
+ if (idx.clauseAliases === undefined) {
174
+ // Bind names introduced by a local export clause to their declarations, so
175
+ // an importer asking for the renamed name gets the real symbol instead of
176
+ // falling through to the name-matcher (which cannot cross the rename).
177
+ // The declaration is the file's first node of that name, exported or not.
178
+ idx.clauseAliases = new Map();
179
+ const content = context.readFile(filePath);
180
+ if (content && content.includes('export')) {
181
+ for (const { exportedName, localName } of (0, alias_binding_1.extractLocalExportAliases)(content)) {
182
+ if (idx.byName.has(exportedName) || idx.clauseAliases.has(exportedName))
183
+ continue;
184
+ const decl = nodesInFileNamed(filePath, localName, context)[0];
185
+ if (decl)
186
+ idx.clauseAliases.set(exportedName, decl);
187
+ }
188
+ }
189
+ }
190
+ return idx.clauseAliases.get(name);
191
+ }
137
192
  /** Drop the per-context memo tables (see ReferenceResolver.clearCaches). */
138
193
  function clearImportResolverMemos(context) {
139
194
  importPathMemos.delete(context);
@@ -141,6 +196,7 @@ function clearImportResolverMemos(context) {
141
196
  fileExportIndexes.delete(context);
142
197
  luaFileBasenameIndexes.delete(context);
143
198
  cobolCopybookIndexes.delete(context);
199
+ pythonModuleFileMemos.delete(context);
144
200
  }
145
201
  function resolveImportPath(importPath, fromFile, language, context) {
146
202
  let memo = importPathMemos.get(context);
@@ -300,6 +356,19 @@ const C_CPP_STDLIB_HEADERS = new Set([
300
356
  'unordered_set', 'utility', 'valarray', 'variant', 'vector',
301
357
  'version',
302
358
  ]);
359
+ /**
360
+ * Languages whose imports are ES-module specifiers, extracted by
361
+ * `extractJSImports` and therefore classified by the same bare-specifier /
362
+ * alias / workspace rules. Svelte, Vue and Astro belong here: an SFC imports
363
+ * inside its `<script>` block (Astro: the `---` frontmatter) with exactly the
364
+ * same syntax, and leaving them out made `isExternalImport` answer "not
365
+ * external" for every npm specifier in an SFC.
366
+ */
367
+ const ESM_IMPORT_LANGUAGES = new Set([
368
+ 'typescript', 'tsx', 'javascript', 'jsx', 'arkts', 'svelte', 'vue', 'astro',
369
+ ]);
370
+ /** Rust path roots that always name a standard-library crate. */
371
+ const RUST_STDLIB_ROOTS = new Set(['std', 'core', 'alloc', 'proc_macro']);
303
372
  /**
304
373
  * Check if an import is external (npm package, etc.)
305
374
  *
@@ -322,7 +391,7 @@ function isExternalImport(importPath, language, context) {
322
391
  return false;
323
392
  }
324
393
  // Common external patterns
325
- if (language === 'typescript' || language === 'javascript' || language === 'tsx' || language === 'jsx' || language === 'arkts') {
394
+ if (ESM_IMPORT_LANGUAGES.has(language)) {
326
395
  // Node built-ins
327
396
  if (['fs', 'path', 'os', 'crypto', 'http', 'https', 'url', 'util', 'events', 'stream', 'child_process', 'buffer'].includes(importPath)) {
328
397
  return true;
@@ -420,8 +489,44 @@ function resolveRelativeImport(importPath, fromDir, language, context) {
420
489
  if (context.fileExists(relativePath)) {
421
490
  return relativePath;
422
491
  }
492
+ return findSourceForEmittedSpecifier(relativePath, language, context);
493
+ }
494
+ /**
495
+ * TypeScript under `moduleResolution: node16 | nodenext | bundler` writes the
496
+ * EMITTED extension in the specifier (`import x from './util.js'` for
497
+ * `util.ts`, `.mjs` for `.mts`, `.cjs` for `.cts`), and the source file with that
498
+ * exact name never exists in the repo. Without this remap the import resolver
499
+ * returned null for every such import, so each imported name fell through to
500
+ * bare-name matching: a method wrapping the same-named helper it imports
501
+ * (`renderDockStyles() { return renderDockStyles() }`) resolved to ITSELF, and
502
+ * any repo-wide same-named symbol could win the cross-module edge.
503
+ */
504
+ const EMITTED_TO_SOURCE_EXTENSIONS = [
505
+ [/\.js$/, ['.ts', '.tsx', '.d.ts']],
506
+ [/\.jsx$/, ['.tsx']],
507
+ [/\.mjs$/, ['.mts', '.d.mts']],
508
+ [/\.cjs$/, ['.cts', '.d.cts']],
509
+ ];
510
+ function findSourceForEmittedSpecifier(relativePath, language, context) {
511
+ if (!EMITTED_SPECIFIER_LANGUAGES.has(language))
512
+ return null;
513
+ for (const [emitted, sources] of EMITTED_TO_SOURCE_EXTENSIONS) {
514
+ if (!emitted.test(relativePath))
515
+ continue;
516
+ const stem = relativePath.replace(emitted, '');
517
+ for (const ext of sources) {
518
+ const candidate = stem + ext;
519
+ if (context.fileExists(candidate))
520
+ return candidate;
521
+ }
522
+ return null;
523
+ }
423
524
  return null;
424
525
  }
526
+ /** Languages whose import specifiers can name the emitted `.js` of a `.ts` source. */
527
+ const EMITTED_SPECIFIER_LANGUAGES = new Set([
528
+ 'typescript', 'tsx', 'javascript', 'jsx', 'vue', 'svelte', 'astro', 'arkts',
529
+ ]);
425
530
  /**
426
531
  * Resolve an aliased/absolute import.
427
532
  *
@@ -443,7 +548,7 @@ function resolveAliasedImport(importPath, projectRoot, language, context) {
443
548
  }
444
549
  if (context.fileExists(basePath))
445
550
  return basePath;
446
- return null;
551
+ return findSourceForEmittedSpecifier(basePath, language, context);
447
552
  };
448
553
  // 1. Project tsconfig/jsconfig paths.
449
554
  const aliasMap = context.getProjectAliases?.();
@@ -1256,6 +1361,47 @@ function pickClosestJvmCandidate(candidates, fromPath) {
1256
1361
  }
1257
1362
  return best;
1258
1363
  }
1364
+ /**
1365
+ * PHP scoped calls are encoded as "Alias.method" by both extractors. A use
1366
+ * mapping names a namespace, not a filesystem path, so resolve the receiver
1367
+ * through its localName and look up the method on that exact imported type.
1368
+ * undefined means this is not an imported static call; null means the import
1369
+ * owns the call but its method is unavailable, so name fallbacks must not guess.
1370
+ */
1371
+ function resolvePhpImportedStaticCall(ref, context) {
1372
+ if (ref.language !== 'php' || ref.referenceKind !== 'calls')
1373
+ return undefined;
1374
+ const call = /^(\w+)\.(\w+)$/.exec(ref.referenceName);
1375
+ if (!call)
1376
+ return undefined;
1377
+ const [, receiver, member] = call;
1378
+ const imp = context.getImportMappings(ref.filePath, ref.language)
1379
+ .find((i) => i.localName === receiver);
1380
+ if (!imp)
1381
+ return undefined;
1382
+ // PHP variables occupy a different namespace from class imports. Extraction
1383
+ // strips the leading "$" from "$Alias->method()" too; leave that receiver to
1384
+ // local type inference even when a class import has the same local name.
1385
+ const lines = context.getFileLines?.(ref.filePath) ?? context.readFile(ref.filePath)?.split('\n');
1386
+ const line = lines?.[ref.line - 1];
1387
+ if (line?.slice(ref.column).startsWith('$'))
1388
+ return undefined;
1389
+ const fqn = imp.source.replace(/^\\/, '');
1390
+ const separator = fqn.lastIndexOf('\\');
1391
+ const typeName = separator < 0
1392
+ ? fqn
1393
+ : `${fqn.slice(0, separator)}::${fqn.slice(separator + 1)}`;
1394
+ const owners = context.getNodesByQualifiedName(typeName)
1395
+ .filter((n) => n.language === 'php' && STATIC_MEMBER_CONTAINERS.has(n.kind));
1396
+ if (owners.length !== 1)
1397
+ return null;
1398
+ const owner = owners[0];
1399
+ const methods = context.getNodesByQualifiedName(`${owner.qualifiedName}::${member}`)
1400
+ .filter((n) => n.language === 'php' && n.kind === 'method' && n.filePath === owner.filePath);
1401
+ if (methods.length !== 1)
1402
+ return null;
1403
+ return { original: ref, targetNodeId: methods[0].id, confidence: 0.95, resolvedBy: 'import' };
1404
+ }
1259
1405
  function resolveViaImport(ref, context) {
1260
1406
  // C/C++ #include references — resolve directly to the included file
1261
1407
  // (file→file edge), bypassing symbol lookup. The extractor emits these
@@ -1450,13 +1596,21 @@ function resolveViaImport(ref, context) {
1450
1596
  for (const imp of imports) {
1451
1597
  if (imp.localName === ref.referenceName || ref.referenceName.startsWith(imp.localName + '.')) {
1452
1598
  // Resolve the import path
1453
- const resolvedPath = resolveImportPath(imp.source, ref.filePath, ref.language, context);
1599
+ let resolvedPath = resolveImportPath(imp.source, ref.filePath, ref.language, context);
1600
+ // Named Python imports need the same absolute-module lookup as namespace
1601
+ // imports, including aliases used as receiver types (#1820).
1602
+ if (!resolvedPath && ref.language === 'python') {
1603
+ resolvedPath = findPythonModuleFile(imp.source, context, ref.filePath)?.filePath ?? null;
1604
+ }
1454
1605
  if (resolvedPath) {
1455
1606
  const exportedName = imp.isDefault ? 'default' : imp.exportedName;
1456
1607
  const memberName = imp.isNamespace
1457
1608
  ? ref.referenceName.replace(imp.localName + '.', '')
1458
1609
  : null;
1459
- const targetNode = findExportedSymbol(resolvedPath, { isDefault: imp.isDefault, isNamespace: imp.isNamespace, exportedName, memberName }, ref.language, context, new Set());
1610
+ const targetNode = findExportedSymbol(resolvedPath, { isDefault: imp.isDefault, isNamespace: imp.isNamespace, exportedName, memberName }, ref.language, context, new Set()) ?? (ref.language === 'python'
1611
+ ? context.getNodesInFile(resolvedPath).find(n => n.name === (memberName ?? exportedName) && !n.qualifiedName.includes('::') &&
1612
+ (n.kind === 'class' || n.kind === 'function' || n.kind === 'variable' || n.kind === 'constant'))
1613
+ : undefined);
1460
1614
  if (targetNode) {
1461
1615
  // `Foo.bar()` / `Foo.CONST` — a NAMED (non-namespace) class import
1462
1616
  // accessed through a member. `findExportedSymbol` resolved `Foo` to
@@ -1475,6 +1629,24 @@ function resolveViaImport(ref, context) {
1475
1629
  resolvedBy: 'import',
1476
1630
  };
1477
1631
  }
1632
+ // An imported object literal used as a namespace (#1573):
1633
+ // `api.call()` after `import { api } from './api'` where `api` is
1634
+ // `export const api = { call() {…} }`. Its members have bare
1635
+ // qualified names inside the constant's extent, so the
1636
+ // `Container::member` lookup above can't see them and the edge
1637
+ // landed on the constant — every cross-file caller of the method
1638
+ // went missing. Resolve the member by containment instead.
1639
+ if (targetNode.kind === 'constant' || targetNode.kind === 'variable') {
1640
+ const member = ref.referenceName.slice(imp.localName.length + 1).split('.')[0];
1641
+ if (member) {
1642
+ const literalMember = (0, name_matcher_1.resolveObjectLiteralMember)(targetNode, member, ref, context, 0.9, 'import');
1643
+ if (literalMember)
1644
+ return literalMember;
1645
+ const aliasMember = resolveObjectLiteralAlias(targetNode, member, ref, context);
1646
+ if (aliasMember)
1647
+ return aliasMember;
1648
+ }
1649
+ }
1478
1650
  // An imported VALUE (singleton constant / shared instance) called
1479
1651
  // through a member: `reproStore.notifyJoinGuildStatus()` after
1480
1652
  // `import { reproStore } from './store'`. findExportedSymbol
@@ -1488,6 +1660,13 @@ function resolveViaImport(ref, context) {
1488
1660
  const instanceMember = resolveImportedInstanceMember(targetNode, ref, imp.localName, context);
1489
1661
  if (instanceMember)
1490
1662
  return instanceMember;
1663
+ // Finding a named Python import proves the receiver exists, not
1664
+ // its requested attribute. In particular, task.delay() enqueues
1665
+ // work; it does not call the imported task function directly.
1666
+ // Keep unknown members unresolved (including callback values)
1667
+ // instead of falling back to the receiver as their target.
1668
+ if (ref.language === 'python')
1669
+ return null;
1491
1670
  }
1492
1671
  return {
1493
1672
  original: ref,
@@ -1603,11 +1782,19 @@ function resolvePythonModuleMember(ref, imports, context) {
1603
1782
  // `import mod` / `import numpy as np` bind the module at `source` itself;
1604
1783
  // `from . import certs` / `from pkg import mod` bind a SUBMODULE whose
1605
1784
  // dotted path is the source joined with the imported name.
1785
+ //
1786
+ // Join with the EXPORTED name, not the local one: under
1787
+ // `from pkg import mod as alias` the receiver is `alias` but the module on
1788
+ // disk is `pkg.mod`, and building `pkg.alias` looked for a file that does
1789
+ // not exist — so the aliased form dropped its `calls` edge while the plain
1790
+ // form (where the two names coincide) worked (#1626). For an unaliased
1791
+ // import the two are identical, so this changes nothing there.
1792
+ const moduleName = imp.exportedName === '*' ? imp.localName : imp.exportedName;
1606
1793
  const modulePath = imp.isNamespace
1607
1794
  ? imp.source
1608
1795
  : imp.source.endsWith('.')
1609
- ? imp.source + imp.localName
1610
- : imp.source + '.' + imp.localName;
1796
+ ? imp.source + moduleName
1797
+ : imp.source + '.' + moduleName;
1611
1798
  // resolveImportPath only maps RELATIVE dotted paths (`.mod`, `..pkg.mod`); an
1612
1799
  // ABSOLUTE package path (`pkg.module` from `from pkg import module`, or a bare
1613
1800
  // `import pkg.mod`) resolves to null there, so fall back to the dotted-module
@@ -1696,6 +1883,30 @@ function resolveLuaRequire(ref, context) {
1696
1883
  }
1697
1884
  return null;
1698
1885
  }
1886
+ /**
1887
+ * `UploadApi.uploadARCapture()` where `UploadApi` is a NAMESPACE OBJECT — the
1888
+ * default-export façade most React Native API layers are written as:
1889
+ *
1890
+ * import { uploadARCapture } from './frames'
1891
+ * const UploadApi = { uploadARCapture, createFolder }
1892
+ * export default UploadApi
1893
+ *
1894
+ * The member is a shorthand (or `key: ident`) property whose value is a
1895
+ * binding of the object's file, not a function defined inside the literal,
1896
+ * so containment (`resolveObjectLiteralMember`) finds nothing and the call
1897
+ * landed on the constant — every cross-file caller of the API function went
1898
+ * missing. Read the literal's source, take the binding the member names, and
1899
+ * resolve it where the object's file would: a symbol declared there, else
1900
+ * through its own imports. Calls accept callable targets only.
1901
+ */
1902
+ function resolveObjectLiteralAlias(container, member, ref, context) {
1903
+ if (container.kind !== 'constant' && container.kind !== 'variable')
1904
+ return null;
1905
+ if (!JS_FAMILY_FILE.test(container.filePath))
1906
+ return null;
1907
+ const resolved = (0, name_matcher_1.resolveObjectLiteralBinding)(container, member, ref, context);
1908
+ return resolved ? { ...resolved, confidence: 0.9, resolvedBy: 'import' } : null;
1909
+ }
1699
1910
  function resolveModuleImportToFile(ref, imports, context) {
1700
1911
  if (ref.referenceKind !== 'imports')
1701
1912
  return null;
@@ -1717,9 +1928,12 @@ function resolveModuleImportToFile(ref, imports, context) {
1717
1928
  }
1718
1929
  else if (ref.language === 'python') {
1719
1930
  // `from . import certs` — the imported NAME is a submodule of the source.
1931
+ // As in resolvePythonModuleMember, use the exported name so an alias
1932
+ // still links to the real module file (#1626).
1933
+ const moduleName = imp.exportedName === '*' ? imp.localName : imp.exportedName;
1720
1934
  modulePath = imp.source.endsWith('.')
1721
- ? imp.source + imp.localName
1722
- : imp.source + '.' + imp.localName;
1935
+ ? imp.source + moduleName
1936
+ : imp.source + '.' + moduleName;
1723
1937
  }
1724
1938
  else {
1725
1939
  // A named TS/JS import binds a symbol, not a module — leave it alone.
@@ -1753,21 +1967,42 @@ function resolveModuleImportToFile(ref, imports, context) {
1753
1967
  * no edge. Shared by absolute `import a.b.c` and absolute `from a.b import c`
1754
1968
  * (where `c` is a submodule) resolution.
1755
1969
  */
1970
+ /**
1971
+ * Per-context memo for findPythonModuleFile: module path → the `<mod>.py` and
1972
+ * `<mod>/__init__.py` file nodes whose path ends with it, in name-lookup
1973
+ * order. Only the importing file's own path is excluded per call, so taking
1974
+ * the first survivor returns the node the unmemoized scan found. Without it,
1975
+ * every ref naming a module outside the project (`from unittest import mock`)
1976
+ * rescanned every `__init__.py` in the tree. Same stable window as the name
1977
+ * caches; dropped by clearImportResolverMemos.
1978
+ */
1979
+ const pythonModuleFileMemos = new WeakMap();
1756
1980
  function findPythonModuleFile(mod, context, excludeFilePath) {
1757
1981
  if (!mod || mod.startsWith('.'))
1758
1982
  return null; // relative imports handled elsewhere
1759
- const rel = mod.replace(/\./g, '/');
1760
- const lastSeg = mod.split('.').pop();
1761
- const endsWith = (p, want) => p === want || p.endsWith('/' + want);
1762
- const moduleFile = context
1763
- .getNodesByName(`${lastSeg}.py`)
1764
- .find((n) => n.kind === 'file' && n.filePath !== excludeFilePath && endsWith(n.filePath, `${rel}.py`));
1765
- if (moduleFile)
1766
- return moduleFile;
1767
- const pkgFile = context
1768
- .getNodesByName('__init__.py')
1769
- .find((n) => n.kind === 'file' && n.filePath !== excludeFilePath && endsWith(n.filePath, `${rel}/__init__.py`));
1770
- return pkgFile ?? null;
1983
+ let memo = pythonModuleFileMemos.get(context);
1984
+ if (!memo) {
1985
+ memo = new Map();
1986
+ pythonModuleFileMemos.set(context, memo);
1987
+ }
1988
+ let files = memo.get(mod);
1989
+ if (!files) {
1990
+ const rel = mod.replace(/\./g, '/');
1991
+ const lastSeg = mod.split('.').pop();
1992
+ const endsWith = (p, want) => p === want || p.endsWith('/' + want);
1993
+ files = {
1994
+ module: context
1995
+ .getNodesByName(`${lastSeg}.py`)
1996
+ .filter((n) => n.kind === 'file' && endsWith(n.filePath, `${rel}.py`)),
1997
+ pkg: context
1998
+ .getNodesByName('__init__.py')
1999
+ .filter((n) => n.kind === 'file' && endsWith(n.filePath, `${rel}/__init__.py`)),
2000
+ };
2001
+ memo.set(mod, files);
2002
+ }
2003
+ return (files.module.find((n) => n.filePath !== excludeFilePath) ??
2004
+ files.pkg.find((n) => n.filePath !== excludeFilePath) ??
2005
+ null);
1771
2006
  }
1772
2007
  /**
1773
2008
  * Resolve a Python ABSOLUTE dotted module import (`import a.b.c`) to its file —
@@ -1807,6 +2042,7 @@ function resolveRustPathReference(ref, context) {
1807
2042
  const target = context.getNodesInFile(file).find((n) => n.name === leaf &&
1808
2043
  (n.kind === 'function' ||
1809
2044
  n.kind === 'struct' ||
2045
+ n.kind === 'union' ||
1810
2046
  n.kind === 'enum' ||
1811
2047
  n.kind === 'trait' ||
1812
2048
  n.kind === 'type_alias' ||
@@ -2079,17 +2315,19 @@ function findExportedSymbolWalk(filePath, want, language, context, visited, dept
2079
2315
  // `.ts`/`.tsx` `export default fn`/`class` case. Without the component
2080
2316
  // branch, an `export { default as X } from './X.svelte'` barrel never
2081
2317
  // resolves and the component shows a false 0 callers (#629).
2082
- const direct = exportIndex.defaultComponent ?? exportIndex.defaultFnClass;
2318
+ // A component file IS its default export; otherwise the statement that
2319
+ // names the binding beats the first-exported-function guess.
2320
+ const direct = exportIndex.defaultComponent ?? defaultExportBindingNode(filePath, exportIndex, context) ?? exportIndex.defaultFnClass;
2083
2321
  if (direct)
2084
2322
  return direct;
2085
2323
  }
2086
2324
  else if (want.isNamespace && want.memberName) {
2087
- const direct = exportIndex.byName.get(want.memberName);
2325
+ const direct = exportedByName(filePath, exportIndex, want.memberName, context);
2088
2326
  if (direct)
2089
2327
  return direct;
2090
2328
  }
2091
2329
  else {
2092
- const direct = exportIndex.byName.get(want.exportedName);
2330
+ const direct = exportedByName(filePath, exportIndex, want.exportedName, context);
2093
2331
  if (direct)
2094
2332
  return direct;
2095
2333
  }
@@ -2132,7 +2370,7 @@ function findExportedSymbolWalk(filePath, want, language, context, visited, dept
2132
2370
  }
2133
2371
  /** Node kinds that own static members reachable as `Container.member`. */
2134
2372
  const STATIC_MEMBER_CONTAINERS = new Set([
2135
- 'class', 'struct', 'interface', 'enum', 'trait', 'protocol',
2373
+ 'class', 'struct', 'union', 'interface', 'enum', 'trait', 'protocol',
2136
2374
  ]);
2137
2375
  /**
2138
2376
  * Resolve `Container.member` — a static method/property access on a NAMED class
@@ -2209,4 +2447,132 @@ function resolveStaticMember(container, ref, localName, context) {
2209
2447
  }
2210
2448
  return candidates[0];
2211
2449
  }
2450
+ /**
2451
+ * Rust `use` declarations, flattened to `localName → full path`.
2452
+ *
2453
+ * Rust is the one supported language with NO `ImportMapping` extraction (see
2454
+ * `extractImportMappings`), so this is the only channel that can tell whether
2455
+ * a bare type name in a Rust file was brought in by a `use`. Handles nested
2456
+ * groups (`use a::{b::C, d as E}`), globs (skipped — they bind no single
2457
+ * name), and `as` aliases.
2458
+ */
2459
+ function collectRustUseBindings(content) {
2460
+ const out = new Map();
2461
+ // Expand one level of `{...}` at a time so `a::{b::{C, D}, E}` flattens.
2462
+ const expand = (spec) => {
2463
+ const open = spec.indexOf('{');
2464
+ if (open === -1)
2465
+ return [spec.trim()];
2466
+ const prefix = spec.slice(0, open);
2467
+ let depth = 0;
2468
+ let close = -1;
2469
+ for (let i = open; i < spec.length; i++) {
2470
+ if (spec[i] === '{')
2471
+ depth++;
2472
+ else if (spec[i] === '}') {
2473
+ depth--;
2474
+ if (depth === 0) {
2475
+ close = i;
2476
+ break;
2477
+ }
2478
+ }
2479
+ }
2480
+ if (close === -1)
2481
+ return [];
2482
+ const suffix = spec.slice(close + 1);
2483
+ const inner = spec.slice(open + 1, close);
2484
+ const parts = [];
2485
+ let depth2 = 0;
2486
+ let start = 0;
2487
+ for (let i = 0; i <= inner.length; i++) {
2488
+ const ch = inner[i];
2489
+ if (ch === '{')
2490
+ depth2++;
2491
+ else if (ch === '}')
2492
+ depth2--;
2493
+ if (i === inner.length || (ch === ',' && depth2 === 0)) {
2494
+ const seg = inner.slice(start, i).trim();
2495
+ if (seg)
2496
+ parts.push(seg);
2497
+ start = i + 1;
2498
+ }
2499
+ }
2500
+ return parts.flatMap((p) => expand(prefix + p + suffix));
2501
+ };
2502
+ // `use` items end at the first `;`. Attributes/visibility (`pub use`) are
2503
+ // irrelevant to the binding itself.
2504
+ const useRe = /(^|\n)\s*(?:pub(?:\([^)]*\))?\s+)?use\s+([^;]+);/g;
2505
+ let m;
2506
+ while ((m = useRe.exec(content)) !== null) {
2507
+ for (const spec of expand(m[2].replace(/\s+/g, ' '))) {
2508
+ const aliasMatch = /^(.*?)\s+as\s+([A-Za-z_]\w*)$/.exec(spec);
2509
+ const rawPath = (aliasMatch ? aliasMatch[1] : spec).trim();
2510
+ if (!rawPath || rawPath.endsWith('*'))
2511
+ continue;
2512
+ const segments = rawPath.split('::').map((s) => s.trim()).filter(Boolean);
2513
+ const leaf = segments[segments.length - 1];
2514
+ if (!leaf)
2515
+ continue;
2516
+ const local = aliasMatch ? aliasMatch[2] : leaf;
2517
+ out.set(local, segments.join('::'));
2518
+ }
2519
+ }
2520
+ return out;
2521
+ }
2522
+ /**
2523
+ * Is `name`, as used in `ref`'s file, bound by an import whose module lives
2524
+ * OUTSIDE the repository?
2525
+ *
2526
+ * When it is, no in-repo node can be the referent: the symbol is defined in a
2527
+ * third-party crate/package, and any same-named local symbol the name-matcher
2528
+ * finds is a coincidence. Rust `use std::error::Error;` + `impl Error for
2529
+ * MapperError {}` bound to a local `MapperError::Error` variant, and once
2530
+ * non-type kinds were filtered out it simply moved to an unrelated local
2531
+ * `type Error` alias — restricting kinds alone RELOCATES the false edge
2532
+ * instead of removing it, so locality has to be checked too.
2533
+ *
2534
+ * Answers only when it can be CERTAIN, because a false "yes" deletes a real
2535
+ * edge. Two languages qualify, each with an oracle that cannot be wrong:
2536
+ *
2537
+ * - **Rust** — the `use` path is rooted at a standard-library crate
2538
+ * (`std`/`core`/`alloc`/`proc_macro`), which by definition ships outside
2539
+ * any repository. Deliberately NOT generalized to "the module path doesn't
2540
+ * resolve to a file": a crate can re-export another workspace crate's
2541
+ * modules (`pub use pupil_core::{ports, domain};`), so `crate::ports::X`
2542
+ * has no `src/ports/` directory to walk yet is entirely in-repo — that
2543
+ * generalization measured 13 real trait implementations deleted.
2544
+ * - **ES modules** — `isExternalImport`, which already accounts for tsconfig
2545
+ * path aliases and monorepo workspace packages.
2546
+ *
2547
+ * Everything else returns false and resolves exactly as before. JVM and Python
2548
+ * imports notably do NOT go through `resolveImportPath` (they have dedicated
2549
+ * FQN/module matchers), so there is no trustworthy oracle to consult here.
2550
+ */
2551
+ function isBoundToOutOfRepoImport(ref, context) {
2552
+ const name = ref.referenceName;
2553
+ if (name.includes('::') || name.includes('.'))
2554
+ return false; // qualified refs resolve by path
2555
+ if (ref.language === 'rust') {
2556
+ const content = context.readFile(ref.filePath);
2557
+ if (!content)
2558
+ return false;
2559
+ const usePath = collectRustUseBindings(content).get(name);
2560
+ if (!usePath)
2561
+ return false;
2562
+ const segments = usePath.split('::');
2563
+ if (segments.length < 2 || !RUST_STDLIB_ROOTS.has(segments[0]))
2564
+ return false;
2565
+ // 2015-edition crate-relative paths can shadow a stdlib root with a local
2566
+ // module of the same name — if the path walks to a real file, it's local.
2567
+ return resolveRustModuleFile(segments.slice(0, -1), ref.filePath, context) === null;
2568
+ }
2569
+ if (!ESM_IMPORT_LANGUAGES.has(ref.language))
2570
+ return false;
2571
+ for (const imp of context.getImportMappings(ref.filePath, ref.language)) {
2572
+ if (imp.localName !== name)
2573
+ continue;
2574
+ return isExternalImport(imp.source, ref.language, context);
2575
+ }
2576
+ return false;
2577
+ }
2212
2578
  //# sourceMappingURL=import-resolver.js.map