@opensip-cli/graph-typescript 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 (344) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +31 -0
  4. package/dist/__tests__/_pipeline.d.ts +40 -0
  5. package/dist/__tests__/_pipeline.d.ts.map +1 -0
  6. package/dist/__tests__/_pipeline.js +67 -0
  7. package/dist/__tests__/_pipeline.js.map +1 -0
  8. package/dist/__tests__/acceptance/_fixture-runner.d.ts +13 -0
  9. package/dist/__tests__/acceptance/_fixture-runner.d.ts.map +1 -0
  10. package/dist/__tests__/acceptance/_fixture-runner.js +55 -0
  11. package/dist/__tests__/acceptance/_fixture-runner.js.map +1 -0
  12. package/dist/__tests__/acceptance/alias-resolution.test.d.ts +8 -0
  13. package/dist/__tests__/acceptance/alias-resolution.test.d.ts.map +1 -0
  14. package/dist/__tests__/acceptance/alias-resolution.test.js +39 -0
  15. package/dist/__tests__/acceptance/alias-resolution.test.js.map +1 -0
  16. package/dist/__tests__/acceptance/arrow-callback-resolution.test.d.ts +8 -0
  17. package/dist/__tests__/acceptance/arrow-callback-resolution.test.d.ts.map +1 -0
  18. package/dist/__tests__/acceptance/arrow-callback-resolution.test.js +33 -0
  19. package/dist/__tests__/acceptance/arrow-callback-resolution.test.js.map +1 -0
  20. package/dist/__tests__/acceptance/constructor-calls.test.d.ts +7 -0
  21. package/dist/__tests__/acceptance/constructor-calls.test.d.ts.map +1 -0
  22. package/dist/__tests__/acceptance/constructor-calls.test.js +36 -0
  23. package/dist/__tests__/acceptance/constructor-calls.test.js.map +1 -0
  24. package/dist/__tests__/acceptance/interface-dispatch.test.d.ts +8 -0
  25. package/dist/__tests__/acceptance/interface-dispatch.test.d.ts.map +1 -0
  26. package/dist/__tests__/acceptance/interface-dispatch.test.js +44 -0
  27. package/dist/__tests__/acceptance/interface-dispatch.test.js.map +1 -0
  28. package/dist/__tests__/acceptance/inventory-completeness.test.d.ts +9 -0
  29. package/dist/__tests__/acceptance/inventory-completeness.test.d.ts.map +1 -0
  30. package/dist/__tests__/acceptance/inventory-completeness.test.js +72 -0
  31. package/dist/__tests__/acceptance/inventory-completeness.test.js.map +1 -0
  32. package/dist/__tests__/acceptance/jsx-resolution.test.d.ts +7 -0
  33. package/dist/__tests__/acceptance/jsx-resolution.test.d.ts.map +1 -0
  34. package/dist/__tests__/acceptance/jsx-resolution.test.js +46 -0
  35. package/dist/__tests__/acceptance/jsx-resolution.test.js.map +1 -0
  36. package/dist/__tests__/acceptance/module-init.test.d.ts +10 -0
  37. package/dist/__tests__/acceptance/module-init.test.d.ts.map +1 -0
  38. package/dist/__tests__/acceptance/module-init.test.js +40 -0
  39. package/dist/__tests__/acceptance/module-init.test.js.map +1 -0
  40. package/dist/__tests__/acceptance/projectdir-normalization.test.d.ts +7 -0
  41. package/dist/__tests__/acceptance/projectdir-normalization.test.d.ts.map +1 -0
  42. package/dist/__tests__/acceptance/projectdir-normalization.test.js +51 -0
  43. package/dist/__tests__/acceptance/projectdir-normalization.test.js.map +1 -0
  44. package/dist/__tests__/body-twin-edges.test.d.ts +12 -0
  45. package/dist/__tests__/body-twin-edges.test.d.ts.map +1 -0
  46. package/dist/__tests__/body-twin-edges.test.js +85 -0
  47. package/dist/__tests__/body-twin-edges.test.js.map +1 -0
  48. package/dist/__tests__/cache-key.test.d.ts +8 -0
  49. package/dist/__tests__/cache-key.test.d.ts.map +1 -0
  50. package/dist/__tests__/cache-key.test.js +86 -0
  51. package/dist/__tests__/cache-key.test.js.map +1 -0
  52. package/dist/__tests__/depends-on-emission.test.d.ts +19 -0
  53. package/dist/__tests__/depends-on-emission.test.d.ts.map +1 -0
  54. package/dist/__tests__/depends-on-emission.test.js +165 -0
  55. package/dist/__tests__/depends-on-emission.test.js.map +1 -0
  56. package/dist/__tests__/discover.test.d.ts +9 -0
  57. package/dist/__tests__/discover.test.d.ts.map +1 -0
  58. package/dist/__tests__/discover.test.js +72 -0
  59. package/dist/__tests__/discover.test.js.map +1 -0
  60. package/dist/__tests__/edge-helpers/method-target.test.d.ts +8 -0
  61. package/dist/__tests__/edge-helpers/method-target.test.d.ts.map +1 -0
  62. package/dist/__tests__/edge-helpers/method-target.test.js +96 -0
  63. package/dist/__tests__/edge-helpers/method-target.test.js.map +1 -0
  64. package/dist/__tests__/edge-helpers/resolve-decl.test.d.ts +13 -0
  65. package/dist/__tests__/edge-helpers/resolve-decl.test.d.ts.map +1 -0
  66. package/dist/__tests__/edge-helpers/resolve-decl.test.js +176 -0
  67. package/dist/__tests__/edge-helpers/resolve-decl.test.js.map +1 -0
  68. package/dist/__tests__/edge-resolvers/branches.test.d.ts +11 -0
  69. package/dist/__tests__/edge-resolvers/branches.test.d.ts.map +1 -0
  70. package/dist/__tests__/edge-resolvers/branches.test.js +305 -0
  71. package/dist/__tests__/edge-resolvers/branches.test.js.map +1 -0
  72. package/dist/__tests__/edge-resolvers/contract.test.d.ts +8 -0
  73. package/dist/__tests__/edge-resolvers/contract.test.d.ts.map +1 -0
  74. package/dist/__tests__/edge-resolvers/contract.test.js +30 -0
  75. package/dist/__tests__/edge-resolvers/contract.test.js.map +1 -0
  76. package/dist/__tests__/edge-resolvers/resolver-units.test.d.ts +17 -0
  77. package/dist/__tests__/edge-resolvers/resolver-units.test.d.ts.map +1 -0
  78. package/dist/__tests__/edge-resolvers/resolver-units.test.js +286 -0
  79. package/dist/__tests__/edge-resolvers/resolver-units.test.js.map +1 -0
  80. package/dist/__tests__/fast-vs-exact.test.d.ts +16 -0
  81. package/dist/__tests__/fast-vs-exact.test.d.ts.map +1 -0
  82. package/dist/__tests__/fast-vs-exact.test.js +116 -0
  83. package/dist/__tests__/fast-vs-exact.test.js.map +1 -0
  84. package/dist/__tests__/graph-cli.test.d.ts +9 -0
  85. package/dist/__tests__/graph-cli.test.d.ts.map +1 -0
  86. package/dist/__tests__/graph-cli.test.js +417 -0
  87. package/dist/__tests__/graph-cli.test.js.map +1 -0
  88. package/dist/__tests__/heap-preflight.test.d.ts +10 -0
  89. package/dist/__tests__/heap-preflight.test.d.ts.map +1 -0
  90. package/dist/__tests__/heap-preflight.test.js +166 -0
  91. package/dist/__tests__/heap-preflight.test.js.map +1 -0
  92. package/dist/__tests__/inventory-differential.test.d.ts +15 -0
  93. package/dist/__tests__/inventory-differential.test.d.ts.map +1 -0
  94. package/dist/__tests__/inventory-differential.test.js +319 -0
  95. package/dist/__tests__/inventory-differential.test.js.map +1 -0
  96. package/dist/__tests__/inventory-helpers/hash-body.test.d.ts +11 -0
  97. package/dist/__tests__/inventory-helpers/hash-body.test.d.ts.map +1 -0
  98. package/dist/__tests__/inventory-helpers/hash-body.test.js +34 -0
  99. package/dist/__tests__/inventory-helpers/hash-body.test.js.map +1 -0
  100. package/dist/__tests__/inventory-helpers/synthesize-name.test.d.ts +9 -0
  101. package/dist/__tests__/inventory-helpers/synthesize-name.test.d.ts.map +1 -0
  102. package/dist/__tests__/inventory-helpers/synthesize-name.test.js +30 -0
  103. package/dist/__tests__/inventory-helpers/synthesize-name.test.js.map +1 -0
  104. package/dist/__tests__/inventory-property-tests.test.d.ts +24 -0
  105. package/dist/__tests__/inventory-property-tests.test.d.ts.map +1 -0
  106. package/dist/__tests__/inventory-property-tests.test.js +521 -0
  107. package/dist/__tests__/inventory-property-tests.test.js.map +1 -0
  108. package/dist/__tests__/inventory-shape-coverage.test.d.ts +16 -0
  109. package/dist/__tests__/inventory-shape-coverage.test.d.ts.map +1 -0
  110. package/dist/__tests__/inventory-shape-coverage.test.js +586 -0
  111. package/dist/__tests__/inventory-shape-coverage.test.js.map +1 -0
  112. package/dist/__tests__/inventory-visitors/contract.test.d.ts +9 -0
  113. package/dist/__tests__/inventory-visitors/contract.test.d.ts.map +1 -0
  114. package/dist/__tests__/inventory-visitors/contract.test.js +33 -0
  115. package/dist/__tests__/inventory-visitors/contract.test.js.map +1 -0
  116. package/dist/__tests__/lang-adapter-contract.test.d.ts +19 -0
  117. package/dist/__tests__/lang-adapter-contract.test.d.ts.map +1 -0
  118. package/dist/__tests__/lang-adapter-contract.test.js +880 -0
  119. package/dist/__tests__/lang-adapter-contract.test.js.map +1 -0
  120. package/dist/__tests__/lang-adapter-registry.test.d.ts +10 -0
  121. package/dist/__tests__/lang-adapter-registry.test.d.ts.map +1 -0
  122. package/dist/__tests__/lang-adapter-registry.test.js +151 -0
  123. package/dist/__tests__/lang-adapter-registry.test.js.map +1 -0
  124. package/dist/__tests__/normalize-project-dir.test.d.ts +5 -0
  125. package/dist/__tests__/normalize-project-dir.test.d.ts.map +1 -0
  126. package/dist/__tests__/normalize-project-dir.test.js +47 -0
  127. package/dist/__tests__/normalize-project-dir.test.js.map +1 -0
  128. package/dist/__tests__/orchestrate.test.d.ts +8 -0
  129. package/dist/__tests__/orchestrate.test.d.ts.map +1 -0
  130. package/dist/__tests__/orchestrate.test.js +213 -0
  131. package/dist/__tests__/orchestrate.test.js.map +1 -0
  132. package/dist/__tests__/parse-fast.test.d.ts +9 -0
  133. package/dist/__tests__/parse-fast.test.d.ts.map +1 -0
  134. package/dist/__tests__/parse-fast.test.js +114 -0
  135. package/dist/__tests__/parse-fast.test.js.map +1 -0
  136. package/dist/__tests__/rules/_helpers.d.ts +18 -0
  137. package/dist/__tests__/rules/_helpers.d.ts.map +1 -0
  138. package/dist/__tests__/rules/_helpers.js +62 -0
  139. package/dist/__tests__/rules/_helpers.js.map +1 -0
  140. package/dist/__tests__/rules/duplicated-function-body.test.d.ts +5 -0
  141. package/dist/__tests__/rules/duplicated-function-body.test.d.ts.map +1 -0
  142. package/dist/__tests__/rules/duplicated-function-body.test.js +39 -0
  143. package/dist/__tests__/rules/duplicated-function-body.test.js.map +1 -0
  144. package/dist/__tests__/rules/orphan-subtree.test.d.ts +5 -0
  145. package/dist/__tests__/rules/orphan-subtree.test.d.ts.map +1 -0
  146. package/dist/__tests__/rules/orphan-subtree.test.js +75 -0
  147. package/dist/__tests__/rules/orphan-subtree.test.js.map +1 -0
  148. package/dist/__tests__/rules/rule-hints-integration.test.d.ts +20 -0
  149. package/dist/__tests__/rules/rule-hints-integration.test.d.ts.map +1 -0
  150. package/dist/__tests__/rules/rule-hints-integration.test.js +279 -0
  151. package/dist/__tests__/rules/rule-hints-integration.test.js.map +1 -0
  152. package/dist/__tests__/tool-register.test.d.ts +16 -0
  153. package/dist/__tests__/tool-register.test.d.ts.map +1 -0
  154. package/dist/__tests__/tool-register.test.js +210 -0
  155. package/dist/__tests__/tool-register.test.js.map +1 -0
  156. package/dist/__tests__/value-reference-unit.test.d.ts +13 -0
  157. package/dist/__tests__/value-reference-unit.test.d.ts.map +1 -0
  158. package/dist/__tests__/value-reference-unit.test.js +226 -0
  159. package/dist/__tests__/value-reference-unit.test.js.map +1 -0
  160. package/dist/__tests__/value-reference.test.d.ts +15 -0
  161. package/dist/__tests__/value-reference.test.d.ts.map +1 -0
  162. package/dist/__tests__/value-reference.test.js +115 -0
  163. package/dist/__tests__/value-reference.test.js.map +1 -0
  164. package/dist/__tests__/walk-fast.test.d.ts +8 -0
  165. package/dist/__tests__/walk-fast.test.d.ts.map +1 -0
  166. package/dist/__tests__/walk-fast.test.js +51 -0
  167. package/dist/__tests__/walk-fast.test.js.map +1 -0
  168. package/dist/__tests__/walk-reexports.test.d.ts +7 -0
  169. package/dist/__tests__/walk-reexports.test.d.ts.map +1 -0
  170. package/dist/__tests__/walk-reexports.test.js +79 -0
  171. package/dist/__tests__/walk-reexports.test.js.map +1 -0
  172. package/dist/cache-key.d.ts +41 -0
  173. package/dist/cache-key.d.ts.map +1 -0
  174. package/dist/cache-key.js +94 -0
  175. package/dist/cache-key.js.map +1 -0
  176. package/dist/discover.d.ts +25 -0
  177. package/dist/discover.d.ts.map +1 -0
  178. package/dist/discover.js +124 -0
  179. package/dist/discover.js.map +1 -0
  180. package/dist/edge-helpers/cross-package-context.d.ts +34 -0
  181. package/dist/edge-helpers/cross-package-context.d.ts.map +1 -0
  182. package/dist/edge-helpers/cross-package-context.js +97 -0
  183. package/dist/edge-helpers/cross-package-context.js.map +1 -0
  184. package/dist/edge-helpers/declaration-to-node.d.ts +58 -0
  185. package/dist/edge-helpers/declaration-to-node.d.ts.map +1 -0
  186. package/dist/edge-helpers/declaration-to-node.js +93 -0
  187. package/dist/edge-helpers/declaration-to-node.js.map +1 -0
  188. package/dist/edge-helpers/find-catalog-entry.d.ts +24 -0
  189. package/dist/edge-helpers/find-catalog-entry.d.ts.map +1 -0
  190. package/dist/edge-helpers/find-catalog-entry.js +45 -0
  191. package/dist/edge-helpers/find-catalog-entry.js.map +1 -0
  192. package/dist/edge-helpers/method-target.d.ts +22 -0
  193. package/dist/edge-helpers/method-target.d.ts.map +1 -0
  194. package/dist/edge-helpers/method-target.js +46 -0
  195. package/dist/edge-helpers/method-target.js.map +1 -0
  196. package/dist/edge-helpers/resolution-trace.d.ts +24 -0
  197. package/dist/edge-helpers/resolution-trace.d.ts.map +1 -0
  198. package/dist/edge-helpers/resolution-trace.js +38 -0
  199. package/dist/edge-helpers/resolution-trace.js.map +1 -0
  200. package/dist/edge-helpers/resolve-decl.d.ts +44 -0
  201. package/dist/edge-helpers/resolve-decl.d.ts.map +1 -0
  202. package/dist/edge-helpers/resolve-decl.js +170 -0
  203. package/dist/edge-helpers/resolve-decl.js.map +1 -0
  204. package/dist/edge-helpers/unalias-symbol.d.ts +10 -0
  205. package/dist/edge-helpers/unalias-symbol.d.ts.map +1 -0
  206. package/dist/edge-helpers/unalias-symbol.js +29 -0
  207. package/dist/edge-helpers/unalias-symbol.js.map +1 -0
  208. package/dist/edge-resolvers/__tests__/boundary.test.d.ts +15 -0
  209. package/dist/edge-resolvers/__tests__/boundary.test.d.ts.map +1 -0
  210. package/dist/edge-resolvers/__tests__/boundary.test.js +227 -0
  211. package/dist/edge-resolvers/__tests__/boundary.test.js.map +1 -0
  212. package/dist/edge-resolvers/__tests__/callee-anchor.test.d.ts +10 -0
  213. package/dist/edge-resolvers/__tests__/callee-anchor.test.d.ts.map +1 -0
  214. package/dist/edge-resolvers/__tests__/callee-anchor.test.js +63 -0
  215. package/dist/edge-resolvers/__tests__/callee-anchor.test.js.map +1 -0
  216. package/dist/edge-resolvers/__tests__/syntactic.test.d.ts +12 -0
  217. package/dist/edge-resolvers/__tests__/syntactic.test.d.ts.map +1 -0
  218. package/dist/edge-resolvers/__tests__/syntactic.test.js +215 -0
  219. package/dist/edge-resolvers/__tests__/syntactic.test.js.map +1 -0
  220. package/dist/edge-resolvers/boundary.d.ts +41 -0
  221. package/dist/edge-resolvers/boundary.d.ts.map +1 -0
  222. package/dist/edge-resolvers/boundary.js +130 -0
  223. package/dist/edge-resolvers/boundary.js.map +1 -0
  224. package/dist/edge-resolvers/catalog-fallback.d.ts +13 -0
  225. package/dist/edge-resolvers/catalog-fallback.d.ts.map +1 -0
  226. package/dist/edge-resolvers/catalog-fallback.js +30 -0
  227. package/dist/edge-resolvers/catalog-fallback.js.map +1 -0
  228. package/dist/edge-resolvers/direct-call.d.ts +10 -0
  229. package/dist/edge-resolvers/direct-call.d.ts.map +1 -0
  230. package/dist/edge-resolvers/direct-call.js +45 -0
  231. package/dist/edge-resolvers/direct-call.js.map +1 -0
  232. package/dist/edge-resolvers/jsx-element.d.ts +16 -0
  233. package/dist/edge-resolvers/jsx-element.d.ts.map +1 -0
  234. package/dist/edge-resolvers/jsx-element.js +67 -0
  235. package/dist/edge-resolvers/jsx-element.js.map +1 -0
  236. package/dist/edge-resolvers/new-expression.d.ts +11 -0
  237. package/dist/edge-resolvers/new-expression.d.ts.map +1 -0
  238. package/dist/edge-resolvers/new-expression.js +56 -0
  239. package/dist/edge-resolvers/new-expression.js.map +1 -0
  240. package/dist/edge-resolvers/polymorphic.d.ts +8 -0
  241. package/dist/edge-resolvers/polymorphic.d.ts.map +1 -0
  242. package/dist/edge-resolvers/polymorphic.js +57 -0
  243. package/dist/edge-resolvers/polymorphic.js.map +1 -0
  244. package/dist/edge-resolvers/property-access.d.ts +10 -0
  245. package/dist/edge-resolvers/property-access.d.ts.map +1 -0
  246. package/dist/edge-resolvers/property-access.js +56 -0
  247. package/dist/edge-resolvers/property-access.js.map +1 -0
  248. package/dist/edge-resolvers/syntactic.d.ts +105 -0
  249. package/dist/edge-resolvers/syntactic.d.ts.map +1 -0
  250. package/dist/edge-resolvers/syntactic.js +294 -0
  251. package/dist/edge-resolvers/syntactic.js.map +1 -0
  252. package/dist/edge-resolvers/types.d.ts +37 -0
  253. package/dist/edge-resolvers/types.d.ts.map +1 -0
  254. package/dist/edge-resolvers/types.js +10 -0
  255. package/dist/edge-resolvers/types.js.map +1 -0
  256. package/dist/edges-value-reference.d.ts +26 -0
  257. package/dist/edges-value-reference.d.ts.map +1 -0
  258. package/dist/edges-value-reference.js +138 -0
  259. package/dist/edges-value-reference.js.map +1 -0
  260. package/dist/edges.d.ts +65 -0
  261. package/dist/edges.d.ts.map +1 -0
  262. package/dist/edges.js +392 -0
  263. package/dist/edges.js.map +1 -0
  264. package/dist/index.d.ts +47 -0
  265. package/dist/index.d.ts.map +1 -0
  266. package/dist/index.js +346 -0
  267. package/dist/index.js.map +1 -0
  268. package/dist/inventory-helpers/classify-visibility.d.ts +13 -0
  269. package/dist/inventory-helpers/classify-visibility.d.ts.map +1 -0
  270. package/dist/inventory-helpers/classify-visibility.js +56 -0
  271. package/dist/inventory-helpers/classify-visibility.js.map +1 -0
  272. package/dist/inventory-helpers/extract-decorators.d.ts +6 -0
  273. package/dist/inventory-helpers/extract-decorators.d.ts.map +1 -0
  274. package/dist/inventory-helpers/extract-decorators.js +33 -0
  275. package/dist/inventory-helpers/extract-decorators.js.map +1 -0
  276. package/dist/inventory-helpers/extract-params.d.ts +7 -0
  277. package/dist/inventory-helpers/extract-params.d.ts.map +1 -0
  278. package/dist/inventory-helpers/extract-params.js +28 -0
  279. package/dist/inventory-helpers/extract-params.js.map +1 -0
  280. package/dist/inventory-helpers/hash-body.d.ts +43 -0
  281. package/dist/inventory-helpers/hash-body.d.ts.map +1 -0
  282. package/dist/inventory-helpers/hash-body.js +52 -0
  283. package/dist/inventory-helpers/hash-body.js.map +1 -0
  284. package/dist/inventory-helpers/synthesize-name.d.ts +16 -0
  285. package/dist/inventory-helpers/synthesize-name.d.ts.map +1 -0
  286. package/dist/inventory-helpers/synthesize-name.js +17 -0
  287. package/dist/inventory-helpers/synthesize-name.js.map +1 -0
  288. package/dist/inventory-visitors/arrow-function.d.ts +8 -0
  289. package/dist/inventory-visitors/arrow-function.d.ts.map +1 -0
  290. package/dist/inventory-visitors/arrow-function.js +55 -0
  291. package/dist/inventory-visitors/arrow-function.js.map +1 -0
  292. package/dist/inventory-visitors/class-static-init.d.ts +17 -0
  293. package/dist/inventory-visitors/class-static-init.d.ts.map +1 -0
  294. package/dist/inventory-visitors/class-static-init.js +45 -0
  295. package/dist/inventory-visitors/class-static-init.js.map +1 -0
  296. package/dist/inventory-visitors/constructor-declaration.d.ts +7 -0
  297. package/dist/inventory-visitors/constructor-declaration.d.ts.map +1 -0
  298. package/dist/inventory-visitors/constructor-declaration.js +47 -0
  299. package/dist/inventory-visitors/constructor-declaration.js.map +1 -0
  300. package/dist/inventory-visitors/function-declaration.d.ts +7 -0
  301. package/dist/inventory-visitors/function-declaration.d.ts.map +1 -0
  302. package/dist/inventory-visitors/function-declaration.js +59 -0
  303. package/dist/inventory-visitors/function-declaration.js.map +1 -0
  304. package/dist/inventory-visitors/function-expression.d.ts +7 -0
  305. package/dist/inventory-visitors/function-expression.d.ts.map +1 -0
  306. package/dist/inventory-visitors/function-expression.js +56 -0
  307. package/dist/inventory-visitors/function-expression.js.map +1 -0
  308. package/dist/inventory-visitors/getter-setter.d.ts +7 -0
  309. package/dist/inventory-visitors/getter-setter.d.ts.map +1 -0
  310. package/dist/inventory-visitors/getter-setter.js +63 -0
  311. package/dist/inventory-visitors/getter-setter.js.map +1 -0
  312. package/dist/inventory-visitors/method-declaration.d.ts +7 -0
  313. package/dist/inventory-visitors/method-declaration.d.ts.map +1 -0
  314. package/dist/inventory-visitors/method-declaration.js +75 -0
  315. package/dist/inventory-visitors/method-declaration.js.map +1 -0
  316. package/dist/inventory-visitors/module-init.d.ts +15 -0
  317. package/dist/inventory-visitors/module-init.d.ts.map +1 -0
  318. package/dist/inventory-visitors/module-init.js +40 -0
  319. package/dist/inventory-visitors/module-init.js.map +1 -0
  320. package/dist/inventory-visitors/types.d.ts +26 -0
  321. package/dist/inventory-visitors/types.d.ts.map +1 -0
  322. package/dist/inventory-visitors/types.js +14 -0
  323. package/dist/inventory-visitors/types.js.map +1 -0
  324. package/dist/normalize-project-dir.d.ts +14 -0
  325. package/dist/normalize-project-dir.d.ts.map +1 -0
  326. package/dist/normalize-project-dir.js +36 -0
  327. package/dist/normalize-project-dir.js.map +1 -0
  328. package/dist/parse-fast.d.ts +41 -0
  329. package/dist/parse-fast.d.ts.map +1 -0
  330. package/dist/parse-fast.js +91 -0
  331. package/dist/parse-fast.js.map +1 -0
  332. package/dist/parse.d.ts +42 -0
  333. package/dist/parse.d.ts.map +1 -0
  334. package/dist/parse.js +75 -0
  335. package/dist/parse.js.map +1 -0
  336. package/dist/test-file.d.ts +7 -0
  337. package/dist/test-file.d.ts.map +1 -0
  338. package/dist/test-file.js +42 -0
  339. package/dist/test-file.js.map +1 -0
  340. package/dist/walk.d.ts +125 -0
  341. package/dist/walk.d.ts.map +1 -0
  342. package/dist/walk.js +393 -0
  343. package/dist/walk.js.map +1 -0
  344. package/package.json +57 -0
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Cross-shard boundary-call extraction (boundary.ts).
3
+ *
4
+ * A boundary call is a call site whose callee name is IMPORTED but the in-shard
5
+ * resolver did NOT resolve THIS site to a target — by construction the target
6
+ * lives in another shard. Detection is keyed on the per-site RESOLUTION OUTCOME
7
+ * (`resolvedEdgesByOwner`), NOT on whether the callee name exists among the
8
+ * shard's occurrences — so a different local function sharing the name does not
9
+ * suppress an imported call (the name-collision fix), and a site already
10
+ * resolved in-shard is skipped (no double edge). These tests drive
11
+ * `extractBoundaryCalls` over real `CallSiteRecord`s and assert the emitted
12
+ * `CrossBoundaryCall` descriptors (and the cases it skips).
13
+ */
14
+ import { ownerEdgeKey } from '@opensip-cli/graph';
15
+ import ts from 'typescript';
16
+ import { describe, expect, it } from 'vitest';
17
+ import { extractBoundaryCalls } from '../boundary.js';
18
+ /**
19
+ * Project root the boundary extractor derives `ownerFile` against. Empty string
20
+ * resolves to cwd, so `relative('', 'm.ts')` === `'m.ts'` — matching the parsed
21
+ * snippet's file name.
22
+ */
23
+ const PROJECT_DIR = '';
24
+ /** No in-shard resolutions — every imported call is an unresolved boundary candidate. */
25
+ const NONE_RESOLVED = new Map();
26
+ /** Parse a snippet into a source file with parent pointers set. */
27
+ function parse(source) {
28
+ return ts.createSourceFile('m.ts', source, ts.ScriptTarget.Latest, true);
29
+ }
30
+ /** Collect every call/new expression node in document order. */
31
+ function allCallNodes(sf) {
32
+ const out = [];
33
+ const visit = (n) => {
34
+ if (ts.isCallExpression(n) || ts.isNewExpression(n))
35
+ out.push(n);
36
+ ts.forEachChild(n, visit);
37
+ };
38
+ visit(sf);
39
+ return out;
40
+ }
41
+ /** Wrap call nodes as 'call'-kind CallSiteRecords owned by `ownerHash`. */
42
+ function callRecords(sf, ownerHash = 'owner') {
43
+ return allCallNodes(sf).map((node) => ({
44
+ node,
45
+ sourceFile: sf,
46
+ ownerHash,
47
+ kind: 'call',
48
+ }));
49
+ }
50
+ /**
51
+ * Build a `resolvedEdgesByOwner` map that marks specific call-site nodes as
52
+ * RESOLVED in-shard (to a real target), at their actual line:column — the input
53
+ * the extractor uses to decide a site is not a boundary call.
54
+ */
55
+ function resolvedFor(records, nodes, ownerFile = 'm.ts') {
56
+ const map = new Map();
57
+ for (const r of records) {
58
+ if (!nodes.includes(r.node))
59
+ continue;
60
+ const start = r.node.getStart(r.sourceFile);
61
+ const lc = r.sourceFile.getLineAndCharacterOfPosition(start);
62
+ const edge = {
63
+ to: ['resolved-in-shard'],
64
+ line: lc.line + 1,
65
+ column: lc.character,
66
+ };
67
+ const key = ownerEdgeKey(r.ownerHash, ownerFile);
68
+ const bucket = map.get(key);
69
+ if (bucket)
70
+ bucket.push(edge);
71
+ else
72
+ map.set(key, [edge]);
73
+ }
74
+ return map;
75
+ }
76
+ describe('extractBoundaryCalls', () => {
77
+ it('emits a descriptor for an imported call the shard did not resolve', () => {
78
+ const sf = parse([
79
+ "import { helper } from './other.js';",
80
+ 'export function caller(): number {',
81
+ ' return helper();',
82
+ '}',
83
+ ].join('\n'));
84
+ const out = extractBoundaryCalls(callRecords(sf), NONE_RESOLVED, PROJECT_DIR);
85
+ expect(out).toHaveLength(1);
86
+ const [call] = out;
87
+ expect(call?.calleeName).toBe('helper');
88
+ expect(call?.importSpecifier).toBe('./other.js');
89
+ expect(call?.ownerHash).toBe('owner');
90
+ // Owner file is derived project-relative (matches FunctionOccurrence.filePath)
91
+ // so the cross-shard merge can key by ownerEdgeKey(ownerHash, ownerFile).
92
+ expect(call?.ownerFile).toBe('m.ts');
93
+ // `return helper()` — the value is used, not discarded.
94
+ expect(call?.discarded).toBe(false);
95
+ expect(call?.line).toBe(3);
96
+ expect(call?.column).toBeGreaterThanOrEqual(0);
97
+ expect(call?.text).toContain('helper');
98
+ });
99
+ it('marks discarded when the call is a bare ExpressionStatement', () => {
100
+ const sf = parse([
101
+ "import { sideEffect } from './fx.js';",
102
+ 'export function run(): void {',
103
+ ' sideEffect();',
104
+ '}',
105
+ ].join('\n'));
106
+ const [call] = extractBoundaryCalls(callRecords(sf), NONE_RESOLVED, PROJECT_DIR);
107
+ expect(call?.calleeName).toBe('sideEffect');
108
+ expect(call?.discarded).toBe(true);
109
+ });
110
+ it('treats an awaited bare call as discarded (unwraps await/paren)', () => {
111
+ const sf = parse([
112
+ "import { flush } from './fx.js';",
113
+ 'export async function run(): Promise<void> {',
114
+ ' await (flush());',
115
+ '}',
116
+ ].join('\n'));
117
+ const [call] = extractBoundaryCalls(callRecords(sf), NONE_RESOLVED, PROJECT_DIR);
118
+ expect(call?.calleeName).toBe('flush');
119
+ expect(call?.discarded).toBe(true);
120
+ });
121
+ it('skips a call the in-shard resolver already resolved at this site (no double edge)', () => {
122
+ const sf = parse([
123
+ "import { helper } from './other.js';",
124
+ 'export function caller(): number {',
125
+ ' return helper();',
126
+ '}',
127
+ ].join('\n'));
128
+ const records = callRecords(sf);
129
+ // The in-shard resolver resolved THIS helper() site → not a boundary call.
130
+ const resolved = resolvedFor(records, allCallNodes(sf));
131
+ const out = extractBoundaryCalls(records, resolved, PROJECT_DIR);
132
+ expect(out).toEqual([]);
133
+ });
134
+ it('emits even when a DIFFERENT local same-name function exists but this site is unresolved (name-collision fix)', () => {
135
+ // A local `helper` elsewhere in the shard must NOT suppress an imported
136
+ // `helper()` the in-shard resolver left unresolved — keyed on the per-site
137
+ // outcome (none resolved here), not on name presence.
138
+ const sf = parse([
139
+ "import { helper } from './other.js';",
140
+ 'export function caller(): number {',
141
+ ' return helper();',
142
+ '}',
143
+ ].join('\n'));
144
+ const out = extractBoundaryCalls(callRecords(sf), NONE_RESOLVED, PROJECT_DIR);
145
+ expect(out.map((c) => c.calleeName)).toEqual(['helper']);
146
+ });
147
+ it('skips a non-imported name (global / local, not a cross-module candidate)', () => {
148
+ const sf = parse([
149
+ 'export function caller(): void {',
150
+ ' console.log(notImported());',
151
+ '}',
152
+ 'function notImported(): number { return 1; }',
153
+ ].join('\n'));
154
+ const out = extractBoundaryCalls(callRecords(sf), NONE_RESOLVED, PROJECT_DIR);
155
+ expect(out).toEqual([]);
156
+ });
157
+ it('skips a call with no extractable simple callee name (element-access call)', () => {
158
+ const sf = parse([
159
+ "import { table } from './t.js';",
160
+ 'export function caller(): unknown {',
161
+ ' return table["dynamic"]();',
162
+ '}',
163
+ ].join('\n'));
164
+ const out = extractBoundaryCalls(callRecords(sf), NONE_RESOLVED, PROJECT_DIR);
165
+ expect(out).toEqual([]);
166
+ });
167
+ it('ignores creation-kind records entirely (always intra-shard)', () => {
168
+ const sf = parse([
169
+ "import { helper } from './other.js';",
170
+ 'export function caller(): number { return helper(); }',
171
+ ].join('\n'));
172
+ const creationRecords = allCallNodes(sf).map((node) => ({
173
+ node,
174
+ sourceFile: sf,
175
+ ownerHash: 'owner',
176
+ kind: 'creation',
177
+ childHash: 'child',
178
+ }));
179
+ const out = extractBoundaryCalls(creationRecords, NONE_RESOLVED, PROJECT_DIR);
180
+ expect(out).toEqual([]);
181
+ });
182
+ it('skips a property-access call whose rightmost name was not itself imported', () => {
183
+ const sf = parse([
184
+ "import { svc } from './svc.js';",
185
+ 'export function caller(): number {',
186
+ ' return svc.method();',
187
+ '}',
188
+ ].join('\n'));
189
+ // The callee simple name is `method` (rightmost of `svc.method`), but
190
+ // only `svc` carries an import specifier — `method` does not, so it is
191
+ // not a cross-module candidate and is skipped.
192
+ const out = extractBoundaryCalls(callRecords(sf), NONE_RESOLVED, PROJECT_DIR);
193
+ expect(out).toEqual([]);
194
+ });
195
+ it('emits for an `import =` (ImportEqualsDeclaration) boundary call', () => {
196
+ const sf = parse([
197
+ "import legacy = require('./legacy.js');",
198
+ 'export function caller(): unknown { return legacy(); }',
199
+ ].join('\n'));
200
+ const [call] = extractBoundaryCalls(callRecords(sf), NONE_RESOLVED, PROJECT_DIR);
201
+ expect(call?.calleeName).toBe('legacy');
202
+ expect(call?.importSpecifier).toBe('./legacy.js');
203
+ });
204
+ it('truncates display text to the 80-char CallEdge contract', () => {
205
+ const longArg = 'x'.repeat(200);
206
+ const sf = parse([
207
+ "import { wide } from './wide.js';",
208
+ `export function caller(): unknown { return wide("${longArg}"); }`,
209
+ ].join('\n'));
210
+ const [call] = extractBoundaryCalls(callRecords(sf), NONE_RESOLVED, PROJECT_DIR);
211
+ expect(call?.text.length).toBeLessThanOrEqual(80);
212
+ expect(call?.text.endsWith('...')).toBe(true);
213
+ });
214
+ it('caches the import-specifier index per source file across multiple sites', () => {
215
+ // Two imported calls in the SAME source file exercise the
216
+ // specifierIndexBySf cache-hit branch on the second site.
217
+ const sf = parse([
218
+ "import { a, b } from './ab.js';",
219
+ 'export function caller(): number { return a() + b(); }',
220
+ ].join('\n'));
221
+ const out = extractBoundaryCalls(callRecords(sf), NONE_RESOLVED, PROJECT_DIR);
222
+ expect(out.map((c) => c.calleeName).sort()).toEqual(['a', 'b']);
223
+ for (const c of out)
224
+ expect(c.importSpecifier).toBe('./ab.js');
225
+ });
226
+ });
227
+ //# sourceMappingURL=boundary.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundary.test.js","sourceRoot":"","sources":["../../../src/edge-resolvers/__tests__/boundary.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Call-edge position anchoring (ADR-0033 follow-up). A chained call
3
+ * `recv(...).method(...)` has its inner and outer CallExpressions BOTH starting
4
+ * at `recv`, so anchoring an edge at the expression start collapses two real,
5
+ * distinct edges onto one (line,column) identity — the spurious "conflict"
6
+ * divergence class. `calleeAnchorNode` anchors at the CALLEE token instead, so
7
+ * every call in a chain gets a distinct column.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=callee-anchor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callee-anchor.test.d.ts","sourceRoot":"","sources":["../../../src/edge-resolvers/__tests__/callee-anchor.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Call-edge position anchoring (ADR-0033 follow-up). A chained call
3
+ * `recv(...).method(...)` has its inner and outer CallExpressions BOTH starting
4
+ * at `recv`, so anchoring an edge at the expression start collapses two real,
5
+ * distinct edges onto one (line,column) identity — the spurious "conflict"
6
+ * divergence class. `calleeAnchorNode` anchors at the CALLEE token instead, so
7
+ * every call in a chain gets a distinct column.
8
+ */
9
+ import ts from 'typescript';
10
+ import { describe, expect, it } from 'vitest';
11
+ import { calleeAnchorNode } from '../syntactic.js';
12
+ /** Parse `code` and return every CallExpression / NewExpression, in source order. */
13
+ function callNodes(code) {
14
+ const sf = ts.createSourceFile('t.ts', code, ts.ScriptTarget.Latest, true);
15
+ const nodes = [];
16
+ const visit = (n) => {
17
+ if (ts.isCallExpression(n) || ts.isNewExpression(n))
18
+ nodes.push(n);
19
+ ts.forEachChild(n, visit);
20
+ };
21
+ visit(sf);
22
+ return { sf, nodes };
23
+ }
24
+ /** Column (0-based) `calleeAnchorNode` anchors `node` at. */
25
+ function anchorCol(sf, node) {
26
+ return sf.getLineAndCharacterOfPosition(calleeAnchorNode(node).getStart(sf)).character;
27
+ }
28
+ /** The identifier text at the anchor (the callee token). */
29
+ function anchorText(sf, node) {
30
+ const a = calleeAnchorNode(node);
31
+ return a.getText(sf);
32
+ }
33
+ describe('calleeAnchorNode', () => {
34
+ it('gives the inner and outer calls of a chain DISTINCT anchor columns', () => {
35
+ const { sf, nodes } = callNodes('const x = currentRulesRegistry().getAll();');
36
+ // forEachChild yields the OUTER call before the inner (outer encloses inner).
37
+ const outer = nodes.find((n) => anchorText(sf, n) === 'getAll');
38
+ const inner = nodes.find((n) => anchorText(sf, n) === 'currentRulesRegistry');
39
+ expect(outer).toBeDefined();
40
+ expect(inner).toBeDefined();
41
+ // Both CallExpressions start at the SAME column (`currentRulesRegistry`)...
42
+ expect(outer.getStart(sf)).toBe(inner.getStart(sf));
43
+ // ...but their CALLEE anchors are at DISTINCT columns — no collision.
44
+ expect(anchorCol(sf, outer)).not.toBe(anchorCol(sf, inner));
45
+ });
46
+ it('anchors a method call at the method name, a plain call at the callee', () => {
47
+ const { sf, nodes } = callNodes('obj.method(); plain();');
48
+ const method = nodes.find((n) => anchorText(sf, n) === 'method');
49
+ const plain = nodes.find((n) => anchorText(sf, n) === 'plain');
50
+ // method call anchors PAST the receiver `obj.`
51
+ expect(anchorCol(sf, method)).toBeGreaterThan(method.getStart(sf) === 0 ? -1 : 0);
52
+ expect(anchorText(sf, method)).toBe('method');
53
+ expect(anchorText(sf, plain)).toBe('plain');
54
+ });
55
+ it('anchors `new C().m()` so the constructor and method do not collide', () => {
56
+ const { sf, nodes } = callNodes('new CatalogRepo(ds).loadCatalogContract();');
57
+ const ctor = nodes.find((n) => ts.isNewExpression(n));
58
+ const call = nodes.find((n) => anchorText(sf, n) === 'loadCatalogContract');
59
+ expect(anchorText(sf, ctor)).toBe('CatalogRepo'); // class name, not the `new` keyword
60
+ expect(anchorCol(sf, ctor)).not.toBe(anchorCol(sf, call));
61
+ });
62
+ });
63
+ //# sourceMappingURL=callee-anchor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callee-anchor.test.js","sourceRoot":"","sources":["../../../src/edge-resolvers/__tests__/callee-anchor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Accuracy contract for the syntactic (fast-tier) resolver.
3
+ *
4
+ * - imported calls resolve to the right file at 'medium';
5
+ * - same-named functions across files are disambiguated by the import graph;
6
+ * - same-file definitions resolve at 'medium';
7
+ * - unique unpinned names resolve at 'low'; ambiguous unpinned names decline;
8
+ * - external imports decline rather than mis-guess;
9
+ * - no verdict is ever 'high', and resolution is always 'syntactic'.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=syntactic.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntactic.test.d.ts","sourceRoot":"","sources":["../../../src/edge-resolvers/__tests__/syntactic.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Accuracy contract for the syntactic (fast-tier) resolver.
3
+ *
4
+ * - imported calls resolve to the right file at 'medium';
5
+ * - same-named functions across files are disambiguated by the import graph;
6
+ * - same-file definitions resolve at 'medium';
7
+ * - unique unpinned names resolve at 'low'; ambiguous unpinned names decline;
8
+ * - external imports decline rather than mis-guess;
9
+ * - no verdict is ever 'high', and resolution is always 'syntactic'.
10
+ */
11
+ import ts from 'typescript';
12
+ import { describe, expect, it } from 'vitest';
13
+ import { buildImportIndex, buildImportSpecifierIndex, collectKnownFiles, resolveSyntactic, } from '../syntactic.js';
14
+ /** Build a minimal catalog occurrence for a named function in a file. */
15
+ function occ(simpleName, filePath, hash) {
16
+ return {
17
+ bodyHash: hash,
18
+ simpleName,
19
+ qualifiedName: `${filePath}.${simpleName}`,
20
+ filePath,
21
+ line: 1,
22
+ column: 0,
23
+ endLine: 1,
24
+ kind: 'function-declaration',
25
+ params: [],
26
+ returnType: null,
27
+ enclosingClass: null,
28
+ decorators: [],
29
+ visibility: 'exported',
30
+ inTestFile: false,
31
+ definedInGenerated: false,
32
+ calls: [],
33
+ };
34
+ }
35
+ function catalogOf(...occs) {
36
+ const functions = {};
37
+ for (const o of occs) {
38
+ const bucket = functions[o.simpleName];
39
+ if (bucket)
40
+ bucket.push(o);
41
+ else
42
+ functions[o.simpleName] = [o];
43
+ }
44
+ return {
45
+ version: '3.0',
46
+ tool: 'graph',
47
+ language: 'typescript',
48
+ builtAt: 'x',
49
+ cacheKey: 'k',
50
+ resolutionMode: 'fast',
51
+ functions,
52
+ };
53
+ }
54
+ /** Parse a snippet and return the first call expression's node. */
55
+ function firstCall(source) {
56
+ const sf = ts.createSourceFile('m.ts', source, ts.ScriptTarget.Latest, true);
57
+ let found;
58
+ const visit = (n) => {
59
+ if (found)
60
+ return;
61
+ if (ts.isCallExpression(n)) {
62
+ found = n;
63
+ return;
64
+ }
65
+ ts.forEachChild(n, visit);
66
+ };
67
+ visit(sf);
68
+ if (!found)
69
+ throw new Error('no call expression in snippet');
70
+ return found;
71
+ }
72
+ const NO_IMPORTS = new Map();
73
+ describe('resolveSyntactic', () => {
74
+ it('resolves an imported call to the imported file at medium confidence', () => {
75
+ const catalog = catalogOf(occ('helper', 'util.ts', 'h1'), occ('helper', 'other.ts', 'h2'));
76
+ const importIndex = new Map([['helper', 'util.ts']]);
77
+ const node = firstCall('helper()');
78
+ const v = resolveSyntactic(node, { catalog, currentFileRel: 'app.ts', importIndex });
79
+ expect(v).not.toBeNull();
80
+ expect(v.resolution).toBe('syntactic');
81
+ expect(v.confidence).toBe('medium');
82
+ expect(v.to).toEqual(['h1']); // pinned to util.ts, NOT other.ts
83
+ });
84
+ it('disambiguates same-named functions across files via the import graph', () => {
85
+ const catalog = catalogOf(occ('save', 'a.ts', 'A'), occ('save', 'b.ts', 'B'));
86
+ const node = firstCall('save()');
87
+ const fromA = resolveSyntactic(node, {
88
+ catalog,
89
+ currentFileRel: 'app.ts',
90
+ importIndex: new Map([['save', 'a.ts']]),
91
+ });
92
+ const fromB = resolveSyntactic(node, {
93
+ catalog,
94
+ currentFileRel: 'app.ts',
95
+ importIndex: new Map([['save', 'b.ts']]),
96
+ });
97
+ expect(fromA.to).toEqual(['A']);
98
+ expect(fromB.to).toEqual(['B']);
99
+ });
100
+ it('pins a same-file definition at medium even without an import', () => {
101
+ const catalog = catalogOf(occ('local', 'app.ts', 'L'), occ('local', 'far.ts', 'F'));
102
+ const node = firstCall('local()');
103
+ const v = resolveSyntactic(node, {
104
+ catalog,
105
+ currentFileRel: 'app.ts',
106
+ importIndex: NO_IMPORTS,
107
+ });
108
+ expect(v.confidence).toBe('medium');
109
+ expect(v.to).toEqual(['L']);
110
+ });
111
+ it('resolves a unique unpinned name at low confidence', () => {
112
+ const catalog = catalogOf(occ('only', 'somewhere.ts', 'O'));
113
+ const node = firstCall('only()');
114
+ const v = resolveSyntactic(node, {
115
+ catalog,
116
+ currentFileRel: 'app.ts',
117
+ importIndex: NO_IMPORTS,
118
+ });
119
+ expect(v.confidence).toBe('low');
120
+ expect(v.to).toEqual(['O']);
121
+ });
122
+ it('declines an ambiguous unpinned name (multiple candidates, no pin)', () => {
123
+ const catalog = catalogOf(occ('amb', 'a.ts', 'A'), occ('amb', 'b.ts', 'B'));
124
+ const node = firstCall('amb()');
125
+ const v = resolveSyntactic(node, {
126
+ catalog,
127
+ currentFileRel: 'app.ts',
128
+ importIndex: NO_IMPORTS,
129
+ });
130
+ expect(v.to).toEqual([]); // declines rather than guessing
131
+ expect(v.confidence).toBe('low');
132
+ });
133
+ it('declines a call to a name imported from outside the catalog (external)', () => {
134
+ const catalog = catalogOf(occ('chalk', 'local.ts', 'X'));
135
+ // chalk imported from an external package → importIndex maps to null.
136
+ const importIndex = new Map([['chalk', null]]);
137
+ const node = firstCall('chalk()');
138
+ const v = resolveSyntactic(node, { catalog, currentFileRel: 'app.ts', importIndex });
139
+ expect(v.to).toEqual([]); // does NOT wrongly resolve to local.ts
140
+ });
141
+ it('never emits high confidence and always labels resolution syntactic', () => {
142
+ const catalog = catalogOf(occ('helper', 'util.ts', 'h1'));
143
+ const node = firstCall('helper()');
144
+ for (const idx of [new Map([['helper', 'util.ts']]), NO_IMPORTS]) {
145
+ const v = resolveSyntactic(node, { catalog, currentFileRel: 'app.ts', importIndex: idx });
146
+ expect(v.resolution).toBe('syntactic');
147
+ expect(v.confidence).not.toBe('high');
148
+ }
149
+ });
150
+ it('resolves the rightmost name of a property-access call', () => {
151
+ const catalog = catalogOf(occ('method', 'svc.ts', 'M'));
152
+ const node = firstCall('svc.method()');
153
+ const v = resolveSyntactic(node, {
154
+ catalog,
155
+ currentFileRel: 'app.ts',
156
+ importIndex: new Map([['svc', 'svc.ts']]),
157
+ });
158
+ // 'method' resolves by name; svc pins the file.
159
+ expect(v.to).toEqual(['M']);
160
+ });
161
+ });
162
+ describe('buildImportIndex', () => {
163
+ it('maps default, named, aliased, and namespace bindings to their target files', () => {
164
+ const source = [
165
+ "import def from './a.js';",
166
+ "import { named, other as alias } from './b.js';",
167
+ "import * as ns from './c.js';",
168
+ "import ext from 'some-pkg';",
169
+ ].join('\n');
170
+ const sf = ts.createSourceFile('/proj/app.ts', source, ts.ScriptTarget.Latest, true);
171
+ const known = collectKnownFiles(catalogOf(occ('x', 'a.ts', '1'), occ('y', 'b.ts', '2'), occ('z', 'c.ts', '3')));
172
+ const idx = buildImportIndex(sf, '/proj', known);
173
+ expect(idx.get('def')).toBe('a.ts');
174
+ expect(idx.get('named')).toBe('b.ts');
175
+ expect(idx.get('alias')).toBe('b.ts');
176
+ expect(idx.get('ns')).toBe('c.ts');
177
+ // bare specifier → external (null)
178
+ expect(idx.get('ext')).toBeNull();
179
+ });
180
+ it('maps a relative specifier that resolves to no known file to null', () => {
181
+ // The import resolves to a file the catalog does not know about →
182
+ // null (the resolveSpecifierToFile no-candidate-match fall-through).
183
+ const sf = ts.createSourceFile('/proj/app.ts', "import { missing } from './does-not-exist.js';", ts.ScriptTarget.Latest, true);
184
+ const known = collectKnownFiles(catalogOf(occ('x', 'other.ts', '1')));
185
+ const idx = buildImportIndex(sf, '/proj', known);
186
+ expect(idx.get('missing')).toBeNull();
187
+ });
188
+ it('resolves an `import =` (ImportEqualsDeclaration) binding to its target file', () => {
189
+ const sf = ts.createSourceFile('/proj/app.ts', "import legacy = require('./legacy.js');", ts.ScriptTarget.Latest, true);
190
+ const known = collectKnownFiles(catalogOf(occ('fn', 'legacy.ts', 'L')));
191
+ const idx = buildImportIndex(sf, '/proj', known);
192
+ expect(idx.get('legacy')).toBe('legacy.ts');
193
+ });
194
+ });
195
+ describe('buildImportSpecifierIndex', () => {
196
+ it('maps binding names to their RAW import specifier (named + default + namespace)', () => {
197
+ const source = [
198
+ "import def from './a.js';",
199
+ "import { named, other as alias } from '@scope/pkg';",
200
+ "import * as ns from './c.js';",
201
+ ].join('\n');
202
+ const sf = ts.createSourceFile('/proj/app.ts', source, ts.ScriptTarget.Latest, true);
203
+ const idx = buildImportSpecifierIndex(sf);
204
+ expect(idx.get('def')).toBe('./a.js');
205
+ expect(idx.get('named')).toBe('@scope/pkg');
206
+ expect(idx.get('alias')).toBe('@scope/pkg');
207
+ expect(idx.get('ns')).toBe('./c.js');
208
+ });
209
+ it('maps an `import =` binding to its raw require specifier', () => {
210
+ const sf = ts.createSourceFile('/proj/app.ts', "import legacy = require('./legacy.js');", ts.ScriptTarget.Latest, true);
211
+ const idx = buildImportSpecifierIndex(sf);
212
+ expect(idx.get('legacy')).toBe('./legacy.js');
213
+ });
214
+ });
215
+ //# sourceMappingURL=syntactic.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntactic.test.js","sourceRoot":"","sources":["../../../src/edge-resolvers/__tests__/syntactic.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Cross-shard boundary-call extraction (plan #2 — sharded build).
3
+ *
4
+ * When a shard worker resolves a shard's call sites, the calls that DON'T
5
+ * land on one of the shard's own occurrences are candidate cross-package
6
+ * edges — the target lives in another shard. This module identifies them
7
+ * syntactically (callee name + the raw import specifier the name came
8
+ * from) so the engine's cross-shard pass can re-resolve them against the
9
+ * global merged catalog, where the target is present.
10
+ *
11
+ * Detection is by RESOLUTION OUTCOME, not by name: a site is a boundary
12
+ * candidate when its callee name is IMPORTED (carries an import specifier) AND
13
+ * the in-shard resolver did NOT resolve THIS call site to a target. Keying on
14
+ * the per-site outcome (not "does the callee name exist among the shard's
15
+ * occurrences?") is what fixes the name-collision class: a name imported from
16
+ * another package is a cross-shard call even when a DIFFERENT local function in
17
+ * this shard happens to share the name (e.g. checks-universal has a local
18
+ * `isTestFile`, but a call to the IMPORTED `@opensip-cli/fitness` `isTestFile`
19
+ * still crosses the boundary). Conversely, a site the in-shard resolver already
20
+ * resolved is skipped, so a recovered boundary edge never double-counts.
21
+ */
22
+ import ts from 'typescript';
23
+ import type { CallSiteRecord } from '../walk.js';
24
+ import type { CallEdge, CrossBoundaryCall } from '@opensip-cli/graph';
25
+ /**
26
+ * Resolve a method call's type-attested target SOURCE file (a cross-package
27
+ * `recv.m()` whose `m` decl is in a workspace `dist/*.d.ts`), or null. Supplied
28
+ * by the adapter (which owns the `ts.Program`/checker); absent in the fast tier.
29
+ */
30
+ export type MethodTargetResolver = (node: ts.Node) => string | null;
31
+ /**
32
+ * Extract cross-boundary call descriptors from a shard's walked call sites. A
33
+ * site is a boundary candidate when the in-shard resolver left it unresolved AND
34
+ * either (a) its callee name is IMPORTED (a cross-package FUNCTION), or (b) it is
35
+ * a METHOD call `recv.m()` whose callee the checker resolves to a workspace
36
+ * `dist/*.d.ts` (`resolveMethodTarget` attests the target file — a cross-package
37
+ * METHOD). Both route through the same post-merge linker. Keyed on the resolution
38
+ * outcome (`resolvedEdgesByOwner`) — see the module doc.
39
+ */
40
+ export declare function extractBoundaryCalls(callSites: readonly CallSiteRecord[], resolvedEdgesByOwner: ReadonlyMap<string, readonly CallEdge[]>, projectDirAbs: string, resolveMethodTarget?: MethodTargetResolver): CrossBoundaryCall[];
41
+ //# sourceMappingURL=boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundary.d.ts","sourceRoot":"","sources":["../../src/edge-resolvers/boundary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,OAAO,EAAE,MAAM,YAAY,CAAC;AAM5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKtE;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC;AAEpE;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,SAAS,cAAc,EAAE,EACpC,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC,EAC9D,aAAa,EAAE,MAAM,EACrB,mBAAmB,CAAC,EAAE,oBAAoB,GACzC,iBAAiB,EAAE,CA2CrB"}