cotx-engine 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/LICENSE +94 -0
  2. package/README.md +103 -0
  3. package/dist/commands/compile.d.ts +3 -0
  4. package/dist/commands/compile.js +93 -0
  5. package/dist/commands/compile.js.map +1 -0
  6. package/dist/commands/context.d.ts +1 -0
  7. package/dist/commands/context.js +98 -0
  8. package/dist/commands/context.js.map +1 -0
  9. package/dist/commands/diff.d.ts +19 -0
  10. package/dist/commands/diff.js +127 -0
  11. package/dist/commands/diff.js.map +1 -0
  12. package/dist/commands/impact.d.ts +3 -0
  13. package/dist/commands/impact.js +91 -0
  14. package/dist/commands/impact.js.map +1 -0
  15. package/dist/commands/init.d.ts +1 -0
  16. package/dist/commands/init.js +13 -0
  17. package/dist/commands/init.js.map +1 -0
  18. package/dist/commands/lint.d.ts +13 -0
  19. package/dist/commands/lint.js +290 -0
  20. package/dist/commands/lint.js.map +1 -0
  21. package/dist/commands/map.d.ts +6 -0
  22. package/dist/commands/map.js +409 -0
  23. package/dist/commands/map.js.map +1 -0
  24. package/dist/commands/migrate.d.ts +16 -0
  25. package/dist/commands/migrate.js +150 -0
  26. package/dist/commands/migrate.js.map +1 -0
  27. package/dist/commands/query.d.ts +3 -0
  28. package/dist/commands/query.js +47 -0
  29. package/dist/commands/query.js.map +1 -0
  30. package/dist/commands/rename.d.ts +5 -0
  31. package/dist/commands/rename.js +163 -0
  32. package/dist/commands/rename.js.map +1 -0
  33. package/dist/commands/snapshot.d.ts +6 -0
  34. package/dist/commands/snapshot.js +48 -0
  35. package/dist/commands/snapshot.js.map +1 -0
  36. package/dist/commands/status.d.ts +1 -0
  37. package/dist/commands/status.js +72 -0
  38. package/dist/commands/status.js.map +1 -0
  39. package/dist/commands/update.d.ts +8 -0
  40. package/dist/commands/update.js +163 -0
  41. package/dist/commands/update.js.map +1 -0
  42. package/dist/commands/write.d.ts +6 -0
  43. package/dist/commands/write.js +221 -0
  44. package/dist/commands/write.js.map +1 -0
  45. package/dist/compiler/auto-describe.d.ts +13 -0
  46. package/dist/compiler/auto-describe.js +91 -0
  47. package/dist/compiler/auto-describe.js.map +1 -0
  48. package/dist/compiler/concept-compiler.d.ts +21 -0
  49. package/dist/compiler/concept-compiler.js +125 -0
  50. package/dist/compiler/concept-compiler.js.map +1 -0
  51. package/dist/compiler/contract-compiler.d.ts +16 -0
  52. package/dist/compiler/contract-compiler.js +90 -0
  53. package/dist/compiler/contract-compiler.js.map +1 -0
  54. package/dist/compiler/delta-detector.d.ts +8 -0
  55. package/dist/compiler/delta-detector.js +34 -0
  56. package/dist/compiler/delta-detector.js.map +1 -0
  57. package/dist/compiler/flow-compiler.d.ts +18 -0
  58. package/dist/compiler/flow-compiler.js +69 -0
  59. package/dist/compiler/flow-compiler.js.map +1 -0
  60. package/dist/compiler/module-compiler.d.ts +18 -0
  61. package/dist/compiler/module-compiler.js +420 -0
  62. package/dist/compiler/module-compiler.js.map +1 -0
  63. package/dist/compiler/stale-detector.d.ts +22 -0
  64. package/dist/compiler/stale-detector.js +79 -0
  65. package/dist/compiler/stale-detector.js.map +1 -0
  66. package/dist/config/ignore-service.d.ts +26 -0
  67. package/dist/config/ignore-service.js +366 -0
  68. package/dist/config/ignore-service.js.map +1 -0
  69. package/dist/core/analysis/cluster-enricher.d.ts +38 -0
  70. package/dist/core/analysis/cluster-enricher.js +169 -0
  71. package/dist/core/analysis/cluster-enricher.js.map +1 -0
  72. package/dist/core/analysis/community-processor.d.ts +39 -0
  73. package/dist/core/analysis/community-processor.js +319 -0
  74. package/dist/core/analysis/community-processor.js.map +1 -0
  75. package/dist/core/analysis/process-processor.d.ts +51 -0
  76. package/dist/core/analysis/process-processor.js +318 -0
  77. package/dist/core/analysis/process-processor.js.map +1 -0
  78. package/dist/core/bridge.d.ts +15 -0
  79. package/dist/core/bridge.js +63 -0
  80. package/dist/core/bridge.js.map +1 -0
  81. package/dist/core/export/json-exporter.d.ts +43 -0
  82. package/dist/core/export/json-exporter.js +13 -0
  83. package/dist/core/export/json-exporter.js.map +1 -0
  84. package/dist/core/graph/graph.d.ts +2 -0
  85. package/dist/core/graph/graph.js +79 -0
  86. package/dist/core/graph/graph.js.map +1 -0
  87. package/dist/core/graph/types.d.ts +25 -0
  88. package/dist/core/graph/types.js +2 -0
  89. package/dist/core/graph/types.js.map +1 -0
  90. package/dist/core/parser/ast-cache.d.ts +11 -0
  91. package/dist/core/parser/ast-cache.js +36 -0
  92. package/dist/core/parser/ast-cache.js.map +1 -0
  93. package/dist/core/parser/call-processor.d.ts +105 -0
  94. package/dist/core/parser/call-processor.js +1807 -0
  95. package/dist/core/parser/call-processor.js.map +1 -0
  96. package/dist/core/parser/call-routing.d.ts +55 -0
  97. package/dist/core/parser/call-routing.js +113 -0
  98. package/dist/core/parser/call-routing.js.map +1 -0
  99. package/dist/core/parser/call-sites/extract-language-call-site.d.ts +10 -0
  100. package/dist/core/parser/call-sites/extract-language-call-site.js +23 -0
  101. package/dist/core/parser/call-sites/extract-language-call-site.js.map +1 -0
  102. package/dist/core/parser/call-sites/java.d.ts +9 -0
  103. package/dist/core/parser/call-sites/java.js +31 -0
  104. package/dist/core/parser/call-sites/java.js.map +1 -0
  105. package/dist/core/parser/cluster-enricher.d.ts +38 -0
  106. package/dist/core/parser/cluster-enricher.js +169 -0
  107. package/dist/core/parser/cluster-enricher.js.map +1 -0
  108. package/dist/core/parser/community-processor.d.ts +39 -0
  109. package/dist/core/parser/community-processor.js +321 -0
  110. package/dist/core/parser/community-processor.js.map +1 -0
  111. package/dist/core/parser/constants.d.ts +16 -0
  112. package/dist/core/parser/constants.js +17 -0
  113. package/dist/core/parser/constants.js.map +1 -0
  114. package/dist/core/parser/entry-point-scoring.d.ts +57 -0
  115. package/dist/core/parser/entry-point-scoring.js +377 -0
  116. package/dist/core/parser/entry-point-scoring.js.map +1 -0
  117. package/dist/core/parser/export-detection.d.ts +57 -0
  118. package/dist/core/parser/export-detection.js +234 -0
  119. package/dist/core/parser/export-detection.js.map +1 -0
  120. package/dist/core/parser/field-extractor.d.ts +34 -0
  121. package/dist/core/parser/field-extractor.js +33 -0
  122. package/dist/core/parser/field-extractor.js.map +1 -0
  123. package/dist/core/parser/field-extractors/configs/c-cpp.d.ts +16 -0
  124. package/dist/core/parser/field-extractors/configs/c-cpp.js +129 -0
  125. package/dist/core/parser/field-extractors/configs/c-cpp.js.map +1 -0
  126. package/dist/core/parser/field-extractors/configs/csharp.d.ts +15 -0
  127. package/dist/core/parser/field-extractors/configs/csharp.js +129 -0
  128. package/dist/core/parser/field-extractors/configs/csharp.js.map +1 -0
  129. package/dist/core/parser/field-extractors/configs/dart.d.ts +12 -0
  130. package/dist/core/parser/field-extractors/configs/dart.js +93 -0
  131. package/dist/core/parser/field-extractors/configs/dart.js.map +1 -0
  132. package/dist/core/parser/field-extractors/configs/go.d.ts +12 -0
  133. package/dist/core/parser/field-extractors/configs/go.js +66 -0
  134. package/dist/core/parser/field-extractors/configs/go.js.map +1 -0
  135. package/dist/core/parser/field-extractors/configs/helpers.d.ts +40 -0
  136. package/dist/core/parser/field-extractors/configs/helpers.js +118 -0
  137. package/dist/core/parser/field-extractors/configs/helpers.js.map +1 -0
  138. package/dist/core/parser/field-extractors/configs/jvm.d.ts +17 -0
  139. package/dist/core/parser/field-extractors/configs/jvm.js +139 -0
  140. package/dist/core/parser/field-extractors/configs/jvm.js.map +1 -0
  141. package/dist/core/parser/field-extractors/configs/php.d.ts +12 -0
  142. package/dist/core/parser/field-extractors/configs/php.js +69 -0
  143. package/dist/core/parser/field-extractors/configs/php.js.map +1 -0
  144. package/dist/core/parser/field-extractors/configs/python.d.ts +15 -0
  145. package/dist/core/parser/field-extractors/configs/python.js +92 -0
  146. package/dist/core/parser/field-extractors/configs/python.js.map +1 -0
  147. package/dist/core/parser/field-extractors/configs/ruby.d.ts +15 -0
  148. package/dist/core/parser/field-extractors/configs/ruby.js +68 -0
  149. package/dist/core/parser/field-extractors/configs/ruby.js.map +1 -0
  150. package/dist/core/parser/field-extractors/configs/rust.d.ts +12 -0
  151. package/dist/core/parser/field-extractors/configs/rust.js +58 -0
  152. package/dist/core/parser/field-extractors/configs/rust.js.map +1 -0
  153. package/dist/core/parser/field-extractors/configs/swift.d.ts +15 -0
  154. package/dist/core/parser/field-extractors/configs/swift.js +75 -0
  155. package/dist/core/parser/field-extractors/configs/swift.js.map +1 -0
  156. package/dist/core/parser/field-extractors/configs/typescript-javascript.d.ts +14 -0
  157. package/dist/core/parser/field-extractors/configs/typescript-javascript.js +72 -0
  158. package/dist/core/parser/field-extractors/configs/typescript-javascript.js.map +1 -0
  159. package/dist/core/parser/field-extractors/generic.d.ts +61 -0
  160. package/dist/core/parser/field-extractors/generic.js +170 -0
  161. package/dist/core/parser/field-extractors/generic.js.map +1 -0
  162. package/dist/core/parser/field-extractors/typescript.d.ts +16 -0
  163. package/dist/core/parser/field-extractors/typescript.js +167 -0
  164. package/dist/core/parser/field-extractors/typescript.js.map +1 -0
  165. package/dist/core/parser/field-types.d.ts +46 -0
  166. package/dist/core/parser/field-types.js +2 -0
  167. package/dist/core/parser/field-types.js.map +1 -0
  168. package/dist/core/parser/filesystem-walker.d.ts +28 -0
  169. package/dist/core/parser/filesystem-walker.js +82 -0
  170. package/dist/core/parser/filesystem-walker.js.map +1 -0
  171. package/dist/core/parser/framework-detection.d.ts +149 -0
  172. package/dist/core/parser/framework-detection.js +782 -0
  173. package/dist/core/parser/framework-detection.js.map +1 -0
  174. package/dist/core/parser/heritage-processor.d.ts +52 -0
  175. package/dist/core/parser/heritage-processor.js +339 -0
  176. package/dist/core/parser/heritage-processor.js.map +1 -0
  177. package/dist/core/parser/import-processor.d.ts +33 -0
  178. package/dist/core/parser/import-processor.js +382 -0
  179. package/dist/core/parser/import-processor.js.map +1 -0
  180. package/dist/core/parser/import-resolvers/csharp.d.ts +19 -0
  181. package/dist/core/parser/import-resolvers/csharp.js +132 -0
  182. package/dist/core/parser/import-resolvers/csharp.js.map +1 -0
  183. package/dist/core/parser/import-resolvers/dart.d.ts +7 -0
  184. package/dist/core/parser/import-resolvers/dart.js +45 -0
  185. package/dist/core/parser/import-resolvers/dart.js.map +1 -0
  186. package/dist/core/parser/import-resolvers/go.d.ts +18 -0
  187. package/dist/core/parser/import-resolvers/go.js +62 -0
  188. package/dist/core/parser/import-resolvers/go.js.map +1 -0
  189. package/dist/core/parser/import-resolvers/jvm.d.ts +32 -0
  190. package/dist/core/parser/import-resolvers/jvm.js +160 -0
  191. package/dist/core/parser/import-resolvers/jvm.js.map +1 -0
  192. package/dist/core/parser/import-resolvers/php.d.ts +25 -0
  193. package/dist/core/parser/import-resolvers/php.js +81 -0
  194. package/dist/core/parser/import-resolvers/php.js.map +1 -0
  195. package/dist/core/parser/import-resolvers/python.d.ts +25 -0
  196. package/dist/core/parser/import-resolvers/python.js +85 -0
  197. package/dist/core/parser/import-resolvers/python.js.map +1 -0
  198. package/dist/core/parser/import-resolvers/ruby.d.ts +15 -0
  199. package/dist/core/parser/import-resolvers/ruby.js +21 -0
  200. package/dist/core/parser/import-resolvers/ruby.js.map +1 -0
  201. package/dist/core/parser/import-resolvers/rust.d.ts +18 -0
  202. package/dist/core/parser/import-resolvers/rust.js +119 -0
  203. package/dist/core/parser/import-resolvers/rust.js.map +1 -0
  204. package/dist/core/parser/import-resolvers/standard.d.ts +36 -0
  205. package/dist/core/parser/import-resolvers/standard.js +144 -0
  206. package/dist/core/parser/import-resolvers/standard.js.map +1 -0
  207. package/dist/core/parser/import-resolvers/swift.d.ts +7 -0
  208. package/dist/core/parser/import-resolvers/swift.js +25 -0
  209. package/dist/core/parser/import-resolvers/swift.js.map +1 -0
  210. package/dist/core/parser/import-resolvers/types.d.ts +44 -0
  211. package/dist/core/parser/import-resolvers/types.js +7 -0
  212. package/dist/core/parser/import-resolvers/types.js.map +1 -0
  213. package/dist/core/parser/import-resolvers/utils.d.ts +35 -0
  214. package/dist/core/parser/import-resolvers/utils.js +150 -0
  215. package/dist/core/parser/import-resolvers/utils.js.map +1 -0
  216. package/dist/core/parser/import-resolvers/vue.d.ts +8 -0
  217. package/dist/core/parser/import-resolvers/vue.js +10 -0
  218. package/dist/core/parser/import-resolvers/vue.js.map +1 -0
  219. package/dist/core/parser/language-config.d.ts +52 -0
  220. package/dist/core/parser/language-config.js +182 -0
  221. package/dist/core/parser/language-config.js.map +1 -0
  222. package/dist/core/parser/language-provider.d.ts +126 -0
  223. package/dist/core/parser/language-provider.js +25 -0
  224. package/dist/core/parser/language-provider.js.map +1 -0
  225. package/dist/core/parser/languages/c-cpp.d.ts +12 -0
  226. package/dist/core/parser/languages/c-cpp.js +312 -0
  227. package/dist/core/parser/languages/c-cpp.js.map +1 -0
  228. package/dist/core/parser/languages/csharp.d.ts +8 -0
  229. package/dist/core/parser/languages/csharp.js +127 -0
  230. package/dist/core/parser/languages/csharp.js.map +1 -0
  231. package/dist/core/parser/languages/dart.d.ts +12 -0
  232. package/dist/core/parser/languages/dart.js +91 -0
  233. package/dist/core/parser/languages/dart.js.map +1 -0
  234. package/dist/core/parser/languages/go.d.ts +11 -0
  235. package/dist/core/parser/languages/go.js +32 -0
  236. package/dist/core/parser/languages/go.js.map +1 -0
  237. package/dist/core/parser/languages/index.d.ts +38 -0
  238. package/dist/core/parser/languages/index.js +63 -0
  239. package/dist/core/parser/languages/index.js.map +1 -0
  240. package/dist/core/parser/languages/java.d.ts +9 -0
  241. package/dist/core/parser/languages/java.js +33 -0
  242. package/dist/core/parser/languages/java.js.map +1 -0
  243. package/dist/core/parser/languages/kotlin.d.ts +9 -0
  244. package/dist/core/parser/languages/kotlin.js +112 -0
  245. package/dist/core/parser/languages/kotlin.js.map +1 -0
  246. package/dist/core/parser/languages/php.d.ts +8 -0
  247. package/dist/core/parser/languages/php.js +226 -0
  248. package/dist/core/parser/languages/php.js.map +1 -0
  249. package/dist/core/parser/languages/python.d.ts +12 -0
  250. package/dist/core/parser/languages/python.js +66 -0
  251. package/dist/core/parser/languages/python.js.map +1 -0
  252. package/dist/core/parser/languages/ruby.d.ts +9 -0
  253. package/dist/core/parser/languages/ruby.js +109 -0
  254. package/dist/core/parser/languages/ruby.js.map +1 -0
  255. package/dist/core/parser/languages/rust.d.ts +12 -0
  256. package/dist/core/parser/languages/rust.js +121 -0
  257. package/dist/core/parser/languages/rust.js.map +1 -0
  258. package/dist/core/parser/languages/swift.d.ts +12 -0
  259. package/dist/core/parser/languages/swift.js +233 -0
  260. package/dist/core/parser/languages/swift.js.map +1 -0
  261. package/dist/core/parser/languages/typescript.d.ts +11 -0
  262. package/dist/core/parser/languages/typescript.js +169 -0
  263. package/dist/core/parser/languages/typescript.js.map +1 -0
  264. package/dist/core/parser/languages/vue.d.ts +13 -0
  265. package/dist/core/parser/languages/vue.js +65 -0
  266. package/dist/core/parser/languages/vue.js.map +1 -0
  267. package/dist/core/parser/markdown-processor.d.ts +17 -0
  268. package/dist/core/parser/markdown-processor.js +125 -0
  269. package/dist/core/parser/markdown-processor.js.map +1 -0
  270. package/dist/core/parser/method-extractors/configs/c-cpp.d.ts +3 -0
  271. package/dist/core/parser/method-extractors/configs/c-cpp.js +276 -0
  272. package/dist/core/parser/method-extractors/configs/c-cpp.js.map +1 -0
  273. package/dist/core/parser/method-extractors/configs/csharp.d.ts +2 -0
  274. package/dist/core/parser/method-extractors/configs/csharp.js +243 -0
  275. package/dist/core/parser/method-extractors/configs/csharp.js.map +1 -0
  276. package/dist/core/parser/method-extractors/configs/dart.d.ts +2 -0
  277. package/dist/core/parser/method-extractors/configs/dart.js +263 -0
  278. package/dist/core/parser/method-extractors/configs/dart.js.map +1 -0
  279. package/dist/core/parser/method-extractors/configs/go.d.ts +2 -0
  280. package/dist/core/parser/method-extractors/configs/go.js +120 -0
  281. package/dist/core/parser/method-extractors/configs/go.js.map +1 -0
  282. package/dist/core/parser/method-extractors/configs/jvm.d.ts +3 -0
  283. package/dist/core/parser/method-extractors/configs/jvm.js +309 -0
  284. package/dist/core/parser/method-extractors/configs/jvm.js.map +1 -0
  285. package/dist/core/parser/method-extractors/configs/php.d.ts +2 -0
  286. package/dist/core/parser/method-extractors/configs/php.js +243 -0
  287. package/dist/core/parser/method-extractors/configs/php.js.map +1 -0
  288. package/dist/core/parser/method-extractors/configs/python.d.ts +2 -0
  289. package/dist/core/parser/method-extractors/configs/python.js +219 -0
  290. package/dist/core/parser/method-extractors/configs/python.js.map +1 -0
  291. package/dist/core/parser/method-extractors/configs/ruby.d.ts +2 -0
  292. package/dist/core/parser/method-extractors/configs/ruby.js +201 -0
  293. package/dist/core/parser/method-extractors/configs/ruby.js.map +1 -0
  294. package/dist/core/parser/method-extractors/configs/rust.d.ts +2 -0
  295. package/dist/core/parser/method-extractors/configs/rust.js +120 -0
  296. package/dist/core/parser/method-extractors/configs/rust.js.map +1 -0
  297. package/dist/core/parser/method-extractors/configs/swift.d.ts +2 -0
  298. package/dist/core/parser/method-extractors/configs/swift.js +191 -0
  299. package/dist/core/parser/method-extractors/configs/swift.js.map +1 -0
  300. package/dist/core/parser/method-extractors/configs/typescript-javascript.d.ts +3 -0
  301. package/dist/core/parser/method-extractors/configs/typescript-javascript.js +231 -0
  302. package/dist/core/parser/method-extractors/configs/typescript-javascript.js.map +1 -0
  303. package/dist/core/parser/method-extractors/generic.d.ts +11 -0
  304. package/dist/core/parser/method-extractors/generic.js +162 -0
  305. package/dist/core/parser/method-extractors/generic.js.map +1 -0
  306. package/dist/core/parser/method-types.d.ts +110 -0
  307. package/dist/core/parser/method-types.js +2 -0
  308. package/dist/core/parser/method-types.js.map +1 -0
  309. package/dist/core/parser/mro-processor.d.ts +46 -0
  310. package/dist/core/parser/mro-processor.js +677 -0
  311. package/dist/core/parser/mro-processor.js.map +1 -0
  312. package/dist/core/parser/named-binding-processor.d.ts +18 -0
  313. package/dist/core/parser/named-binding-processor.js +43 -0
  314. package/dist/core/parser/named-binding-processor.js.map +1 -0
  315. package/dist/core/parser/named-bindings/csharp.d.ts +3 -0
  316. package/dist/core/parser/named-bindings/csharp.js +38 -0
  317. package/dist/core/parser/named-bindings/csharp.js.map +1 -0
  318. package/dist/core/parser/named-bindings/java.d.ts +3 -0
  319. package/dist/core/parser/named-bindings/java.js +30 -0
  320. package/dist/core/parser/named-bindings/java.js.map +1 -0
  321. package/dist/core/parser/named-bindings/kotlin.d.ts +3 -0
  322. package/dist/core/parser/named-bindings/kotlin.js +37 -0
  323. package/dist/core/parser/named-bindings/kotlin.js.map +1 -0
  324. package/dist/core/parser/named-bindings/php.d.ts +3 -0
  325. package/dist/core/parser/named-bindings/php.js +62 -0
  326. package/dist/core/parser/named-bindings/php.js.map +1 -0
  327. package/dist/core/parser/named-bindings/python.d.ts +3 -0
  328. package/dist/core/parser/named-bindings/python.js +50 -0
  329. package/dist/core/parser/named-bindings/python.js.map +1 -0
  330. package/dist/core/parser/named-bindings/rust.d.ts +3 -0
  331. package/dist/core/parser/named-bindings/rust.js +67 -0
  332. package/dist/core/parser/named-bindings/rust.js.map +1 -0
  333. package/dist/core/parser/named-bindings/types.d.ts +16 -0
  334. package/dist/core/parser/named-bindings/types.js +7 -0
  335. package/dist/core/parser/named-bindings/types.js.map +1 -0
  336. package/dist/core/parser/named-bindings/typescript.d.ts +3 -0
  337. package/dist/core/parser/named-bindings/typescript.js +59 -0
  338. package/dist/core/parser/named-bindings/typescript.js.map +1 -0
  339. package/dist/core/parser/parsing-processor.d.ts +23 -0
  340. package/dist/core/parser/parsing-processor.js +464 -0
  341. package/dist/core/parser/parsing-processor.js.map +1 -0
  342. package/dist/core/parser/pipeline.d.ts +17 -0
  343. package/dist/core/parser/pipeline.js +1405 -0
  344. package/dist/core/parser/pipeline.js.map +1 -0
  345. package/dist/core/parser/process-processor.d.ts +51 -0
  346. package/dist/core/parser/process-processor.js +318 -0
  347. package/dist/core/parser/process-processor.js.map +1 -0
  348. package/dist/core/parser/resolution-context.d.ts +58 -0
  349. package/dist/core/parser/resolution-context.js +136 -0
  350. package/dist/core/parser/resolution-context.js.map +1 -0
  351. package/dist/core/parser/route-extractors/expo.d.ts +1 -0
  352. package/dist/core/parser/route-extractors/expo.js +37 -0
  353. package/dist/core/parser/route-extractors/expo.js.map +1 -0
  354. package/dist/core/parser/route-extractors/middleware.d.ts +47 -0
  355. package/dist/core/parser/route-extractors/middleware.js +168 -0
  356. package/dist/core/parser/route-extractors/middleware.js.map +1 -0
  357. package/dist/core/parser/route-extractors/nextjs.d.ts +3 -0
  358. package/dist/core/parser/route-extractors/nextjs.js +77 -0
  359. package/dist/core/parser/route-extractors/nextjs.js.map +1 -0
  360. package/dist/core/parser/route-extractors/php.d.ts +7 -0
  361. package/dist/core/parser/route-extractors/php.js +23 -0
  362. package/dist/core/parser/route-extractors/php.js.map +1 -0
  363. package/dist/core/parser/route-extractors/response-shapes.d.ts +20 -0
  364. package/dist/core/parser/route-extractors/response-shapes.js +295 -0
  365. package/dist/core/parser/route-extractors/response-shapes.js.map +1 -0
  366. package/dist/core/parser/structure-processor.d.ts +2 -0
  367. package/dist/core/parser/structure-processor.js +37 -0
  368. package/dist/core/parser/structure-processor.js.map +1 -0
  369. package/dist/core/parser/symbol-table.d.ts +79 -0
  370. package/dist/core/parser/symbol-table.js +116 -0
  371. package/dist/core/parser/symbol-table.js.map +1 -0
  372. package/dist/core/parser/tree-sitter-queries.d.ts +16 -0
  373. package/dist/core/parser/tree-sitter-queries.js +1180 -0
  374. package/dist/core/parser/tree-sitter-queries.js.map +1 -0
  375. package/dist/core/parser/type-env.d.ts +81 -0
  376. package/dist/core/parser/type-env.js +1048 -0
  377. package/dist/core/parser/type-env.js.map +1 -0
  378. package/dist/core/parser/type-extractors/c-cpp.d.ts +7 -0
  379. package/dist/core/parser/type-extractors/c-cpp.js +533 -0
  380. package/dist/core/parser/type-extractors/c-cpp.js.map +1 -0
  381. package/dist/core/parser/type-extractors/csharp.d.ts +2 -0
  382. package/dist/core/parser/type-extractors/csharp.js +584 -0
  383. package/dist/core/parser/type-extractors/csharp.js.map +1 -0
  384. package/dist/core/parser/type-extractors/dart.d.ts +15 -0
  385. package/dist/core/parser/type-extractors/dart.js +370 -0
  386. package/dist/core/parser/type-extractors/dart.js.map +1 -0
  387. package/dist/core/parser/type-extractors/go.d.ts +2 -0
  388. package/dist/core/parser/type-extractors/go.js +514 -0
  389. package/dist/core/parser/type-extractors/go.js.map +1 -0
  390. package/dist/core/parser/type-extractors/jvm.d.ts +3 -0
  391. package/dist/core/parser/type-extractors/jvm.js +857 -0
  392. package/dist/core/parser/type-extractors/jvm.js.map +1 -0
  393. package/dist/core/parser/type-extractors/php.d.ts +2 -0
  394. package/dist/core/parser/type-extractors/php.js +535 -0
  395. package/dist/core/parser/type-extractors/php.js.map +1 -0
  396. package/dist/core/parser/type-extractors/python.d.ts +2 -0
  397. package/dist/core/parser/type-extractors/python.js +475 -0
  398. package/dist/core/parser/type-extractors/python.js.map +1 -0
  399. package/dist/core/parser/type-extractors/ruby.d.ts +2 -0
  400. package/dist/core/parser/type-extractors/ruby.js +378 -0
  401. package/dist/core/parser/type-extractors/ruby.js.map +1 -0
  402. package/dist/core/parser/type-extractors/rust.d.ts +2 -0
  403. package/dist/core/parser/type-extractors/rust.js +516 -0
  404. package/dist/core/parser/type-extractors/rust.js.map +1 -0
  405. package/dist/core/parser/type-extractors/shared.d.ts +131 -0
  406. package/dist/core/parser/type-extractors/shared.js +797 -0
  407. package/dist/core/parser/type-extractors/shared.js.map +1 -0
  408. package/dist/core/parser/type-extractors/swift.d.ts +2 -0
  409. package/dist/core/parser/type-extractors/swift.js +485 -0
  410. package/dist/core/parser/type-extractors/swift.js.map +1 -0
  411. package/dist/core/parser/type-extractors/types.d.ts +172 -0
  412. package/dist/core/parser/type-extractors/types.js +2 -0
  413. package/dist/core/parser/type-extractors/types.js.map +1 -0
  414. package/dist/core/parser/type-extractors/typescript.d.ts +2 -0
  415. package/dist/core/parser/type-extractors/typescript.js +662 -0
  416. package/dist/core/parser/type-extractors/typescript.js.map +1 -0
  417. package/dist/core/parser/utils/ast-helpers.d.ts +73 -0
  418. package/dist/core/parser/utils/ast-helpers.js +415 -0
  419. package/dist/core/parser/utils/ast-helpers.js.map +1 -0
  420. package/dist/core/parser/utils/call-analysis.d.ts +75 -0
  421. package/dist/core/parser/utils/call-analysis.js +575 -0
  422. package/dist/core/parser/utils/call-analysis.js.map +1 -0
  423. package/dist/core/parser/utils/event-loop.d.ts +5 -0
  424. package/dist/core/parser/utils/event-loop.js +6 -0
  425. package/dist/core/parser/utils/event-loop.js.map +1 -0
  426. package/dist/core/parser/utils/method-props.d.ts +8 -0
  427. package/dist/core/parser/utils/method-props.js +39 -0
  428. package/dist/core/parser/utils/method-props.js.map +1 -0
  429. package/dist/core/parser/utils/verbose.d.ts +1 -0
  430. package/dist/core/parser/utils/verbose.js +8 -0
  431. package/dist/core/parser/utils/verbose.js.map +1 -0
  432. package/dist/core/parser/vue-sfc-extractor.d.ts +44 -0
  433. package/dist/core/parser/vue-sfc-extractor.js +95 -0
  434. package/dist/core/parser/vue-sfc-extractor.js.map +1 -0
  435. package/dist/core/parser/workers/parse-worker.d.ts +171 -0
  436. package/dist/core/parser/workers/parse-worker.js +1724 -0
  437. package/dist/core/parser/workers/parse-worker.js.map +1 -0
  438. package/dist/core/parser/workers/worker-pool.d.ts +16 -0
  439. package/dist/core/parser/workers/worker-pool.js +124 -0
  440. package/dist/core/parser/workers/worker-pool.js.map +1 -0
  441. package/dist/core/shared/graph-types.d.ts +61 -0
  442. package/dist/core/shared/graph-types.js +5 -0
  443. package/dist/core/shared/graph-types.js.map +1 -0
  444. package/dist/core/shared/index.d.ts +4 -0
  445. package/dist/core/shared/index.js +4 -0
  446. package/dist/core/shared/index.js.map +1 -0
  447. package/dist/core/shared/language-detection.d.ts +22 -0
  448. package/dist/core/shared/language-detection.js +137 -0
  449. package/dist/core/shared/language-detection.js.map +1 -0
  450. package/dist/core/shared/languages.d.ts +23 -0
  451. package/dist/core/shared/languages.js +25 -0
  452. package/dist/core/shared/languages.js.map +1 -0
  453. package/dist/core/shared/pipeline.d.ts +15 -0
  454. package/dist/core/shared/pipeline.js +5 -0
  455. package/dist/core/shared/pipeline.js.map +1 -0
  456. package/dist/core/tree-sitter/parser-loader.d.ts +5 -0
  457. package/dist/core/tree-sitter/parser-loader.js +71 -0
  458. package/dist/core/tree-sitter/parser-loader.js.map +1 -0
  459. package/dist/index.d.ts +2 -0
  460. package/dist/index.js +132 -0
  461. package/dist/index.js.map +1 -0
  462. package/dist/lib/hash.d.ts +1 -0
  463. package/dist/lib/hash.js +6 -0
  464. package/dist/lib/hash.js.map +1 -0
  465. package/dist/lib/naming.d.ts +12 -0
  466. package/dist/lib/naming.js +28 -0
  467. package/dist/lib/naming.js.map +1 -0
  468. package/dist/lib/utils.d.ts +1 -0
  469. package/dist/lib/utils.js +4 -0
  470. package/dist/lib/utils.js.map +1 -0
  471. package/dist/mcp/server.d.ts +26 -0
  472. package/dist/mcp/server.js +282 -0
  473. package/dist/mcp/server.js.map +1 -0
  474. package/dist/mcp/tools.d.ts +37 -0
  475. package/dist/mcp/tools.js +650 -0
  476. package/dist/mcp/tools.js.map +1 -0
  477. package/dist/query/bm25.d.ts +19 -0
  478. package/dist/query/bm25.js +60 -0
  479. package/dist/query/bm25.js.map +1 -0
  480. package/dist/query/graph-index.d.ts +40 -0
  481. package/dist/query/graph-index.js +178 -0
  482. package/dist/query/graph-index.js.map +1 -0
  483. package/dist/store/derived-index.d.ts +4 -0
  484. package/dist/store/derived-index.js +68 -0
  485. package/dist/store/derived-index.js.map +1 -0
  486. package/dist/store/meta.d.ts +1 -0
  487. package/dist/store/meta.js +3 -0
  488. package/dist/store/meta.js.map +1 -0
  489. package/dist/store/schema.d.ts +135 -0
  490. package/dist/store/schema.js +2 -0
  491. package/dist/store/schema.js.map +1 -0
  492. package/dist/store/store.d.ts +49 -0
  493. package/dist/store/store.js +254 -0
  494. package/dist/store/store.js.map +1 -0
  495. package/dist/types/pipeline.d.ts +12 -0
  496. package/dist/types/pipeline.js +2 -0
  497. package/dist/types/pipeline.js.map +1 -0
  498. package/package.json +69 -0
  499. package/skills/cotx-enrich/SKILL.md +59 -0
  500. package/vendor/leiden/index.cjs +355 -0
  501. package/vendor/leiden/utils.cjs +392 -0
