@grafema/core 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +76 -0
  3. package/dist/Orchestrator.d.ts +142 -0
  4. package/dist/Orchestrator.d.ts.map +1 -0
  5. package/dist/Orchestrator.js +481 -0
  6. package/dist/api/GraphAPI.d.ts +87 -0
  7. package/dist/api/GraphAPI.d.ts.map +1 -0
  8. package/dist/api/GraphAPI.js +210 -0
  9. package/dist/api/GuaranteeAPI.d.ts +147 -0
  10. package/dist/api/GuaranteeAPI.d.ts.map +1 -0
  11. package/dist/api/GuaranteeAPI.js +288 -0
  12. package/dist/core/ASTWorker.d.ts +133 -0
  13. package/dist/core/ASTWorker.d.ts.map +1 -0
  14. package/dist/core/ASTWorker.js +352 -0
  15. package/dist/core/ASTWorkerPool.d.ts +85 -0
  16. package/dist/core/ASTWorkerPool.d.ts.map +1 -0
  17. package/dist/core/ASTWorkerPool.js +207 -0
  18. package/dist/core/AnalysisQueue.d.ts +104 -0
  19. package/dist/core/AnalysisQueue.d.ts.map +1 -0
  20. package/dist/core/AnalysisQueue.js +299 -0
  21. package/dist/core/AnalysisWorker.d.ts +14 -0
  22. package/dist/core/AnalysisWorker.d.ts.map +1 -0
  23. package/dist/core/AnalysisWorker.js +307 -0
  24. package/dist/core/GraphBackend.d.ts +156 -0
  25. package/dist/core/GraphBackend.d.ts.map +1 -0
  26. package/dist/core/GraphBackend.js +85 -0
  27. package/dist/core/GuaranteeManager.d.ts +230 -0
  28. package/dist/core/GuaranteeManager.d.ts.map +1 -0
  29. package/dist/core/GuaranteeManager.js +352 -0
  30. package/dist/core/ManifestStore.d.ts +71 -0
  31. package/dist/core/ManifestStore.d.ts.map +1 -0
  32. package/dist/core/ManifestStore.js +146 -0
  33. package/dist/core/NodeFactory.d.ts +160 -0
  34. package/dist/core/NodeFactory.d.ts.map +1 -0
  35. package/dist/core/NodeFactory.js +137 -0
  36. package/dist/core/NodeId.d.ts +88 -0
  37. package/dist/core/NodeId.d.ts.map +1 -0
  38. package/dist/core/NodeId.js +170 -0
  39. package/dist/core/ParallelAnalyzer.d.ts +120 -0
  40. package/dist/core/ParallelAnalyzer.d.ts.map +1 -0
  41. package/dist/core/ParallelAnalyzer.js +331 -0
  42. package/dist/core/PriorityQueue.d.ts +106 -0
  43. package/dist/core/PriorityQueue.d.ts.map +1 -0
  44. package/dist/core/PriorityQueue.js +168 -0
  45. package/dist/core/Profiler.d.ts +75 -0
  46. package/dist/core/Profiler.d.ts.map +1 -0
  47. package/dist/core/Profiler.js +149 -0
  48. package/dist/core/QueueWorker.d.ts +12 -0
  49. package/dist/core/QueueWorker.d.ts.map +1 -0
  50. package/dist/core/QueueWorker.js +567 -0
  51. package/dist/core/RFDBClient.d.ts +179 -0
  52. package/dist/core/RFDBClient.d.ts.map +1 -0
  53. package/dist/core/RFDBClient.js +429 -0
  54. package/dist/core/Task.d.ts +56 -0
  55. package/dist/core/Task.d.ts.map +1 -0
  56. package/dist/core/Task.js +85 -0
  57. package/dist/core/TaskTypes.d.ts +20 -0
  58. package/dist/core/TaskTypes.d.ts.map +1 -0
  59. package/dist/core/TaskTypes.js +10 -0
  60. package/dist/core/VersionManager.d.ts +166 -0
  61. package/dist/core/VersionManager.d.ts.map +1 -0
  62. package/dist/core/VersionManager.js +237 -0
  63. package/dist/core/WorkerPool.d.ts +82 -0
  64. package/dist/core/WorkerPool.d.ts.map +1 -0
  65. package/dist/core/WorkerPool.js +109 -0
  66. package/dist/core/nodes/CallSiteNode.d.ts +26 -0
  67. package/dist/core/nodes/CallSiteNode.d.ts.map +1 -0
  68. package/dist/core/nodes/CallSiteNode.js +44 -0
  69. package/dist/core/nodes/ClassNode.d.ts +25 -0
  70. package/dist/core/nodes/ClassNode.d.ts.map +1 -0
  71. package/dist/core/nodes/ClassNode.js +40 -0
  72. package/dist/core/nodes/ConstantNode.d.ts +24 -0
  73. package/dist/core/nodes/ConstantNode.d.ts.map +1 -0
  74. package/dist/core/nodes/ConstantNode.js +39 -0
  75. package/dist/core/nodes/DatabaseQueryNode.d.ts +22 -0
  76. package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -0
  77. package/dist/core/nodes/DatabaseQueryNode.js +37 -0
  78. package/dist/core/nodes/EntrypointNode.d.ts +102 -0
  79. package/dist/core/nodes/EntrypointNode.d.ts.map +1 -0
  80. package/dist/core/nodes/EntrypointNode.js +119 -0
  81. package/dist/core/nodes/EventListenerNode.d.ts +25 -0
  82. package/dist/core/nodes/EventListenerNode.d.ts.map +1 -0
  83. package/dist/core/nodes/EventListenerNode.js +39 -0
  84. package/dist/core/nodes/ExportNode.d.ts +26 -0
  85. package/dist/core/nodes/ExportNode.d.ts.map +1 -0
  86. package/dist/core/nodes/ExportNode.js +40 -0
  87. package/dist/core/nodes/ExternalStdioNode.d.ts +17 -0
  88. package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -0
  89. package/dist/core/nodes/ExternalStdioNode.js +26 -0
  90. package/dist/core/nodes/FunctionNode.d.ts +27 -0
  91. package/dist/core/nodes/FunctionNode.d.ts.map +1 -0
  92. package/dist/core/nodes/FunctionNode.js +53 -0
  93. package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
  94. package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
  95. package/dist/core/nodes/GuaranteeNode.js +117 -0
  96. package/dist/core/nodes/HttpRequestNode.d.ts +24 -0
  97. package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -0
  98. package/dist/core/nodes/HttpRequestNode.js +38 -0
  99. package/dist/core/nodes/ImportNode.d.ts +27 -0
  100. package/dist/core/nodes/ImportNode.d.ts.map +1 -0
  101. package/dist/core/nodes/ImportNode.js +43 -0
  102. package/dist/core/nodes/LiteralNode.d.ts +26 -0
  103. package/dist/core/nodes/LiteralNode.d.ts.map +1 -0
  104. package/dist/core/nodes/LiteralNode.js +40 -0
  105. package/dist/core/nodes/MethodCallNode.d.ts +29 -0
  106. package/dist/core/nodes/MethodCallNode.d.ts.map +1 -0
  107. package/dist/core/nodes/MethodCallNode.js +47 -0
  108. package/dist/core/nodes/MethodNode.d.ts +29 -0
  109. package/dist/core/nodes/MethodNode.d.ts.map +1 -0
  110. package/dist/core/nodes/MethodNode.js +44 -0
  111. package/dist/core/nodes/ModuleNode.d.ts +29 -0
  112. package/dist/core/nodes/ModuleNode.d.ts.map +1 -0
  113. package/dist/core/nodes/ModuleNode.js +49 -0
  114. package/dist/core/nodes/NodeKind.d.ts +91 -0
  115. package/dist/core/nodes/NodeKind.d.ts.map +1 -0
  116. package/dist/core/nodes/NodeKind.js +146 -0
  117. package/dist/core/nodes/ParameterNode.d.ts +26 -0
  118. package/dist/core/nodes/ParameterNode.d.ts.map +1 -0
  119. package/dist/core/nodes/ParameterNode.js +43 -0
  120. package/dist/core/nodes/ScopeNode.d.ts +32 -0
  121. package/dist/core/nodes/ScopeNode.d.ts.map +1 -0
  122. package/dist/core/nodes/ScopeNode.js +47 -0
  123. package/dist/core/nodes/ServiceNode.d.ts +44 -0
  124. package/dist/core/nodes/ServiceNode.d.ts.map +1 -0
  125. package/dist/core/nodes/ServiceNode.js +49 -0
  126. package/dist/core/nodes/VariableDeclarationNode.d.ts +22 -0
  127. package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -0
  128. package/dist/core/nodes/VariableDeclarationNode.js +38 -0
  129. package/dist/core/nodes/index.d.ts +25 -0
  130. package/dist/core/nodes/index.d.ts.map +1 -0
  131. package/dist/core/nodes/index.js +30 -0
  132. package/dist/index.d.ts +57 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +63 -0
  135. package/dist/plugins/Plugin.d.ts +44 -0
  136. package/dist/plugins/Plugin.d.ts.map +1 -0
  137. package/dist/plugins/Plugin.js +46 -0
  138. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts +23 -0
  139. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -0
  140. package/dist/plugins/analysis/DatabaseAnalyzer.js +260 -0
  141. package/dist/plugins/analysis/ExpressAnalyzer.d.ts +19 -0
  142. package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -0
  143. package/dist/plugins/analysis/ExpressAnalyzer.js +306 -0
  144. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts +17 -0
  145. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -0
  146. package/dist/plugins/analysis/ExpressRouteAnalyzer.js +308 -0
  147. package/dist/plugins/analysis/FetchAnalyzer.d.ts +38 -0
  148. package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -0
  149. package/dist/plugins/analysis/FetchAnalyzer.js +344 -0
  150. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +65 -0
  151. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -0
  152. package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +472 -0
  153. package/dist/plugins/analysis/JSASTAnalyzer.d.ts +84 -0
  154. package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -0
  155. package/dist/plugins/analysis/JSASTAnalyzer.js +1378 -0
  156. package/dist/plugins/analysis/ReactAnalyzer.d.ts +90 -0
  157. package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -0
  158. package/dist/plugins/analysis/ReactAnalyzer.js +1153 -0
  159. package/dist/plugins/analysis/RustAnalyzer.d.ts +13 -0
  160. package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -0
  161. package/dist/plugins/analysis/RustAnalyzer.js +259 -0
  162. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts +21 -0
  163. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -0
  164. package/dist/plugins/analysis/SQLiteAnalyzer.js +317 -0
  165. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts +35 -0
  166. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -0
  167. package/dist/plugins/analysis/ServiceLayerAnalyzer.js +303 -0
  168. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +33 -0
  169. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -0
  170. package/dist/plugins/analysis/SocketIOAnalyzer.js +283 -0
  171. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts +27 -0
  172. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -0
  173. package/dist/plugins/analysis/SystemDbAnalyzer.js +211 -0
  174. package/dist/plugins/analysis/ast/ConditionParser.d.ts +85 -0
  175. package/dist/plugins/analysis/ast/ConditionParser.d.ts.map +1 -0
  176. package/dist/plugins/analysis/ast/ConditionParser.js +277 -0
  177. package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts +15 -0
  178. package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts.map +1 -0
  179. package/dist/plugins/analysis/ast/ExpressionEvaluator.js +91 -0
  180. package/dist/plugins/analysis/ast/GraphBuilder.d.ts +77 -0
  181. package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -0
  182. package/dist/plugins/analysis/ast/GraphBuilder.js +1077 -0
  183. package/dist/plugins/analysis/ast/OxcAdapter.d.ts +41 -0
  184. package/dist/plugins/analysis/ast/OxcAdapter.d.ts.map +1 -0
  185. package/dist/plugins/analysis/ast/OxcAdapter.js +40 -0
  186. package/dist/plugins/analysis/ast/types.d.ts +346 -0
  187. package/dist/plugins/analysis/ast/types.d.ts.map +1 -0
  188. package/dist/plugins/analysis/ast/types.js +4 -0
  189. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +93 -0
  190. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -0
  191. package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +24 -0
  192. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +77 -0
  193. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -0
  194. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +377 -0
  195. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +27 -0
  196. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -0
  197. package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +232 -0
  198. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +25 -0
  199. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -0
  200. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +172 -0
  201. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +29 -0
  202. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -0
  203. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +180 -0
  204. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +14 -0
  205. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -0
  206. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +200 -0
  207. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +45 -0
  208. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -0
  209. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +150 -0
  210. package/dist/plugins/analysis/ast/visitors/index.d.ts +17 -0
  211. package/dist/plugins/analysis/ast/visitors/index.d.ts.map +1 -0
  212. package/dist/plugins/analysis/ast/visitors/index.js +13 -0
  213. package/dist/plugins/discovery/DiscoveryPlugin.d.ts +34 -0
  214. package/dist/plugins/discovery/DiscoveryPlugin.d.ts.map +1 -0
  215. package/dist/plugins/discovery/DiscoveryPlugin.js +26 -0
  216. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts +26 -0
  217. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -0
  218. package/dist/plugins/discovery/MonorepoServiceDiscovery.js +79 -0
  219. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts +14 -0
  220. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -0
  221. package/dist/plugins/discovery/SimpleProjectDiscovery.js +65 -0
  222. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +19 -0
  223. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +1 -0
  224. package/dist/plugins/discovery/ZonServiceDiscovery.js +204 -0
  225. package/dist/plugins/enrichment/AliasTracker.d.ts +40 -0
  226. package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -0
  227. package/dist/plugins/enrichment/AliasTracker.js +290 -0
  228. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +30 -0
  229. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -0
  230. package/dist/plugins/enrichment/HTTPConnectionEnricher.js +135 -0
  231. package/dist/plugins/enrichment/ImportExportLinker.d.ts +30 -0
  232. package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -0
  233. package/dist/plugins/enrichment/ImportExportLinker.js +176 -0
  234. package/dist/plugins/enrichment/InstanceOfResolver.d.ts +21 -0
  235. package/dist/plugins/enrichment/InstanceOfResolver.d.ts.map +1 -0
  236. package/dist/plugins/enrichment/InstanceOfResolver.js +117 -0
  237. package/dist/plugins/enrichment/MethodCallResolver.d.ts +41 -0
  238. package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -0
  239. package/dist/plugins/enrichment/MethodCallResolver.js +252 -0
  240. package/dist/plugins/enrichment/MountPointResolver.d.ts +26 -0
  241. package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -0
  242. package/dist/plugins/enrichment/MountPointResolver.js +189 -0
  243. package/dist/plugins/enrichment/PrefixEvaluator.d.ts +89 -0
  244. package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -0
  245. package/dist/plugins/enrichment/PrefixEvaluator.js +415 -0
  246. package/dist/plugins/enrichment/RustFFIEnricher.d.ts +25 -0
  247. package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -0
  248. package/dist/plugins/enrichment/RustFFIEnricher.js +170 -0
  249. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +114 -0
  250. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -0
  251. package/dist/plugins/enrichment/ValueDomainAnalyzer.js +464 -0
  252. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts +27 -0
  253. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -0
  254. package/dist/plugins/indexing/IncrementalModuleIndexer.js +238 -0
  255. package/dist/plugins/indexing/JSModuleIndexer.d.ts +33 -0
  256. package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -0
  257. package/dist/plugins/indexing/JSModuleIndexer.js +299 -0
  258. package/dist/plugins/indexing/RustModuleIndexer.d.ts +28 -0
  259. package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -0
  260. package/dist/plugins/indexing/RustModuleIndexer.js +140 -0
  261. package/dist/plugins/indexing/ServiceDetector.d.ts +46 -0
  262. package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -0
  263. package/dist/plugins/indexing/ServiceDetector.js +164 -0
  264. package/dist/plugins/validation/CallResolverValidator.d.ts +23 -0
  265. package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -0
  266. package/dist/plugins/validation/CallResolverValidator.js +108 -0
  267. package/dist/plugins/validation/DataFlowValidator.d.ts +24 -0
  268. package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -0
  269. package/dist/plugins/validation/DataFlowValidator.js +148 -0
  270. package/dist/plugins/validation/EvalBanValidator.d.ts +25 -0
  271. package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -0
  272. package/dist/plugins/validation/EvalBanValidator.js +123 -0
  273. package/dist/plugins/validation/GraphConnectivityValidator.d.ts +11 -0
  274. package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -0
  275. package/dist/plugins/validation/GraphConnectivityValidator.js +135 -0
  276. package/dist/plugins/validation/SQLInjectionValidator.d.ts +43 -0
  277. package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -0
  278. package/dist/plugins/validation/SQLInjectionValidator.js +251 -0
  279. package/dist/plugins/validation/ShadowingDetector.d.ts +26 -0
  280. package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -0
  281. package/dist/plugins/validation/ShadowingDetector.js +119 -0
  282. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts +21 -0
  283. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -0
  284. package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +151 -0
  285. package/dist/plugins/vcs/GitPlugin.d.ts +84 -0
  286. package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -0
  287. package/dist/plugins/vcs/GitPlugin.js +295 -0
  288. package/dist/plugins/vcs/VCSPlugin.d.ts +133 -0
  289. package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -0
  290. package/dist/plugins/vcs/VCSPlugin.js +82 -0
  291. package/dist/plugins/vcs/index.d.ts +10 -0
  292. package/dist/plugins/vcs/index.d.ts.map +1 -0
  293. package/dist/plugins/vcs/index.js +18 -0
  294. package/dist/storage/backends/RFDBServerBackend.d.ts +258 -0
  295. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
  296. package/dist/storage/backends/RFDBServerBackend.js +565 -0
  297. package/dist/storage/backends/typeValidation.d.ts +47 -0
  298. package/dist/storage/backends/typeValidation.d.ts.map +1 -0
  299. package/dist/storage/backends/typeValidation.js +137 -0
  300. package/dist/validation/PathValidator.d.ts +81 -0
  301. package/dist/validation/PathValidator.d.ts.map +1 -0
  302. package/dist/validation/PathValidator.js +251 -0
  303. package/package.json +57 -0
  304. package/src/.rfguard/current-session.txt +1 -0
  305. package/src/Orchestrator.ts +673 -0
  306. package/src/api/GraphAPI.ts +305 -0
  307. package/src/api/GuaranteeAPI.ts +401 -0
  308. package/src/core/ASTWorker.ts +567 -0
  309. package/src/core/ASTWorkerPool.ts +299 -0
  310. package/src/core/AnalysisQueue.ts +447 -0
  311. package/src/core/AnalysisWorker.ts +410 -0
  312. package/src/core/GraphBackend.ts +265 -0
  313. package/src/core/GuaranteeManager.ts +581 -0
  314. package/src/core/ManifestStore.ts +196 -0
  315. package/src/core/NodeFactory.ts +274 -0
  316. package/src/core/NodeId.ts +257 -0
  317. package/src/core/ParallelAnalyzer.ts +476 -0
  318. package/src/core/PriorityQueue.ts +227 -0
  319. package/src/core/Profiler.ts +188 -0
  320. package/src/core/QueueWorker.ts +780 -0
  321. package/src/core/Task.ts +107 -0
  322. package/src/core/TaskTypes.ts +40 -0
  323. package/src/core/VersionManager.ts +404 -0
  324. package/src/core/WorkerPool.ts +180 -0
  325. package/src/core/nodes/CallSiteNode.ts +72 -0
  326. package/src/core/nodes/ClassNode.ts +69 -0
  327. package/src/core/nodes/ConstantNode.ts +63 -0
  328. package/src/core/nodes/DatabaseQueryNode.ts +60 -0
  329. package/src/core/nodes/EntrypointNode.ts +164 -0
  330. package/src/core/nodes/EventListenerNode.ts +64 -0
  331. package/src/core/nodes/ExportNode.ts +71 -0
  332. package/src/core/nodes/ExternalStdioNode.ts +36 -0
  333. package/src/core/nodes/FunctionNode.ts +78 -0
  334. package/src/core/nodes/GuaranteeNode.ts +162 -0
  335. package/src/core/nodes/HttpRequestNode.ts +63 -0
  336. package/src/core/nodes/ImportNode.ts +75 -0
  337. package/src/core/nodes/LiteralNode.ts +67 -0
  338. package/src/core/nodes/MethodCallNode.ts +79 -0
  339. package/src/core/nodes/MethodNode.ts +78 -0
  340. package/src/core/nodes/ModuleNode.ts +74 -0
  341. package/src/core/nodes/NodeKind.ts +171 -0
  342. package/src/core/nodes/ParameterNode.ts +73 -0
  343. package/src/core/nodes/ScopeNode.ts +80 -0
  344. package/src/core/nodes/ServiceNode.ts +86 -0
  345. package/src/core/nodes/VariableDeclarationNode.ts +60 -0
  346. package/src/core/nodes/index.ts +49 -0
  347. package/src/index.ts +93 -0
  348. package/src/plugins/Plugin.ts +74 -0
  349. package/src/plugins/analysis/DatabaseAnalyzer.ts +322 -0
  350. package/src/plugins/analysis/ExpressAnalyzer.ts +401 -0
  351. package/src/plugins/analysis/ExpressRouteAnalyzer.ts +414 -0
  352. package/src/plugins/analysis/FetchAnalyzer.ts +441 -0
  353. package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +686 -0
  354. package/src/plugins/analysis/JSASTAnalyzer.ts +1680 -0
  355. package/src/plugins/analysis/ReactAnalyzer.ts +1368 -0
  356. package/src/plugins/analysis/RustAnalyzer.ts +438 -0
  357. package/src/plugins/analysis/SQLiteAnalyzer.ts +388 -0
  358. package/src/plugins/analysis/ServiceLayerAnalyzer.ts +429 -0
  359. package/src/plugins/analysis/SocketIOAnalyzer.ts +395 -0
  360. package/src/plugins/analysis/SystemDbAnalyzer.ts +284 -0
  361. package/src/plugins/analysis/ast/ConditionParser.ts +333 -0
  362. package/src/plugins/analysis/ast/ExpressionEvaluator.ts +117 -0
  363. package/src/plugins/analysis/ast/GraphBuilder.ts +1371 -0
  364. package/src/plugins/analysis/ast/OxcAdapter.ts +63 -0
  365. package/src/plugins/analysis/ast/types.ts +400 -0
  366. package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +137 -0
  367. package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +528 -0
  368. package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +339 -0
  369. package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +273 -0
  370. package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +259 -0
  371. package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +235 -0
  372. package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +268 -0
  373. package/src/plugins/analysis/ast/visitors/index.ts +36 -0
  374. package/src/plugins/discovery/DiscoveryPlugin.ts +50 -0
  375. package/src/plugins/discovery/MonorepoServiceDiscovery.ts +117 -0
  376. package/src/plugins/discovery/SimpleProjectDiscovery.ts +102 -0
  377. package/src/plugins/enrichment/AliasTracker.ts +399 -0
  378. package/src/plugins/enrichment/HTTPConnectionEnricher.ts +192 -0
  379. package/src/plugins/enrichment/ImportExportLinker.ts +221 -0
  380. package/src/plugins/enrichment/InstanceOfResolver.ts +165 -0
  381. package/src/plugins/enrichment/MethodCallResolver.ts +333 -0
  382. package/src/plugins/enrichment/MountPointResolver.ts +264 -0
  383. package/src/plugins/enrichment/PrefixEvaluator.ts +527 -0
  384. package/src/plugins/enrichment/RustFFIEnricher.ts +218 -0
  385. package/src/plugins/enrichment/ValueDomainAnalyzer.ts +682 -0
  386. package/src/plugins/indexing/IncrementalModuleIndexer.ts +287 -0
  387. package/src/plugins/indexing/JSModuleIndexer.ts +374 -0
  388. package/src/plugins/indexing/RustModuleIndexer.ts +160 -0
  389. package/src/plugins/indexing/ServiceDetector.ts +230 -0
  390. package/src/plugins/validation/CallResolverValidator.ts +170 -0
  391. package/src/plugins/validation/DataFlowValidator.ts +233 -0
  392. package/src/plugins/validation/EvalBanValidator.ts +175 -0
  393. package/src/plugins/validation/GraphConnectivityValidator.ts +201 -0
  394. package/src/plugins/validation/SQLInjectionValidator.ts +363 -0
  395. package/src/plugins/validation/ShadowingDetector.ts +173 -0
  396. package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +203 -0
  397. package/src/plugins/vcs/GitPlugin.ts +344 -0
  398. package/src/plugins/vcs/VCSPlugin.ts +190 -0
  399. package/src/plugins/vcs/index.ts +32 -0
  400. package/src/storage/backends/RFDBServerBackend.ts +687 -0
  401. package/src/storage/backends/typeValidation.ts +151 -0
  402. package/src/validation/PathValidator.ts +342 -0
