@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,399 @@
1
+ /**
2
+ * AliasTracker - резолвит вызовы через алиасы
3
+ *
4
+ * Проблема: `const m = obj.method; m()` не резолвится как method call
5
+ * Решение: трассируем ASSIGNED_FROM цепочки чтобы найти оригинальный источник
6
+ *
7
+ * ИСПОЛЬЗУЕТ:
8
+ * - VARIABLE -> ASSIGNED_FROM -> EXPRESSION (из JSASTAnalyzer)
9
+ * - EXPRESSION с expressionType='MemberExpression'
10
+ *
11
+ * СОЗДАЁТ:
12
+ * - CALL -> CALLS -> METHOD/FUNCTION (когда алиас резолвится)
13
+ * - CALL -> ALIAS_OF -> EXPRESSION (для трассировки)
14
+ */
15
+
16
+ import { Plugin, createSuccessResult } from '../Plugin.js';
17
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
18
+ import type { BaseNodeRecord, NodeRecord } from '@grafema/types';
19
+
20
+ /**
21
+ * Alias info from index
22
+ */
23
+ interface AliasInfo {
24
+ variableId: string;
25
+ variableName: string;
26
+ expressionId: string;
27
+ expressionType: string;
28
+ object?: string;
29
+ property?: string;
30
+ computed?: boolean;
31
+ computedPropertyVar?: string;
32
+ file: string;
33
+ }
34
+
35
+ /**
36
+ * Expression source info
37
+ */
38
+ interface ExpressionSource {
39
+ expressionId: string;
40
+ expressionType: string;
41
+ object?: string;
42
+ property?: string;
43
+ computed?: boolean;
44
+ computedPropertyVar?: string;
45
+ }
46
+
47
+ /**
48
+ * Depth exceeded info
49
+ */
50
+ interface DepthExceededInfo {
51
+ file?: string;
52
+ name: string;
53
+ chain: string[];
54
+ depth: number;
55
+ }
56
+
57
+ /**
58
+ * Extended call node
59
+ */
60
+ interface CallNode extends BaseNodeRecord {
61
+ object?: string;
62
+ method?: string;
63
+ }
64
+
65
+ export class AliasTracker extends Plugin {
66
+ static MAX_DEPTH = 10;
67
+ private depthExceeded: DepthExceededInfo[] = [];
68
+
69
+ get metadata(): PluginMetadata {
70
+ return {
71
+ name: 'AliasTracker',
72
+ phase: 'ENRICHMENT',
73
+ priority: 60, // После MethodCallResolver (50)
74
+ creates: {
75
+ nodes: [],
76
+ edges: ['CALLS', 'ALIAS_OF']
77
+ }
78
+ };
79
+ }
80
+
81
+ async execute(context: PluginContext): Promise<PluginResult> {
82
+ const { graph, onProgress } = context;
83
+
84
+ console.log('[AliasTracker] Starting alias resolution...');
85
+
86
+ let callsProcessed = 0;
87
+ let aliasesFound = 0;
88
+ let edgesCreated = 0;
89
+ let resolvedToMethod = 0;
90
+
91
+ // Трекинг превышений глубины
92
+ this.depthExceeded = [];
93
+
94
+ // 1. Найти все CALL без object (call sites) которые ещё не резолвлены
95
+ const unresolvedCalls: CallNode[] = [];
96
+ for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
97
+ const callNode = node as CallNode;
98
+ // Пропускаем method calls (у них есть object)
99
+ if (callNode.object) continue;
100
+
101
+ // Пропускаем уже резолвленные
102
+ const existingEdges = await graph.getOutgoingEdges(node.id, ['CALLS']);
103
+ if (existingEdges.length > 0) continue;
104
+
105
+ unresolvedCalls.push(callNode);
106
+ }
107
+
108
+ console.log(`[AliasTracker] Found ${unresolvedCalls.length} unresolved call sites`);
109
+
110
+ // 2. Строим индекс алиасов: variableName -> EXPRESSION info
111
+ const aliasIndex = await this.buildAliasIndex(graph);
112
+ console.log(`[AliasTracker] Found ${aliasIndex.size} potential aliases`);
113
+
114
+ // 3. Строим индекс методов для резолвинга
115
+ const methodIndex = await this.buildMethodIndex(graph);
116
+
117
+ // 4. Обрабатываем каждый нерезолвленный вызов
118
+ for (const call of unresolvedCalls) {
119
+ callsProcessed++;
120
+
121
+ // Report progress every 50 calls
122
+ if (onProgress && callsProcessed % 50 === 0) {
123
+ onProgress({
124
+ phase: 'enrichment',
125
+ currentPlugin: 'AliasTracker',
126
+ message: `Tracking aliases ${callsProcessed}/${unresolvedCalls.length}`,
127
+ totalFiles: unresolvedCalls.length,
128
+ processedFiles: callsProcessed
129
+ });
130
+ }
131
+
132
+ const callName = call.name as string;
133
+ const callFile = call.file;
134
+
135
+ // Ищем алиас с таким же именем в том же файле
136
+ const aliasKey = `${callFile}:${callName}`;
137
+ const alias = aliasIndex.get(aliasKey);
138
+
139
+ if (!alias) continue;
140
+
141
+ aliasesFound++;
142
+
143
+ // Создаём ALIAS_OF ребро для трассировки
144
+ await graph.addEdge({
145
+ src: call.id,
146
+ dst: alias.expressionId,
147
+ type: 'ALIAS_OF'
148
+ });
149
+ edgesCreated++;
150
+
151
+ // Если это MemberExpression - пробуем резолвить как method call
152
+ if (alias.expressionType === 'MemberExpression') {
153
+ const targetMethod = await this.resolveAliasedMethodCall(
154
+ alias.object,
155
+ alias.property,
156
+ callFile!,
157
+ methodIndex,
158
+ graph,
159
+ alias.computedPropertyVar // Pass variable name for computed access
160
+ );
161
+
162
+ if (targetMethod) {
163
+ await graph.addEdge({
164
+ src: call.id,
165
+ dst: targetMethod.id,
166
+ type: 'CALLS'
167
+ });
168
+ edgesCreated++;
169
+ resolvedToMethod++;
170
+ }
171
+ }
172
+ }
173
+
174
+ const summary = {
175
+ callsProcessed,
176
+ aliasesFound,
177
+ edgesCreated,
178
+ resolvedToMethod,
179
+ aliasesIndexed: aliasIndex.size,
180
+ depthExceeded: this.depthExceeded.length
181
+ };
182
+
183
+ // Алярм если были превышения глубины
184
+ if (this.depthExceeded.length > 0) {
185
+ console.warn(`[AliasTracker] ⚠️ WARNING: ${this.depthExceeded.length} alias chain(s) exceeded max depth (${AliasTracker.MAX_DEPTH}):`);
186
+ for (const info of this.depthExceeded) {
187
+ console.warn(` - ${info.file}:${info.name} (chain: ${info.chain.join(' → ')}...)`);
188
+ }
189
+ }
190
+
191
+ console.log('[AliasTracker] Summary:', summary);
192
+
193
+ return createSuccessResult({ nodes: 0, edges: edgesCreated }, summary);
194
+ }
195
+
196
+ /**
197
+ * Строит индекс алиасов: file:variableName -> EXPRESSION info
198
+ * Поддерживает транзитивные цепочки: a = b; b = c; c = obj.method
199
+ */
200
+ private async buildAliasIndex(graph: PluginContext['graph']): Promise<Map<string, AliasInfo>> {
201
+ const index = new Map<string, AliasInfo>();
202
+
203
+ // Находим все VARIABLE ноды
204
+ for await (const varNode of graph.queryNodes({ nodeType: 'VARIABLE' })) {
205
+ const expressionSource = await this.findExpressionSource(varNode, graph, new Set());
206
+ if (expressionSource) {
207
+ const key = `${varNode.file}:${varNode.name}`;
208
+ index.set(key, {
209
+ variableId: varNode.id,
210
+ variableName: varNode.name as string,
211
+ ...expressionSource,
212
+ file: varNode.file!
213
+ });
214
+ }
215
+ }
216
+
217
+ // Также проверяем CONSTANT ноды (const m = obj.method)
218
+ for await (const constNode of graph.queryNodes({ nodeType: 'CONSTANT' })) {
219
+ const expressionSource = await this.findExpressionSource(constNode, graph, new Set());
220
+ if (expressionSource) {
221
+ const key = `${constNode.file}:${constNode.name}`;
222
+ index.set(key, {
223
+ variableId: constNode.id,
224
+ variableName: constNode.name as string,
225
+ ...expressionSource,
226
+ file: constNode.file!
227
+ });
228
+ }
229
+ }
230
+
231
+ return index;
232
+ }
233
+
234
+ /**
235
+ * Рекурсивно ищет EXPRESSION источник через цепочки ASSIGNED_FROM
236
+ */
237
+ private async findExpressionSource(
238
+ node: NodeRecord,
239
+ graph: PluginContext['graph'],
240
+ visited: Set<string>,
241
+ depth: number = 0,
242
+ chain: string[] = []
243
+ ): Promise<ExpressionSource | null> {
244
+ // Добавляем текущую ноду в цепочку
245
+ chain.push((node.name as string) || node.id);
246
+
247
+ // Защита от бесконечных циклов
248
+ if (visited.has(node.id.toString())) return null;
249
+ visited.add(node.id.toString());
250
+
251
+ // Защита от слишком глубоких цепочек
252
+ if (depth > AliasTracker.MAX_DEPTH) {
253
+ this.depthExceeded.push({
254
+ file: node.file,
255
+ name: chain[0],
256
+ chain: chain.slice(0, 5),
257
+ depth: depth
258
+ });
259
+ return null;
260
+ }
261
+
262
+ // Получаем ASSIGNED_FROM рёбра
263
+ const assignedFromEdges = await graph.getOutgoingEdges(node.id, ['ASSIGNED_FROM']);
264
+
265
+ for (const edge of assignedFromEdges) {
266
+ const targetNode = await graph.getNode(edge.dst);
267
+ if (!targetNode) continue;
268
+
269
+ // Если это EXPRESSION - нашли источник!
270
+ if (targetNode.type === 'EXPRESSION') {
271
+ return {
272
+ expressionId: targetNode.id,
273
+ expressionType: targetNode.expressionType as string,
274
+ object: targetNode.object as string | undefined,
275
+ property: targetNode.property as string | undefined,
276
+ computed: targetNode.computed as boolean | undefined,
277
+ computedPropertyVar: targetNode.computedPropertyVar as string | undefined
278
+ };
279
+ }
280
+
281
+ // Если это VARIABLE или CONSTANT - идём глубже (транзитивно)
282
+ if (targetNode.type === 'VARIABLE' || targetNode.type === 'CONSTANT') {
283
+ const result = await this.findExpressionSource(targetNode, graph, visited, depth + 1, chain);
284
+ if (result) return result;
285
+ }
286
+ }
287
+
288
+ return null;
289
+ }
290
+
291
+ /**
292
+ * Строит индекс методов для резолвинга: className:methodName -> METHOD node
293
+ */
294
+ private async buildMethodIndex(graph: PluginContext['graph']): Promise<Map<string, NodeRecord>> {
295
+ const index = new Map<string, NodeRecord>();
296
+
297
+ // Индексируем методы классов
298
+ for await (const classNode of graph.queryNodes({ nodeType: 'CLASS' })) {
299
+ const className = classNode.name as string;
300
+ if (!className) continue;
301
+
302
+ const containsEdges = await graph.getOutgoingEdges(classNode.id, ['CONTAINS']);
303
+ for (const edge of containsEdges) {
304
+ const childNode = await graph.getNode(edge.dst);
305
+ if (childNode && (childNode.type === 'METHOD' || childNode.type === 'FUNCTION')) {
306
+ if (childNode.name) {
307
+ // По имени класса
308
+ index.set(`${className}:${childNode.name}`, childNode);
309
+ // По файлу и имени класса
310
+ index.set(`${classNode.file}:${className}:${childNode.name}`, childNode);
311
+ }
312
+ }
313
+ }
314
+ }
315
+
316
+ return index;
317
+ }
318
+
319
+ /**
320
+ * Пытается резолвить алиасированный method call
321
+ */
322
+ private async resolveAliasedMethodCall(
323
+ objectName: string | undefined,
324
+ propertyName: string | undefined,
325
+ file: string,
326
+ methodIndex: Map<string, NodeRecord>,
327
+ graph: PluginContext['graph'],
328
+ computedPropertyVar: string | null = null
329
+ ): Promise<NodeRecord | null> {
330
+ if (!objectName || !propertyName) return null;
331
+
332
+ // Если property вычисляемый - пробуем трассировать через computedPropertyVar
333
+ if (propertyName === '<computed>') {
334
+ if (!computedPropertyVar) {
335
+ return null;
336
+ }
337
+
338
+ if (!graph.findByAttr) {
339
+ return null;
340
+ }
341
+ const varNodes = await graph.findByAttr({
342
+ name: computedPropertyVar,
343
+ file: file
344
+ });
345
+
346
+ for (const varId of varNodes) {
347
+ const assignedFromEdges = await graph.getOutgoingEdges(varId, ['ASSIGNED_FROM']);
348
+ for (const edge of assignedFromEdges) {
349
+ const targetNode = await graph.getNode(edge.dst);
350
+ if (targetNode && targetNode.type === 'LITERAL' && typeof targetNode.value === 'string') {
351
+ propertyName = targetNode.value as string;
352
+ break;
353
+ }
354
+ }
355
+ if (propertyName !== '<computed>') break;
356
+ }
357
+
358
+ if (propertyName === '<computed>') {
359
+ return null;
360
+ }
361
+ }
362
+
363
+ // 1. Проверяем прямое имя класса
364
+ const directKey = `${objectName}:${propertyName}`;
365
+ if (methodIndex.has(directKey)) {
366
+ return methodIndex.get(directKey)!;
367
+ }
368
+
369
+ // 2. Проверяем локальный класс в том же файле
370
+ const localKey = `${file}:${objectName}:${propertyName}`;
371
+ if (methodIndex.has(localKey)) {
372
+ return methodIndex.get(localKey)!;
373
+ }
374
+
375
+ // 3. Ищем переменную с типом (INSTANCE_OF)
376
+ if (!graph.findByAttr) {
377
+ return null;
378
+ }
379
+ const varNodes = await graph.findByAttr({
380
+ name: objectName,
381
+ file: file
382
+ });
383
+
384
+ for (const varId of varNodes) {
385
+ const instanceOfEdges = await graph.getOutgoingEdges(varId, ['INSTANCE_OF']);
386
+ for (const edge of instanceOfEdges) {
387
+ const classNode = await graph.getNode(edge.dst);
388
+ if (classNode && classNode.name) {
389
+ const classKey = `${classNode.name}:${propertyName}`;
390
+ if (methodIndex.has(classKey)) {
391
+ return methodIndex.get(classKey)!;
392
+ }
393
+ }
394
+ }
395
+ }
396
+
397
+ return null;
398
+ }
399
+ }
@@ -0,0 +1,192 @@
1
+ /**
2
+ * HTTPConnectionEnricher - связывает http:request (frontend) с http:route (backend)
3
+ *
4
+ * Создаёт INTERACTS_WITH edges между:
5
+ * - Frontend fetch('/api/users') → Backend GET /api/users
6
+ * - Frontend fetch('/api/users', {method: 'POST'}) → Backend POST /api/users
7
+ *
8
+ * Поддержка параметризованных путей:
9
+ * - /api/graph/:serviceId матчится с /api/graph/my-service
10
+ */
11
+
12
+ import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
13
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
14
+ import type { BaseNodeRecord } from '@grafema/types';
15
+
16
+ /**
17
+ * HTTP route node
18
+ */
19
+ interface HTTPRouteNode extends BaseNodeRecord {
20
+ method?: string;
21
+ path?: string;
22
+ url?: string;
23
+ }
24
+
25
+ /**
26
+ * HTTP request node
27
+ */
28
+ interface HTTPRequestNode extends BaseNodeRecord {
29
+ method?: string;
30
+ url?: string;
31
+ }
32
+
33
+ /**
34
+ * Connection info for logging
35
+ */
36
+ interface ConnectionInfo {
37
+ request: string;
38
+ route: string;
39
+ requestFile?: string;
40
+ routeFile?: string;
41
+ }
42
+
43
+ export class HTTPConnectionEnricher extends Plugin {
44
+ get metadata(): PluginMetadata {
45
+ return {
46
+ name: 'HTTPConnectionEnricher',
47
+ phase: 'ENRICHMENT',
48
+ priority: 50, // После основных enrichers
49
+ creates: {
50
+ nodes: [],
51
+ edges: ['INTERACTS_WITH']
52
+ },
53
+ dependencies: ['ExpressRouteAnalyzer', 'FetchAnalyzer']
54
+ };
55
+ }
56
+
57
+ async execute(context: PluginContext): Promise<PluginResult> {
58
+ const { graph } = context;
59
+
60
+ try {
61
+ // Собираем все http:route (backend endpoints)
62
+ const routes: HTTPRouteNode[] = [];
63
+ for await (const node of graph.queryNodes({ type: 'http:route' })) {
64
+ routes.push(node as HTTPRouteNode);
65
+ }
66
+
67
+ // Собираем все http:request (frontend requests)
68
+ const requests: HTTPRequestNode[] = [];
69
+ for await (const node of graph.queryNodes({ type: 'http:request' })) {
70
+ requests.push(node as HTTPRequestNode);
71
+ }
72
+
73
+ console.log(`[HTTPConnectionEnricher] Found ${routes.length} routes, ${requests.length} requests`);
74
+
75
+ // Дедуплицируем по ID (из-за multi-service анализа)
76
+ const uniqueRoutes = this.deduplicateById(routes);
77
+ const uniqueRequests = this.deduplicateById(requests);
78
+
79
+ console.log(`[HTTPConnectionEnricher] Unique: ${uniqueRoutes.length} routes, ${uniqueRequests.length} requests`);
80
+
81
+ let edgesCreated = 0;
82
+ const connections: ConnectionInfo[] = [];
83
+
84
+ // Для каждого request ищем matching route
85
+ for (const request of uniqueRequests) {
86
+ // Пропускаем dynamic URLs
87
+ if (request.url === 'dynamic' || !request.url) {
88
+ continue;
89
+ }
90
+
91
+ const method = (request.method || 'GET').toUpperCase();
92
+ const url = request.url;
93
+
94
+ // Ищем matching route
95
+ for (const route of uniqueRoutes) {
96
+ const routeMethod = (route.method || 'GET').toUpperCase();
97
+ const routePath = route.path;
98
+
99
+ if (routePath && method === routeMethod && this.pathsMatch(url, routePath)) {
100
+ // Создаём edge
101
+ await graph.addEdge({
102
+ type: 'INTERACTS_WITH',
103
+ src: request.id,
104
+ dst: route.id,
105
+ matchType: this.hasParams(routePath) ? 'parametric' : 'exact'
106
+ });
107
+
108
+ connections.push({
109
+ request: `${method} ${url}`,
110
+ route: `${routeMethod} ${routePath}`,
111
+ requestFile: request.file,
112
+ routeFile: route.file
113
+ });
114
+
115
+ edgesCreated++;
116
+ break; // Один request → один route
117
+ }
118
+ }
119
+ }
120
+
121
+ // Логируем найденные связи
122
+ if (connections.length > 0) {
123
+ console.log(`[HTTPConnectionEnricher] Connections found:`);
124
+ for (const conn of connections) {
125
+ console.log(` ${conn.request} → ${conn.route}`);
126
+ }
127
+ }
128
+
129
+ return createSuccessResult(
130
+ { nodes: 0, edges: edgesCreated },
131
+ {
132
+ connections: connections.length,
133
+ routesAnalyzed: uniqueRoutes.length,
134
+ requestsAnalyzed: uniqueRequests.length
135
+ }
136
+ );
137
+
138
+ } catch (error) {
139
+ console.error(`[HTTPConnectionEnricher] Error:`, error);
140
+ return createErrorResult(error instanceof Error ? error : new Error(String(error)));
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Проверяет совпадают ли пути
146
+ * Поддерживает параметризованные пути: /api/users/:id матчится с /api/users/123
147
+ */
148
+ private pathsMatch(requestUrl: string, routePath: string): boolean {
149
+ // Точное совпадение
150
+ if (requestUrl === routePath) {
151
+ return true;
152
+ }
153
+
154
+ // Если route не имеет параметров, требуем точное совпадение
155
+ if (!this.hasParams(routePath)) {
156
+ return false;
157
+ }
158
+
159
+ // Преобразуем route path в regex
160
+ // /api/users/:id → /api/users/[^/]+
161
+ const regexPattern = routePath
162
+ .replace(/:[^/]+/g, '[^/]+') // :param → [^/]+
163
+ .replace(/\//g, '\\/'); // / → \/
164
+
165
+ const regex = new RegExp(`^${regexPattern}$`);
166
+ return regex.test(requestUrl);
167
+ }
168
+
169
+ /**
170
+ * Проверяет есть ли параметры в пути
171
+ */
172
+ private hasParams(path: string): boolean {
173
+ return Boolean(path && path.includes(':'));
174
+ }
175
+
176
+ /**
177
+ * Убирает дубликаты по ID
178
+ */
179
+ private deduplicateById<T extends BaseNodeRecord>(nodes: T[]): T[] {
180
+ const seen = new Set<string>();
181
+ const unique: T[] = [];
182
+
183
+ for (const node of nodes) {
184
+ if (!seen.has(node.id)) {
185
+ seen.add(node.id);
186
+ unique.push(node);
187
+ }
188
+ }
189
+
190
+ return unique;
191
+ }
192
+ }