@@ -0,0 +1,797 @@
1
+ /** Empty set for containers that have no key-yielding methods */
2
+ const NO_KEYS = new Set();
3
+ /** Standard key-yielding methods across languages */
4
+ const STD_KEY_METHODS = new Set(['keys']);
5
+ const JAVA_KEY_METHODS = new Set(['keySet']);
6
+ const CSHARP_KEY_METHODS = new Set(['Keys']);
7
+ /** Standard value-yielding methods across languages */
8
+ const STD_VALUE_METHODS = new Set(['values', 'get', 'pop', 'remove']);
9
+ const CSHARP_VALUE_METHODS = new Set(['Values', 'TryGetValue']);
10
+ const SINGLE_ELEMENT_METHODS = new Set([
11
+ 'iter',
12
+ 'into_iter',
13
+ 'iterator',
14
+ 'get',
15
+ 'first',
16
+ 'last',
17
+ 'pop',
18
+ 'peek',
19
+ 'poll',
20
+ 'find',
21
+ 'filter',
22
+ 'map',
23
+ ]);
24
+ const CONTAINER_DESCRIPTORS = new Map([
25
+ // --- Map / Dict types (arity 2: key + value) ---
26
+ ['Map', { arity: 2, keyMethods: STD_KEY_METHODS, valueMethods: STD_VALUE_METHODS }],
27
+ ['WeakMap', { arity: 2, keyMethods: STD_KEY_METHODS, valueMethods: STD_VALUE_METHODS }],
28
+ ['HashMap', { arity: 2, keyMethods: STD_KEY_METHODS, valueMethods: STD_VALUE_METHODS }],
29
+ ['BTreeMap', { arity: 2, keyMethods: STD_KEY_METHODS, valueMethods: STD_VALUE_METHODS }],
30
+ ['LinkedHashMap', { arity: 2, keyMethods: JAVA_KEY_METHODS, valueMethods: STD_VALUE_METHODS }],
31
+ ['TreeMap', { arity: 2, keyMethods: JAVA_KEY_METHODS, valueMethods: STD_VALUE_METHODS }],
32
+ ['dict', { arity: 2, keyMethods: STD_KEY_METHODS, valueMethods: STD_VALUE_METHODS }],
33
+ ['Dict', { arity: 2, keyMethods: STD_KEY_METHODS, valueMethods: STD_VALUE_METHODS }],
34
+ ['Dictionary', { arity: 2, keyMethods: CSHARP_KEY_METHODS, valueMethods: CSHARP_VALUE_METHODS }],
35
+ [
36
+ 'SortedDictionary',
37
+ { arity: 2, keyMethods: CSHARP_KEY_METHODS, valueMethods: CSHARP_VALUE_METHODS },
38
+ ],
39
+ ['Record', { arity: 2, keyMethods: STD_KEY_METHODS, valueMethods: STD_VALUE_METHODS }],
40
+ ['OrderedDict', { arity: 2, keyMethods: STD_KEY_METHODS, valueMethods: STD_VALUE_METHODS }],
41
+ [
42
+ 'ConcurrentHashMap',
43
+ { arity: 2, keyMethods: JAVA_KEY_METHODS, valueMethods: STD_VALUE_METHODS },
44
+ ],
45
+ [
46
+ 'ConcurrentDictionary',
47
+ { arity: 2, keyMethods: CSHARP_KEY_METHODS, valueMethods: CSHARP_VALUE_METHODS },
48
+ ],
49
+ // --- Single-element containers (arity 1) ---
50
+ ['Array', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
51
+ ['List', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
52
+ ['ArrayList', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
53
+ ['LinkedList', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
54
+ ['Vec', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
55
+ ['VecDeque', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
56
+ ['Set', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
57
+ ['HashSet', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
58
+ ['BTreeSet', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
59
+ ['TreeSet', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
60
+ ['Queue', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
61
+ ['Deque', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
62
+ ['Stack', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
63
+ ['Sequence', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
64
+ ['Iterable', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
65
+ ['Iterator', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
66
+ ['IEnumerable', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
67
+ ['IList', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
68
+ ['ICollection', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
69
+ ['Collection', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
70
+ ['ObservableCollection', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
71
+ ['IEnumerator', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
72
+ ['SortedSet', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
73
+ ['Stream', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
74
+ ['MutableList', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
75
+ ['MutableSet', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
76
+ ['LinkedHashSet', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
77
+ ['ArrayDeque', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
78
+ ['PriorityQueue', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
79
+ ['MutableMap', { arity: 2, keyMethods: STD_KEY_METHODS, valueMethods: STD_VALUE_METHODS }],
80
+ ['list', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
81
+ ['set', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
82
+ ['tuple', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
83
+ ['frozenset', { arity: 1, keyMethods: NO_KEYS, valueMethods: SINGLE_ELEMENT_METHODS }],
84
+ ]);
85
+ /** Determine which type arg to extract based on container type name and access method.
86
+ *
87
+ * Resolution order:
88
+ * 1. If container is known and method is in keyMethods → 'first'
89
+ * 2. If container is known with arity 1 → 'last' (same as 'first' for single-arg)
90
+ * 3. If container is unknown → fall back to method name heuristic
91
+ * 4. Default: 'last' (value type)
92
+ */
93
+ export function methodToTypeArgPosition(methodName, containerTypeName) {
94
+ if (containerTypeName) {
95
+ const desc = CONTAINER_DESCRIPTORS.get(containerTypeName);
96
+ if (desc) {
97
+ // Single-element container: always 'last' (= only arg)
98
+ if (desc.arity === 1)
99
+ return 'last';
100
+ // Multi-element: check if method yields key type
101
+ if (methodName && desc.keyMethods.has(methodName))
102
+ return 'first';
103
+ // Default for multi-element: value type
104
+ return 'last';
105
+ }
106
+ }
107
+ // Fallback for unknown containers: simple method name heuristic
108
+ if (methodName && (methodName === 'keys' || methodName === 'keySet' || methodName === 'Keys')) {
109
+ return 'first';
110
+ }
111
+ return 'last';
112
+ }
113
+ /** Look up the container descriptor for a type name. Exported for heritage-chain lookups. */
114
+ export function getContainerDescriptor(typeName) {
115
+ return CONTAINER_DESCRIPTORS.get(typeName);
116
+ }
117
+ /**
118
+ * Shared 3-strategy fallback for resolving the element type of a container variable.
119
+ * Used by all for-loop extractors to resolve the loop variable's type from the iterable.
120
+ *
121
+ * Strategy 1: declarationTypeNodes — raw AST type annotation node (handles container types
122
+ * where extractSimpleTypeName returned undefined, e.g., User[], List[User])
123
+ * Strategy 2: scopeEnv string — extractElementTypeFromString on the stored type string
124
+ * Strategy 3: AST walk — language-specific upward walk to enclosing function parameters
125
+ *
126
+ * @param extractFromTypeNode Language-specific function to extract element type from AST node
127
+ * @param findParamElementType Optional language-specific AST walk to find parameter type
128
+ * @param typeArgPos Which generic type arg to extract: 'first' for keys, 'last' for values (default)
129
+ */
130
+ export function resolveIterableElementType(iterableName, node, scopeEnv, declarationTypeNodes, scope, extractFromTypeNode, findParamElementType, typeArgPos = 'last') {
131
+ // Strategy 1: declarationTypeNodes AST node (check current scope, then file scope)
132
+ const typeNode = declarationTypeNodes.get(`${scope}\0${iterableName}`) ??
133
+ (scope !== '' ? declarationTypeNodes.get(`\0${iterableName}`) : undefined);
134
+ if (typeNode) {
135
+ const t = extractFromTypeNode(typeNode, typeArgPos);
136
+ if (t)
137
+ return t;
138
+ }
139
+ // Strategy 2: scopeEnv string → extractElementTypeFromString
140
+ const iterableType = scopeEnv.get(iterableName);
141
+ if (iterableType) {
142
+ const el = extractElementTypeFromString(iterableType, typeArgPos);
143
+ if (el)
144
+ return el;
145
+ }
146
+ // Strategy 3: AST walk to function parameters
147
+ if (findParamElementType)
148
+ return findParamElementType(iterableName, node, typeArgPos);
149
+ return undefined;
150
+ }
151
+ /** Known single-arg nullable wrapper types that unwrap to their inner type
152
+ * for receiver resolution. Optional<User> → "User", Option<User> → "User".
153
+ * Only nullable wrappers — NOT containers (List, Vec) or async wrappers (Promise, Future).
154
+ * See WRAPPER_GENERICS below for the full set used in return-type inference. */
155
+ const NULLABLE_WRAPPER_TYPES = new Set([
156
+ 'Optional', // Java
157
+ 'Option', // Rust, Scala
158
+ 'Maybe', // Haskell-style, Kotlin Arrow
159
+ ]);
160
+ /**
161
+ * Extract the simple type name from a type AST node.
162
+ * Handles generic types (e.g., List<User> → List), qualified names
163
+ * (e.g., models.User → User), and nullable types (e.g., User? → User).
164
+ * Returns undefined for complex types (unions, intersections, function types).
165
+ */
166
+ export const extractSimpleTypeName = (typeNode, depth = 0) => {
167
+ if (depth > 50 || typeNode.text.length > 2048)
168
+ return undefined;
169
+ // Direct type identifier (includes Ruby 'constant' for class names)
170
+ if (typeNode.type === 'type_identifier' ||
171
+ typeNode.type === 'identifier' ||
172
+ typeNode.type === 'simple_identifier' ||
173
+ typeNode.type === 'constant') {
174
+ return typeNode.text;
175
+ }
176
+ // Qualified/scoped names: take the last segment (e.g., models.User → User, Models::User → User)
177
+ if (typeNode.type === 'scoped_identifier' ||
178
+ typeNode.type === 'qualified_identifier' ||
179
+ typeNode.type === 'scoped_type_identifier' ||
180
+ typeNode.type === 'qualified_name' ||
181
+ typeNode.type === 'qualified_type' ||
182
+ typeNode.type === 'member_expression' ||
183
+ typeNode.type === 'member_access_expression' ||
184
+ typeNode.type === 'attribute' ||
185
+ typeNode.type === 'scope_resolution' ||
186
+ typeNode.type === 'selector_expression') {
187
+ const last = typeNode.lastNamedChild;
188
+ if (last &&
189
+ (last.type === 'type_identifier' ||
190
+ last.type === 'identifier' ||
191
+ last.type === 'simple_identifier' ||
192
+ last.type === 'name' ||
193
+ last.type === 'constant' ||
194
+ last.type === 'property_identifier' ||
195
+ last.type === 'field_identifier')) {
196
+ return last.text;
197
+ }
198
+ }
199
+ // C++ template_type (e.g., vector<User>, map<string, User>): extract base name
200
+ if (typeNode.type === 'template_type') {
201
+ const base = typeNode.childForFieldName('name') ?? typeNode.firstNamedChild;
202
+ if (base)
203
+ return extractSimpleTypeName(base, depth + 1);
204
+ }
205
+ // Generic types: extract the base type (e.g., List<User> → List)
206
+ // For nullable wrappers (Optional<User>, Option<User>), unwrap to inner type.
207
+ if (typeNode.type === 'generic_type' ||
208
+ typeNode.type === 'parameterized_type' ||
209
+ typeNode.type === 'generic_name') {
210
+ const base = typeNode.childForFieldName('name') ??
211
+ typeNode.childForFieldName('type') ??
212
+ typeNode.firstNamedChild;
213
+ if (!base)
214
+ return undefined;
215
+ const baseName = extractSimpleTypeName(base, depth + 1);
216
+ // Unwrap known nullable wrappers: Optional<User> → User, Option<User> → User
217
+ if (baseName && NULLABLE_WRAPPER_TYPES.has(baseName)) {
218
+ const args = extractGenericTypeArgs(typeNode);
219
+ if (args.length >= 1)
220
+ return args[0];
221
+ }
222
+ return baseName;
223
+ }
224
+ // Nullable types (Kotlin User?, C# User?)
225
+ if (typeNode.type === 'nullable_type') {
226
+ const inner = typeNode.firstNamedChild;
227
+ if (inner)
228
+ return extractSimpleTypeName(inner, depth + 1);
229
+ }
230
+ // Nullable union types (TS/JS: User | null, User | undefined, User | null | undefined)
231
+ // Extract the single non-null/undefined type from the union.
232
+ if (typeNode.type === 'union_type') {
233
+ const nonNullTypes = [];
234
+ for (let i = 0; i < typeNode.namedChildCount; i++) {
235
+ const child = typeNode.namedChild(i);
236
+ if (!child)
237
+ continue;
238
+ // Skip null/undefined/void literal types
239
+ const text = child.text;
240
+ if (text === 'null' || text === 'undefined' || text === 'void')
241
+ continue;
242
+ nonNullTypes.push(child);
243
+ }
244
+ // Only unwrap if exactly one meaningful type remains
245
+ if (nonNullTypes.length === 1) {
246
+ return extractSimpleTypeName(nonNullTypes[0], depth + 1);
247
+ }
248
+ }
249
+ // Type annotations that wrap the actual type (TS/Python: `: Foo`, Kotlin: user_type)
250
+ if (typeNode.type === 'type_annotation' ||
251
+ typeNode.type === 'type' ||
252
+ typeNode.type === 'user_type') {
253
+ const inner = typeNode.firstNamedChild;
254
+ if (inner)
255
+ return extractSimpleTypeName(inner, depth + 1);
256
+ }
257
+ // Pointer/reference types (C++, Rust): User*, &User, &mut User
258
+ if (typeNode.type === 'pointer_type' || typeNode.type === 'reference_type') {
259
+ // Skip mutable_specifier for Rust &mut references — firstNamedChild would be
260
+ // `mutable_specifier` not the actual type. Walk named children to find the type.
261
+ for (let i = 0; i < typeNode.namedChildCount; i++) {
262
+ const child = typeNode.namedChild(i);
263
+ if (child && child.type !== 'mutable_specifier') {
264
+ return extractSimpleTypeName(child, depth + 1);
265
+ }
266
+ }
267
+ }
268
+ // Primitive/predefined types: string, int, float, bool, number, unknown, any
269
+ // PHP: primitive_type; TS/JS: predefined_type
270
+ // Java: integral_type (int/long/short/byte), floating_point_type (float/double),
271
+ // boolean_type (boolean), void_type (void)
272
+ if (typeNode.type === 'primitive_type' ||
273
+ typeNode.type === 'predefined_type' ||
274
+ typeNode.type === 'integral_type' ||
275
+ typeNode.type === 'floating_point_type' ||
276
+ typeNode.type === 'boolean_type' ||
277
+ typeNode.type === 'void_type') {
278
+ return typeNode.text;
279
+ }
280
+ // PHP named_type / optional_type
281
+ if (typeNode.type === 'named_type' || typeNode.type === 'optional_type') {
282
+ const inner = typeNode.childForFieldName('name') ?? typeNode.firstNamedChild;
283
+ if (inner)
284
+ return extractSimpleTypeName(inner, depth + 1);
285
+ }
286
+ // Name node (PHP)
287
+ if (typeNode.type === 'name') {
288
+ return typeNode.text;
289
+ }
290
+ return undefined;
291
+ };
292
+ /**
293
+ * Extract variable name from a declarator or pattern node.
294
+ * Returns the simple identifier text, or undefined for destructuring/complex patterns.
295
+ */
296
+ export const extractVarName = (node) => {
297
+ if (node.type === 'identifier' ||
298
+ node.type === 'simple_identifier' ||
299
+ node.type === 'variable_name' ||
300
+ node.type === 'name' ||
301
+ node.type === 'constant' ||
302
+ node.type === 'property_identifier') {
303
+ return node.text;
304
+ }
305
+ // variable_declarator (Java/C#): has a 'name' field
306
+ if (node.type === 'variable_declarator') {
307
+ const nameChild = node.childForFieldName('name');
308
+ if (nameChild)
309
+ return extractVarName(nameChild);
310
+ }
311
+ // Rust: let mut x = ... — mut_pattern wraps an identifier
312
+ if (node.type === 'mut_pattern') {
313
+ const inner = node.firstNamedChild;
314
+ if (inner)
315
+ return extractVarName(inner);
316
+ }
317
+ // Swift: pattern node wraps a simple_identifier
318
+ if (node.type === 'pattern') {
319
+ const inner = node.firstNamedChild;
320
+ if (inner)
321
+ return extractVarName(inner);
322
+ }
323
+ return undefined;
324
+ };
325
+ /** Node types for function/method parameters with type annotations */
326
+ export const TYPED_PARAMETER_TYPES = new Set([
327
+ 'required_parameter', // TS: (x: Foo)
328
+ 'optional_parameter', // TS: (x?: Foo)
329
+ 'formal_parameter', // Java/Kotlin
330
+ 'parameter', // C#/Rust/Go/Python/Swift
331
+ 'typed_parameter', // Python: def f(x: Foo) — distinct from 'parameter' in tree-sitter-python
332
+ 'parameter_declaration', // C/C++ void f(Type name)
333
+ 'simple_parameter', // PHP function(Foo $x)
334
+ 'property_promotion_parameter', // PHP 8.0+ constructor promotion: __construct(private Foo $x)
335
+ 'closure_parameter', // Rust: |user: User| — typed closure parameters
336
+ ]);
337
+ /**
338
+ * Extract type arguments from a generic type node.
339
+ * e.g., List<User, String> → ['User', 'String'], Vec<User> → ['User']
340
+ *
341
+ * Used by extractSimpleTypeName to unwrap nullable wrappers (Optional<User> → User).
342
+ *
343
+ * Handles language-specific AST structures:
344
+ * - TS/Java/Rust/Go: generic_type > type_arguments > type nodes
345
+ * - C#: generic_type > type_argument_list > type nodes
346
+ * - Kotlin: generic_type > type_arguments > type_projection > type nodes
347
+ *
348
+ * Note: Go slices/maps use slice_type/map_type, not generic_type — those are
349
+ * NOT handled here. Use language-specific extractors for Go container types.
350
+ *
351
+ * @param typeNode A generic_type or parameterized_type AST node (or any node —
352
+ * returns [] for non-generic types).
353
+ * @returns Array of resolved type argument names. Unresolvable arguments are omitted.
354
+ */
355
+ export const extractGenericTypeArgs = (typeNode, depth = 0) => {
356
+ if (depth > 50)
357
+ return [];
358
+ // Unwrap wrapper nodes that may sit above the generic_type
359
+ if (typeNode.type === 'type_annotation' ||
360
+ typeNode.type === 'type' ||
361
+ typeNode.type === 'user_type' ||
362
+ typeNode.type === 'nullable_type' ||
363
+ typeNode.type === 'optional_type') {
364
+ const inner = typeNode.firstNamedChild;
365
+ if (inner)
366
+ return extractGenericTypeArgs(inner, depth + 1);
367
+ return [];
368
+ }
369
+ // Only process generic/parameterized type nodes (includes C#'s generic_name)
370
+ if (typeNode.type !== 'generic_type' &&
371
+ typeNode.type !== 'parameterized_type' &&
372
+ typeNode.type !== 'generic_name') {
373
+ return [];
374
+ }
375
+ // Find the type_arguments / type_argument_list child
376
+ let argsNode = null;
377
+ for (let i = 0; i < typeNode.namedChildCount; i++) {
378
+ const child = typeNode.namedChild(i);
379
+ if (child && (child.type === 'type_arguments' || child.type === 'type_argument_list')) {
380
+ argsNode = child;
381
+ break;
382
+ }
383
+ }
384
+ if (!argsNode)
385
+ return [];
386
+ const result = [];
387
+ for (let i = 0; i < argsNode.namedChildCount; i++) {
388
+ let argNode = argsNode.namedChild(i);
389
+ if (!argNode)
390
+ continue;
391
+ // Kotlin: type_arguments > type_projection > user_type > type_identifier
392
+ if (argNode.type === 'type_projection') {
393
+ argNode = argNode.firstNamedChild;
394
+ if (!argNode)
395
+ continue;
396
+ }
397
+ const name = extractSimpleTypeName(argNode);
398
+ if (name)
399
+ result.push(name);
400
+ }
401
+ return result;
402
+ };
403
+ /**
404
+ * Match Ruby constructor assignment: `user = User.new` or `service = Models::User.new`.
405
+ * Returns { varName, calleeName } or undefined if the node is not a Ruby constructor assignment.
406
+ * Handles both simple constants and scope_resolution (namespaced) receivers.
407
+ */
408
+ export const extractRubyConstructorAssignment = (node) => {
409
+ if (node.type !== 'assignment')
410
+ return undefined;
411
+ const left = node.childForFieldName('left');
412
+ const right = node.childForFieldName('right');
413
+ if (!left || !right)
414
+ return undefined;
415
+ if (left.type !== 'identifier' && left.type !== 'constant')
416
+ return undefined;
417
+ if (right.type !== 'call')
418
+ return undefined;
419
+ const method = right.childForFieldName('method');
420
+ if (!method || method.text !== 'new')
421
+ return undefined;
422
+ const receiver = right.childForFieldName('receiver');
423
+ if (!receiver)
424
+ return undefined;
425
+ let calleeName;
426
+ if (receiver.type === 'constant') {
427
+ calleeName = receiver.text;
428
+ }
429
+ else if (receiver.type === 'scope_resolution') {
430
+ // Models::User → extract last segment "User"
431
+ const last = receiver.lastNamedChild;
432
+ if (!last || last.type !== 'constant')
433
+ return undefined;
434
+ calleeName = last.text;
435
+ }
436
+ else {
437
+ return undefined;
438
+ }
439
+ return { varName: left.text, calleeName };
440
+ };
441
+ /**
442
+ * Check if an AST node has an explicit type annotation.
443
+ * Checks both named fields ('type') and child nodes ('type_annotation').
444
+ * Used by constructor binding scanners to skip annotated declarations.
445
+ */
446
+ export const hasTypeAnnotation = (node) => {
447
+ if (node.childForFieldName('type'))
448
+ return true;
449
+ for (let i = 0; i < node.childCount; i++) {
450
+ if (node.child(i)?.type === 'type_annotation')
451
+ return true;
452
+ }
453
+ return false;
454
+ };
455
+ /** Bare nullable keywords that should not produce a receiver binding. */
456
+ const NULLABLE_KEYWORDS = new Set(['null', 'undefined', 'void', 'None', 'nil']);
457
+ /**
458
+ * Strip nullable wrappers from a type name string.
459
+ * Used by both lookupInEnv (TypeEnv annotations) and extractReturnTypeName
460
+ * (return-type text) to normalize types before receiver lookup.
461
+ *
462
+ * "User | null" → "User"
463
+ * "User | undefined" → "User"
464
+ * "User | null | undefined" → "User"
465
+ * "User?" → "User"
466
+ * "User | Repo" → undefined (genuine union — refuse)
467
+ * "null" → undefined
468
+ */
469
+ export const stripNullable = (typeName) => {
470
+ let text = typeName.trim();
471
+ if (!text)
472
+ return undefined;
473
+ if (NULLABLE_KEYWORDS.has(text))
474
+ return undefined;
475
+ // Strip nullable suffix: User? → User
476
+ if (text.endsWith('?'))
477
+ text = text.slice(0, -1).trim();
478
+ // Strip union with null/undefined/None/nil/void
479
+ if (text.includes('|')) {
480
+ const parts = text
481
+ .split('|')
482
+ .map((p) => p.trim())
483
+ .filter((p) => p !== '' && !NULLABLE_KEYWORDS.has(p));
484
+ if (parts.length === 1)
485
+ return parts[0];
486
+ return undefined; // genuine union or all-nullable — refuse
487
+ }
488
+ return text || undefined;
489
+ };
490
+ /**
491
+ * Unwrap an await_expression to get the inner value.
492
+ * Returns the node itself if not an await_expression, or null if input is null.
493
+ */
494
+ export const unwrapAwait = (node) => {
495
+ if (!node)
496
+ return null;
497
+ return node.type === 'await_expression' ? node.firstNamedChild : node;
498
+ };
499
+ /**
500
+ * Extract the callee name from a call_expression node.
501
+ * Navigates to the 'function' field (or first named child) and extracts a simple type name.
502
+ */
503
+ export const extractCalleeName = (callNode) => {
504
+ const func = callNode.childForFieldName('function') ?? callNode.firstNamedChild;
505
+ if (!func)
506
+ return undefined;
507
+ return extractSimpleTypeName(func);
508
+ };
509
+ // Internal helper: extract the first comma-separated argument from a string,
510
+ // respecting nested angle-bracket and square-bracket depth.
511
+ function extractFirstArg(args) {
512
+ let depth = 0;
513
+ for (let i = 0; i < args.length; i++) {
514
+ const ch = args[i];
515
+ if (ch === '<' || ch === '[')
516
+ depth++;
517
+ else if (ch === '>' || ch === ']')
518
+ depth--;
519
+ else if (ch === ',' && depth === 0)
520
+ return args.slice(0, i).trim();
521
+ }
522
+ return args.trim();
523
+ }
524
+ /**
525
+ * Extract element type from a container type string.
526
+ * Uses bracket-balanced parsing (no regex) for generic argument extraction.
527
+ * Returns undefined for ambiguous or unparseable strings.
528
+ *
529
+ * Handles:
530
+ * - Array<User> → User (generic angle brackets)
531
+ * - User[] → User (array suffix)
532
+ * - []User → User (Go slice prefix)
533
+ * - List[User] → User (Python subscript)
534
+ * - [User] → User (Swift array sugar)
535
+ * - vector<User> → User (C++ container)
536
+ * - Vec<User> → User (Rust container)
537
+ *
538
+ * For multi-argument generics (Map<K, V>), returns the first or last type arg
539
+ * based on `pos` ('first' for keys, 'last' for values — default 'last').
540
+ * Returns undefined when the extracted type is not a simple word.
541
+ */
542
+ export function extractElementTypeFromString(typeStr, pos = 'last') {
543
+ if (!typeStr || typeStr.length === 0 || typeStr.length > 2048)
544
+ return undefined;
545
+ // 1. Array suffix: User[] → User
546
+ if (typeStr.endsWith('[]')) {
547
+ const base = typeStr.slice(0, -2).trim();
548
+ return base && /^\w+$/.test(base) ? base : undefined;
549
+ }
550
+ // 2. Go slice prefix: []User → User
551
+ if (typeStr.startsWith('[]')) {
552
+ const element = typeStr.slice(2).trim();
553
+ return element && /^\w+$/.test(element) ? element : undefined;
554
+ }
555
+ // 3. Swift array sugar: [User] → User
556
+ // Must start with '[', end with ']', and contain no angle brackets
557
+ // (to avoid confusing with List[User] handled below).
558
+ if (typeStr.startsWith('[') && typeStr.endsWith(']') && !typeStr.includes('<')) {
559
+ const element = typeStr.slice(1, -1).trim();
560
+ return element && /^\w+$/.test(element) ? element : undefined;
561
+ }
562
+ // 4. Generic bracket-balanced extraction: Array<User> / List[User] / Vec<User>
563
+ // Find the first opening bracket (< or [) and pick the one that appears first.
564
+ const openAngle = typeStr.indexOf('<');
565
+ const openSquare = typeStr.indexOf('[');
566
+ let openIdx = -1;
567
+ let openChar = '';
568
+ let closeChar = '';
569
+ if (openAngle >= 0 && (openSquare < 0 || openAngle < openSquare)) {
570
+ openIdx = openAngle;
571
+ openChar = '<';
572
+ closeChar = '>';
573
+ }
574
+ else if (openSquare >= 0) {
575
+ openIdx = openSquare;
576
+ openChar = '[';
577
+ closeChar = ']';
578
+ }
579
+ if (openIdx < 0)
580
+ return undefined;
581
+ // Walk bracket-balanced from the character after the opening bracket to find
582
+ // the matching close bracket, tracking depth for nested brackets.
583
+ // All bracket types (<, >, [, ]) contribute to depth uniformly, but only the
584
+ // selected closeChar can match at depth 0 (prevents cross-bracket miscounting).
585
+ let depth = 0;
586
+ const start = openIdx + 1;
587
+ let lastCommaIdx = -1; // Track last top-level comma for 'last' position
588
+ for (let i = start; i < typeStr.length; i++) {
589
+ const ch = typeStr[i];
590
+ if (ch === '<' || ch === '[') {
591
+ depth++;
592
+ }
593
+ else if (ch === '>' || ch === ']') {
594
+ if (depth === 0) {
595
+ // At depth 0 — only match if it is our selected close bracket.
596
+ if (ch !== closeChar)
597
+ return undefined; // mismatched bracket = malformed
598
+ if (pos === 'last' && lastCommaIdx >= 0) {
599
+ // Return last arg (text after last comma)
600
+ const lastArg = typeStr.slice(lastCommaIdx + 1, i).trim();
601
+ return lastArg && /^\w+$/.test(lastArg) ? lastArg : undefined;
602
+ }
603
+ const inner = typeStr.slice(start, i).trim();
604
+ const firstArg = extractFirstArg(inner);
605
+ return firstArg && /^\w+$/.test(firstArg) ? firstArg : undefined;
606
+ }
607
+ depth--;
608
+ }
609
+ else if (ch === ',' && depth === 0) {
610
+ if (pos === 'first') {
611
+ // Return first arg (text before first comma)
612
+ const arg = typeStr.slice(start, i).trim();
613
+ return arg && /^\w+$/.test(arg) ? arg : undefined;
614
+ }
615
+ lastCommaIdx = i;
616
+ }
617
+ }
618
+ return undefined;
619
+ }
620
+ // ── Return type text helpers ─────────────────────────────────────────────
621
+ // extractReturnTypeName works on raw return-type text already stored in
622
+ // SymbolDefinition (e.g. "User", "Promise<User>", "User | null", "*User").
623
+ // Extracts the base user-defined type name.
624
+ /** Primitive / built-in types that should NOT produce a receiver binding. */
625
+ const PRIMITIVE_TYPES = new Set([
626
+ 'string',
627
+ 'number',
628
+ 'boolean',
629
+ 'void',
630
+ 'int',
631
+ 'float',
632
+ 'double',
633
+ 'long',
634
+ 'short',
635
+ 'byte',
636
+ 'char',
637
+ 'bool',
638
+ 'str',
639
+ 'i8',
640
+ 'i16',
641
+ 'i32',
642
+ 'i64',
643
+ 'u8',
644
+ 'u16',
645
+ 'u32',
646
+ 'u64',
647
+ 'f32',
648
+ 'f64',
649
+ 'usize',
650
+ 'isize',
651
+ 'undefined',
652
+ 'null',
653
+ 'None',
654
+ 'nil',
655
+ ]);
656
+ /**
657
+ * Extract a simple type name from raw return-type text.
658
+ * Handles common patterns:
659
+ * "User" → "User"
660
+ * "Promise<User>" → "User" (unwrap wrapper generics)
661
+ * "Option<User>" → "User"
662
+ * "Result<User, Error>" → "User" (first type arg)
663
+ * "User | null" → "User" (strip nullable union)
664
+ * "User?" → "User" (strip nullable suffix)
665
+ * "*User" → "User" (Go pointer)
666
+ * "&User" → "User" (Rust reference)
667
+ * Returns undefined for complex types or primitives.
668
+ */
669
+ const WRAPPER_GENERICS = new Set([
670
+ 'Promise',
671
+ 'Observable',
672
+ 'Future',
673
+ 'CompletableFuture',
674
+ 'Task',
675
+ 'ValueTask', // async wrappers
676
+ 'Option',
677
+ 'Some',
678
+ 'Optional',
679
+ 'Maybe', // nullable wrappers
680
+ 'Result',
681
+ 'Either', // result wrappers
682
+ // Rust smart pointers (Deref to inner type)
683
+ 'Rc',
684
+ 'Arc',
685
+ 'Weak', // pointer types
686
+ 'MutexGuard',
687
+ 'RwLockReadGuard',
688
+ 'RwLockWriteGuard', // guard types
689
+ 'Ref',
690
+ 'RefMut', // RefCell guards
691
+ 'Cow', // copy-on-write
692
+ // Containers (List, Array, Vec, Set, etc.) are intentionally excluded —
693
+ // methods are called on the container, not the element type.
694
+ // Non-wrapper generics return the base type (e.g., List) via the else branch.
695
+ ]);
696
+ /**
697
+ * Extracts the first type argument from a comma-separated generic argument string,
698
+ * respecting nested angle brackets. For example:
699
+ * "Result<User, Error>" → "Result<User, Error>" (no top-level comma)
700
+ * "User, Error" → "User"
701
+ * "Map<K, V>, string" → "Map<K, V>"
702
+ */
703
+ function extractFirstGenericArg(args) {
704
+ let depth = 0;
705
+ for (let i = 0; i < args.length; i++) {
706
+ if (args[i] === '<')
707
+ depth++;
708
+ else if (args[i] === '>')
709
+ depth--;
710
+ else if (args[i] === ',' && depth === 0)
711
+ return args.slice(0, i).trim();
712
+ }
713
+ return args.trim();
714
+ }
715
+ /**
716
+ * Extract the first non-lifetime type argument from a generic argument string.
717
+ * Skips Rust lifetime parameters (e.g., `'a`, `'_`) to find the actual type.
718
+ * "'_, User" → "User"
719
+ * "'a, User" → "User"
720
+ * "User, Error" → "User" (no lifetime — delegates to extractFirstGenericArg)
721
+ */
722
+ function extractFirstTypeArg(args) {
723
+ let remaining = args;
724
+ while (remaining) {
725
+ const first = extractFirstGenericArg(remaining);
726
+ if (!first.startsWith("'"))
727
+ return first;
728
+ // Skip past this lifetime arg + the comma separator
729
+ const commaIdx = remaining.indexOf(',', first.length);
730
+ if (commaIdx < 0)
731
+ return first; // only lifetimes — fall through
732
+ remaining = remaining.slice(commaIdx + 1).trim();
733
+ }
734
+ return args.trim();
735
+ }
736
+ const MAX_RETURN_TYPE_INPUT_LENGTH = 2048;
737
+ const MAX_RETURN_TYPE_LENGTH = 512;
738
+ export const extractReturnTypeName = (raw, depth = 0) => {
739
+ if (depth > 10)
740
+ return undefined;
741
+ if (raw.length > MAX_RETURN_TYPE_INPUT_LENGTH)
742
+ return undefined;
743
+ let text = raw.trim();
744
+ if (!text)
745
+ return undefined;
746
+ // Strip pointer/reference prefixes: *User, &User, &mut User
747
+ text = text.replace(/^[&*]+\s*(mut\s+)?/, '');
748
+ // Strip nullable suffix: User?
749
+ text = text.replace(/\?$/, '');
750
+ // Handle union types: "User | null" → "User"
751
+ if (text.includes('|')) {
752
+ const parts = text
753
+ .split('|')
754
+ .map((p) => p.trim())
755
+ .filter((p) => p !== 'null' && p !== 'undefined' && p !== 'void' && p !== 'None' && p !== 'nil');
756
+ if (parts.length === 1)
757
+ text = parts[0];
758
+ else
759
+ return undefined; // genuine union — too complex
760
+ }
761
+ // Handle generics: Promise<User> → unwrap if wrapper, else take base
762
+ const genericMatch = text.match(/^(\w+)\s*<(.+)>$/);
763
+ if (genericMatch) {
764
+ const [, base, args] = genericMatch;
765
+ if (WRAPPER_GENERICS.has(base)) {
766
+ // Take the first non-lifetime type argument, using bracket-balanced splitting
767
+ // so that nested generics like Result<User, Error> are not split at the inner
768
+ // comma. Lifetime parameters (Rust 'a, '_) are skipped.
769
+ const firstArg = extractFirstTypeArg(args);
770
+ return extractReturnTypeName(firstArg, depth + 1);
771
+ }
772
+ // Non-wrapper generic: return the base type (e.g., Map<K,V> → Map)
773
+ return PRIMITIVE_TYPES.has(base.toLowerCase()) ? undefined : base;
774
+ }
775
+ // Bare wrapper type without generic argument (e.g. Task, Promise, Option)
776
+ // should not produce a binding — these are meaningless without a type parameter
777
+ if (WRAPPER_GENERICS.has(text))
778
+ return undefined;
779
+ // Handle qualified names: models.User → User, Models::User → User, \App\Models\User → User
780
+ if (text.includes('::') || text.includes('.') || text.includes('\\')) {
781
+ text = text.split(/::|[.\\]/).pop();
782
+ }
783
+ // Final check: skip primitives
784
+ if (PRIMITIVE_TYPES.has(text) || PRIMITIVE_TYPES.has(text.toLowerCase()))
785
+ return undefined;
786
+ // Must start with uppercase (class/type convention) or be a valid identifier
787
+ if (!/^[A-Z_]\w*$/.test(text))
788
+ return undefined;
789
+ // If the final extracted type name is too long, reject it
790
+ if (text.length > MAX_RETURN_TYPE_LENGTH)
791
+ return undefined;
792
+ return text;
793
+ };
794
+ // extractPropertyDeclaredType removed — all 14 languages register a FieldExtractor
795
+ // via defineLanguage() which is the single source of truth for Property metadata
796
+ // (declaredType, visibility, isStatic, isReadonly).
797
+ //# sourceMappingURL=shared.js.map