@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,226 @@
1
+ /**
2
+ * Unit tests for the value-reference predicates + resolvers
3
+ * (edges-value-reference.ts).
4
+ *
5
+ * `isValueReference` is a pure AST predicate: an Identifier is a value
6
+ * reference unless it is a structural name (declaration/property/type/
7
+ * import/export name) or a call/new/JSX target. These tests craft each
8
+ * structural and call-target shape so every short-circuit branch is
9
+ * exercised. `resolveValueReference` is then driven against a real
10
+ * program for the no-symbol and class-constructor declaration branches.
11
+ */
12
+ import ts from 'typescript';
13
+ import { describe, expect, it } from 'vitest';
14
+ import { buildCrossPackageContext } from '../edge-helpers/cross-package-context.js';
15
+ import { buildImportSpecifierIndex } from '../edge-resolvers/syntactic.js';
16
+ import { isValueReference, resolveValueReference } from '../edges-value-reference.js';
17
+ /** Parse a snippet (parent pointers set) and return the source file. */
18
+ function parse(source, name = 'm.ts') {
19
+ return ts.createSourceFile(name, source, ts.ScriptTarget.Latest, true);
20
+ }
21
+ /** Find the first identifier whose text === `text`. */
22
+ function ident(sf, text) {
23
+ let found;
24
+ const visit = (n) => {
25
+ if (found)
26
+ return;
27
+ if (ts.isIdentifier(n) && n.text === text) {
28
+ found = n;
29
+ return;
30
+ }
31
+ ts.forEachChild(n, visit);
32
+ };
33
+ visit(sf);
34
+ if (!found)
35
+ throw new Error(`identifier ${text} not found`);
36
+ return found;
37
+ }
38
+ describe('isValueReference — structural-name branches', () => {
39
+ it('treats a variable-declaration name as structural (not a value ref)', () => {
40
+ const sf = parse('const myVar = 1;');
41
+ expect(isValueReference(ident(sf, 'myVar'))).toBe(false);
42
+ });
43
+ it('treats a property-access property name as structural', () => {
44
+ // In `obj.prop`, `prop` is the property name slot, not a value ref.
45
+ const sf = parse('declare const obj: { prop: number }; obj.prop;');
46
+ const refs = [];
47
+ const visit = (n) => {
48
+ if (ts.isIdentifier(n) && n.text === 'prop')
49
+ refs.push(n);
50
+ ts.forEachChild(n, visit);
51
+ };
52
+ visit(sf);
53
+ const propName = refs.find((id) => ts.isPropertyAccessExpression(id.parent) && id.parent.name === id);
54
+ expect(propName).toBeDefined();
55
+ expect(isValueReference(propName)).toBe(false);
56
+ });
57
+ it('treats a labeled-statement label as structural', () => {
58
+ const sf = parse('loopLabel: for (;;) { break loopLabel; }');
59
+ // The label declaration is the structural slot.
60
+ const labels = [];
61
+ const visit = (n) => {
62
+ if (ts.isIdentifier(n) && n.text === 'loopLabel')
63
+ labels.push(n);
64
+ ts.forEachChild(n, visit);
65
+ };
66
+ visit(sf);
67
+ const labelDecl = labels.find((id) => ts.isLabeledStatement(id.parent) && id.parent.label === id);
68
+ expect(labelDecl).toBeDefined();
69
+ expect(isValueReference(labelDecl)).toBe(false);
70
+ });
71
+ it('treats a type-reference name as structural', () => {
72
+ const sf = parse('type Alias = number; let v: Alias;');
73
+ // `Alias` in the annotation is a TypeReferenceNode name.
74
+ const aliasRefs = [];
75
+ const visit = (n) => {
76
+ if (ts.isIdentifier(n) && n.text === 'Alias')
77
+ aliasRefs.push(n);
78
+ ts.forEachChild(n, visit);
79
+ };
80
+ visit(sf);
81
+ const inType = aliasRefs.find((id) => ts.isTypeReferenceNode(id.parent));
82
+ expect(inType).toBeDefined();
83
+ expect(isValueReference(inType)).toBe(false);
84
+ });
85
+ it('treats an import-specifier name as structural', () => {
86
+ const sf = parse("import { thing } from './x.js';");
87
+ expect(isValueReference(ident(sf, 'thing'))).toBe(false);
88
+ });
89
+ it('classifies a bare value use (function argument) as a value reference', () => {
90
+ const sf = parse('declare function take(cb: unknown): void; declare const handler: unknown; take(handler);');
91
+ // `handler` inside `take(handler)` is a genuine value reference.
92
+ const refs = [];
93
+ const visit = (n) => {
94
+ if (ts.isIdentifier(n) && n.text === 'handler')
95
+ refs.push(n);
96
+ ts.forEachChild(n, visit);
97
+ };
98
+ visit(sf);
99
+ const argRef = refs.find((id) => ts.isCallExpression(id.parent) && id.parent.arguments.includes(id));
100
+ expect(argRef).toBeDefined();
101
+ expect(isValueReference(argRef)).toBe(true);
102
+ });
103
+ });
104
+ describe('isValueReference — call/new/JSX target branches', () => {
105
+ it('treats a direct call target as a call-site target (not a value ref)', () => {
106
+ const sf = parse('declare function fn(): void; fn();');
107
+ const refs = [];
108
+ const visit = (n) => {
109
+ if (ts.isIdentifier(n) && n.text === 'fn')
110
+ refs.push(n);
111
+ ts.forEachChild(n, visit);
112
+ };
113
+ visit(sf);
114
+ const callTarget = refs.find((id) => ts.isCallExpression(id.parent) && id.parent.expression === id);
115
+ expect(callTarget).toBeDefined();
116
+ expect(isValueReference(callTarget)).toBe(false);
117
+ });
118
+ it('treats a new-expression target as a call-site target', () => {
119
+ const sf = parse('declare class K {} new K();');
120
+ const refs = [];
121
+ const visit = (n) => {
122
+ if (ts.isIdentifier(n) && n.text === 'K')
123
+ refs.push(n);
124
+ ts.forEachChild(n, visit);
125
+ };
126
+ visit(sf);
127
+ const newTarget = refs.find((id) => ts.isNewExpression(id.parent) && id.parent.expression === id);
128
+ expect(newTarget).toBeDefined();
129
+ expect(isValueReference(newTarget)).toBe(false);
130
+ });
131
+ it('treats a JSX self-closing tag name as a call-site target', () => {
132
+ const sf = parse('const x = <Comp />;', 'v.tsx');
133
+ const refs = [];
134
+ const visit = (n) => {
135
+ if (ts.isIdentifier(n) && n.text === 'Comp')
136
+ refs.push(n);
137
+ ts.forEachChild(n, visit);
138
+ };
139
+ visit(sf);
140
+ const tag = refs.find((id) => ts.isJsxSelfClosingElement(id.parent) && id.parent.tagName === id);
141
+ expect(tag).toBeDefined();
142
+ expect(isValueReference(tag)).toBe(false);
143
+ });
144
+ it('treats a JSX opening-element tag name as a call-site target', () => {
145
+ const sf = parse('const x = <Comp>child</Comp>;', 'v.tsx');
146
+ const refs = [];
147
+ const visit = (n) => {
148
+ if (ts.isIdentifier(n) && n.text === 'Comp')
149
+ refs.push(n);
150
+ ts.forEachChild(n, visit);
151
+ };
152
+ visit(sf);
153
+ const tag = refs.find((id) => ts.isJsxOpeningElement(id.parent) && id.parent.tagName === id);
154
+ expect(tag).toBeDefined();
155
+ expect(isValueReference(tag)).toBe(false);
156
+ });
157
+ });
158
+ describe('resolveValueReference — symbol resolution branches', () => {
159
+ const PROJECT_DIR = '/proj';
160
+ function programCtx(source) {
161
+ const fileAbs = `${PROJECT_DIR}/m.ts`;
162
+ const options = {
163
+ target: ts.ScriptTarget.ES2022,
164
+ noLib: true,
165
+ skipLibCheck: true,
166
+ };
167
+ const sf = ts.createSourceFile(fileAbs, source, ts.ScriptTarget.ES2022, true);
168
+ const defaultHost = ts.createCompilerHost(options);
169
+ const host = {
170
+ ...defaultHost,
171
+ getSourceFile: (fileName) => (fileName === fileAbs ? sf : undefined),
172
+ fileExists: (fileName) => fileName === fileAbs,
173
+ readFile: (fileName) => (fileName === fileAbs ? source : undefined),
174
+ getDefaultLibFileName: () => 'lib.d.ts',
175
+ writeFile: () => {
176
+ // No emit in tests.
177
+ },
178
+ };
179
+ const program = ts.createProgram({ rootNames: [fileAbs], options, host });
180
+ const typeChecker = program.getTypeChecker();
181
+ const catalog = {
182
+ version: '3.0',
183
+ tool: 'graph',
184
+ language: 'typescript',
185
+ builtAt: 'x',
186
+ cacheKey: 'k',
187
+ functions: {},
188
+ };
189
+ const ctx = {
190
+ catalog,
191
+ program,
192
+ typeChecker,
193
+ sourceFile: sf,
194
+ projectDirAbs: PROJECT_DIR,
195
+ crossPackage: buildCrossPackageContext(catalog, PROJECT_DIR),
196
+ importSpecifiers: buildImportSpecifierIndex(sf),
197
+ };
198
+ // Re-read the program's copy of the source file so symbols bind.
199
+ const boundSf = program.getSourceFile(fileAbs);
200
+ let target;
201
+ const visit = (n) => {
202
+ if (ts.isIdentifier(n) && n.text === 'ref')
203
+ target = n;
204
+ ts.forEachChild(n, visit);
205
+ };
206
+ visit(boundSf);
207
+ return { node: target, ctx: { ...ctx, sourceFile: boundSf } };
208
+ }
209
+ it('returns UNRESOLVED (unknown) when the identifier has no symbol', () => {
210
+ // `ref` is undeclared → getSymbolAtLocation returns undefined.
211
+ const { node, ctx } = programCtx('function use(): unknown { return ref; }');
212
+ const v = resolveValueReference(node, ctx);
213
+ expect(v.to).toEqual([]);
214
+ expect(v.resolution).toBe('unknown');
215
+ expect(v.confidence).toBe('low');
216
+ });
217
+ it('returns UNRESOLVED for a symbol whose declaration is not function-shaped', () => {
218
+ // `ref` resolves to a plain number variable — no function-shaped
219
+ // declaration → hashFromDeclaration returns null for every decl.
220
+ const { node, ctx } = programCtx('const num = 1; const ref = num; function use(): number { return ref; }');
221
+ const v = resolveValueReference(node, ctx);
222
+ expect(v.to).toEqual([]);
223
+ expect(v.resolution).toBe('unknown');
224
+ });
225
+ });
226
+ //# sourceMappingURL=value-reference-unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-reference-unit.test.js","sourceRoot":"","sources":["../../src/__tests__/value-reference-unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Value-reference + shorthand-assignment edge resolution
3
+ * (edges-value-reference.ts).
4
+ *
5
+ * The exact-mode pipeline records bare Identifier value references
6
+ * (function passed as an argument, returned, defaulted) and
7
+ * ShorthandPropertyAssignment nodes (`{ fn }`) as call sites, then
8
+ * resolves the referenced symbol to its catalog bodyHash. These tests
9
+ * drive the full pipeline over fixtures that hand functions around as
10
+ * VALUES (not invoked) so a handoff edge is emitted, covering the
11
+ * function-declaration, arrow-in-variable, function-expression, and
12
+ * class-constructor declaration branches of `hashFromDeclaration`.
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=value-reference.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-reference.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/value-reference.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Value-reference + shorthand-assignment edge resolution
3
+ * (edges-value-reference.ts).
4
+ *
5
+ * The exact-mode pipeline records bare Identifier value references
6
+ * (function passed as an argument, returned, defaulted) and
7
+ * ShorthandPropertyAssignment nodes (`{ fn }`) as call sites, then
8
+ * resolves the referenced symbol to its catalog bodyHash. These tests
9
+ * drive the full pipeline over fixtures that hand functions around as
10
+ * VALUES (not invoked) so a handoff edge is emitted, covering the
11
+ * function-declaration, arrow-in-variable, function-expression, and
12
+ * class-constructor declaration branches of `hashFromDeclaration`.
13
+ */
14
+ import { mkdtempSync, rmSync } from 'node:fs';
15
+ import { tmpdir } from 'node:os';
16
+ import { join } from 'node:path';
17
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest';
18
+ import { findOccurrence, runFixture, writeFixture } from './acceptance/_fixture-runner.js';
19
+ describe('value-reference + shorthand edge resolution', () => {
20
+ const fixtureDir = mkdtempSync(join(tmpdir(), 'graph-value-ref-'));
21
+ afterAll(() => {
22
+ rmSync(fixtureDir, { recursive: true, force: true });
23
+ });
24
+ writeFixture(fixtureDir, {
25
+ // A top-level function declaration handed to another function as a
26
+ // VALUE argument (not called). The reference is an Identifier in a
27
+ // value position → resolveValueReference → function-declaration branch.
28
+ 'fn-decl-handoff.ts': `
29
+ export function handler(): number { return 1; }
30
+ function register(cb: () => number): void { void cb; }
31
+ export function wire(): void {
32
+ register(handler);
33
+ }
34
+ `,
35
+ // Shorthand property assignment `{ handler }` — exercises
36
+ // resolveShorthandAssignment + getShorthandAssignmentValueSymbol.
37
+ 'shorthand.ts': `
38
+ export function shorthandTarget(): number { return 2; }
39
+ export function buildBag(): { shorthandTarget: () => number } {
40
+ return { shorthandTarget };
41
+ }
42
+ `,
43
+ // Arrow function assigned to a const, then passed as a value.
44
+ // Exercises the VariableDeclaration + ArrowFunction initializer
45
+ // branch of hashFromDeclaration.
46
+ 'arrow-handoff.ts': `
47
+ const arrowFn = (): number => 3;
48
+ function take(cb: () => number): void { void cb; }
49
+ export function passArrow(): void {
50
+ take(arrowFn);
51
+ }
52
+ `,
53
+ // Function-expression assigned to a const, then passed as a value.
54
+ 'fn-expr-handoff.ts': `
55
+ const exprFn = function (): number { return 4; };
56
+ function consume(cb: () => number): void { void cb; }
57
+ export function passExpr(): void {
58
+ consume(exprFn);
59
+ }
60
+ `,
61
+ // Class referenced as a VALUE (passed as an argument), not via
62
+ // `new`. Exercises hashFromDeclaration's class-declaration branch:
63
+ // it resolves to the class's constructor catalog entry.
64
+ 'class-value.ts': `
65
+ export class Widget {
66
+ constructor() { /* ctor body so a constructor occurrence exists */ }
67
+ }
68
+ function useCtor(c: new () => Widget): void { void c; }
69
+ export function passClass(): void {
70
+ useCtor(Widget);
71
+ }
72
+ `,
73
+ });
74
+ let catalog;
75
+ beforeAll(async () => {
76
+ catalog = await runFixture(fixtureDir);
77
+ });
78
+ it('builds a catalog (sanity)', () => {
79
+ expect(Object.keys(catalog.functions).length).toBeGreaterThan(0);
80
+ });
81
+ it('resolves a function declaration passed as a value argument', () => {
82
+ const occ = findOccurrence(catalog, (o) => o.simpleName === 'wire');
83
+ expect(occ).toBeDefined();
84
+ // The handoff of `handler` as a value yields an edge from wire.
85
+ const edge = occ.calls.find((e) => e.text.includes('handler') || e.text.includes('register'));
86
+ expect(edge).toBeDefined();
87
+ });
88
+ it('resolves a shorthand property assignment to its function', () => {
89
+ const occ = findOccurrence(catalog, (o) => o.simpleName === 'buildBag');
90
+ expect(occ).toBeDefined();
91
+ const edge = occ.calls.find((e) => e.text.includes('shorthandTarget'));
92
+ expect(edge).toBeDefined();
93
+ expect(edge.to.length).toBeGreaterThan(0);
94
+ });
95
+ it('resolves an arrow-in-variable referenced as a value', () => {
96
+ const occ = findOccurrence(catalog, (o) => o.simpleName === 'passArrow');
97
+ expect(occ).toBeDefined();
98
+ const edge = occ.calls.find((e) => e.to.length > 0);
99
+ expect(edge).toBeDefined();
100
+ });
101
+ it('resolves a function-expression-in-variable referenced as a value', () => {
102
+ const occ = findOccurrence(catalog, (o) => o.simpleName === 'passExpr');
103
+ expect(occ).toBeDefined();
104
+ const edge = occ.calls.find((e) => e.to.length > 0);
105
+ expect(edge).toBeDefined();
106
+ });
107
+ it('resolves a class referenced as a value to its constructor entry', () => {
108
+ const occ = findOccurrence(catalog, (o) => o.simpleName === 'passClass');
109
+ expect(occ).toBeDefined();
110
+ // Widget-as-value resolves to the class constructor's catalog entry.
111
+ const edge = occ.calls.find((e) => e.text.includes('Widget') && e.to.length > 0);
112
+ expect(edge).toBeDefined();
113
+ });
114
+ });
115
+ //# sourceMappingURL=value-reference.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-reference.test.js","sourceRoot":"","sources":["../../src/__tests__/value-reference.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tests that the walk yields the same occurrences/call-site records from
3
+ * the fast source-file map as from an exact ts.Program — the walk is
4
+ * structural and mode-agnostic, so the two parse tiers must produce an
5
+ * identical inventory.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=walk-fast.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk-fast.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/walk-fast.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Tests that the walk yields the same occurrences/call-site records from
3
+ * the fast source-file map as from an exact ts.Program — the walk is
4
+ * structural and mode-agnostic, so the two parse tiers must produce an
5
+ * identical inventory.
6
+ */
7
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
8
+ import { tmpdir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
11
+ import { parseProject } from '../parse.js';
12
+ import { walkProgram } from '../walk.js';
13
+ const SOURCE = `
14
+ import { dep } from './dep.js';
15
+ export function top() { return dep(); }
16
+ function helper() { return top(); }
17
+ export const arrow = () => helper();
18
+ class C { method() { return arrow(); } }
19
+ `;
20
+ describe('walkProgram — fast vs exact source files', () => {
21
+ let dir;
22
+ beforeEach(() => {
23
+ dir = mkdtempSync(join(tmpdir(), 'graph-ts-walkfast-'));
24
+ });
25
+ afterEach(() => {
26
+ rmSync(dir, { recursive: true, force: true });
27
+ });
28
+ it('produces the same occurrence names and call-site count from either tier', () => {
29
+ const a = join(dir, 'a.ts');
30
+ const depFile = join(dir, 'dep.ts');
31
+ writeFileSync(a, SOURCE, 'utf8');
32
+ writeFileSync(depFile, 'export function dep() { return 0; }\n', 'utf8');
33
+ const files = [a, depFile];
34
+ const exactParsed = parseProject({ projectDirAbs: dir, files, resolutionMode: 'exact' });
35
+ const fastParsed = parseProject({ projectDirAbs: dir, files, resolutionMode: 'fast' });
36
+ if (exactParsed.project.kind !== 'exact' || fastParsed.project.kind !== 'fast') {
37
+ throw new Error('unexpected parse tiers');
38
+ }
39
+ const exactSf = exactParsed.project.program.getSourceFiles();
40
+ const fastSf = fastParsed.project.sourceFiles.values();
41
+ const exactWalk = walkProgram({ sourceFiles: exactSf, files, projectDirAbs: dir });
42
+ const fastWalk = walkProgram({ sourceFiles: fastSf, files, projectDirAbs: dir });
43
+ const names = (w) => Object.keys(w.functions).sort();
44
+ expect(names(fastWalk)).toEqual(names(exactWalk));
45
+ // Same number of located call sites (resolution differs, location does not).
46
+ expect(fastWalk.callSites.length).toBe(exactWalk.callSites.length);
47
+ // Sanity: the inventory actually contains the declared functions.
48
+ expect(names(fastWalk)).toEqual(expect.arrayContaining(['top', 'helper', 'arrow', 'method']));
49
+ });
50
+ });
51
+ //# sourceMappingURL=walk-fast.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk-fast.test.js","sourceRoot":"","sources":["../../src/__tests__/walk-fast.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Re-export capture (`collectReExports`): the walk records the data the engine's
3
+ * export index needs to follow re-export chains. Covers both TS forms plus the
4
+ * "local definition export is not a re-export" exclusion.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=walk-reexports.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk-reexports.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/walk-reexports.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Re-export capture (`collectReExports`): the walk records the data the engine's
3
+ * export index needs to follow re-export chains. Covers both TS forms plus the
4
+ * "local definition export is not a re-export" exclusion.
5
+ */
6
+ import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
7
+ import { tmpdir } from 'node:os';
8
+ import { join } from 'node:path';
9
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
10
+ import { parseProject } from '../parse.js';
11
+ import { walkProgram } from '../walk.js';
12
+ describe('walkProgram — re-export capture', () => {
13
+ let dir;
14
+ beforeEach(() => {
15
+ dir = mkdtempSync(join(tmpdir(), 'graph-ts-reexp-'));
16
+ });
17
+ afterEach(() => {
18
+ rmSync(dir, { recursive: true, force: true });
19
+ });
20
+ function reExportsOf(source) {
21
+ const f = join(dir, 'index.ts');
22
+ writeFileSync(f, source, 'utf8');
23
+ const files = [f];
24
+ const parsed = parseProject({ projectDirAbs: dir, files, resolutionMode: 'exact' });
25
+ if (parsed.project.kind !== 'exact')
26
+ throw new Error('expected exact tier');
27
+ const out = walkProgram({
28
+ sourceFiles: parsed.project.program.getSourceFiles(),
29
+ files,
30
+ projectDirAbs: dir,
31
+ });
32
+ return [...out.reExports].sort((a, b) => a.exportedName.localeCompare(b.exportedName));
33
+ }
34
+ it('captures `export { x, y as z } from spec`', () => {
35
+ expect(reExportsOf(`export { childrenOf, nameOf as renamed } from '@scope/ts';\n`)).toEqual([
36
+ {
37
+ fromFile: 'index.ts',
38
+ exportedName: 'childrenOf',
39
+ sourceName: 'childrenOf',
40
+ specifier: '@scope/ts',
41
+ },
42
+ {
43
+ fromFile: 'index.ts',
44
+ exportedName: 'renamed',
45
+ sourceName: 'nameOf',
46
+ specifier: '@scope/ts',
47
+ },
48
+ ]);
49
+ });
50
+ it('captures the import-then-re-export idiom `export { x }` (no `from`)', () => {
51
+ expect(reExportsOf(`import { childrenOf } from '@scope/ts';\nexport { childrenOf };\n`)).toEqual([
52
+ {
53
+ fromFile: 'index.ts',
54
+ exportedName: 'childrenOf',
55
+ sourceName: 'childrenOf',
56
+ specifier: '@scope/ts',
57
+ },
58
+ ]);
59
+ });
60
+ it('captures an aliased import-then-re-export', () => {
61
+ expect(reExportsOf(`import { nameOf } from '@scope/ts';\nexport { nameOf as renamed };\n`)).toEqual([
62
+ {
63
+ fromFile: 'index.ts',
64
+ exportedName: 'renamed',
65
+ sourceName: 'nameOf',
66
+ specifier: '@scope/ts',
67
+ },
68
+ ]);
69
+ });
70
+ it('captures `export * from spec`', () => {
71
+ expect(reExportsOf(`export * from '@scope/ts';\n`)).toEqual([
72
+ { fromFile: 'index.ts', exportedName: '*', sourceName: '*', specifier: '@scope/ts' },
73
+ ]);
74
+ });
75
+ it('does NOT treat a local definition export as a re-export', () => {
76
+ expect(reExportsOf(`function localFn() { return 1; }\nexport { localFn };\n`)).toEqual([]);
77
+ });
78
+ });
79
+ //# sourceMappingURL=walk-reexports.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk-reexports.test.js","sourceRoot":"","sources":["../../src/__tests__/walk-reexports.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * TypeScript cacheKey implementation.
3
+ *
4
+ * Produces `ts-${ts.version}-adapter-${adapterVersion}-${resolutionMode}-${resolvedTsconfigHash}`.
5
+ * Stored in Catalog.cacheKey (v3 shape introduced by the language-pluggability
6
+ * work). Replaces the v2 fields `tsCompilerVersion` and `tsConfigPath` that lived
7
+ * as separate top-level catalog properties.
8
+ *
9
+ * The resolution mode is part of the key so a fast catalog and an exact catalog
10
+ * for the same tsconfig occupy distinct `cache_key` rows in the datastore —
11
+ * switching `--resolution` is a clean cache miss against the other tier, never a
12
+ * wrong-tier reuse. No schema change is needed; the existing `cache_key` column
13
+ * carries the mode.
14
+ *
15
+ * F2 — RESOLVED tsconfig (extends-aware). Earlier this hashed only the NAMED
16
+ * tsconfig file's RAW content. But package tsconfigs `extends` a shared base
17
+ * (`tsconfig.base.json`), and editing the base's `paths`/`baseUrl`/
18
+ * `moduleResolution` changes module resolution → different edges — WITHOUT
19
+ * changing the named file's bytes. Every shard fragment would then cache-hit a
20
+ * stale fragment → a silently-wrong graph (`--no-cache` recovers, but only if you
21
+ * know to). We now hash the RESOLVED `compilerOptions` (TS walks the `extends`
22
+ * chain for us via `parseJsonConfigFileContent`), stable-stringified, so any
23
+ * extends-base edit that affects resolution invalidates the key.
24
+ *
25
+ * F5 — adapter package version. The engine version is folded in separately at
26
+ * the engine boundary (`stampEngineVersion`, ADR-0015), but a
27
+ * `@opensip-cli/graph-typescript` resolver fix shipped WITHOUT an engine
28
+ * version bump (possible under independent versioning, ADR-0012) would reuse
29
+ * stale fragments. Folding the adapter's OWN package version closes that:
30
+ * belt-and-suspenders while engine + adapters ship in lockstep (3.0.0 today),
31
+ * load-bearing the moment they diverge.
32
+ *
33
+ * Per contract invariant I-6 (cacheKey is stable for stable input): the function
34
+ * is purely a function of
35
+ * `(ts.version, adapterVersion, resolutionMode, resolvedTsconfigOptions)`. If the
36
+ * tsconfig file is missing/unreadable on disk we fall back to a literal marker so
37
+ * two calls without a (readable) tsconfig still match.
38
+ */
39
+ import type { CacheKeyInput } from '@opensip-cli/graph';
40
+ export declare function cacheKey(input: CacheKeyInput): string;
41
+ //# sourceMappingURL=cache-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-key.d.ts","sourceRoot":"","sources":["../src/cache-key.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AASH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQxD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAGrD"}