@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,527 @@
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
+
13
+ import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
14
+ import type { PluginMetadata, PluginContext, PluginResult } from '../Plugin.js';
15
+ import { parse } from '@babel/parser';
16
+ import type { ParseResult, ParserPlugin } from '@babel/parser';
17
+ import _traverse from '@babel/traverse';
18
+ import type {
19
+ File,
20
+ Node,
21
+ CallExpression,
22
+ MemberExpression,
23
+ BinaryExpression,
24
+ TemplateLiteral,
25
+ Identifier,
26
+ StringLiteral,
27
+ ObjectExpression,
28
+ ObjectProperty,
29
+ ArrayExpression,
30
+ VariableDeclarator,
31
+ NumericLiteral
32
+ } from '@babel/types';
33
+ import type { NodePath } from '@babel/traverse';
34
+ import { readFileSync } from 'fs';
35
+ import type { NodeRecord } from '@grafema/types';
36
+
37
+ // ES module compatibility - handle default export
38
+ const traverseFn = (_traverse as unknown as { default: typeof _traverse }).default || _traverse;
39
+ const traverse = traverseFn as unknown as (
40
+ ast: Node | null | undefined,
41
+ opts: Record<string, unknown>
42
+ ) => void;
43
+
44
+ interface MountPointNode {
45
+ id: string;
46
+ type: 'MOUNT_POINT';
47
+ name: string;
48
+ file: string;
49
+ line: number;
50
+ prefix: string;
51
+ evaluated?: boolean;
52
+ }
53
+
54
+ interface ModuleNode {
55
+ id: string;
56
+ type: 'MODULE';
57
+ name: string;
58
+ file: string;
59
+ line: number;
60
+ }
61
+
62
+ interface Edge {
63
+ type: string;
64
+ fromId: string;
65
+ dst: string;
66
+ [key: string]: unknown;
67
+ }
68
+
69
+ interface EdgeCriteria {
70
+ type?: string;
71
+ dst?: string;
72
+ [key: string]: unknown;
73
+ }
74
+
75
+ interface Graph {
76
+ nodes: Map<string, NodeRecord> | { get(id: string): NodeRecord | undefined; values(): Iterable<NodeRecord> };
77
+ edges: Map<string, Edge> | { values(): Iterable<Edge> };
78
+ }
79
+
80
+ export class PrefixEvaluator extends Plugin {
81
+ get metadata(): PluginMetadata {
82
+ return {
83
+ name: 'PrefixEvaluator',
84
+ phase: 'ENRICHMENT',
85
+ priority: 80, // After MountPointResolver (90)
86
+ creates: {
87
+ nodes: [],
88
+ edges: []
89
+ },
90
+ dependencies: ['JSModuleIndexer', 'JSASTAnalyzer', 'MountPointResolver']
91
+ };
92
+ }
93
+
94
+ async execute(context: PluginContext): Promise<PluginResult> {
95
+ try {
96
+ const { graph } = context;
97
+ const graphTyped = graph as unknown as Graph;
98
+
99
+ let mountPointsEvaluated = 0;
100
+ let successfulEvaluations = 0;
101
+
102
+ // Find all MOUNT_POINT nodes with placeholder prefixes
103
+ const mountPoints: MountPointNode[] = [];
104
+ if (graphTyped.nodes) {
105
+ const allNodes = await (graphTyped.nodes as Map<string, NodeRecord>).values();
106
+ for (const node of allNodes) {
107
+ // Cast through unknown since node types vary
108
+ const typedNode = node as unknown as MountPointNode;
109
+ if (typedNode.type === 'MOUNT_POINT' && typedNode.prefix && typedNode.prefix.startsWith('${')) {
110
+ mountPoints.push(typedNode);
111
+ }
112
+ }
113
+ }
114
+
115
+ console.log(`[PrefixEvaluator] Found ${mountPoints.length} mount points with placeholders`);
116
+
117
+ // For each mount point try to evaluate prefix
118
+ for (const mountPoint of mountPoints) {
119
+ mountPointsEvaluated++;
120
+
121
+ // Find MODULE that defines this mount point
122
+ const definesEdges = this.findEdges(graphTyped, {
123
+ type: 'DEFINES',
124
+ dst: mountPoint.id
125
+ });
126
+
127
+ if (definesEdges.length === 0) {
128
+ console.log(`[PrefixEvaluator] No DEFINES edge for mount point ${mountPoint.id}`);
129
+ continue;
130
+ }
131
+
132
+ const moduleId = definesEdges[0].fromId;
133
+ const module = (graphTyped.nodes as Map<string, NodeRecord>).get(moduleId) as ModuleNode | undefined;
134
+
135
+ if (!module || module.type !== 'MODULE') {
136
+ console.log(`[PrefixEvaluator] Module not found for ${mountPoint.id}`);
137
+ continue;
138
+ }
139
+
140
+ // Parse module AST
141
+ let ast: ParseResult<File>;
142
+ try {
143
+ const code = readFileSync(module.file, 'utf-8');
144
+ ast = parse(code, {
145
+ sourceType: 'module',
146
+ plugins: ['jsx', 'typescript'] as ParserPlugin[]
147
+ });
148
+ } catch (error) {
149
+ const err = error as Error;
150
+ console.log(`[PrefixEvaluator] Failed to parse ${module.file}:`, err.message);
151
+ continue;
152
+ }
153
+
154
+ // Try to evaluate prefix based on placeholder type
155
+ const evaluatedPrefix = await this.evaluatePrefix(
156
+ mountPoint.prefix,
157
+ mountPoint.line,
158
+ ast,
159
+ module
160
+ );
161
+
162
+ if (evaluatedPrefix && evaluatedPrefix !== mountPoint.prefix) {
163
+ mountPoint.prefix = evaluatedPrefix;
164
+ mountPoint.evaluated = true;
165
+ successfulEvaluations++;
166
+ console.log(`[PrefixEvaluator] Resolved ${mountPoint.file}:${mountPoint.line}: ${evaluatedPrefix}`);
167
+ }
168
+ }
169
+
170
+ console.log(`[PrefixEvaluator] Evaluated ${successfulEvaluations}/${mountPointsEvaluated} mount points`);
171
+
172
+ return createSuccessResult(
173
+ { nodes: 0, edges: 0 },
174
+ { mountPointsEvaluated, successfulEvaluations }
175
+ );
176
+
177
+ } catch (error) {
178
+ console.error(`[PrefixEvaluator] Error:`, error);
179
+ return createErrorResult(error as Error);
180
+ }
181
+ }
182
+
183
+ /**
184
+ * Evaluate prefix based on placeholder type
185
+ */
186
+ async evaluatePrefix(
187
+ placeholder: string,
188
+ line: number,
189
+ ast: ParseResult<File>,
190
+ _module: ModuleNode
191
+ ): Promise<string | null> {
192
+ if (placeholder === '${variable}') {
193
+ return this.evaluateVariable(line, ast);
194
+ } else if (placeholder === '${binary}') {
195
+ return this.evaluateBinary(line, ast);
196
+ } else if (placeholder === '${template}') {
197
+ return this.evaluateTemplate(line, ast);
198
+ } else if (placeholder === '${member}') {
199
+ return this.evaluateMember(line, ast);
200
+ }
201
+ // ${call}, ${conditional} - not supported yet
202
+ return null;
203
+ }
204
+
205
+ /**
206
+ * Resolve ${variable} - find VariableDeclaration
207
+ */
208
+ evaluateVariable(line: number, ast: ParseResult<File>): string | null {
209
+ let variableName: string | null = null;
210
+ let variableValue: string | null = null;
211
+
212
+ // First find app.use() on the target line and get variable name
213
+ traverse(ast, {
214
+ CallExpression: (path: NodePath<CallExpression>) => {
215
+ const node = path.node;
216
+ if (node.loc?.start.line === line) {
217
+ // Check if this is app.use() or router.use()
218
+ if (node.callee.type === 'MemberExpression' &&
219
+ (node.callee.property as Identifier).name === 'use' &&
220
+ node.arguments.length >= 2) {
221
+ const firstArg = node.arguments[0];
222
+ if (firstArg.type === 'Identifier') {
223
+ variableName = firstArg.name;
224
+ }
225
+ }
226
+ }
227
+ }
228
+ });
229
+
230
+ if (!variableName) {
231
+ return null;
232
+ }
233
+
234
+ // Now find declaration of this variable
235
+ const targetName = variableName;
236
+ traverse(ast, {
237
+ VariableDeclarator: (path: NodePath<VariableDeclarator>) => {
238
+ const node = path.node;
239
+ if (node.id.type === 'Identifier' && node.id.name === targetName) {
240
+ if (node.init && node.init.type === 'StringLiteral') {
241
+ variableValue = (node.init as StringLiteral).value;
242
+ }
243
+ }
244
+ }
245
+ });
246
+
247
+ return variableValue;
248
+ }
249
+
250
+ /**
251
+ * Resolve ${binary} - BinaryExpression (a + b)
252
+ */
253
+ evaluateBinary(line: number, ast: ParseResult<File>): string | null {
254
+ let binaryExpression: BinaryExpression | null = null;
255
+
256
+ // Find app.use() on target line and get BinaryExpression
257
+ traverse(ast, {
258
+ CallExpression: (path: NodePath<CallExpression>) => {
259
+ const node = path.node;
260
+ if (node.loc?.start.line === line) {
261
+ if (node.callee.type === 'MemberExpression' &&
262
+ (node.callee.property as Identifier).name === 'use' &&
263
+ node.arguments.length >= 2) {
264
+ const firstArg = node.arguments[0];
265
+ if (firstArg.type === 'BinaryExpression') {
266
+ binaryExpression = firstArg;
267
+ }
268
+ }
269
+ }
270
+ }
271
+ });
272
+
273
+ if (!binaryExpression) {
274
+ return null;
275
+ }
276
+
277
+ // Cast to help TypeScript understand the narrowing after closure mutation
278
+ const expr = binaryExpression as BinaryExpression;
279
+
280
+ // Recursively resolve both sides of Binary Expression
281
+ const left = this.resolveExpression(expr.left, ast);
282
+ const right = this.resolveExpression(expr.right, ast);
283
+
284
+ if (left && right && expr.operator === '+') {
285
+ return left + right;
286
+ }
287
+
288
+ return null;
289
+ }
290
+
291
+ /**
292
+ * Recursively resolve arbitrary expression
293
+ */
294
+ resolveExpression(node: Node, ast: ParseResult<File>): string | null {
295
+ if (node.type === 'StringLiteral') {
296
+ return (node as StringLiteral).value;
297
+ } else if (node.type === 'Identifier') {
298
+ // Find variable declaration
299
+ let value: string | null = null;
300
+ const targetName = (node as Identifier).name;
301
+ traverse(ast, {
302
+ VariableDeclarator: (path: NodePath<VariableDeclarator>) => {
303
+ if (path.node.id.type === 'Identifier' &&
304
+ path.node.id.name === targetName &&
305
+ path.node.init &&
306
+ path.node.init.type === 'StringLiteral') {
307
+ value = (path.node.init as StringLiteral).value;
308
+ }
309
+ }
310
+ });
311
+ return value;
312
+ } else if (node.type === 'BinaryExpression') {
313
+ const binaryNode = node as BinaryExpression;
314
+ const left = this.resolveExpression(binaryNode.left, ast);
315
+ const right = this.resolveExpression(binaryNode.right, ast);
316
+ if (left && right && binaryNode.operator === '+') {
317
+ return left + right;
318
+ }
319
+ } else if (node.type === 'MemberExpression') {
320
+ // Resolve MemberExpression (for TemplateLiteral with objects)
321
+ return this.resolveMemberExpression(node as MemberExpression, ast);
322
+ }
323
+ return null;
324
+ }
325
+
326
+ /**
327
+ * Resolve ${template} - TemplateLiteral with variables
328
+ */
329
+ evaluateTemplate(line: number, ast: ParseResult<File>): string | null {
330
+ let templateLiteral: TemplateLiteral | null = null;
331
+
332
+ // Find app.use() and TemplateLiteral
333
+ traverse(ast, {
334
+ CallExpression: (path: NodePath<CallExpression>) => {
335
+ const node = path.node;
336
+ if (node.loc?.start.line === line) {
337
+ if (node.callee.type === 'MemberExpression' &&
338
+ (node.callee.property as Identifier).name === 'use' &&
339
+ node.arguments.length >= 2) {
340
+ const firstArg = node.arguments[0];
341
+ if (firstArg.type === 'TemplateLiteral') {
342
+ templateLiteral = firstArg;
343
+ }
344
+ }
345
+ }
346
+ }
347
+ });
348
+
349
+ if (!templateLiteral) {
350
+ return null;
351
+ }
352
+
353
+ // Cast to help TypeScript understand the narrowing after closure mutation
354
+ const tmpl = templateLiteral as TemplateLiteral;
355
+
356
+ // Assemble string from quasis and expressions
357
+ let result = '';
358
+ for (let i = 0; i < tmpl.quasis.length; i++) {
359
+ result += tmpl.quasis[i].value.raw;
360
+
361
+ if (i < tmpl.expressions.length) {
362
+ const expr = tmpl.expressions[i];
363
+ const resolvedValue = this.resolveExpression(expr as Node, ast);
364
+ if (resolvedValue === null) {
365
+ return null; // Couldn't resolve expression
366
+ }
367
+ result += resolvedValue;
368
+ }
369
+ }
370
+
371
+ return result;
372
+ }
373
+
374
+ /**
375
+ * Resolve ${member} - MemberExpression (config.apiPrefix)
376
+ */
377
+ evaluateMember(line: number, ast: ParseResult<File>): string | null {
378
+ let memberExpression: MemberExpression | null = null;
379
+
380
+ // Find app.use() and MemberExpression
381
+ traverse(ast, {
382
+ CallExpression: (path: NodePath<CallExpression>) => {
383
+ const node = path.node;
384
+ if (node.loc?.start.line === line) {
385
+ if (node.callee.type === 'MemberExpression' &&
386
+ (node.callee.property as Identifier).name === 'use' &&
387
+ node.arguments.length >= 2) {
388
+ const firstArg = node.arguments[0];
389
+ if (firstArg.type === 'MemberExpression') {
390
+ memberExpression = firstArg;
391
+ }
392
+ }
393
+ }
394
+ }
395
+ });
396
+
397
+ if (!memberExpression) {
398
+ return null;
399
+ }
400
+
401
+ // Resolve MemberExpression (can be nested: config.nested.path)
402
+ return this.resolveMemberExpression(memberExpression, ast);
403
+ }
404
+
405
+ /**
406
+ * Recursively resolve MemberExpression
407
+ */
408
+ resolveMemberExpression(node: MemberExpression, ast: ParseResult<File>): string | null {
409
+ if (node.type !== 'MemberExpression') {
410
+ return null;
411
+ }
412
+
413
+ // Get path to property: config.nested.path → ['config', 'nested', 'path']
414
+ const path: (string | number)[] = [];
415
+ let current: Node = node;
416
+ while (current.type === 'MemberExpression') {
417
+ const memberNode = current as MemberExpression;
418
+ if (memberNode.property.type === 'Identifier') {
419
+ path.unshift((memberNode.property as Identifier).name);
420
+ } else if (memberNode.property.type === 'NumericLiteral') {
421
+ // Array access: arr[0]
422
+ path.unshift((memberNode.property as NumericLiteral).value);
423
+ }
424
+ current = memberNode.object;
425
+ }
426
+
427
+ if (current.type === 'Identifier') {
428
+ path.unshift((current as Identifier).name);
429
+ } else {
430
+ return null;
431
+ }
432
+
433
+ // Now resolve via AST
434
+ // Find object declaration
435
+ const rootName = path[0] as string;
436
+ let objectValue: Record<string, unknown> | unknown[] | null = null;
437
+
438
+ traverse(ast, {
439
+ VariableDeclarator: (varPath: NodePath<VariableDeclarator>) => {
440
+ if (varPath.node.id.type === 'Identifier' &&
441
+ varPath.node.id.name === rootName &&
442
+ varPath.node.init &&
443
+ varPath.node.init.type === 'ObjectExpression') {
444
+ objectValue = this.evaluateObjectExpression(varPath.node.init as ObjectExpression);
445
+ } else if (varPath.node.id.type === 'Identifier' &&
446
+ varPath.node.id.name === rootName &&
447
+ varPath.node.init &&
448
+ varPath.node.init.type === 'ArrayExpression') {
449
+ objectValue = this.evaluateArrayExpression(varPath.node.init as ArrayExpression);
450
+ }
451
+ }
452
+ });
453
+
454
+ if (!objectValue) {
455
+ return null;
456
+ }
457
+
458
+ // Walk through path and get value
459
+ let result: unknown = objectValue;
460
+ for (let i = 1; i < path.length; i++) {
461
+ const key = path[i];
462
+ if (result && typeof result === 'object' && key in (result as Record<string, unknown>)) {
463
+ result = (result as Record<string | number, unknown>)[key];
464
+ } else {
465
+ return null;
466
+ }
467
+ }
468
+
469
+ return typeof result === 'string' ? result : null;
470
+ }
471
+
472
+ /**
473
+ * Evaluate ObjectExpression to plain JS object
474
+ */
475
+ evaluateObjectExpression(node: ObjectExpression): Record<string, unknown> {
476
+ const obj: Record<string, unknown> = {};
477
+ for (const prop of node.properties) {
478
+ if (prop.type === 'ObjectProperty') {
479
+ const objProp = prop as ObjectProperty;
480
+ if (objProp.key.type === 'Identifier') {
481
+ const key = (objProp.key as Identifier).name;
482
+ if (objProp.value.type === 'StringLiteral') {
483
+ obj[key] = (objProp.value as StringLiteral).value;
484
+ } else if (objProp.value.type === 'ObjectExpression') {
485
+ obj[key] = this.evaluateObjectExpression(objProp.value);
486
+ }
487
+ }
488
+ }
489
+ }
490
+ return obj;
491
+ }
492
+
493
+ /**
494
+ * Evaluate ArrayExpression to plain JS array
495
+ */
496
+ evaluateArrayExpression(node: ArrayExpression): string[] {
497
+ const arr: string[] = [];
498
+ for (const element of node.elements) {
499
+ if (element && element.type === 'StringLiteral') {
500
+ arr.push((element as StringLiteral).value);
501
+ }
502
+ }
503
+ return arr;
504
+ }
505
+
506
+ /**
507
+ * Helper method for finding edges
508
+ */
509
+ findEdges(graph: Graph, criteria: EdgeCriteria): Edge[] {
510
+ const result: Edge[] = [];
511
+ if (!graph.edges) return result;
512
+
513
+ for (const edge of graph.edges.values()) {
514
+ let matches = true;
515
+ for (const [key, value] of Object.entries(criteria)) {
516
+ if (edge[key] !== value) {
517
+ matches = false;
518
+ break;
519
+ }
520
+ }
521
+ if (matches) {
522
+ result.push(edge);
523
+ }
524
+ }
525
+ return result;
526
+ }
527
+ }