@@ -0,0 +1,415 @@
1
+ /**
2
+ * PrefixEvaluator - ENRICHMENT plugin for evaluating dynamic prefixes
3
+ *
4
+ * Resolves placeholders in MOUNT_POINT.prefix:
5
+ * - ${variable} → finds VariableDeclaration in the same module
6
+ * - ${binary} → recursively resolves BinaryExpression
7
+ * - ${template} → resolves TemplateLiteral with variables
8
+ * - ${member} → finds object and its property
9
+ * - ${call} → not supported yet (requires runtime eval)
10
+ * - ${conditional} → not supported yet (requires runtime eval)
11
+ */
12
+ import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
13
+ import { parse } from '@babel/parser';
14
+ import _traverse from '@babel/traverse';
15
+ import { readFileSync } from 'fs';
16
+ // ES module compatibility - handle default export
17
+ const traverseFn = _traverse.default || _traverse;
18
+ const traverse = traverseFn;
19
+ export class PrefixEvaluator extends Plugin {
20
+ get metadata() {
21
+ return {
22
+ name: 'PrefixEvaluator',
23
+ phase: 'ENRICHMENT',
24
+ priority: 80, // After MountPointResolver (90)
25
+ creates: {
26
+ nodes: [],
27
+ edges: []
28
+ },
29
+ dependencies: ['JSModuleIndexer', 'JSASTAnalyzer', 'MountPointResolver']
30
+ };
31
+ }
32
+ async execute(context) {
33
+ try {
34
+ const { graph } = context;
35
+ const graphTyped = graph;
36
+ let mountPointsEvaluated = 0;
37
+ let successfulEvaluations = 0;
38
+ // Find all MOUNT_POINT nodes with placeholder prefixes
39
+ const mountPoints = [];
40
+ if (graphTyped.nodes) {
41
+ const allNodes = await graphTyped.nodes.values();
42
+ for (const node of allNodes) {
43
+ // Cast through unknown since node types vary
44
+ const typedNode = node;
45
+ if (typedNode.type === 'MOUNT_POINT' && typedNode.prefix && typedNode.prefix.startsWith('${')) {
46
+ mountPoints.push(typedNode);
47
+ }
48
+ }
49
+ }
50
+ console.log(`[PrefixEvaluator] Found ${mountPoints.length} mount points with placeholders`);
51
+ // For each mount point try to evaluate prefix
52
+ for (const mountPoint of mountPoints) {
53
+ mountPointsEvaluated++;
54
+ // Find MODULE that defines this mount point
55
+ const definesEdges = this.findEdges(graphTyped, {
56
+ type: 'DEFINES',
57
+ dst: mountPoint.id
58
+ });
59
+ if (definesEdges.length === 0) {
60
+ console.log(`[PrefixEvaluator] No DEFINES edge for mount point ${mountPoint.id}`);
61
+ continue;
62
+ }
63
+ const moduleId = definesEdges[0].fromId;
64
+ const module = graphTyped.nodes.get(moduleId);
65
+ if (!module || module.type !== 'MODULE') {
66
+ console.log(`[PrefixEvaluator] Module not found for ${mountPoint.id}`);
67
+ continue;
68
+ }
69
+ // Parse module AST
70
+ let ast;
71
+ try {
72
+ const code = readFileSync(module.file, 'utf-8');
73
+ ast = parse(code, {
74
+ sourceType: 'module',
75
+ plugins: ['jsx', 'typescript']
76
+ });
77
+ }
78
+ catch (error) {
79
+ const err = error;
80
+ console.log(`[PrefixEvaluator] Failed to parse ${module.file}:`, err.message);
81
+ continue;
82
+ }
83
+ // Try to evaluate prefix based on placeholder type
84
+ const evaluatedPrefix = await this.evaluatePrefix(mountPoint.prefix, mountPoint.line, ast, module);
85
+ if (evaluatedPrefix && evaluatedPrefix !== mountPoint.prefix) {
86
+ mountPoint.prefix = evaluatedPrefix;
87
+ mountPoint.evaluated = true;
88
+ successfulEvaluations++;
89
+ console.log(`[PrefixEvaluator] Resolved ${mountPoint.file}:${mountPoint.line}: ${evaluatedPrefix}`);
90
+ }
91
+ }
92
+ console.log(`[PrefixEvaluator] Evaluated ${successfulEvaluations}/${mountPointsEvaluated} mount points`);
93
+ return createSuccessResult({ nodes: 0, edges: 0 }, { mountPointsEvaluated, successfulEvaluations });
94
+ }
95
+ catch (error) {
96
+ console.error(`[PrefixEvaluator] Error:`, error);
97
+ return createErrorResult(error);
98
+ }
99
+ }
100
+ /**
101
+ * Evaluate prefix based on placeholder type
102
+ */
103
+ async evaluatePrefix(placeholder, line, ast, _module) {
104
+ if (placeholder === '${variable}') {
105
+ return this.evaluateVariable(line, ast);
106
+ }
107
+ else if (placeholder === '${binary}') {
108
+ return this.evaluateBinary(line, ast);
109
+ }
110
+ else if (placeholder === '${template}') {
111
+ return this.evaluateTemplate(line, ast);
112
+ }
113
+ else if (placeholder === '${member}') {
114
+ return this.evaluateMember(line, ast);
115
+ }
116
+ // ${call}, ${conditional} - not supported yet
117
+ return null;
118
+ }
119
+ /**
120
+ * Resolve ${variable} - find VariableDeclaration
121
+ */
122
+ evaluateVariable(line, ast) {
123
+ let variableName = null;
124
+ let variableValue = null;
125
+ // First find app.use() on the target line and get variable name
126
+ traverse(ast, {
127
+ CallExpression: (path) => {
128
+ const node = path.node;
129
+ if (node.loc?.start.line === line) {
130
+ // Check if this is app.use() or router.use()
131
+ if (node.callee.type === 'MemberExpression' &&
132
+ node.callee.property.name === 'use' &&
133
+ node.arguments.length >= 2) {
134
+ const firstArg = node.arguments[0];
135
+ if (firstArg.type === 'Identifier') {
136
+ variableName = firstArg.name;
137
+ }
138
+ }
139
+ }
140
+ }
141
+ });
142
+ if (!variableName) {
143
+ return null;
144
+ }
145
+ // Now find declaration of this variable
146
+ const targetName = variableName;
147
+ traverse(ast, {
148
+ VariableDeclarator: (path) => {
149
+ const node = path.node;
150
+ if (node.id.type === 'Identifier' && node.id.name === targetName) {
151
+ if (node.init && node.init.type === 'StringLiteral') {
152
+ variableValue = node.init.value;
153
+ }
154
+ }
155
+ }
156
+ });
157
+ return variableValue;
158
+ }
159
+ /**
160
+ * Resolve ${binary} - BinaryExpression (a + b)
161
+ */
162
+ evaluateBinary(line, ast) {
163
+ let binaryExpression = null;
164
+ // Find app.use() on target line and get BinaryExpression
165
+ traverse(ast, {
166
+ CallExpression: (path) => {
167
+ const node = path.node;
168
+ if (node.loc?.start.line === line) {
169
+ if (node.callee.type === 'MemberExpression' &&
170
+ node.callee.property.name === 'use' &&
171
+ node.arguments.length >= 2) {
172
+ const firstArg = node.arguments[0];
173
+ if (firstArg.type === 'BinaryExpression') {
174
+ binaryExpression = firstArg;
175
+ }
176
+ }
177
+ }
178
+ }
179
+ });
180
+ if (!binaryExpression) {
181
+ return null;
182
+ }
183
+ // Cast to help TypeScript understand the narrowing after closure mutation
184
+ const expr = binaryExpression;
185
+ // Recursively resolve both sides of Binary Expression
186
+ const left = this.resolveExpression(expr.left, ast);
187
+ const right = this.resolveExpression(expr.right, ast);
188
+ if (left && right && expr.operator === '+') {
189
+ return left + right;
190
+ }
191
+ return null;
192
+ }
193
+ /**
194
+ * Recursively resolve arbitrary expression
195
+ */
196
+ resolveExpression(node, ast) {
197
+ if (node.type === 'StringLiteral') {
198
+ return node.value;
199
+ }
200
+ else if (node.type === 'Identifier') {
201
+ // Find variable declaration
202
+ let value = null;
203
+ const targetName = node.name;
204
+ traverse(ast, {
205
+ VariableDeclarator: (path) => {
206
+ if (path.node.id.type === 'Identifier' &&
207
+ path.node.id.name === targetName &&
208
+ path.node.init &&
209
+ path.node.init.type === 'StringLiteral') {
210
+ value = path.node.init.value;
211
+ }
212
+ }
213
+ });
214
+ return value;
215
+ }
216
+ else if (node.type === 'BinaryExpression') {
217
+ const binaryNode = node;
218
+ const left = this.resolveExpression(binaryNode.left, ast);
219
+ const right = this.resolveExpression(binaryNode.right, ast);
220
+ if (left && right && binaryNode.operator === '+') {
221
+ return left + right;
222
+ }
223
+ }
224
+ else if (node.type === 'MemberExpression') {
225
+ // Resolve MemberExpression (for TemplateLiteral with objects)
226
+ return this.resolveMemberExpression(node, ast);
227
+ }
228
+ return null;
229
+ }
230
+ /**
231
+ * Resolve ${template} - TemplateLiteral with variables
232
+ */
233
+ evaluateTemplate(line, ast) {
234
+ let templateLiteral = null;
235
+ // Find app.use() and TemplateLiteral
236
+ traverse(ast, {
237
+ CallExpression: (path) => {
238
+ const node = path.node;
239
+ if (node.loc?.start.line === line) {
240
+ if (node.callee.type === 'MemberExpression' &&
241
+ node.callee.property.name === 'use' &&
242
+ node.arguments.length >= 2) {
243
+ const firstArg = node.arguments[0];
244
+ if (firstArg.type === 'TemplateLiteral') {
245
+ templateLiteral = firstArg;
246
+ }
247
+ }
248
+ }
249
+ }
250
+ });
251
+ if (!templateLiteral) {
252
+ return null;
253
+ }
254
+ // Cast to help TypeScript understand the narrowing after closure mutation
255
+ const tmpl = templateLiteral;
256
+ // Assemble string from quasis and expressions
257
+ let result = '';
258
+ for (let i = 0; i < tmpl.quasis.length; i++) {
259
+ result += tmpl.quasis[i].value.raw;
260
+ if (i < tmpl.expressions.length) {
261
+ const expr = tmpl.expressions[i];
262
+ const resolvedValue = this.resolveExpression(expr, ast);
263
+ if (resolvedValue === null) {
264
+ return null; // Couldn't resolve expression
265
+ }
266
+ result += resolvedValue;
267
+ }
268
+ }
269
+ return result;
270
+ }
271
+ /**
272
+ * Resolve ${member} - MemberExpression (config.apiPrefix)
273
+ */
274
+ evaluateMember(line, ast) {
275
+ let memberExpression = null;
276
+ // Find app.use() and MemberExpression
277
+ traverse(ast, {
278
+ CallExpression: (path) => {
279
+ const node = path.node;
280
+ if (node.loc?.start.line === line) {
281
+ if (node.callee.type === 'MemberExpression' &&
282
+ node.callee.property.name === 'use' &&
283
+ node.arguments.length >= 2) {
284
+ const firstArg = node.arguments[0];
285
+ if (firstArg.type === 'MemberExpression') {
286
+ memberExpression = firstArg;
287
+ }
288
+ }
289
+ }
290
+ }
291
+ });
292
+ if (!memberExpression) {
293
+ return null;
294
+ }
295
+ // Resolve MemberExpression (can be nested: config.nested.path)
296
+ return this.resolveMemberExpression(memberExpression, ast);
297
+ }
298
+ /**
299
+ * Recursively resolve MemberExpression
300
+ */
301
+ resolveMemberExpression(node, ast) {
302
+ if (node.type !== 'MemberExpression') {
303
+ return null;
304
+ }
305
+ // Get path to property: config.nested.path → ['config', 'nested', 'path']
306
+ const path = [];
307
+ let current = node;
308
+ while (current.type === 'MemberExpression') {
309
+ const memberNode = current;
310
+ if (memberNode.property.type === 'Identifier') {
311
+ path.unshift(memberNode.property.name);
312
+ }
313
+ else if (memberNode.property.type === 'NumericLiteral') {
314
+ // Array access: arr[0]
315
+ path.unshift(memberNode.property.value);
316
+ }
317
+ current = memberNode.object;
318
+ }
319
+ if (current.type === 'Identifier') {
320
+ path.unshift(current.name);
321
+ }
322
+ else {
323
+ return null;
324
+ }
325
+ // Now resolve via AST
326
+ // Find object declaration
327
+ const rootName = path[0];
328
+ let objectValue = null;
329
+ traverse(ast, {
330
+ VariableDeclarator: (varPath) => {
331
+ if (varPath.node.id.type === 'Identifier' &&
332
+ varPath.node.id.name === rootName &&
333
+ varPath.node.init &&
334
+ varPath.node.init.type === 'ObjectExpression') {
335
+ objectValue = this.evaluateObjectExpression(varPath.node.init);
336
+ }
337
+ else if (varPath.node.id.type === 'Identifier' &&
338
+ varPath.node.id.name === rootName &&
339
+ varPath.node.init &&
340
+ varPath.node.init.type === 'ArrayExpression') {
341
+ objectValue = this.evaluateArrayExpression(varPath.node.init);
342
+ }
343
+ }
344
+ });
345
+ if (!objectValue) {
346
+ return null;
347
+ }
348
+ // Walk through path and get value
349
+ let result = objectValue;
350
+ for (let i = 1; i < path.length; i++) {
351
+ const key = path[i];
352
+ if (result && typeof result === 'object' && key in result) {
353
+ result = result[key];
354
+ }
355
+ else {
356
+ return null;
357
+ }
358
+ }
359
+ return typeof result === 'string' ? result : null;
360
+ }
361
+ /**
362
+ * Evaluate ObjectExpression to plain JS object
363
+ */
364
+ evaluateObjectExpression(node) {
365
+ const obj = {};
366
+ for (const prop of node.properties) {
367
+ if (prop.type === 'ObjectProperty') {
368
+ const objProp = prop;
369
+ if (objProp.key.type === 'Identifier') {
370
+ const key = objProp.key.name;
371
+ if (objProp.value.type === 'StringLiteral') {
372
+ obj[key] = objProp.value.value;
373
+ }
374
+ else if (objProp.value.type === 'ObjectExpression') {
375
+ obj[key] = this.evaluateObjectExpression(objProp.value);
376
+ }
377
+ }
378
+ }
379
+ }
380
+ return obj;
381
+ }
382
+ /**
383
+ * Evaluate ArrayExpression to plain JS array
384
+ */
385
+ evaluateArrayExpression(node) {
386
+ const arr = [];
387
+ for (const element of node.elements) {
388
+ if (element && element.type === 'StringLiteral') {
389
+ arr.push(element.value);
390
+ }
391
+ }
392
+ return arr;
393
+ }
394
+ /**
395
+ * Helper method for finding edges
396
+ */
397
+ findEdges(graph, criteria) {
398
+ const result = [];
399
+ if (!graph.edges)
400
+ return result;
401
+ for (const edge of graph.edges.values()) {
402
+ let matches = true;
403
+ for (const [key, value] of Object.entries(criteria)) {
404
+ if (edge[key] !== value) {
405
+ matches = false;
406
+ break;
407
+ }
408
+ }
409
+ if (matches) {
410
+ result.push(edge);
411
+ }
412
+ }
413
+ return result;
414
+ }
415
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * RustFFIEnricher - links JavaScript CALL nodes to Rust NAPI functions
3
+ * Creates FFI_CALLS edges between JS calls and their Rust implementations
4
+ */
5
+ import { Plugin } from '../Plugin.js';
6
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
7
+ export declare class RustFFIEnricher extends Plugin {
8
+ get metadata(): PluginMetadata;
9
+ execute(context: PluginContext): Promise<PluginResult>;
10
+ private buildNapiIndex;
11
+ private findRustCallingJsCalls;
12
+ private matchJsCallToRust;
13
+ /**
14
+ * Convert Rust snake_case to JavaScript camelCase
15
+ * add_nodes -> addNodes
16
+ * compute_node_id_js -> computeNodeIdJs
17
+ */
18
+ private rustNameToJs;
19
+ /**
20
+ * Convert JavaScript camelCase to Rust snake_case
21
+ * addNodes -> add_nodes
22
+ */
23
+ private jsNameToRust;
24
+ }
25
+ //# sourceMappingURL=RustFFIEnricher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RustFFIEnricher.d.ts","sourceRoot":"","sources":["../../../src/plugins/enrichment/RustFFIEnricher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAuB,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAoBhF,qBAAa,eAAgB,SAAQ,MAAM;IACzC,IAAI,QAAQ,IAAI,cAAc,CAW7B;IAEK,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;YA+C9C,cAAc;YAiCd,sBAAsB;IAuCpC,OAAO,CAAC,iBAAiB;IAyCzB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAIpB;;;OAGG;IACH,OAAO,CAAC,YAAY;CAIrB"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * RustFFIEnricher - links JavaScript CALL nodes to Rust NAPI functions
3
+ * Creates FFI_CALLS edges between JS calls and their Rust implementations
4
+ */
5
+ import { Plugin, createSuccessResult } from '../Plugin.js';
6
+ export class RustFFIEnricher extends Plugin {
7
+ get metadata() {
8
+ return {
9
+ name: 'RustFFIEnricher',
10
+ phase: 'ENRICHMENT',
11
+ priority: 45, // After MethodCallResolver (50)
12
+ creates: {
13
+ nodes: [],
14
+ edges: ['FFI_CALLS']
15
+ },
16
+ dependencies: ['RustAnalyzer', 'MethodCallResolver']
17
+ };
18
+ }
19
+ async execute(context) {
20
+ const { graph } = context;
21
+ // 1. Build index of NAPI-exported Rust functions/methods
22
+ const napiIndex = await this.buildNapiIndex(graph);
23
+ if (napiIndex.size === 0) {
24
+ console.log('[RustFFIEnricher] No NAPI exports found, skipping');
25
+ return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true, reason: 'No NAPI exports' });
26
+ }
27
+ console.log(`[RustFFIEnricher] Indexed ${napiIndex.size} NAPI exports`);
28
+ // 2. Find JS CALL nodes that target Rust
29
+ const jsCalls = await this.findRustCallingJsCalls(graph);
30
+ console.log(`[RustFFIEnricher] Found ${jsCalls.length} candidate JS calls`);
31
+ // 3. Match and create FFI_CALLS edges
32
+ let edgesCreated = 0;
33
+ const unmatched = [];
34
+ for (const call of jsCalls) {
35
+ const rustTarget = this.matchJsCallToRust(call, napiIndex);
36
+ if (rustTarget) {
37
+ await graph.addEdge({
38
+ src: call.id,
39
+ dst: rustTarget.id,
40
+ type: 'FFI_CALLS'
41
+ });
42
+ edgesCreated++;
43
+ }
44
+ else {
45
+ const callName = `${call.object || ''}.${call.method || call.name}`;
46
+ if (callName && !unmatched.includes(callName)) {
47
+ unmatched.push(callName);
48
+ }
49
+ }
50
+ }
51
+ if (unmatched.length > 0 && unmatched.length <= 20) {
52
+ console.log(`[RustFFIEnricher] Unmatched calls:`, unmatched.slice(0, 10));
53
+ }
54
+ console.log(`[RustFFIEnricher] Created ${edgesCreated} FFI_CALLS edges`);
55
+ return createSuccessResult({ nodes: 0, edges: edgesCreated }, { unmatched: unmatched.length });
56
+ }
57
+ async buildNapiIndex(graph) {
58
+ const index = new Map();
59
+ // Index RUST_FUNCTION with napi=true
60
+ for await (const node of graph.queryNodes({ nodeType: 'RUST_FUNCTION' })) {
61
+ const rustNode = node;
62
+ if (rustNode.napi) {
63
+ const jsName = rustNode.napiJsName || this.rustNameToJs(rustNode.name);
64
+ index.set(jsName, rustNode);
65
+ // Also store with Rust name for direct matches
66
+ index.set(rustNode.name, rustNode);
67
+ }
68
+ }
69
+ // Index RUST_METHOD with napi=true
70
+ for await (const node of graph.queryNodes({ nodeType: 'RUST_METHOD' })) {
71
+ const rustNode = node;
72
+ if (rustNode.napi) {
73
+ const jsName = rustNode.napiJsName || this.rustNameToJs(rustNode.name);
74
+ // Methods are called as object.method() in JS
75
+ // Use implType to determine the class name
76
+ if (rustNode.implType) {
77
+ // GraphEngine.addNodes -> maps to GraphEngine::add_nodes
78
+ index.set(`${rustNode.implType}.${jsName}`, rustNode);
79
+ // Also store just method name for loose matching
80
+ index.set(jsName, rustNode);
81
+ }
82
+ }
83
+ }
84
+ return index;
85
+ }
86
+ async findRustCallingJsCalls(graph) {
87
+ const candidates = [];
88
+ const seen = new Set();
89
+ for await (const call of graph.queryNodes({ nodeType: 'CALL' })) {
90
+ const callNode = call;
91
+ // Skip duplicates
92
+ if (seen.has(callNode.id))
93
+ continue;
94
+ seen.add(callNode.id);
95
+ // Look for calls on objects that are likely Rust bindings:
96
+ // - engine.addNodes(), graph.bfs()
97
+ // - Direct function calls: computeNodeIdJs()
98
+ // - Method calls on GraphEngine instances
99
+ if (callNode.object === 'engine' ||
100
+ callNode.object === 'graph' ||
101
+ callNode.object === 'this.engine' ||
102
+ callNode.object === 'this.graph' ||
103
+ callNode.object === 'nativeBinding' ||
104
+ (callNode.name && callNode.name.startsWith('compute'))) {
105
+ candidates.push(callNode);
106
+ continue;
107
+ }
108
+ // Check if method name matches known NAPI pattern
109
+ if (callNode.method) {
110
+ const snakeName = this.jsNameToRust(callNode.method);
111
+ // Common NAPI patterns: add_*, get_*, set_*, query_*, etc.
112
+ if (snakeName && /^(add|get|set|query|compute|find|run|create|delete|update|list|check|flush|load|save|bfs|dfs)_/.test(snakeName)) {
113
+ candidates.push(callNode);
114
+ }
115
+ }
116
+ }
117
+ return candidates;
118
+ }
119
+ matchJsCallToRust(call, napiIndex) {
120
+ // Try multiple matching strategies
121
+ // 1. Direct method match: object.method -> Class.method
122
+ if (call.method) {
123
+ // Try exact match with class name (GraphEngine.method)
124
+ for (const [key, node] of napiIndex) {
125
+ if (key.endsWith(`.${call.method}`)) {
126
+ return node;
127
+ }
128
+ }
129
+ // Try just method name
130
+ if (napiIndex.has(call.method)) {
131
+ return napiIndex.get(call.method);
132
+ }
133
+ // Try snake_case version
134
+ const snakeName = this.jsNameToRust(call.method);
135
+ if (snakeName && napiIndex.has(snakeName)) {
136
+ return napiIndex.get(snakeName);
137
+ }
138
+ }
139
+ // 2. Direct function call match
140
+ if (call.name) {
141
+ const callName = call.name;
142
+ if (napiIndex.has(callName)) {
143
+ return napiIndex.get(callName);
144
+ }
145
+ // Try snake_case version
146
+ const snakeName = this.jsNameToRust(callName);
147
+ if (snakeName && napiIndex.has(snakeName)) {
148
+ return napiIndex.get(snakeName);
149
+ }
150
+ }
151
+ return null;
152
+ }
153
+ /**
154
+ * Convert Rust snake_case to JavaScript camelCase
155
+ * add_nodes -> addNodes
156
+ * compute_node_id_js -> computeNodeIdJs
157
+ */
158
+ rustNameToJs(rustName) {
159
+ return rustName.replace(/_([a-z])/g, (_, c) => c.toUpperCase());
160
+ }
161
+ /**
162
+ * Convert JavaScript camelCase to Rust snake_case
163
+ * addNodes -> add_nodes
164
+ */
165
+ jsNameToRust(jsName) {
166
+ if (!jsName)
167
+ return null;
168
+ return jsName.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '');
169
+ }
170
+ }