@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,339 @@
1
+ /**
2
+ * ClassVisitor - handles class declarations and their methods
3
+ *
4
+ * Handles:
5
+ * - ClassDeclaration
6
+ * - ClassMethod (nested)
7
+ * - ClassProperty with function values (nested)
8
+ * - Implements (TypeScript)
9
+ * - Decorators
10
+ */
11
+
12
+ import type {
13
+ ClassDeclaration,
14
+ ClassMethod,
15
+ ClassProperty,
16
+ Identifier,
17
+ ArrowFunctionExpression,
18
+ FunctionExpression,
19
+ Decorator,
20
+ Node
21
+ } from '@babel/types';
22
+ import type { NodePath } from '@babel/traverse';
23
+ import { ASTVisitor, type VisitorModule, type VisitorCollections, type VisitorHandlers } from './ASTVisitor.js';
24
+ import type { AnalyzeFunctionBodyCallback } from './FunctionVisitor.js';
25
+ import type { DecoratorInfo } from '../types.js';
26
+ import { ExpressionEvaluator } from '../ExpressionEvaluator.js';
27
+
28
+ /**
29
+ * Class declaration info
30
+ */
31
+ interface ClassInfo {
32
+ id: string;
33
+ type: 'CLASS';
34
+ name: string;
35
+ file: string;
36
+ line: number;
37
+ column: number;
38
+ superClass: string | null;
39
+ implements?: string[]; // TypeScript implements
40
+ methods: string[];
41
+ }
42
+
43
+ /**
44
+ * Function node info for class methods
45
+ */
46
+ interface ClassFunctionInfo {
47
+ id: string;
48
+ stableId: string;
49
+ type: 'FUNCTION';
50
+ name: string;
51
+ file: string;
52
+ line: number;
53
+ column: number;
54
+ async: boolean;
55
+ generator?: boolean;
56
+ arrowFunction?: boolean;
57
+ isClassProperty?: boolean;
58
+ isClassMethod?: boolean;
59
+ className: string;
60
+ methodKind?: 'constructor' | 'method' | 'get' | 'set';
61
+ }
62
+
63
+ /**
64
+ * Scope node info
65
+ */
66
+ interface ScopeInfo {
67
+ id: string;
68
+ type: 'SCOPE';
69
+ scopeType: string;
70
+ name: string;
71
+ conditional?: boolean;
72
+ file: string;
73
+ line: number;
74
+ parentFunctionId: string;
75
+ }
76
+
77
+ export class ClassVisitor extends ASTVisitor {
78
+ private analyzeFunctionBody: AnalyzeFunctionBodyCallback;
79
+
80
+ /**
81
+ * @param module - Current module being analyzed
82
+ * @param collections - Must contain arrays and counter refs
83
+ * @param analyzeFunctionBody - Callback to analyze method internals
84
+ */
85
+ constructor(
86
+ module: VisitorModule,
87
+ collections: VisitorCollections,
88
+ analyzeFunctionBody: AnalyzeFunctionBodyCallback
89
+ ) {
90
+ super(module, collections);
91
+ this.analyzeFunctionBody = analyzeFunctionBody;
92
+ }
93
+
94
+ /**
95
+ * Extract decorator information from a Decorator node
96
+ */
97
+ private extractDecoratorInfo(
98
+ decorator: Decorator,
99
+ targetId: string,
100
+ targetType: 'CLASS' | 'METHOD' | 'PROPERTY' | 'PARAMETER',
101
+ module: VisitorModule
102
+ ): DecoratorInfo | null {
103
+ let decoratorName: string;
104
+ let decoratorArgs: unknown[] | undefined;
105
+
106
+ // @Decorator or @Decorator()
107
+ if (decorator.expression.type === 'Identifier') {
108
+ decoratorName = (decorator.expression as Identifier).name;
109
+ } else if (decorator.expression.type === 'CallExpression') {
110
+ const callExpr = decorator.expression as { callee: { type: string; name?: string }; arguments: unknown[] };
111
+ if (callExpr.callee.type === 'Identifier') {
112
+ decoratorName = callExpr.callee.name!;
113
+ // Extract arguments (cast to Node since Babel types guarantee these are AST nodes)
114
+ decoratorArgs = callExpr.arguments.map(arg => {
115
+ return ExpressionEvaluator.extractLiteralValue(arg as Node);
116
+ }).filter(v => v !== null);
117
+ if (decoratorArgs.length === 0) {
118
+ decoratorArgs = undefined;
119
+ }
120
+ } else {
121
+ return null; // Complex decorator expression
122
+ }
123
+ } else {
124
+ return null; // Unsupported decorator type
125
+ }
126
+
127
+ const decoratorId = `DECORATOR#${decoratorName}#${module.file}#${decorator.loc!.start.line}:${decorator.loc!.start.column}`;
128
+
129
+ return {
130
+ id: decoratorId,
131
+ type: 'DECORATOR',
132
+ name: decoratorName,
133
+ file: module.file,
134
+ line: decorator.loc!.start.line,
135
+ column: decorator.loc!.start.column,
136
+ arguments: decoratorArgs,
137
+ targetId,
138
+ targetType
139
+ };
140
+ }
141
+
142
+ getHandlers(): VisitorHandlers {
143
+ const { module } = this;
144
+ const {
145
+ functions,
146
+ scopes,
147
+ classDeclarations,
148
+ decorators
149
+ } = this.collections;
150
+
151
+ const analyzeFunctionBody = this.analyzeFunctionBody;
152
+ const collections = this.collections;
153
+
154
+ return {
155
+ ClassDeclaration: (classPath: NodePath) => {
156
+ const classNode = classPath.node as ClassDeclaration;
157
+ if (!classNode.id) return; // Skip anonymous classes
158
+
159
+ const className = classNode.id.name;
160
+
161
+ // Create CLASS node for declaration
162
+ const classId = `CLASS#${className}#${module.file}#${classNode.loc!.start.line}`;
163
+ const superClassName = classNode.superClass?.type === 'Identifier'
164
+ ? (classNode.superClass as Identifier).name
165
+ : null;
166
+
167
+ // Extract implements (TypeScript)
168
+ const implementsNames: string[] = [];
169
+ const classNodeWithImplements = classNode as ClassDeclaration & { implements?: Array<{ expression: { type: string; name?: string } }> };
170
+ if (classNodeWithImplements.implements && classNodeWithImplements.implements.length > 0) {
171
+ for (const impl of classNodeWithImplements.implements) {
172
+ if (impl.expression.type === 'Identifier') {
173
+ implementsNames.push(impl.expression.name!);
174
+ }
175
+ }
176
+ }
177
+
178
+ (classDeclarations as ClassInfo[]).push({
179
+ id: classId,
180
+ type: 'CLASS',
181
+ name: className,
182
+ file: module.file,
183
+ line: classNode.loc!.start.line,
184
+ column: classNode.loc!.start.column,
185
+ superClass: superClassName,
186
+ implements: implementsNames.length > 0 ? implementsNames : undefined,
187
+ methods: []
188
+ });
189
+
190
+ // Extract class decorators
191
+ const classNodeWithDecorators = classNode as ClassDeclaration & { decorators?: Decorator[] };
192
+ if (classNodeWithDecorators.decorators && classNodeWithDecorators.decorators.length > 0 && decorators) {
193
+ for (const decorator of classNodeWithDecorators.decorators) {
194
+ const decoratorInfo = this.extractDecoratorInfo(decorator, classId, 'CLASS', module);
195
+ if (decoratorInfo) {
196
+ (decorators as DecoratorInfo[]).push(decoratorInfo);
197
+ }
198
+ }
199
+ }
200
+
201
+ // Get reference to current class for adding methods
202
+ const classDeclarationsTyped = classDeclarations as ClassInfo[];
203
+ const currentClass = classDeclarationsTyped[classDeclarationsTyped.length - 1];
204
+
205
+ // Process class methods and properties
206
+ classPath.traverse({
207
+ ClassProperty: (propPath: NodePath) => {
208
+ const propNode = propPath.node as ClassProperty;
209
+
210
+ // Skip if not property of current class
211
+ if (propPath.parent !== classNode.body) {
212
+ return;
213
+ }
214
+
215
+ const propName = propNode.key.type === 'Identifier'
216
+ ? propNode.key.name
217
+ : (propNode.key as { value?: string }).value || 'anonymous';
218
+
219
+ // Extract property decorators (even for non-function properties)
220
+ const propNodeWithDecorators = propNode as ClassProperty & { decorators?: Decorator[] };
221
+ if (propNodeWithDecorators.decorators && propNodeWithDecorators.decorators.length > 0 && decorators) {
222
+ // For function properties, target will be set later; for regular properties, create a target ID
223
+ const propertyTargetId = `PROPERTY#${className}.${propName}#${module.file}#${propNode.loc!.start.line}`;
224
+ for (const decorator of propNodeWithDecorators.decorators) {
225
+ const decoratorInfo = this.extractDecoratorInfo(decorator, propertyTargetId, 'PROPERTY', module);
226
+ if (decoratorInfo) {
227
+ (decorators as DecoratorInfo[]).push(decoratorInfo);
228
+ }
229
+ }
230
+ }
231
+
232
+ // Only process if value is a function
233
+ if (propNode.value &&
234
+ (propNode.value.type === 'ArrowFunctionExpression' ||
235
+ propNode.value.type === 'FunctionExpression')) {
236
+
237
+ const funcNode = propNode.value as ArrowFunctionExpression | FunctionExpression;
238
+
239
+ const functionId = `FUNCTION#${className}.${propName}#${module.file}#${propNode.loc!.start.line}:${propNode.loc!.start.column}`;
240
+
241
+ // Add method to class methods list for CONTAINS edges
242
+ currentClass.methods.push(functionId);
243
+
244
+ (functions as ClassFunctionInfo[]).push({
245
+ id: functionId,
246
+ stableId: functionId,
247
+ type: 'FUNCTION',
248
+ name: propName,
249
+ file: module.file,
250
+ line: propNode.loc!.start.line,
251
+ column: propNode.loc!.start.column,
252
+ async: funcNode.async || false,
253
+ generator: funcNode.type === 'FunctionExpression' ? funcNode.generator || false : false,
254
+ arrowFunction: funcNode.type === 'ArrowFunctionExpression',
255
+ isClassProperty: true,
256
+ className: className
257
+ });
258
+
259
+ // Create SCOPE for property function body
260
+ const propBodyScopeId = `SCOPE#${className}.${propName}:body#${module.file}#${propNode.loc!.start.line}`;
261
+ (scopes as ScopeInfo[]).push({
262
+ id: propBodyScopeId,
263
+ type: 'SCOPE',
264
+ scopeType: 'property_body',
265
+ name: `${className}.${propName}:body`,
266
+ conditional: false,
267
+ file: module.file,
268
+ line: propNode.loc!.start.line,
269
+ parentFunctionId: functionId
270
+ });
271
+
272
+ const funcPath = propPath.get('value') as NodePath<ArrowFunctionExpression | FunctionExpression>;
273
+ analyzeFunctionBody(funcPath, propBodyScopeId, module, collections);
274
+ }
275
+ },
276
+
277
+ ClassMethod: (methodPath: NodePath<ClassMethod>) => {
278
+ const methodNode = methodPath.node;
279
+ const methodName = methodNode.key.type === 'Identifier'
280
+ ? methodNode.key.name
281
+ : (methodNode.key as { value?: string }).value || 'anonymous';
282
+
283
+ // Skip if not method of current class (nested classes)
284
+ if (methodPath.parent !== classNode.body) {
285
+ return;
286
+ }
287
+
288
+ const functionId = `FUNCTION#${className}.${methodName}#${module.file}#${methodNode.loc!.start.line}:${methodNode.loc!.start.column}`;
289
+
290
+ // Add method to class methods list for CONTAINS edges
291
+ currentClass.methods.push(functionId);
292
+
293
+ const funcData: ClassFunctionInfo = {
294
+ id: functionId,
295
+ stableId: functionId,
296
+ type: 'FUNCTION',
297
+ name: methodName,
298
+ file: module.file,
299
+ line: methodNode.loc!.start.line,
300
+ column: methodNode.loc!.start.column,
301
+ async: methodNode.async || false,
302
+ generator: methodNode.generator || false,
303
+ isClassMethod: true,
304
+ className: className,
305
+ methodKind: methodNode.kind as 'constructor' | 'method' | 'get' | 'set'
306
+ };
307
+ (functions as ClassFunctionInfo[]).push(funcData);
308
+
309
+ // Extract method decorators
310
+ const methodNodeWithDecorators = methodNode as ClassMethod & { decorators?: Decorator[] };
311
+ if (methodNodeWithDecorators.decorators && methodNodeWithDecorators.decorators.length > 0 && decorators) {
312
+ for (const decorator of methodNodeWithDecorators.decorators) {
313
+ const decoratorInfo = this.extractDecoratorInfo(decorator, functionId, 'METHOD', module);
314
+ if (decoratorInfo) {
315
+ (decorators as DecoratorInfo[]).push(decoratorInfo);
316
+ }
317
+ }
318
+ }
319
+
320
+ // Create SCOPE for method body
321
+ const methodBodyScopeId = `SCOPE#${className}.${methodName}:body#${module.file}#${methodNode.loc!.start.line}`;
322
+ (scopes as ScopeInfo[]).push({
323
+ id: methodBodyScopeId,
324
+ type: 'SCOPE',
325
+ scopeType: 'method_body',
326
+ name: `${className}.${methodName}:body`,
327
+ conditional: false,
328
+ file: module.file,
329
+ line: methodNode.loc!.start.line,
330
+ parentFunctionId: functionId
331
+ });
332
+
333
+ analyzeFunctionBody(methodPath, methodBodyScopeId, module, collections);
334
+ }
335
+ });
336
+ }
337
+ };
338
+ }
339
+ }
@@ -0,0 +1,273 @@
1
+ /**
2
+ * FunctionVisitor - handles function declarations and arrow functions
3
+ *
4
+ * Handles:
5
+ * - FunctionDeclaration
6
+ * - ArrowFunctionExpression (module-level)
7
+ */
8
+
9
+ import type {
10
+ Node,
11
+ Function,
12
+ FunctionDeclaration,
13
+ ArrowFunctionExpression,
14
+ Identifier,
15
+ AssignmentPattern,
16
+ RestElement,
17
+ VariableDeclarator
18
+ } from '@babel/types';
19
+ import type { NodePath } from '@babel/traverse';
20
+ import { ASTVisitor, type VisitorModule, type VisitorCollections, type VisitorHandlers, type CounterRef } from './ASTVisitor.js';
21
+
22
+ /**
23
+ * Scope context for generating stable semantic IDs
24
+ */
25
+ interface ScopeContext {
26
+ semanticPath: string;
27
+ siblingCounters: Map<string, number>;
28
+ }
29
+
30
+ /**
31
+ * Parameter node info
32
+ */
33
+ interface ParameterInfo {
34
+ id: string;
35
+ type: 'PARAMETER';
36
+ name: string;
37
+ file: string;
38
+ line: number;
39
+ index: number;
40
+ hasDefault?: boolean;
41
+ isRest?: boolean;
42
+ parentFunctionId: string;
43
+ }
44
+
45
+ /**
46
+ * Function node info
47
+ */
48
+ interface FunctionInfo {
49
+ id: string;
50
+ stableId: string;
51
+ type: 'FUNCTION';
52
+ name: string;
53
+ file: string;
54
+ line: number;
55
+ column?: number;
56
+ async: boolean;
57
+ generator?: boolean;
58
+ arrowFunction?: boolean;
59
+ }
60
+
61
+ /**
62
+ * Scope node info
63
+ */
64
+ interface ScopeInfo {
65
+ id: string;
66
+ type: 'SCOPE';
67
+ scopeType: string;
68
+ name: string;
69
+ conditional?: boolean;
70
+ file: string;
71
+ line: number;
72
+ parentFunctionId: string;
73
+ }
74
+
75
+ /**
76
+ * Callback type for analyzing function bodies
77
+ */
78
+ export type AnalyzeFunctionBodyCallback = (
79
+ path: NodePath<Function>,
80
+ scopeId: string,
81
+ module: VisitorModule,
82
+ collections: VisitorCollections
83
+ ) => void;
84
+
85
+ export class FunctionVisitor extends ASTVisitor {
86
+ private analyzeFunctionBody: AnalyzeFunctionBodyCallback;
87
+
88
+ /**
89
+ * @param module - Current module being analyzed
90
+ * @param collections - Must contain arrays and counter refs
91
+ * @param analyzeFunctionBody - Callback to analyze function internals
92
+ */
93
+ constructor(
94
+ module: VisitorModule,
95
+ collections: VisitorCollections,
96
+ analyzeFunctionBody: AnalyzeFunctionBodyCallback
97
+ ) {
98
+ super(module, collections);
99
+ this.analyzeFunctionBody = analyzeFunctionBody;
100
+ }
101
+
102
+ getHandlers(): VisitorHandlers {
103
+ const { module } = this;
104
+ const functions = this.collections.functions ?? [];
105
+ const parameters = this.collections.parameters ?? [];
106
+ const scopes = this.collections.scopes ?? [];
107
+ const functionCounterRef = (this.collections.functionCounterRef ?? { value: 0 }) as CounterRef;
108
+ const moduleScopeCtx = this.collections.moduleScopeCtx as ScopeContext | undefined;
109
+
110
+ const analyzeFunctionBody = this.analyzeFunctionBody;
111
+ const collections = this.collections;
112
+
113
+ // Helper function to generate stable anonymous function name
114
+ const generateAnonymousName = (): string => {
115
+ if (!moduleScopeCtx) return 'anonymous';
116
+ const index = moduleScopeCtx.siblingCounters.get('anonymous') || 0;
117
+ moduleScopeCtx.siblingCounters.set('anonymous', index + 1);
118
+ return `anonymous[${index}]`;
119
+ };
120
+
121
+ // Helper function to create PARAMETER nodes for function params
122
+ const createParameterNodes = (
123
+ params: Node[],
124
+ functionId: string,
125
+ file: string,
126
+ line: number
127
+ ): void => {
128
+ if (!parameters) return; // Guard for backward compatibility
129
+
130
+ params.forEach((param, index) => {
131
+ // Handle different parameter types
132
+ if (param.type === 'Identifier') {
133
+ const paramId = `PARAMETER#${param.name}#${file}#${line}:${index}`;
134
+ (parameters as ParameterInfo[]).push({
135
+ id: paramId,
136
+ type: 'PARAMETER',
137
+ name: param.name,
138
+ file: file,
139
+ line: param.loc?.start.line || line,
140
+ index: index,
141
+ parentFunctionId: functionId
142
+ });
143
+ } else if (param.type === 'AssignmentPattern') {
144
+ // Default parameter: function(a = 1)
145
+ const assignmentParam = param as AssignmentPattern;
146
+ if (assignmentParam.left.type === 'Identifier') {
147
+ const paramId = `PARAMETER#${assignmentParam.left.name}#${file}#${line}:${index}`;
148
+ (parameters as ParameterInfo[]).push({
149
+ id: paramId,
150
+ type: 'PARAMETER',
151
+ name: assignmentParam.left.name,
152
+ file: file,
153
+ line: assignmentParam.left.loc?.start.line || line,
154
+ index: index,
155
+ hasDefault: true,
156
+ parentFunctionId: functionId
157
+ });
158
+ }
159
+ } else if ((param as Node).type === 'RestElement') {
160
+ // Rest parameter: function(...args)
161
+ const restParam = param as unknown as RestElement;
162
+ if (restParam.argument.type === 'Identifier') {
163
+ const paramId = `PARAMETER#${restParam.argument.name}#${file}#${line}:${index}`;
164
+ (parameters as ParameterInfo[]).push({
165
+ id: paramId,
166
+ type: 'PARAMETER',
167
+ name: restParam.argument.name,
168
+ file: file,
169
+ line: restParam.argument.loc?.start.line || line,
170
+ index: index,
171
+ isRest: true,
172
+ parentFunctionId: functionId
173
+ });
174
+ }
175
+ }
176
+ // ObjectPattern and ArrayPattern (destructuring parameters) can be added later
177
+ });
178
+ };
179
+
180
+ return {
181
+ // Regular function declarations
182
+ FunctionDeclaration: (path: NodePath) => {
183
+ const node = path.node as FunctionDeclaration;
184
+ if (!node.id) return; // Skip anonymous function declarations
185
+
186
+ const functionId = `FUNCTION#${node.id.name}#${module.file}#${node.loc!.start.line}`;
187
+
188
+ (functions as FunctionInfo[]).push({
189
+ id: functionId,
190
+ stableId: functionId,
191
+ type: 'FUNCTION',
192
+ name: node.id.name,
193
+ file: module.file,
194
+ line: node.loc!.start.line,
195
+ async: node.async || false,
196
+ generator: node.generator || false
197
+ });
198
+
199
+ // Create PARAMETER nodes for function parameters
200
+ createParameterNodes(node.params, functionId, module.file, node.loc!.start.line);
201
+
202
+ // Create SCOPE for function body
203
+ const functionBodyScopeId = `SCOPE#${node.id.name}:body#${module.file}#${node.loc!.start.line}`;
204
+ (scopes as ScopeInfo[]).push({
205
+ id: functionBodyScopeId,
206
+ type: 'SCOPE',
207
+ scopeType: 'function_body',
208
+ name: `${node.id.name}:body`,
209
+ conditional: false,
210
+ file: module.file,
211
+ line: node.loc!.start.line,
212
+ parentFunctionId: functionId
213
+ });
214
+
215
+ // Analyze function body
216
+ analyzeFunctionBody(path as NodePath<FunctionDeclaration>, functionBodyScopeId, module, collections);
217
+
218
+ // Stop traversal - analyzeFunctionBody already processed contents
219
+ path.skip();
220
+ },
221
+
222
+ // Arrow functions (module-level, assigned to variables or as callbacks)
223
+ ArrowFunctionExpression: (path: NodePath) => {
224
+ const node = path.node as ArrowFunctionExpression;
225
+ const line = node.loc!.start.line;
226
+ const column = node.loc!.start.column;
227
+
228
+ // Determine arrow function name (use scope-level counter for stable semanticId)
229
+ let functionName = generateAnonymousName();
230
+
231
+ // If arrow function is assigned to variable: const add = () => {}
232
+ const parent = path.parent;
233
+ if (parent.type === 'VariableDeclarator') {
234
+ const declarator = parent as VariableDeclarator;
235
+ if (declarator.id.type === 'Identifier') {
236
+ functionName = declarator.id.name;
237
+ }
238
+ }
239
+
240
+ const functionId = `FUNCTION#${functionName}#${module.file}#${line}:${column}:${functionCounterRef.value++}`;
241
+
242
+ (functions as FunctionInfo[]).push({
243
+ id: functionId,
244
+ stableId: functionId,
245
+ type: 'FUNCTION',
246
+ name: functionName,
247
+ file: module.file,
248
+ line,
249
+ column,
250
+ async: node.async || false,
251
+ arrowFunction: true
252
+ });
253
+
254
+ // Create PARAMETER nodes for arrow function parameters
255
+ createParameterNodes(node.params, functionId, module.file, line);
256
+
257
+ // Create SCOPE for arrow function body
258
+ const bodyScope = `SCOPE#${functionName}:body#${module.file}#${line}:${column}`;
259
+ (scopes as ScopeInfo[]).push({
260
+ id: bodyScope,
261
+ type: 'SCOPE',
262
+ name: `${functionName}:body`,
263
+ file: module.file,
264
+ line,
265
+ scopeType: 'function-body',
266
+ parentFunctionId: functionId
267
+ });
268
+
269
+ analyzeFunctionBody(path as NodePath<ArrowFunctionExpression>, bodyScope, module, collections);
270
+ }
271
+ };
272
+ }
273
+ }