@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,528 @@
1
+ /**
2
+ * CallExpressionVisitor - handles function calls and constructor invocations at module level
3
+ *
4
+ * Handles:
5
+ * - Direct function calls: foo()
6
+ * - Method calls: obj.method()
7
+ * - Event handlers: obj.on('event', handler)
8
+ * - Constructor calls: new Foo(), new Function()
9
+ */
10
+
11
+ import type { Node, CallExpression, NewExpression, Identifier, MemberExpression } from '@babel/types';
12
+ import type { NodePath } from '@babel/traverse';
13
+ import { ASTVisitor, type VisitorModule, type VisitorCollections, type VisitorHandlers, type CounterRef } from './ASTVisitor.js';
14
+ import { ExpressionEvaluator } from '../ExpressionEvaluator.js';
15
+
16
+ /**
17
+ * Argument info for PASSES_ARGUMENT edges
18
+ */
19
+ interface ArgumentInfo {
20
+ callId: string;
21
+ argIndex: number;
22
+ file: string;
23
+ line: number;
24
+ column: number;
25
+ isSpread?: boolean;
26
+ targetType?: string;
27
+ targetId?: string;
28
+ targetName?: string;
29
+ literalValue?: unknown;
30
+ functionLine?: number;
31
+ functionColumn?: number;
32
+ nestedCallLine?: number;
33
+ nestedCallColumn?: number;
34
+ objectName?: string;
35
+ propertyName?: string;
36
+ expressionType?: string;
37
+ }
38
+
39
+ /**
40
+ * Call site info
41
+ */
42
+ interface CallSiteInfo {
43
+ id: string;
44
+ type: 'CALL';
45
+ name: string;
46
+ file: string;
47
+ line: number;
48
+ column: number;
49
+ parentScopeId: string;
50
+ targetFunctionName: string;
51
+ isNew?: boolean;
52
+ }
53
+
54
+ /**
55
+ * Method call info
56
+ */
57
+ interface MethodCallInfo {
58
+ id: string;
59
+ type: 'CALL';
60
+ name: string;
61
+ object: string;
62
+ method: string;
63
+ computed?: boolean;
64
+ computedPropertyVar?: string | null;
65
+ file: string;
66
+ line: number;
67
+ column: number;
68
+ parentScopeId: string;
69
+ isNew?: boolean;
70
+ }
71
+
72
+ /**
73
+ * Event listener info
74
+ */
75
+ interface EventListenerInfo {
76
+ id: string;
77
+ type: 'event:listener';
78
+ name: string;
79
+ object: string;
80
+ file: string;
81
+ line: number;
82
+ parentScopeId: string;
83
+ callbackArg: Node;
84
+ }
85
+
86
+ /**
87
+ * Method callback info
88
+ */
89
+ interface MethodCallbackInfo {
90
+ methodCallId: string;
91
+ callbackLine: number;
92
+ callbackColumn: number;
93
+ callbackType: string;
94
+ }
95
+
96
+ /**
97
+ * Literal node info
98
+ */
99
+ interface LiteralInfo {
100
+ id: string;
101
+ type: 'LITERAL' | 'EXPRESSION';
102
+ value?: unknown;
103
+ valueType?: string;
104
+ expressionType?: string;
105
+ operator?: string;
106
+ name?: string;
107
+ file: string;
108
+ line: number;
109
+ column: number;
110
+ parentCallId: string;
111
+ argIndex: number;
112
+ }
113
+
114
+ export class CallExpressionVisitor extends ASTVisitor {
115
+ constructor(module: VisitorModule, collections: VisitorCollections) {
116
+ super(module, collections);
117
+ }
118
+
119
+ /**
120
+ * Extract argument information for PASSES_ARGUMENT edges
121
+ */
122
+ extractArguments(
123
+ args: CallExpression['arguments'],
124
+ callId: string,
125
+ module: VisitorModule,
126
+ callArguments: ArgumentInfo[],
127
+ literals: LiteralInfo[],
128
+ literalCounterRef: CounterRef
129
+ ): void {
130
+ args.forEach((arg, index) => {
131
+ const argInfo: ArgumentInfo = {
132
+ callId,
133
+ argIndex: index,
134
+ file: module.file,
135
+ line: arg.loc?.start.line || 0,
136
+ column: arg.loc?.start.column || 0
137
+ };
138
+
139
+ // Check for spread: ...arg
140
+ let actualArg: Node = arg;
141
+ if (arg.type === 'SpreadElement') {
142
+ argInfo.isSpread = true;
143
+ actualArg = arg.argument; // Get the actual argument
144
+ }
145
+
146
+ // Literal value
147
+ const literalValue = ExpressionEvaluator.extractLiteralValue(actualArg);
148
+ if (literalValue !== null) {
149
+ const literalId = `LITERAL#arg${index}#${module.file}#${argInfo.line}:${argInfo.column}:${literalCounterRef.value++}`;
150
+ literals.push({
151
+ id: literalId,
152
+ type: 'LITERAL',
153
+ value: literalValue,
154
+ valueType: typeof literalValue,
155
+ file: module.file,
156
+ line: argInfo.line,
157
+ column: argInfo.column,
158
+ parentCallId: callId,
159
+ argIndex: index
160
+ });
161
+ argInfo.targetType = 'LITERAL';
162
+ argInfo.targetId = literalId;
163
+ argInfo.literalValue = literalValue;
164
+ }
165
+ // Variable reference
166
+ else if (actualArg.type === 'Identifier') {
167
+ argInfo.targetType = 'VARIABLE';
168
+ argInfo.targetName = (actualArg as Identifier).name; // Will be resolved in GraphBuilder
169
+ }
170
+ // Function expression (callback)
171
+ else if (actualArg.type === 'ArrowFunctionExpression' || actualArg.type === 'FunctionExpression') {
172
+ argInfo.targetType = 'FUNCTION';
173
+ argInfo.functionLine = actualArg.loc?.start.line;
174
+ argInfo.functionColumn = actualArg.loc?.start.column;
175
+ }
176
+ // Call expression (nested call)
177
+ else if (actualArg.type === 'CallExpression') {
178
+ argInfo.targetType = 'CALL';
179
+ // Nested calls will be processed separately, link by position
180
+ argInfo.nestedCallLine = actualArg.loc?.start.line;
181
+ argInfo.nestedCallColumn = actualArg.loc?.start.column;
182
+ }
183
+ // Member expression: obj.prop or obj[x]
184
+ else if (actualArg.type === 'MemberExpression') {
185
+ const memberExpr = actualArg as MemberExpression;
186
+ argInfo.targetType = 'EXPRESSION';
187
+ argInfo.expressionType = 'MemberExpression';
188
+ if (memberExpr.object.type === 'Identifier') {
189
+ argInfo.objectName = memberExpr.object.name;
190
+ }
191
+ if (!memberExpr.computed && memberExpr.property.type === 'Identifier') {
192
+ argInfo.propertyName = memberExpr.property.name;
193
+ }
194
+ }
195
+ // Binary/Logical expression: a + b, a && b
196
+ else if (actualArg.type === 'BinaryExpression' || actualArg.type === 'LogicalExpression') {
197
+ const expr = actualArg as { operator?: string; type: string };
198
+ const operator = expr.operator || '?';
199
+ const exprName = `<${actualArg.type}:${operator}>`;
200
+ const expressionId = `EXPRESSION#${exprName}#${module.file}#${argInfo.line}:${argInfo.column}:${literalCounterRef.value++}`;
201
+
202
+ // Create EXPRESSION node
203
+ literals.push({
204
+ id: expressionId,
205
+ type: 'EXPRESSION',
206
+ expressionType: actualArg.type,
207
+ operator: operator,
208
+ name: exprName,
209
+ file: module.file,
210
+ line: argInfo.line,
211
+ column: argInfo.column,
212
+ parentCallId: callId,
213
+ argIndex: index
214
+ });
215
+
216
+ argInfo.targetType = 'EXPRESSION';
217
+ argInfo.targetId = expressionId;
218
+ argInfo.expressionType = actualArg.type;
219
+
220
+ // Track DERIVES_FROM edges for identifiers in expression
221
+ const identifiers = this.extractIdentifiers(actualArg);
222
+ const { variableAssignments } = this.collections;
223
+ if (variableAssignments) {
224
+ for (const identName of identifiers) {
225
+ variableAssignments.push({
226
+ variableId: expressionId,
227
+ sourceId: null,
228
+ sourceName: identName,
229
+ sourceType: 'DERIVES_FROM_VARIABLE',
230
+ file: module.file
231
+ });
232
+ }
233
+ }
234
+ }
235
+ // Object literal
236
+ else if (actualArg.type === 'ObjectExpression') {
237
+ argInfo.targetType = 'OBJECT_LITERAL';
238
+ }
239
+ // Array literal
240
+ else if (actualArg.type === 'ArrayExpression') {
241
+ argInfo.targetType = 'ARRAY_LITERAL';
242
+ }
243
+ // Other expression types
244
+ else {
245
+ argInfo.targetType = 'EXPRESSION';
246
+ argInfo.expressionType = actualArg.type;
247
+ }
248
+
249
+ callArguments.push(argInfo);
250
+ });
251
+ }
252
+
253
+ /**
254
+ * Extract all Identifier names from an expression (recursively)
255
+ * Used for BinaryExpression/LogicalExpression to track DERIVES_FROM edges
256
+ */
257
+ extractIdentifiers(node: Node | null | undefined, identifiers: Set<string> = new Set()): string[] {
258
+ if (!node) return Array.from(identifiers);
259
+
260
+ if (node.type === 'Identifier') {
261
+ identifiers.add((node as Identifier).name);
262
+ } else if (node.type === 'BinaryExpression' || node.type === 'LogicalExpression') {
263
+ const expr = node as { left: Node; right: Node };
264
+ this.extractIdentifiers(expr.left, identifiers);
265
+ this.extractIdentifiers(expr.right, identifiers);
266
+ } else if (node.type === 'UnaryExpression') {
267
+ const expr = node as { argument: Node };
268
+ this.extractIdentifiers(expr.argument, identifiers);
269
+ } else if (node.type === 'ConditionalExpression') {
270
+ const expr = node as { test: Node; consequent: Node; alternate: Node };
271
+ this.extractIdentifiers(expr.test, identifiers);
272
+ this.extractIdentifiers(expr.consequent, identifiers);
273
+ this.extractIdentifiers(expr.alternate, identifiers);
274
+ } else if (node.type === 'MemberExpression') {
275
+ const memberExpr = node as MemberExpression;
276
+ // For obj.prop - track obj (but not prop as it's a property name)
277
+ if (memberExpr.object.type === 'Identifier') {
278
+ identifiers.add(memberExpr.object.name);
279
+ } else {
280
+ this.extractIdentifiers(memberExpr.object, identifiers);
281
+ }
282
+ } else if (node.type === 'CallExpression') {
283
+ const callExpr = node as CallExpression;
284
+ // For func() - track func if identifier, and all arguments
285
+ if (callExpr.callee.type === 'Identifier') {
286
+ identifiers.add((callExpr.callee as Identifier).name);
287
+ }
288
+ for (const arg of callExpr.arguments) {
289
+ if (arg.type !== 'SpreadElement') {
290
+ this.extractIdentifiers(arg, identifiers);
291
+ } else {
292
+ this.extractIdentifiers(arg.argument, identifiers);
293
+ }
294
+ }
295
+ }
296
+
297
+ return Array.from(identifiers);
298
+ }
299
+
300
+ /**
301
+ * Get a stable scope ID for a function parent
302
+ * Format must match what FunctionVisitor creates:
303
+ * - FunctionDeclaration: FUNCTION#name#file#line
304
+ * - ArrowFunctionExpression: FUNCTION#name#file#line:col:counter
305
+ *
306
+ * NOTE: We don't have access to the counter here, so for arrow functions
307
+ * we try to match by name+file+line:col. This may not always work for
308
+ * multiple arrow functions on the same line.
309
+ */
310
+ getFunctionScopeId(functionParent: NodePath, module: VisitorModule): string {
311
+ const funcNode = functionParent.node as Node & {
312
+ id?: { name: string } | null;
313
+ loc?: { start: { line: number; column: number } };
314
+ type: string;
315
+ };
316
+ const line = funcNode.loc?.start.line || 0;
317
+ const col = funcNode.loc?.start.column || 0;
318
+
319
+ // FunctionDeclaration with name
320
+ if (funcNode.type === 'FunctionDeclaration' && funcNode.id?.name) {
321
+ return `FUNCTION#${funcNode.id.name}#${module.file}#${line}`;
322
+ }
323
+
324
+ // For arrow functions and other cases, we can't perfectly match the ID
325
+ // because FunctionVisitor uses a counter. For now, use module.id as fallback
326
+ // to avoid creating invalid edges. The CALL node will be connected to MODULE
327
+ // instead of the specific function.
328
+ return module.id;
329
+ }
330
+
331
+ getHandlers(): VisitorHandlers {
332
+ const { module } = this;
333
+ const callSites = this.collections.callSites ?? [];
334
+ const methodCalls = this.collections.methodCalls ?? [];
335
+ const eventListeners = this.collections.eventListeners ?? [];
336
+ const methodCallbacks = this.collections.methodCallbacks ?? [];
337
+ const literals = this.collections.literals ?? [];
338
+ const callArguments = this.collections.callArguments ?? [];
339
+ const callSiteCounterRef = (this.collections.callSiteCounterRef ?? { value: 0 }) as CounterRef;
340
+ const literalCounterRef = (this.collections.literalCounterRef ?? { value: 0 }) as CounterRef;
341
+ const processedNodes = this.collections.processedNodes ?? { callSites: new Set(), methodCalls: new Set(), eventListeners: new Set() };
342
+
343
+ return {
344
+ CallExpression: (path: NodePath) => {
345
+ const callNode = path.node as CallExpression;
346
+ const functionParent = path.getFunctionParent();
347
+ // Determine parent scope - if inside a function, use function's scope, otherwise module
348
+ const parentScopeId = functionParent ? this.getFunctionScopeId(functionParent, module) : module.id;
349
+
350
+ // Identifier calls (direct function calls)
351
+ if (callNode.callee.type === 'Identifier') {
352
+ const callee = callNode.callee as Identifier;
353
+ const callId = `CALL#${callee.name}#${module.file}#${callNode.loc!.start.line}:${callNode.loc!.start.column}:${callSiteCounterRef.value++}`;
354
+
355
+ (callSites as CallSiteInfo[]).push({
356
+ id: callId,
357
+ type: 'CALL',
358
+ name: callee.name,
359
+ file: module.file,
360
+ line: callNode.loc!.start.line,
361
+ column: callNode.loc!.start.column,
362
+ parentScopeId,
363
+ targetFunctionName: callee.name
364
+ });
365
+
366
+ // Extract arguments for PASSES_ARGUMENT edges
367
+ if (callNode.arguments.length > 0) {
368
+ this.extractArguments(
369
+ callNode.arguments,
370
+ callId,
371
+ module,
372
+ callArguments as ArgumentInfo[],
373
+ literals as LiteralInfo[],
374
+ literalCounterRef
375
+ );
376
+ }
377
+ }
378
+ // MemberExpression calls (method calls at module level)
379
+ else if (callNode.callee.type === 'MemberExpression') {
380
+ const memberCallee = callNode.callee as MemberExpression;
381
+ const object = memberCallee.object;
382
+ const property = memberCallee.property;
383
+ const isComputed = memberCallee.computed;
384
+
385
+ if ((object.type === 'Identifier' || object.type === 'ThisExpression') && property.type === 'Identifier') {
386
+ const objectName = object.type === 'Identifier' ? (object as Identifier).name : 'this';
387
+ // For computed access obj[x](), methodName is '<computed>' but we save the variable name
388
+ const methodName = isComputed ? '<computed>' : (property as Identifier).name;
389
+ const computedPropertyVar = isComputed ? (property as Identifier).name : null;
390
+
391
+ // Special handling for .on() event handlers
392
+ if (methodName === 'on' && callNode.arguments.length >= 2) {
393
+ const firstArg = callNode.arguments[0];
394
+ const secondArg = callNode.arguments[1];
395
+
396
+ if (firstArg.type === 'StringLiteral') {
397
+ const eventName = firstArg.value;
398
+
399
+ // Dedup check
400
+ const nodeKey = `${callNode.start}:${callNode.end}`;
401
+ if (processedNodes.eventListeners.has(nodeKey)) {
402
+ return;
403
+ }
404
+ processedNodes.eventListeners.add(nodeKey);
405
+
406
+ (eventListeners as EventListenerInfo[]).push({
407
+ id: `event:listener#${eventName}#${module.file}#${callNode.loc!.start.line}:${callNode.loc!.start.column}:${callSiteCounterRef.value++}`,
408
+ type: 'event:listener',
409
+ name: eventName,
410
+ object: objectName,
411
+ file: module.file,
412
+ line: callNode.loc!.start.line,
413
+ parentScopeId,
414
+ callbackArg: secondArg
415
+ });
416
+ }
417
+ } else {
418
+ // Regular method call
419
+ const nodeKey = `${callNode.start}:${callNode.end}`;
420
+ if (processedNodes.methodCalls.has(nodeKey)) {
421
+ return;
422
+ }
423
+ processedNodes.methodCalls.add(nodeKey);
424
+
425
+ const fullName = `${objectName}.${methodName}`;
426
+ const methodCallId = `CALL#${fullName}#${module.file}#${callNode.loc!.start.line}:${callNode.loc!.start.column}:${callSiteCounterRef.value++}`;
427
+
428
+ (methodCalls as MethodCallInfo[]).push({
429
+ id: methodCallId,
430
+ type: 'CALL',
431
+ name: fullName,
432
+ object: objectName,
433
+ method: methodName,
434
+ computed: isComputed,
435
+ computedPropertyVar, // Variable name used in obj[x]() calls
436
+ file: module.file,
437
+ line: callNode.loc!.start.line,
438
+ column: callNode.loc!.start.column,
439
+ parentScopeId
440
+ });
441
+
442
+ // Extract arguments for PASSES_ARGUMENT edges
443
+ if (callNode.arguments.length > 0) {
444
+ this.extractArguments(
445
+ callNode.arguments,
446
+ methodCallId,
447
+ module,
448
+ callArguments as ArgumentInfo[],
449
+ literals as LiteralInfo[],
450
+ literalCounterRef
451
+ );
452
+
453
+ // Also track callbacks for HAS_CALLBACK edges
454
+ callNode.arguments.forEach((arg) => {
455
+ if (arg.type === 'ArrowFunctionExpression' || arg.type === 'FunctionExpression') {
456
+ (methodCallbacks as MethodCallbackInfo[]).push({
457
+ methodCallId,
458
+ callbackLine: arg.loc!.start.line,
459
+ callbackColumn: arg.loc!.start.column,
460
+ callbackType: arg.type
461
+ });
462
+ }
463
+ });
464
+ }
465
+ }
466
+ }
467
+ }
468
+ },
469
+
470
+ // NewExpression: new Foo(), new Function(), new Map(), etc.
471
+ NewExpression: (path: NodePath) => {
472
+ const newNode = path.node as NewExpression;
473
+ const functionParent = path.getFunctionParent();
474
+ const parentScopeId = functionParent ? this.getFunctionScopeId(functionParent, module) : module.id;
475
+
476
+ // Dedup check
477
+ const nodeKey = `new:${newNode.start}:${newNode.end}`;
478
+ if (processedNodes.methodCalls.has(nodeKey)) {
479
+ return;
480
+ }
481
+ processedNodes.methodCalls.add(nodeKey);
482
+
483
+ // new Foo() - Identifier callee
484
+ if (newNode.callee.type === 'Identifier') {
485
+ const callee = newNode.callee as Identifier;
486
+ const constructorName = callee.name;
487
+
488
+ (callSites as CallSiteInfo[]).push({
489
+ id: `CALL#new:${constructorName}#${module.file}#${newNode.loc!.start.line}:${newNode.loc!.start.column}:${callSiteCounterRef.value++}`,
490
+ type: 'CALL',
491
+ name: constructorName,
492
+ file: module.file,
493
+ line: newNode.loc!.start.line,
494
+ column: newNode.loc!.start.column,
495
+ parentScopeId,
496
+ targetFunctionName: constructorName,
497
+ isNew: true // Mark as constructor call
498
+ });
499
+ }
500
+ // new obj.Constructor() - MemberExpression callee
501
+ else if (newNode.callee.type === 'MemberExpression') {
502
+ const memberCallee = newNode.callee as MemberExpression;
503
+ const object = memberCallee.object;
504
+ const property = memberCallee.property;
505
+
506
+ if (object.type === 'Identifier' && property.type === 'Identifier') {
507
+ const objectName = (object as Identifier).name;
508
+ const constructorName = (property as Identifier).name;
509
+ const fullName = `${objectName}.${constructorName}`;
510
+
511
+ (methodCalls as MethodCallInfo[]).push({
512
+ id: `CALL#new:${fullName}#${module.file}#${newNode.loc!.start.line}:${newNode.loc!.start.column}:${callSiteCounterRef.value++}`,
513
+ type: 'CALL',
514
+ name: fullName,
515
+ object: objectName,
516
+ method: constructorName,
517
+ file: module.file,
518
+ line: newNode.loc!.start.line,
519
+ column: newNode.loc!.start.column,
520
+ parentScopeId,
521
+ isNew: true // Mark as constructor call
522
+ });
523
+ }
524
+ }
525
+ }
526
+ };
527
+ }
528
+ }