@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,114 @@
1
+ /**
2
+ * ValueDomainAnalyzer - Value Set Analysis for computed member access
3
+ *
4
+ * Purpose: Determine the set of possible values for a variable and resolve
5
+ * computed member access obj[method]() when method is deterministic.
6
+ *
7
+ * USES:
8
+ * - VARIABLE -> ASSIGNED_FROM -> LITERAL (from JSASTAnalyzer)
9
+ * - VARIABLE -> ASSIGNED_FROM -> VARIABLE (transitive chains)
10
+ * - ConditionalExpression → multiple ASSIGNED_FROM edges
11
+ *
12
+ * CREATES:
13
+ * - CALL -> CALLS -> METHOD (with isConditional: true for conditional calls)
14
+ */
15
+ import { Plugin } from '../Plugin.js';
16
+ import type { PluginMetadata, PluginContext, PluginResult } from '../Plugin.js';
17
+ import type { NodeRecord } from '@grafema/types';
18
+ import type { EdgeRecord } from '@grafema/types';
19
+ interface ExpressionNode {
20
+ id: string;
21
+ type: string;
22
+ name?: string;
23
+ file?: string;
24
+ line?: number;
25
+ expressionType?: string;
26
+ object?: string;
27
+ property?: string;
28
+ attrs?: {
29
+ expressionType?: string;
30
+ object?: string;
31
+ property?: string;
32
+ };
33
+ }
34
+ interface Constraint {
35
+ variable?: string;
36
+ operator?: string;
37
+ value?: unknown;
38
+ values?: unknown[];
39
+ type?: 'or' | 'and';
40
+ constraints?: Constraint[];
41
+ }
42
+ interface ValueSetResult {
43
+ values: unknown[];
44
+ hasUnknown: boolean;
45
+ }
46
+ interface ValueSetAtNodeResult extends ValueSetResult {
47
+ constraints: Constraint[];
48
+ globalValues: unknown[];
49
+ globalHasUnknown: boolean;
50
+ }
51
+ interface NondeterministicPattern {
52
+ object: string;
53
+ property: string;
54
+ }
55
+ interface Graph {
56
+ queryNodes(filter: {
57
+ nodeType: string;
58
+ }): AsyncIterable<NodeRecord>;
59
+ getNode(id: string): Promise<NodeRecord | null>;
60
+ getOutgoingEdges(nodeId: string): Promise<EdgeRecord[]>;
61
+ getIncomingEdges(nodeId: string): Promise<EdgeRecord[]>;
62
+ addEdge(edge: {
63
+ src: string;
64
+ dst: string;
65
+ type: string;
66
+ metadata?: Record<string, unknown>;
67
+ }): Promise<void> | void;
68
+ }
69
+ export declare class ValueDomainAnalyzer extends Plugin {
70
+ static MAX_DEPTH: number;
71
+ static NONDETERMINISTIC_PATTERNS: NondeterministicPattern[];
72
+ static NONDETERMINISTIC_OBJECTS: string[];
73
+ get metadata(): PluginMetadata;
74
+ execute(context: PluginContext): Promise<PluginResult>;
75
+ /**
76
+ * Get set of possible values for a variable
77
+ */
78
+ getValueSet(variableName: string, file: string, graph: Graph): Promise<ValueSetResult>;
79
+ /**
80
+ * Get value set for a variable at a specific node, considering path constraints
81
+ * This is path-sensitive: it collects constraints from enclosing scopes and applies them
82
+ */
83
+ getValueSetAtNode(variableName: string, node: NodeRecord & {
84
+ parentScopeId?: string;
85
+ }, graph: Graph): Promise<ValueSetAtNodeResult>;
86
+ /**
87
+ * Collect all constraints from the scope chain leading to this node
88
+ */
89
+ collectPathConstraints(node: NodeRecord & {
90
+ parentScopeId?: string;
91
+ }, graph: Graph): Promise<Constraint[]>;
92
+ /**
93
+ * Apply constraints to narrow a value set
94
+ */
95
+ applyConstraints(valueSet: ValueSetResult, constraints: Constraint[], variableName: string): ValueSetResult;
96
+ /**
97
+ * Apply a single constraint to a value set
98
+ */
99
+ applySingleConstraint(valueSet: ValueSetResult, constraint: Constraint, variableName: string): ValueSetResult;
100
+ /**
101
+ * Check if an EXPRESSION node represents a nondeterministic source
102
+ */
103
+ isNondeterministicExpression(node: ExpressionNode): boolean;
104
+ /**
105
+ * Recursive value set tracing through ASSIGNED_FROM edges
106
+ */
107
+ traceValueSet(node: NodeRecord, graph: Graph, visited: Set<string>, depth: number): Promise<ValueSetResult>;
108
+ /**
109
+ * Find method by object name and method name
110
+ */
111
+ findMethod(objectName: string, methodName: string, file: string, graph: Graph): Promise<NodeRecord | null>;
112
+ }
113
+ export default ValueDomainAnalyzer;
114
+ //# sourceMappingURL=ValueDomainAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValueDomainAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/plugins/enrichment/ValueDomainAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,464 @@
1
+ /**
2
+ * ValueDomainAnalyzer - Value Set Analysis for computed member access
3
+ *
4
+ * Purpose: Determine the set of possible values for a variable and resolve
5
+ * computed member access obj[method]() when method is deterministic.
6
+ *
7
+ * USES:
8
+ * - VARIABLE -> ASSIGNED_FROM -> LITERAL (from JSASTAnalyzer)
9
+ * - VARIABLE -> ASSIGNED_FROM -> VARIABLE (transitive chains)
10
+ * - ConditionalExpression → multiple ASSIGNED_FROM edges
11
+ *
12
+ * CREATES:
13
+ * - CALL -> CALLS -> METHOD (with isConditional: true for conditional calls)
14
+ */
15
+ import { Plugin, createSuccessResult } from '../Plugin.js';
16
+ export class ValueDomainAnalyzer extends Plugin {
17
+ static MAX_DEPTH = 10; // Maximum depth for tracing
18
+ // Nondeterministic MemberExpression patterns
19
+ // object.property patterns that are external/user input
20
+ static NONDETERMINISTIC_PATTERNS = [
21
+ // Environment variables
22
+ { object: 'process', property: 'env' },
23
+ // HTTP request data (Express.js patterns)
24
+ { object: 'req', property: 'body' },
25
+ { object: 'req', property: 'query' },
26
+ { object: 'req', property: 'params' },
27
+ { object: 'req', property: 'headers' },
28
+ { object: 'req', property: 'cookies' },
29
+ { object: 'request', property: 'body' },
30
+ { object: 'request', property: 'query' },
31
+ { object: 'request', property: 'params' },
32
+ // Context patterns (Koa, etc.)
33
+ { object: 'ctx', property: 'request' },
34
+ { object: 'ctx', property: 'body' },
35
+ { object: 'ctx', property: 'query' },
36
+ { object: 'ctx', property: 'params' },
37
+ ];
38
+ // Nondeterministic object prefixes (any property access is nondeterministic)
39
+ static NONDETERMINISTIC_OBJECTS = [
40
+ 'process.env', // process.env.ANY_VAR
41
+ 'req.body', // req.body.userId
42
+ 'req.query', // req.query.filter
43
+ 'req.params', // req.params.id
44
+ 'request.body',
45
+ 'ctx.request',
46
+ ];
47
+ get metadata() {
48
+ return {
49
+ name: 'ValueDomainAnalyzer',
50
+ phase: 'ENRICHMENT',
51
+ priority: 65, // After AliasTracker (60)
52
+ creates: {
53
+ nodes: [],
54
+ edges: ['CALLS']
55
+ }
56
+ };
57
+ }
58
+ async execute(context) {
59
+ const { graph } = context;
60
+ const onProgress = context.onProgress;
61
+ const graphTyped = graph;
62
+ console.log('[ValueDomainAnalyzer] Starting value domain analysis...');
63
+ let callsProcessed = 0;
64
+ let callsResolved = 0;
65
+ let edgesCreated = 0;
66
+ let conditionalCalls = 0;
67
+ let partialCalls = 0;
68
+ // 1. Find all CALL nodes with computed member access
69
+ const computedCalls = [];
70
+ for await (const node of graphTyped.queryNodes({ nodeType: 'CALL' })) {
71
+ // Cast through unknown since node types vary
72
+ const callNode = node;
73
+ if (callNode.computed === true) {
74
+ computedCalls.push(callNode);
75
+ }
76
+ }
77
+ console.log(`[ValueDomainAnalyzer] Found ${computedCalls.length} computed member calls`);
78
+ // 2. For each computed call get value set
79
+ for (const call of computedCalls) {
80
+ callsProcessed++;
81
+ // Report progress every 20 calls
82
+ if (onProgress && callsProcessed % 20 === 0) {
83
+ onProgress({
84
+ phase: 'enrichment',
85
+ currentPlugin: 'ValueDomainAnalyzer',
86
+ message: `Analyzing value domains ${callsProcessed}/${computedCalls.length}`,
87
+ totalFiles: computedCalls.length,
88
+ processedFiles: callsProcessed
89
+ });
90
+ }
91
+ const objectName = call.object;
92
+ const propertyExpr = call.property; // variable name with method name
93
+ if (!objectName || !propertyExpr)
94
+ continue;
95
+ // 3. Get value set for property expression
96
+ const valueSet = await this.getValueSet(propertyExpr, call.file, graphTyped);
97
+ if (valueSet.hasUnknown && valueSet.values.length === 0) {
98
+ // Completely nondeterministic - skip
99
+ continue;
100
+ }
101
+ if (valueSet.values.length === 0) {
102
+ // No known values - skip
103
+ continue;
104
+ }
105
+ // 4. Create CALLS edges for each known value
106
+ callsResolved++;
107
+ const isConditional = valueSet.values.length > 1 || valueSet.hasUnknown;
108
+ const partial = valueSet.hasUnknown;
109
+ for (const methodName of valueSet.values) {
110
+ // Find method by name in the same file
111
+ const targetMethod = await this.findMethod(objectName, methodName, call.file, graphTyped);
112
+ if (targetMethod) {
113
+ await graphTyped.addEdge({
114
+ src: call.id,
115
+ dst: targetMethod.id,
116
+ type: 'CALLS',
117
+ metadata: {
118
+ isConditional,
119
+ partial: partial || undefined, // undefined to not store false
120
+ source: 'computed_member_access'
121
+ }
122
+ });
123
+ edgesCreated++;
124
+ if (isConditional) {
125
+ conditionalCalls++;
126
+ }
127
+ if (partial) {
128
+ partialCalls++;
129
+ }
130
+ }
131
+ }
132
+ }
133
+ const summary = {
134
+ callsProcessed,
135
+ callsResolved,
136
+ edgesCreated,
137
+ conditionalCalls,
138
+ partialCalls
139
+ };
140
+ console.log('[ValueDomainAnalyzer] Summary:', summary);
141
+ return createSuccessResult({ nodes: 0, edges: edgesCreated }, summary);
142
+ }
143
+ /**
144
+ * Get set of possible values for a variable
145
+ */
146
+ async getValueSet(variableName, file, graph) {
147
+ const result = {
148
+ values: [],
149
+ hasUnknown: false
150
+ };
151
+ // Find variable
152
+ const variables = [];
153
+ for await (const node of graph.queryNodes({ nodeType: 'VARIABLE' })) {
154
+ const varNode = node;
155
+ const nodeName = varNode.name || varNode.attrs?.name;
156
+ const nodeFile = varNode.file || varNode.attrs?.file;
157
+ if (nodeName === variableName && nodeFile === file) {
158
+ variables.push(varNode);
159
+ }
160
+ }
161
+ for await (const node of graph.queryNodes({ nodeType: 'CONSTANT' })) {
162
+ const varNode = node;
163
+ const nodeName = varNode.name || varNode.attrs?.name;
164
+ const nodeFile = varNode.file || varNode.attrs?.file;
165
+ if (nodeName === variableName && nodeFile === file) {
166
+ variables.push(varNode);
167
+ }
168
+ }
169
+ if (variables.length === 0) {
170
+ console.log(`[ValueDomainAnalyzer] No variable found for ${variableName} in ${file}`);
171
+ result.hasUnknown = true;
172
+ return result;
173
+ }
174
+ console.log(`[ValueDomainAnalyzer] Found ${variables.length} variable(s) for ${variableName}`);
175
+ // Trace ASSIGNED_FROM to LITERAL or nondeterministic sources
176
+ const visited = new Set();
177
+ const valueSet = new Set();
178
+ for (const variable of variables) {
179
+ const { values, hasUnknown } = await this.traceValueSet(variable, graph, visited, 0);
180
+ values.forEach(v => valueSet.add(v));
181
+ if (hasUnknown) {
182
+ result.hasUnknown = true;
183
+ }
184
+ }
185
+ result.values = Array.from(valueSet);
186
+ return result;
187
+ }
188
+ /**
189
+ * Get value set for a variable at a specific node, considering path constraints
190
+ * This is path-sensitive: it collects constraints from enclosing scopes and applies them
191
+ */
192
+ async getValueSetAtNode(variableName, node, graph) {
193
+ // 1. Get global value set
194
+ const file = node.file ||
195
+ node.attrs?.file || '';
196
+ const globalResult = await this.getValueSet(variableName, file, graph);
197
+ // 2. Collect constraints from enclosing scopes
198
+ const constraints = await this.collectPathConstraints(node, graph);
199
+ // 3. Filter constraints relevant to this variable
200
+ const relevantConstraints = constraints.filter(c => c.variable === variableName ||
201
+ (c.type === 'or' && c.constraints?.some(sub => sub.variable === variableName)) ||
202
+ (c.type === 'and' && c.constraints?.some(sub => sub.variable === variableName)));
203
+ // 4. Apply constraints to narrow the value set
204
+ const refinedResult = this.applyConstraints(globalResult, relevantConstraints, variableName);
205
+ return {
206
+ ...refinedResult,
207
+ constraints: relevantConstraints,
208
+ globalValues: globalResult.values,
209
+ globalHasUnknown: globalResult.hasUnknown
210
+ };
211
+ }
212
+ /**
213
+ * Collect all constraints from the scope chain leading to this node
214
+ */
215
+ async collectPathConstraints(node, graph) {
216
+ const constraints = [];
217
+ let currentScopeId = node.parentScopeId;
218
+ const visited = new Set();
219
+ while (currentScopeId && !visited.has(currentScopeId)) {
220
+ visited.add(currentScopeId);
221
+ // Find the scope node
222
+ let scope = null;
223
+ for await (const s of graph.queryNodes({ nodeType: 'SCOPE' })) {
224
+ const scopeNode = s;
225
+ if (scopeNode.id === currentScopeId ||
226
+ scopeNode.originalId === currentScopeId ||
227
+ scopeNode.stableId === currentScopeId) {
228
+ scope = scopeNode;
229
+ break;
230
+ }
231
+ }
232
+ if (!scope)
233
+ break;
234
+ // Add constraints from this scope
235
+ if (scope.constraints && Array.isArray(scope.constraints)) {
236
+ constraints.push(...scope.constraints);
237
+ }
238
+ // Move up to parent scope
239
+ currentScopeId = scope.parentScopeId;
240
+ }
241
+ return constraints;
242
+ }
243
+ /**
244
+ * Apply constraints to narrow a value set
245
+ */
246
+ applyConstraints(valueSet, constraints, variableName) {
247
+ if (constraints.length === 0) {
248
+ return valueSet;
249
+ }
250
+ let result = {
251
+ values: [...valueSet.values],
252
+ hasUnknown: valueSet.hasUnknown
253
+ };
254
+ for (const constraint of constraints) {
255
+ result = this.applySingleConstraint(result, constraint, variableName);
256
+ }
257
+ return result;
258
+ }
259
+ /**
260
+ * Apply a single constraint to a value set
261
+ */
262
+ applySingleConstraint(valueSet, constraint, variableName) {
263
+ if (constraint.variable !== variableName) {
264
+ // Constraint is for a different variable - no change
265
+ return valueSet;
266
+ }
267
+ switch (constraint.operator) {
268
+ case '===':
269
+ case '==':
270
+ // Exact match - narrow to single value
271
+ return {
272
+ values: [constraint.value],
273
+ hasUnknown: false
274
+ };
275
+ case '!==':
276
+ case '!=':
277
+ // Exclusion - remove specific value from set
278
+ return {
279
+ values: valueSet.values.filter(v => v !== constraint.value),
280
+ hasUnknown: valueSet.hasUnknown
281
+ };
282
+ case 'in':
283
+ // Value must be one of the specified values
284
+ if (constraint.values) {
285
+ if (valueSet.hasUnknown) {
286
+ // Unknown narrowed to specific set
287
+ return {
288
+ values: constraint.values,
289
+ hasUnknown: false
290
+ };
291
+ }
292
+ else {
293
+ // Intersect with known values
294
+ return {
295
+ values: valueSet.values.filter(v => constraint.values.includes(v)),
296
+ hasUnknown: false
297
+ };
298
+ }
299
+ }
300
+ return valueSet;
301
+ case 'not_in':
302
+ // Value must NOT be one of the specified values
303
+ if (constraint.values) {
304
+ return {
305
+ values: valueSet.values.filter(v => !constraint.values.includes(v)),
306
+ hasUnknown: valueSet.hasUnknown
307
+ };
308
+ }
309
+ return valueSet;
310
+ case 'truthy':
311
+ // Variable is truthy - can't narrow much, but excludes falsy values
312
+ return {
313
+ values: valueSet.values.filter(v => v !== null && v !== undefined && v !== false && v !== 0 && v !== ''),
314
+ hasUnknown: valueSet.hasUnknown
315
+ };
316
+ case 'falsy':
317
+ // Variable is falsy
318
+ return {
319
+ values: valueSet.values.filter(v => v === null || v === undefined || v === false || v === 0 || v === ''),
320
+ hasUnknown: false // We know it's falsy
321
+ };
322
+ default:
323
+ return valueSet;
324
+ }
325
+ }
326
+ /**
327
+ * Check if an EXPRESSION node represents a nondeterministic source
328
+ */
329
+ isNondeterministicExpression(node) {
330
+ const expressionType = node.expressionType || node.attrs?.expressionType;
331
+ if (expressionType !== 'MemberExpression') {
332
+ return false;
333
+ }
334
+ const object = node.object || node.attrs?.object;
335
+ const property = node.property || node.attrs?.property;
336
+ if (!object || !property) {
337
+ return false;
338
+ }
339
+ // Check exact patterns (object.property)
340
+ for (const pattern of ValueDomainAnalyzer.NONDETERMINISTIC_PATTERNS) {
341
+ if (object === pattern.object && property === pattern.property) {
342
+ return true;
343
+ }
344
+ }
345
+ // Check if object is a known nondeterministic prefix
346
+ // e.g., process.env.VAR where object is 'process.env'
347
+ for (const prefix of ValueDomainAnalyzer.NONDETERMINISTIC_OBJECTS) {
348
+ if (object === prefix || object.startsWith(prefix + '.')) {
349
+ return true;
350
+ }
351
+ }
352
+ return false;
353
+ }
354
+ /**
355
+ * Recursive value set tracing through ASSIGNED_FROM edges
356
+ */
357
+ async traceValueSet(node, graph, visited, depth) {
358
+ const result = { values: [], hasUnknown: false };
359
+ // Cycle protection
360
+ if (visited.has(node.id)) {
361
+ return result;
362
+ }
363
+ visited.add(node.id);
364
+ // Depth protection
365
+ if (depth > ValueDomainAnalyzer.MAX_DEPTH) {
366
+ result.hasUnknown = true;
367
+ return result;
368
+ }
369
+ // Support both fields: nodeType (from getNode) and type (alias)
370
+ const nodeType = node.nodeType ||
371
+ node.type;
372
+ // If it's a LITERAL - add value
373
+ if (nodeType === 'LITERAL') {
374
+ const value = node.value;
375
+ if (value !== undefined && value !== null) {
376
+ result.values.push(value);
377
+ }
378
+ return result;
379
+ }
380
+ // If it's a PARAMETER or nondeterministic source
381
+ if (nodeType === 'PARAMETER') {
382
+ result.hasUnknown = true;
383
+ return result;
384
+ }
385
+ // If it's a CALL - consider nondeterministic (for now)
386
+ if (nodeType === 'CALL') {
387
+ result.hasUnknown = true;
388
+ return result;
389
+ }
390
+ // If it's an EXPRESSION - check nondeterministic patterns
391
+ if (nodeType === 'EXPRESSION') {
392
+ if (this.isNondeterministicExpression(node)) {
393
+ result.hasUnknown = true;
394
+ return result;
395
+ }
396
+ }
397
+ // Follow ASSIGNED_FROM and DERIVES_FROM edges
398
+ // DERIVES_FROM is used for template literals and other composite expressions
399
+ const outgoing = await graph.getOutgoingEdges(node.id);
400
+ // edgeType (from getOutgoingEdges) or edge_type (from other APIs)
401
+ const dataFlowEdges = outgoing.filter(e => {
402
+ const edgeType = e.edgeType ||
403
+ e.edge_type;
404
+ return edgeType === 'ASSIGNED_FROM' || edgeType === 'DERIVES_FROM';
405
+ });
406
+ if (dataFlowEdges.length === 0) {
407
+ // No sources - unknown
408
+ result.hasUnknown = true;
409
+ return result;
410
+ }
411
+ // Recursively trace each source
412
+ for (const edge of dataFlowEdges) {
413
+ // dst (from getOutgoingEdges) or target_id (from other APIs)
414
+ const targetId = edge.dst ||
415
+ edge.target_id;
416
+ if (!targetId)
417
+ continue;
418
+ const sourceNode = await graph.getNode(targetId);
419
+ if (!sourceNode)
420
+ continue;
421
+ const sourceResult = await this.traceValueSet(sourceNode, graph, visited, depth + 1);
422
+ sourceResult.values.forEach(v => result.values.push(v));
423
+ if (sourceResult.hasUnknown) {
424
+ result.hasUnknown = true;
425
+ }
426
+ }
427
+ return result;
428
+ }
429
+ /**
430
+ * Find method by object name and method name
431
+ */
432
+ async findMethod(objectName, methodName, file, graph) {
433
+ // Find methods in the same file
434
+ for await (const node of graph.queryNodes({ nodeType: 'FUNCTION' })) {
435
+ const funcNode = node;
436
+ if (funcNode.file === file && funcNode.name === methodName) {
437
+ // Check if this is a method of the right object
438
+ // Simplified: check via incoming CONTAINS edges from CLASS
439
+ const incoming = await graph.getIncomingEdges(node.id);
440
+ const containsEdges = incoming.filter(e => {
441
+ const edgeType = e.edgeType ||
442
+ e.edge_type;
443
+ return edgeType === 'CONTAINS';
444
+ });
445
+ for (const edge of containsEdges) {
446
+ const sourceId = edge.src ||
447
+ edge.source_id;
448
+ if (!sourceId)
449
+ continue;
450
+ const container = await graph.getNode(sourceId);
451
+ // node_type (from DB) or type (from addNodes)
452
+ const containerType = container?.node_type ||
453
+ container?.type;
454
+ const containerName = container?.name;
455
+ if (container && containerType === 'CLASS' && containerName === objectName) {
456
+ return node;
457
+ }
458
+ }
459
+ }
460
+ }
461
+ return null;
462
+ }
463
+ }
464
+ export default ValueDomainAnalyzer;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * IncrementalModuleIndexer - индексирует модули по требованию через очередь
3
+ * Стартует с entry файла, затем анализирует импорты и добавляет новые файлы в очередь
4
+ */
5
+ import { Plugin } from '../Plugin.js';
6
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
7
+ export declare class IncrementalModuleIndexer extends Plugin {
8
+ get metadata(): PluginMetadata;
9
+ /**
10
+ * Resolve module path from import
11
+ */
12
+ private resolveModule;
13
+ /**
14
+ * Try to resolve file with different extensions
15
+ */
16
+ private tryResolve;
17
+ /**
18
+ * Calculate file hash
19
+ */
20
+ private calculateFileHash;
21
+ /**
22
+ * Parse imports from file
23
+ */
24
+ private parseImports;
25
+ execute(context: PluginContext): Promise<PluginResult>;
26
+ }
27
+ //# sourceMappingURL=IncrementalModuleIndexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncrementalModuleIndexer.d.ts","sourceRoot":"","sources":["../../../src/plugins/indexing/IncrementalModuleIndexer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAAE,MAAM,EAA0C,MAAM,cAAc,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAyBhF,qBAAa,wBAAyB,SAAQ,MAAM;IAClD,IAAI,QAAQ,IAAI,cAAc,CAU7B;IAED;;OAEG;IACH,OAAO,CAAC,aAAa;IA0BrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAuBlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAqCd,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CAgI7D"}