@grafema/core 0.1.0-alpha.5 → 0.2.0-beta

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 (530) hide show
  1. package/README.md +0 -1
  2. package/dist/Orchestrator.d.ts +31 -2
  3. package/dist/Orchestrator.d.ts.map +1 -1
  4. package/dist/Orchestrator.js +222 -27
  5. package/dist/config/ConfigLoader.d.ts +90 -0
  6. package/dist/config/ConfigLoader.d.ts.map +1 -0
  7. package/dist/config/ConfigLoader.js +249 -0
  8. package/dist/config/index.d.ts +6 -0
  9. package/dist/config/index.d.ts.map +1 -0
  10. package/dist/config/index.js +4 -0
  11. package/dist/core/ASTWorker.d.ts +11 -36
  12. package/dist/core/ASTWorker.d.ts.map +1 -1
  13. package/dist/core/ASTWorker.js +93 -99
  14. package/dist/core/CoverageAnalyzer.d.ts +65 -0
  15. package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
  16. package/dist/core/CoverageAnalyzer.js +198 -0
  17. package/dist/core/FileExplainer.d.ts +101 -0
  18. package/dist/core/FileExplainer.d.ts.map +1 -0
  19. package/dist/core/FileExplainer.js +139 -0
  20. package/dist/core/FileNodeManager.d.ts +40 -0
  21. package/dist/core/FileNodeManager.d.ts.map +1 -0
  22. package/dist/core/FileNodeManager.js +84 -0
  23. package/dist/core/GraphFreshnessChecker.d.ts +33 -0
  24. package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
  25. package/dist/core/GraphFreshnessChecker.js +101 -0
  26. package/dist/core/HashUtils.d.ts +24 -0
  27. package/dist/core/HashUtils.d.ts.map +1 -0
  28. package/dist/core/HashUtils.js +45 -0
  29. package/dist/core/IncrementalReanalyzer.d.ts +36 -0
  30. package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
  31. package/dist/core/IncrementalReanalyzer.js +132 -0
  32. package/dist/core/NodeFactory.d.ts +266 -19
  33. package/dist/core/NodeFactory.d.ts.map +1 -1
  34. package/dist/core/NodeFactory.js +256 -21
  35. package/dist/core/ScopeTracker.d.ts +84 -0
  36. package/dist/core/ScopeTracker.d.ts.map +1 -0
  37. package/dist/core/ScopeTracker.js +116 -0
  38. package/dist/core/SemanticId.d.ts +90 -0
  39. package/dist/core/SemanticId.d.ts.map +1 -0
  40. package/dist/core/SemanticId.js +115 -0
  41. package/dist/core/VersionManager.d.ts.map +1 -1
  42. package/dist/core/VersionManager.js +3 -2
  43. package/dist/core/nodes/ArgumentExpressionNode.d.ts +43 -0
  44. package/dist/core/nodes/ArgumentExpressionNode.d.ts.map +1 -0
  45. package/dist/core/nodes/ArgumentExpressionNode.js +60 -0
  46. package/dist/core/nodes/ArrayLiteralNode.d.ts +27 -0
  47. package/dist/core/nodes/ArrayLiteralNode.d.ts.map +1 -0
  48. package/dist/core/nodes/ArrayLiteralNode.js +43 -0
  49. package/dist/core/nodes/BranchNode.d.ts +41 -0
  50. package/dist/core/nodes/BranchNode.d.ts.map +1 -0
  51. package/dist/core/nodes/BranchNode.js +82 -0
  52. package/dist/core/nodes/CallSiteNode.d.ts +30 -2
  53. package/dist/core/nodes/CallSiteNode.d.ts.map +1 -1
  54. package/dist/core/nodes/CallSiteNode.js +54 -4
  55. package/dist/core/nodes/CaseNode.d.ts +43 -0
  56. package/dist/core/nodes/CaseNode.d.ts.map +1 -0
  57. package/dist/core/nodes/CaseNode.js +81 -0
  58. package/dist/core/nodes/ClassNode.d.ts +34 -2
  59. package/dist/core/nodes/ClassNode.d.ts.map +1 -1
  60. package/dist/core/nodes/ClassNode.js +52 -4
  61. package/dist/core/nodes/ConstantNode.d.ts +2 -2
  62. package/dist/core/nodes/ConstantNode.d.ts.map +1 -1
  63. package/dist/core/nodes/ConstantNode.js +6 -4
  64. package/dist/core/nodes/ConstructorCallNode.d.ts +51 -0
  65. package/dist/core/nodes/ConstructorCallNode.d.ts.map +1 -0
  66. package/dist/core/nodes/ConstructorCallNode.js +171 -0
  67. package/dist/core/nodes/DatabaseQueryNode.d.ts +3 -2
  68. package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -1
  69. package/dist/core/nodes/DatabaseQueryNode.js +5 -2
  70. package/dist/core/nodes/DecoratorNode.d.ts +42 -0
  71. package/dist/core/nodes/DecoratorNode.d.ts.map +1 -0
  72. package/dist/core/nodes/DecoratorNode.js +64 -0
  73. package/dist/core/nodes/EnumNode.d.ts +42 -0
  74. package/dist/core/nodes/EnumNode.d.ts.map +1 -0
  75. package/dist/core/nodes/EnumNode.js +56 -0
  76. package/dist/core/nodes/EventListenerNode.d.ts +4 -4
  77. package/dist/core/nodes/EventListenerNode.d.ts.map +1 -1
  78. package/dist/core/nodes/EventListenerNode.js +7 -4
  79. package/dist/core/nodes/ExportNode.d.ts +38 -2
  80. package/dist/core/nodes/ExportNode.d.ts.map +1 -1
  81. package/dist/core/nodes/ExportNode.js +54 -4
  82. package/dist/core/nodes/ExpressionNode.d.ts +97 -0
  83. package/dist/core/nodes/ExpressionNode.d.ts.map +1 -0
  84. package/dist/core/nodes/ExpressionNode.js +180 -0
  85. package/dist/core/nodes/ExternalModuleNode.d.ts +32 -0
  86. package/dist/core/nodes/ExternalModuleNode.d.ts.map +1 -0
  87. package/dist/core/nodes/ExternalModuleNode.js +49 -0
  88. package/dist/core/nodes/ExternalStdioNode.d.ts +13 -6
  89. package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -1
  90. package/dist/core/nodes/ExternalStdioNode.js +15 -8
  91. package/dist/core/nodes/FunctionNode.d.ts +36 -0
  92. package/dist/core/nodes/FunctionNode.d.ts.map +1 -1
  93. package/dist/core/nodes/FunctionNode.js +80 -1
  94. package/dist/core/nodes/HttpRequestNode.d.ts +4 -4
  95. package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -1
  96. package/dist/core/nodes/HttpRequestNode.js +7 -4
  97. package/dist/core/nodes/ImportNode.d.ts +28 -6
  98. package/dist/core/nodes/ImportNode.d.ts.map +1 -1
  99. package/dist/core/nodes/ImportNode.js +43 -8
  100. package/dist/core/nodes/InterfaceNode.d.ts +46 -0
  101. package/dist/core/nodes/InterfaceNode.d.ts.map +1 -0
  102. package/dist/core/nodes/InterfaceNode.js +57 -0
  103. package/dist/core/nodes/IssueNode.d.ts +73 -0
  104. package/dist/core/nodes/IssueNode.d.ts.map +1 -0
  105. package/dist/core/nodes/IssueNode.js +129 -0
  106. package/dist/core/nodes/LiteralNode.d.ts +2 -2
  107. package/dist/core/nodes/LiteralNode.d.ts.map +1 -1
  108. package/dist/core/nodes/LiteralNode.js +6 -4
  109. package/dist/core/nodes/MethodCallNode.d.ts +32 -2
  110. package/dist/core/nodes/MethodCallNode.d.ts.map +1 -1
  111. package/dist/core/nodes/MethodCallNode.js +57 -4
  112. package/dist/core/nodes/MethodNode.d.ts +34 -2
  113. package/dist/core/nodes/MethodNode.d.ts.map +1 -1
  114. package/dist/core/nodes/MethodNode.js +55 -3
  115. package/dist/core/nodes/ModuleNode.d.ts +31 -0
  116. package/dist/core/nodes/ModuleNode.d.ts.map +1 -1
  117. package/dist/core/nodes/ModuleNode.js +37 -0
  118. package/dist/core/nodes/NetworkRequestNode.d.ts +54 -0
  119. package/dist/core/nodes/NetworkRequestNode.d.ts.map +1 -0
  120. package/dist/core/nodes/NetworkRequestNode.js +65 -0
  121. package/dist/core/nodes/ObjectLiteralNode.d.ts +27 -0
  122. package/dist/core/nodes/ObjectLiteralNode.d.ts.map +1 -0
  123. package/dist/core/nodes/ObjectLiteralNode.js +43 -0
  124. package/dist/core/nodes/ParameterNode.d.ts +2 -2
  125. package/dist/core/nodes/ParameterNode.d.ts.map +1 -1
  126. package/dist/core/nodes/ParameterNode.js +5 -3
  127. package/dist/core/nodes/ScopeNode.d.ts +31 -0
  128. package/dist/core/nodes/ScopeNode.d.ts.map +1 -1
  129. package/dist/core/nodes/ScopeNode.js +49 -0
  130. package/dist/core/nodes/TypeNode.d.ts +36 -0
  131. package/dist/core/nodes/TypeNode.d.ts.map +1 -0
  132. package/dist/core/nodes/TypeNode.js +55 -0
  133. package/dist/core/nodes/VariableDeclarationNode.d.ts +29 -2
  134. package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -1
  135. package/dist/core/nodes/VariableDeclarationNode.js +48 -4
  136. package/dist/core/nodes/index.d.ts +15 -1
  137. package/dist/core/nodes/index.d.ts.map +1 -1
  138. package/dist/core/nodes/index.js +17 -0
  139. package/dist/data/builtins/BuiltinRegistry.d.ts +78 -0
  140. package/dist/data/builtins/BuiltinRegistry.d.ts.map +1 -0
  141. package/dist/data/builtins/BuiltinRegistry.js +110 -0
  142. package/dist/data/builtins/definitions.d.ts +28 -0
  143. package/dist/data/builtins/definitions.d.ts.map +1 -0
  144. package/dist/data/builtins/definitions.js +250 -0
  145. package/dist/data/builtins/index.d.ts +10 -0
  146. package/dist/data/builtins/index.d.ts.map +1 -0
  147. package/dist/data/builtins/index.js +8 -0
  148. package/dist/data/builtins/jsGlobals.d.ts +18 -0
  149. package/dist/data/builtins/jsGlobals.d.ts.map +1 -0
  150. package/dist/data/builtins/jsGlobals.js +26 -0
  151. package/dist/data/builtins/types.d.ts +34 -0
  152. package/dist/data/builtins/types.d.ts.map +1 -0
  153. package/dist/data/builtins/types.js +7 -0
  154. package/dist/data/globals/definitions.d.ts +27 -0
  155. package/dist/data/globals/definitions.d.ts.map +1 -0
  156. package/dist/data/globals/definitions.js +117 -0
  157. package/dist/data/globals/index.d.ts +36 -0
  158. package/dist/data/globals/index.d.ts.map +1 -0
  159. package/dist/data/globals/index.js +52 -0
  160. package/dist/diagnostics/DiagnosticCollector.d.ts +98 -0
  161. package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
  162. package/dist/diagnostics/DiagnosticCollector.js +129 -0
  163. package/dist/diagnostics/DiagnosticReporter.d.ts +100 -0
  164. package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
  165. package/dist/diagnostics/DiagnosticReporter.js +247 -0
  166. package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
  167. package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
  168. package/dist/diagnostics/DiagnosticWriter.js +43 -0
  169. package/dist/diagnostics/index.d.ts +14 -0
  170. package/dist/diagnostics/index.d.ts.map +1 -0
  171. package/dist/diagnostics/index.js +11 -0
  172. package/dist/errors/GrafemaError.d.ts +161 -0
  173. package/dist/errors/GrafemaError.d.ts.map +1 -0
  174. package/dist/errors/GrafemaError.js +181 -0
  175. package/dist/index.d.ts +73 -1
  176. package/dist/index.d.ts.map +1 -1
  177. package/dist/index.js +70 -1
  178. package/dist/logging/Logger.d.ts +48 -0
  179. package/dist/logging/Logger.d.ts.map +1 -0
  180. package/dist/logging/Logger.js +134 -0
  181. package/dist/plugins/Plugin.d.ts +5 -1
  182. package/dist/plugins/Plugin.d.ts.map +1 -1
  183. package/dist/plugins/Plugin.js +33 -0
  184. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -1
  185. package/dist/plugins/analysis/DatabaseAnalyzer.js +14 -6
  186. package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
  187. package/dist/plugins/analysis/ExpressAnalyzer.js +29 -19
  188. package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts +148 -0
  189. package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts.map +1 -0
  190. package/dist/plugins/analysis/ExpressResponseAnalyzer.js +495 -0
  191. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -1
  192. package/dist/plugins/analysis/ExpressRouteAnalyzer.js +71 -29
  193. package/dist/plugins/analysis/FetchAnalyzer.d.ts +41 -0
  194. package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
  195. package/dist/plugins/analysis/FetchAnalyzer.js +187 -19
  196. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +6 -3
  197. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -1
  198. package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +76 -80
  199. package/dist/plugins/analysis/JSASTAnalyzer.d.ts +313 -19
  200. package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
  201. package/dist/plugins/analysis/JSASTAnalyzer.js +3430 -503
  202. package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -1
  203. package/dist/plugins/analysis/ReactAnalyzer.js +56 -57
  204. package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -1
  205. package/dist/plugins/analysis/RustAnalyzer.js +16 -11
  206. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
  207. package/dist/plugins/analysis/SQLiteAnalyzer.js +11 -7
  208. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -1
  209. package/dist/plugins/analysis/ServiceLayerAnalyzer.js +21 -9
  210. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +9 -0
  211. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -1
  212. package/dist/plugins/analysis/SocketIOAnalyzer.js +117 -21
  213. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -1
  214. package/dist/plugins/analysis/SystemDbAnalyzer.js +15 -5
  215. package/dist/plugins/analysis/ast/GraphBuilder.d.ts +207 -4
  216. package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
  217. package/dist/plugins/analysis/ast/GraphBuilder.js +1527 -316
  218. package/dist/plugins/analysis/ast/IdGenerator.d.ts +105 -0
  219. package/dist/plugins/analysis/ast/IdGenerator.d.ts.map +1 -0
  220. package/dist/plugins/analysis/ast/IdGenerator.js +116 -0
  221. package/dist/plugins/analysis/ast/types.d.ts +470 -5
  222. package/dist/plugins/analysis/ast/types.d.ts.map +1 -1
  223. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts +33 -0
  224. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts.map +1 -0
  225. package/dist/plugins/analysis/ast/utils/createParameterNodes.js +89 -0
  226. package/dist/plugins/analysis/ast/utils/index.d.ts +6 -0
  227. package/dist/plugins/analysis/ast/utils/index.d.ts.map +1 -0
  228. package/dist/plugins/analysis/ast/utils/index.js +5 -0
  229. package/dist/plugins/analysis/ast/utils/location.d.ts +87 -0
  230. package/dist/plugins/analysis/ast/utils/location.d.ts.map +1 -0
  231. package/dist/plugins/analysis/ast/utils/location.js +78 -0
  232. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +14 -5
  233. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -1
  234. package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +6 -5
  235. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +100 -9
  236. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
  237. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +674 -125
  238. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +4 -1
  239. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -1
  240. package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +72 -32
  241. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +14 -1
  242. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
  243. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +190 -63
  244. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +4 -0
  245. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -1
  246. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +112 -8
  247. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +12 -1
  248. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -1
  249. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +36 -14
  250. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +20 -2
  251. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
  252. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +243 -45
  253. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -1
  254. package/dist/plugins/discovery/MonorepoServiceDiscovery.js +3 -2
  255. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -1
  256. package/dist/plugins/discovery/SimpleProjectDiscovery.js +5 -1
  257. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts +22 -0
  258. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts.map +1 -0
  259. package/dist/plugins/discovery/WorkspaceDiscovery.js +141 -0
  260. package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts +46 -0
  261. package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts.map +1 -0
  262. package/dist/plugins/discovery/resolveSourceEntrypoint.js +86 -0
  263. package/dist/plugins/discovery/workspaces/detector.d.ts +21 -0
  264. package/dist/plugins/discovery/workspaces/detector.d.ts.map +1 -0
  265. package/dist/plugins/discovery/workspaces/detector.js +49 -0
  266. package/dist/plugins/discovery/workspaces/globResolver.d.ts +35 -0
  267. package/dist/plugins/discovery/workspaces/globResolver.d.ts.map +1 -0
  268. package/dist/plugins/discovery/workspaces/globResolver.js +184 -0
  269. package/dist/plugins/discovery/workspaces/index.d.ts +9 -0
  270. package/dist/plugins/discovery/workspaces/index.d.ts.map +1 -0
  271. package/dist/plugins/discovery/workspaces/index.js +8 -0
  272. package/dist/plugins/discovery/workspaces/parsers.d.ts +38 -0
  273. package/dist/plugins/discovery/workspaces/parsers.d.ts.map +1 -0
  274. package/dist/plugins/discovery/workspaces/parsers.js +80 -0
  275. package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -1
  276. package/dist/plugins/enrichment/AliasTracker.js +29 -8
  277. package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts +32 -0
  278. package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts.map +1 -0
  279. package/dist/plugins/enrichment/ArgumentParameterLinker.js +175 -0
  280. package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts +51 -0
  281. package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts.map +1 -0
  282. package/dist/plugins/enrichment/ClosureCaptureEnricher.js +205 -0
  283. package/dist/plugins/enrichment/ExternalCallResolver.d.ts +42 -0
  284. package/dist/plugins/enrichment/ExternalCallResolver.d.ts.map +1 -0
  285. package/dist/plugins/enrichment/ExternalCallResolver.js +213 -0
  286. package/dist/plugins/enrichment/FunctionCallResolver.d.ts +58 -0
  287. package/dist/plugins/enrichment/FunctionCallResolver.d.ts.map +1 -0
  288. package/dist/plugins/enrichment/FunctionCallResolver.js +340 -0
  289. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +16 -3
  290. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -1
  291. package/dist/plugins/enrichment/HTTPConnectionEnricher.js +78 -27
  292. package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -1
  293. package/dist/plugins/enrichment/ImportExportLinker.js +23 -6
  294. package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -1
  295. package/dist/plugins/enrichment/MethodCallResolver.js +33 -13
  296. package/dist/plugins/enrichment/MountPointResolver.d.ts +14 -12
  297. package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -1
  298. package/dist/plugins/enrichment/MountPointResolver.js +173 -147
  299. package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts +44 -0
  300. package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts.map +1 -0
  301. package/dist/plugins/enrichment/NodejsBuiltinsResolver.js +271 -0
  302. package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -1
  303. package/dist/plugins/enrichment/PrefixEvaluator.js +16 -7
  304. package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -1
  305. package/dist/plugins/enrichment/RustFFIEnricher.js +6 -5
  306. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +22 -27
  307. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
  308. package/dist/plugins/enrichment/ValueDomainAnalyzer.js +185 -143
  309. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -1
  310. package/dist/plugins/indexing/IncrementalModuleIndexer.js +23 -14
  311. package/dist/plugins/indexing/JSModuleIndexer.d.ts +15 -0
  312. package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -1
  313. package/dist/plugins/indexing/JSModuleIndexer.js +121 -31
  314. package/dist/plugins/indexing/RustModuleIndexer.d.ts +1 -1
  315. package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -1
  316. package/dist/plugins/indexing/RustModuleIndexer.js +8 -7
  317. package/dist/plugins/indexing/ServiceDetector.d.ts +10 -0
  318. package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -1
  319. package/dist/plugins/indexing/ServiceDetector.js +28 -15
  320. package/dist/plugins/validation/BrokenImportValidator.d.ts +31 -0
  321. package/dist/plugins/validation/BrokenImportValidator.d.ts.map +1 -0
  322. package/dist/plugins/validation/BrokenImportValidator.js +249 -0
  323. package/dist/plugins/validation/CallResolverValidator.d.ts +21 -10
  324. package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -1
  325. package/dist/plugins/validation/CallResolverValidator.js +103 -77
  326. package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -1
  327. package/dist/plugins/validation/DataFlowValidator.js +62 -49
  328. package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -1
  329. package/dist/plugins/validation/EvalBanValidator.js +17 -16
  330. package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -1
  331. package/dist/plugins/validation/GraphConnectivityValidator.js +44 -24
  332. package/dist/plugins/validation/NodeCreationValidator.d.ts +85 -0
  333. package/dist/plugins/validation/NodeCreationValidator.d.ts.map +1 -0
  334. package/dist/plugins/validation/NodeCreationValidator.js +415 -0
  335. package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -1
  336. package/dist/plugins/validation/SQLInjectionValidator.js +61 -19
  337. package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -1
  338. package/dist/plugins/validation/ShadowingDetector.js +6 -5
  339. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -1
  340. package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +12 -11
  341. package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -1
  342. package/dist/plugins/vcs/GitPlugin.js +10 -12
  343. package/dist/plugins/vcs/VCSPlugin.d.ts +3 -2
  344. package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -1
  345. package/dist/plugins/vcs/VCSPlugin.js +5 -5
  346. package/dist/queries/findCallsInFunction.d.ts +52 -0
  347. package/dist/queries/findCallsInFunction.d.ts.map +1 -0
  348. package/dist/queries/findCallsInFunction.js +135 -0
  349. package/dist/queries/findContainingFunction.d.ts +45 -0
  350. package/dist/queries/findContainingFunction.d.ts.map +1 -0
  351. package/dist/queries/findContainingFunction.js +54 -0
  352. package/dist/queries/index.d.ts +14 -0
  353. package/dist/queries/index.d.ts.map +1 -0
  354. package/dist/queries/index.js +11 -0
  355. package/dist/queries/traceValues.d.ts +70 -0
  356. package/dist/queries/traceValues.d.ts.map +1 -0
  357. package/dist/queries/traceValues.js +299 -0
  358. package/dist/queries/types.d.ts +163 -0
  359. package/dist/queries/types.d.ts.map +1 -0
  360. package/dist/queries/types.js +9 -0
  361. package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
  362. package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
  363. package/dist/schema/GraphSchemaExtractor.js +124 -0
  364. package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
  365. package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
  366. package/dist/schema/InterfaceSchemaExtractor.js +112 -0
  367. package/dist/schema/index.d.ts +5 -0
  368. package/dist/schema/index.d.ts.map +1 -0
  369. package/dist/schema/index.js +2 -0
  370. package/dist/storage/backends/RFDBServerBackend.d.ts +21 -34
  371. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
  372. package/dist/storage/backends/RFDBServerBackend.js +72 -62
  373. package/dist/storage/backends/typeValidation.d.ts.map +1 -1
  374. package/dist/storage/backends/typeValidation.js +1 -0
  375. package/dist/validation/PathValidator.d.ts +1 -2
  376. package/dist/validation/PathValidator.d.ts.map +1 -1
  377. package/package.json +3 -3
  378. package/src/Orchestrator.ts +272 -27
  379. package/src/config/ConfigLoader.ts +354 -0
  380. package/src/config/index.ts +5 -0
  381. package/src/core/ASTWorker.ts +143 -139
  382. package/src/core/CoverageAnalyzer.ts +243 -0
  383. package/src/core/FileExplainer.ts +179 -0
  384. package/src/core/FileNodeManager.ts +100 -0
  385. package/src/core/GraphFreshnessChecker.ts +143 -0
  386. package/src/core/HashUtils.ts +48 -0
  387. package/src/core/IncrementalReanalyzer.ts +192 -0
  388. package/src/core/NodeFactory.ts +470 -23
  389. package/src/core/ScopeTracker.ts +154 -0
  390. package/src/core/SemanticId.ts +192 -0
  391. package/src/core/VersionManager.ts +3 -2
  392. package/src/core/nodes/ArgumentExpressionNode.ts +89 -0
  393. package/src/core/nodes/ArrayLiteralNode.ts +66 -0
  394. package/src/core/nodes/BranchNode.ts +113 -0
  395. package/src/core/nodes/CallSiteNode.ts +64 -4
  396. package/src/core/nodes/CaseNode.ts +123 -0
  397. package/src/core/nodes/ClassNode.ts +67 -4
  398. package/src/core/nodes/ConstantNode.ts +5 -4
  399. package/src/core/nodes/ConstructorCallNode.ts +217 -0
  400. package/src/core/nodes/DatabaseQueryNode.ts +5 -1
  401. package/src/core/nodes/DecoratorNode.ts +92 -0
  402. package/src/core/nodes/EnumNode.ts +87 -0
  403. package/src/core/nodes/EventListenerNode.ts +7 -4
  404. package/src/core/nodes/ExportNode.ts +74 -4
  405. package/src/core/nodes/ExpressionNode.ts +232 -0
  406. package/src/core/nodes/ExternalModuleNode.ts +65 -0
  407. package/src/core/nodes/ExternalStdioNode.ts +17 -9
  408. package/src/core/nodes/FunctionNode.ts +101 -1
  409. package/src/core/nodes/HttpRequestNode.ts +7 -4
  410. package/src/core/nodes/ImportNode.ts +62 -13
  411. package/src/core/nodes/InterfaceNode.ts +92 -0
  412. package/src/core/nodes/IssueNode.ts +177 -0
  413. package/src/core/nodes/LiteralNode.ts +5 -4
  414. package/src/core/nodes/MethodCallNode.ts +70 -4
  415. package/src/core/nodes/MethodNode.ts +68 -3
  416. package/src/core/nodes/ModuleNode.ts +50 -0
  417. package/src/core/nodes/NetworkRequestNode.ts +77 -0
  418. package/src/core/nodes/ObjectLiteralNode.ts +66 -0
  419. package/src/core/nodes/ParameterNode.ts +4 -3
  420. package/src/core/nodes/ScopeNode.ts +65 -0
  421. package/src/core/nodes/TypeNode.ts +79 -0
  422. package/src/core/nodes/VariableDeclarationNode.ts +58 -4
  423. package/src/core/nodes/index.ts +21 -1
  424. package/src/data/builtins/BuiltinRegistry.ts +124 -0
  425. package/src/data/builtins/definitions.ts +267 -0
  426. package/src/data/builtins/index.ts +10 -0
  427. package/src/data/builtins/jsGlobals.ts +28 -0
  428. package/src/data/builtins/types.ts +36 -0
  429. package/src/data/globals/definitions.ts +156 -0
  430. package/src/data/globals/index.ts +66 -0
  431. package/src/diagnostics/DiagnosticCollector.ts +163 -0
  432. package/src/diagnostics/DiagnosticReporter.ts +324 -0
  433. package/src/diagnostics/DiagnosticWriter.ts +50 -0
  434. package/src/diagnostics/index.ts +16 -0
  435. package/src/errors/GrafemaError.ts +239 -0
  436. package/src/index.ts +193 -1
  437. package/src/logging/Logger.ts +152 -0
  438. package/src/plugins/Plugin.ts +42 -0
  439. package/src/plugins/analysis/DatabaseAnalyzer.ts +16 -8
  440. package/src/plugins/analysis/ExpressAnalyzer.ts +33 -19
  441. package/src/plugins/analysis/ExpressResponseAnalyzer.ts +636 -0
  442. package/src/plugins/analysis/ExpressRouteAnalyzer.ts +76 -36
  443. package/src/plugins/analysis/FetchAnalyzer.ts +232 -21
  444. package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +84 -101
  445. package/src/plugins/analysis/JSASTAnalyzer.ts +4265 -587
  446. package/src/plugins/analysis/ReactAnalyzer.ts +57 -57
  447. package/src/plugins/analysis/RustAnalyzer.ts +16 -11
  448. package/src/plugins/analysis/SQLiteAnalyzer.ts +13 -7
  449. package/src/plugins/analysis/ServiceLayerAnalyzer.ts +22 -16
  450. package/src/plugins/analysis/SocketIOAnalyzer.ts +151 -28
  451. package/src/plugins/analysis/SystemDbAnalyzer.ts +16 -11
  452. package/src/plugins/analysis/ast/GraphBuilder.ts +1947 -327
  453. package/src/plugins/analysis/ast/IdGenerator.ts +177 -0
  454. package/src/plugins/analysis/ast/types.ts +596 -6
  455. package/src/plugins/analysis/ast/utils/createParameterNodes.ts +104 -0
  456. package/src/plugins/analysis/ast/utils/index.ts +12 -0
  457. package/src/plugins/analysis/ast/utils/location.ts +103 -0
  458. package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +19 -8
  459. package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +924 -83
  460. package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +97 -44
  461. package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +234 -93
  462. package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +124 -9
  463. package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +41 -14
  464. package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +294 -49
  465. package/src/plugins/discovery/MonorepoServiceDiscovery.ts +3 -2
  466. package/src/plugins/discovery/SimpleProjectDiscovery.ts +6 -1
  467. package/src/plugins/discovery/WorkspaceDiscovery.ts +184 -0
  468. package/src/plugins/discovery/resolveSourceEntrypoint.ts +103 -0
  469. package/src/plugins/discovery/workspaces/detector.ts +63 -0
  470. package/src/plugins/discovery/workspaces/globResolver.ts +229 -0
  471. package/src/plugins/discovery/workspaces/index.ts +23 -0
  472. package/src/plugins/discovery/workspaces/parsers.ts +99 -0
  473. package/src/plugins/enrichment/AliasTracker.ts +35 -8
  474. package/src/plugins/enrichment/ArgumentParameterLinker.ts +240 -0
  475. package/src/plugins/enrichment/ClosureCaptureEnricher.ts +267 -0
  476. package/src/plugins/enrichment/ExternalCallResolver.ts +262 -0
  477. package/src/plugins/enrichment/FunctionCallResolver.ts +456 -0
  478. package/src/plugins/enrichment/HTTPConnectionEnricher.ts +84 -27
  479. package/src/plugins/enrichment/ImportExportLinker.ts +24 -6
  480. package/src/plugins/enrichment/MethodCallResolver.ts +39 -13
  481. package/src/plugins/enrichment/MountPointResolver.ts +208 -195
  482. package/src/plugins/enrichment/NodejsBuiltinsResolver.ts +365 -0
  483. package/src/plugins/enrichment/PrefixEvaluator.ts +16 -7
  484. package/src/plugins/enrichment/RustFFIEnricher.ts +6 -5
  485. package/src/plugins/enrichment/ValueDomainAnalyzer.ts +209 -189
  486. package/src/plugins/indexing/IncrementalModuleIndexer.ts +23 -14
  487. package/src/plugins/indexing/JSModuleIndexer.ts +140 -34
  488. package/src/plugins/indexing/RustModuleIndexer.ts +8 -7
  489. package/src/plugins/validation/BrokenImportValidator.ts +325 -0
  490. package/src/plugins/validation/CallResolverValidator.ts +131 -110
  491. package/src/plugins/validation/DataFlowValidator.ts +88 -67
  492. package/src/plugins/validation/EvalBanValidator.ts +17 -16
  493. package/src/plugins/validation/GraphConnectivityValidator.ts +58 -24
  494. package/src/plugins/validation/NodeCreationValidator.ts +554 -0
  495. package/src/plugins/validation/SQLInjectionValidator.ts +63 -20
  496. package/src/plugins/validation/ShadowingDetector.ts +6 -5
  497. package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +12 -11
  498. package/src/plugins/vcs/GitPlugin.ts +40 -12
  499. package/src/plugins/vcs/VCSPlugin.ts +7 -5
  500. package/src/queries/README.md +46 -0
  501. package/src/queries/findCallsInFunction.ts +206 -0
  502. package/src/queries/findContainingFunction.ts +83 -0
  503. package/src/queries/index.ts +23 -0
  504. package/src/queries/traceValues.ts +398 -0
  505. package/src/queries/types.ts +187 -0
  506. package/src/schema/GraphSchemaExtractor.ts +177 -0
  507. package/src/schema/InterfaceSchemaExtractor.ts +173 -0
  508. package/src/schema/index.ts +5 -0
  509. package/src/storage/backends/RFDBServerBackend.ts +100 -98
  510. package/src/storage/backends/typeValidation.ts +1 -0
  511. package/src/validation/PathValidator.ts +1 -1
  512. package/dist/core/AnalysisWorker.d.ts +0 -14
  513. package/dist/core/AnalysisWorker.d.ts.map +0 -1
  514. package/dist/core/AnalysisWorker.js +0 -307
  515. package/dist/core/ParallelAnalyzer.d.ts +0 -120
  516. package/dist/core/ParallelAnalyzer.d.ts.map +0 -1
  517. package/dist/core/ParallelAnalyzer.js +0 -331
  518. package/dist/core/QueueWorker.d.ts +0 -12
  519. package/dist/core/QueueWorker.d.ts.map +0 -1
  520. package/dist/core/QueueWorker.js +0 -567
  521. package/dist/core/RFDBClient.d.ts +0 -179
  522. package/dist/core/RFDBClient.d.ts.map +0 -1
  523. package/dist/core/RFDBClient.js +0 -429
  524. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +0 -19
  525. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +0 -1
  526. package/dist/plugins/discovery/ZonServiceDiscovery.js +0 -204
  527. package/src/core/AnalysisWorker.ts +0 -410
  528. package/src/core/ParallelAnalyzer.ts +0 -476
  529. package/src/core/QueueWorker.ts +0 -780
  530. package/src/plugins/indexing/ServiceDetector.ts +0 -230
@@ -16,6 +16,7 @@
16
16
  import { Plugin, createSuccessResult } from '../Plugin.js';
17
17
  import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
18
18
  import type { BaseNodeRecord, NodeRecord } from '@grafema/types';
19
+ import { StrictModeError } from '../../errors/GrafemaError.js';
19
20
 
20
21
  /**
21
22
  * Alias info from index
@@ -80,13 +81,15 @@ export class AliasTracker extends Plugin {
80
81
 
81
82
  async execute(context: PluginContext): Promise<PluginResult> {
82
83
  const { graph, onProgress } = context;
84
+ const logger = this.log(context);
83
85
 
84
- console.log('[AliasTracker] Starting alias resolution...');
86
+ logger.info('Starting alias resolution');
85
87
 
86
88
  let callsProcessed = 0;
87
89
  let aliasesFound = 0;
88
90
  let edgesCreated = 0;
89
91
  let resolvedToMethod = 0;
92
+ const errors: Error[] = [];
90
93
 
91
94
  // Трекинг превышений глубины
92
95
  this.depthExceeded = [];
@@ -105,11 +108,11 @@ export class AliasTracker extends Plugin {
105
108
  unresolvedCalls.push(callNode);
106
109
  }
107
110
 
108
- console.log(`[AliasTracker] Found ${unresolvedCalls.length} unresolved call sites`);
111
+ logger.info('Found unresolved call sites', { count: unresolvedCalls.length });
109
112
 
110
113
  // 2. Строим индекс алиасов: variableName -> EXPRESSION info
111
114
  const aliasIndex = await this.buildAliasIndex(graph);
112
- console.log(`[AliasTracker] Found ${aliasIndex.size} potential aliases`);
115
+ logger.debug('Found potential aliases', { count: aliasIndex.size });
113
116
 
114
117
  // 3. Строим индекс методов для резолвинга
115
118
  const methodIndex = await this.buildMethodIndex(graph);
@@ -182,15 +185,39 @@ export class AliasTracker extends Plugin {
182
185
 
183
186
  // Алярм если были превышения глубины
184
187
  if (this.depthExceeded.length > 0) {
185
- console.warn(`[AliasTracker] ⚠️ WARNING: ${this.depthExceeded.length} alias chain(s) exceeded max depth (${AliasTracker.MAX_DEPTH}):`);
186
- for (const info of this.depthExceeded) {
187
- console.warn(` - ${info.file}:${info.name} (chain: ${info.chain.join(' → ')}...)`);
188
+ logger.warn('Alias chains exceeded max depth', {
189
+ count: this.depthExceeded.length,
190
+ maxDepth: AliasTracker.MAX_DEPTH,
191
+ examples: this.depthExceeded.slice(0, 5).map(info => ({
192
+ file: info.file,
193
+ name: info.name,
194
+ chain: info.chain.join(' → ')
195
+ }))
196
+ });
197
+
198
+ // In strict mode, report as errors
199
+ if (context.strictMode) {
200
+ for (const info of this.depthExceeded) {
201
+ const error = new StrictModeError(
202
+ `Alias chain exceeded max depth (${info.depth}): ${info.name}`,
203
+ 'STRICT_ALIAS_DEPTH_EXCEEDED',
204
+ {
205
+ filePath: info.file,
206
+ phase: 'ENRICHMENT',
207
+ plugin: 'AliasTracker',
208
+ aliasName: info.name,
209
+ chainLength: info.depth,
210
+ },
211
+ `Possible circular alias reference. Chain: ${info.chain.slice(0, 3).join(' -> ')}...`
212
+ );
213
+ errors.push(error);
214
+ }
188
215
  }
189
216
  }
190
217
 
191
- console.log('[AliasTracker] Summary:', summary);
218
+ logger.info('Summary', summary);
192
219
 
193
- return createSuccessResult({ nodes: 0, edges: edgesCreated }, summary);
220
+ return createSuccessResult({ nodes: 0, edges: edgesCreated }, summary, errors);
194
221
  }
195
222
 
196
223
  /**
@@ -0,0 +1,240 @@
1
+ /**
2
+ * ArgumentParameterLinker - creates RECEIVES_ARGUMENT edges connecting
3
+ * function parameters to call arguments.
4
+ *
5
+ * RECEIVES_ARGUMENT edges connect:
6
+ * PARAMETER node -> RECEIVES_ARGUMENT -> argument source (VARIABLE, LITERAL, CALL, etc.)
7
+ *
8
+ * This is the inverse of PASSES_ARGUMENT:
9
+ * - PASSES_ARGUMENT: CALL -> argument (call site perspective)
10
+ * - RECEIVES_ARGUMENT: PARAMETER -> argument (function perspective)
11
+ *
12
+ * Edge attributes:
13
+ * - argIndex: position of the argument (0-based)
14
+ * - callId: ID of the CALL node that passed this argument
15
+ *
16
+ * Algorithm:
17
+ * For each CALL node with PASSES_ARGUMENT edges:
18
+ * 1. Get outgoing CALLS edge to find target function
19
+ * 2. If no CALLS edge -> skip (unresolved call)
20
+ * 3. Get target function's PARAMETER nodes via HAS_PARAMETER edges
21
+ * 4. For each PASSES_ARGUMENT edge:
22
+ * a. Get argIndex from edge metadata
23
+ * b. Find PARAMETER with matching index
24
+ * c. Create RECEIVES_ARGUMENT edge: PARAMETER -> argument_source
25
+ */
26
+
27
+ import { Plugin, createSuccessResult } from '../Plugin.js';
28
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
29
+ import type { BaseNodeRecord, EdgeRecord } from '@grafema/types';
30
+ import { StrictModeError } from '../../errors/GrafemaError.js';
31
+
32
+ /**
33
+ * Extended call node type
34
+ */
35
+ interface CallNode extends BaseNodeRecord {
36
+ // All properties inherited from BaseNodeRecord
37
+ }
38
+
39
+ /**
40
+ * Extended parameter node type
41
+ */
42
+ interface ParameterNode extends BaseNodeRecord {
43
+ index?: number;
44
+ }
45
+
46
+ /**
47
+ * Edge with metadata for PASSES_ARGUMENT
48
+ */
49
+ interface PassesArgumentEdge extends EdgeRecord {
50
+ argIndex?: number;
51
+ isSpread?: boolean;
52
+ }
53
+
54
+ /**
55
+ * Edge record with extended fields for RECEIVES_ARGUMENT lookup
56
+ */
57
+ interface ExtendedEdgeRecord extends EdgeRecord {
58
+ callId?: string;
59
+ }
60
+
61
+ export class ArgumentParameterLinker extends Plugin {
62
+ get metadata(): PluginMetadata {
63
+ return {
64
+ name: 'ArgumentParameterLinker',
65
+ phase: 'ENRICHMENT',
66
+ priority: 45, // Runs AFTER MethodCallResolver (50) which creates required CALLS edges
67
+ creates: {
68
+ nodes: [],
69
+ edges: ['RECEIVES_ARGUMENT']
70
+ },
71
+ dependencies: ['JSASTAnalyzer', 'MethodCallResolver'] // Requires CALLS edges
72
+ };
73
+ }
74
+
75
+ async execute(context: PluginContext): Promise<PluginResult> {
76
+ const { graph, onProgress } = context;
77
+ const logger = this.log(context);
78
+
79
+ logger.info('Starting argument-parameter linking');
80
+
81
+ const startTime = Date.now();
82
+
83
+ let callsProcessed = 0;
84
+ let edgesCreated = 0;
85
+ let unresolvedCalls = 0;
86
+ let noParams = 0;
87
+ const errors: Error[] = [];
88
+
89
+ // Collect all CALL nodes (both CALL and METHOD_CALL via CALL type check)
90
+ const callNodes: CallNode[] = [];
91
+ for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
92
+ callNodes.push(node as CallNode);
93
+ }
94
+
95
+ logger.info('Found calls to process', { count: callNodes.length });
96
+
97
+ // Build a Set of existing RECEIVES_ARGUMENT edges to avoid duplicates
98
+ // Key: `${paramId}:${dstId}:${callId}`
99
+ const existingEdges = new Set<string>();
100
+ for await (const node of graph.queryNodes({ nodeType: 'PARAMETER' })) {
101
+ const edges = await graph.getOutgoingEdges(node.id, ['RECEIVES_ARGUMENT']) as ExtendedEdgeRecord[];
102
+ for (const edge of edges) {
103
+ const callId = edge.callId ?? (edge.metadata?.callId as string | undefined) ?? '';
104
+ existingEdges.add(`${node.id}:${edge.dst}:${callId}`);
105
+ }
106
+ }
107
+ logger.debug('Found existing RECEIVES_ARGUMENT edges', { count: existingEdges.size });
108
+
109
+ for (const callNode of callNodes) {
110
+ callsProcessed++;
111
+
112
+ // Report progress every 100 calls
113
+ if (onProgress && callsProcessed % 100 === 0) {
114
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
115
+ onProgress({
116
+ phase: 'enrichment',
117
+ currentPlugin: 'ArgumentParameterLinker',
118
+ message: `Linking arguments ${callsProcessed}/${callNodes.length} (${elapsed}s)`,
119
+ totalFiles: callNodes.length,
120
+ processedFiles: callsProcessed
121
+ });
122
+ }
123
+
124
+ // 1. Get PASSES_ARGUMENT edges from this call
125
+ const passesArgumentEdges = await graph.getOutgoingEdges(callNode.id, ['PASSES_ARGUMENT']);
126
+ if (passesArgumentEdges.length === 0) {
127
+ continue; // No arguments passed, skip
128
+ }
129
+
130
+ // 2. Get CALLS edge to find target function
131
+ const callsEdges = await graph.getOutgoingEdges(callNode.id, ['CALLS']);
132
+ if (callsEdges.length === 0) {
133
+ unresolvedCalls++;
134
+
135
+ // In strict mode, report unresolved calls that have arguments
136
+ if (context.strictMode) {
137
+ const error = new StrictModeError(
138
+ `Call with arguments has no resolved target: ${callNode.name || callNode.id}`,
139
+ 'STRICT_UNRESOLVED_ARGUMENT',
140
+ {
141
+ filePath: callNode.file,
142
+ lineNumber: callNode.line as number | undefined,
143
+ phase: 'ENRICHMENT',
144
+ plugin: 'ArgumentParameterLinker',
145
+ callId: callNode.id,
146
+ },
147
+ `Ensure the called function is imported or defined`
148
+ );
149
+ errors.push(error);
150
+ }
151
+ continue; // Unresolved call, skip
152
+ }
153
+
154
+ // Get target function node
155
+ const targetFunctionId = callsEdges[0].dst;
156
+ const targetFunction = await graph.getNode(targetFunctionId);
157
+ if (!targetFunction) {
158
+ unresolvedCalls++;
159
+ continue;
160
+ }
161
+
162
+ // 3. Get target function's PARAMETER nodes via HAS_PARAMETER edges
163
+ const hasParameterEdges = await graph.getOutgoingEdges(targetFunctionId, ['HAS_PARAMETER']);
164
+ if (hasParameterEdges.length === 0) {
165
+ noParams++;
166
+ continue; // Function has no parameters
167
+ }
168
+
169
+ // Build parameter index map: argIndex -> paramNode
170
+ const paramsByIndex = new Map<number, ParameterNode>();
171
+ for (const paramEdge of hasParameterEdges) {
172
+ const paramNode = await graph.getNode(paramEdge.dst) as ParameterNode | null;
173
+ if (paramNode && typeof paramNode.index === 'number') {
174
+ paramsByIndex.set(paramNode.index, paramNode);
175
+ }
176
+ }
177
+
178
+ if (paramsByIndex.size === 0) {
179
+ noParams++;
180
+ continue;
181
+ }
182
+
183
+ // 4. For each PASSES_ARGUMENT edge, create RECEIVES_ARGUMENT edge
184
+ for (const passesEdge of passesArgumentEdges as PassesArgumentEdge[]) {
185
+ // Get argIndex from edge (can be top-level or in metadata)
186
+ const argIndex = passesEdge.argIndex ?? (passesEdge.metadata?.argIndex as number | undefined);
187
+ if (argIndex === undefined) {
188
+ continue; // No argIndex, skip
189
+ }
190
+
191
+ // Find matching parameter
192
+ const paramNode = paramsByIndex.get(argIndex);
193
+ if (!paramNode) {
194
+ continue; // No parameter for this argument index (extra arg)
195
+ }
196
+
197
+ // Check for duplicate
198
+ const edgeKey = `${paramNode.id}:${passesEdge.dst}:${callNode.id}`;
199
+ if (existingEdges.has(edgeKey)) {
200
+ continue; // Already exists
201
+ }
202
+
203
+ // Create RECEIVES_ARGUMENT edge: PARAMETER -> argument_source
204
+ await graph.addEdge({
205
+ type: 'RECEIVES_ARGUMENT',
206
+ src: paramNode.id,
207
+ dst: passesEdge.dst,
208
+ metadata: {
209
+ argIndex,
210
+ callId: callNode.id
211
+ }
212
+ });
213
+
214
+ existingEdges.add(edgeKey);
215
+ edgesCreated++;
216
+ }
217
+ }
218
+
219
+ const totalTime = ((Date.now() - startTime) / 1000).toFixed(2);
220
+ logger.info('Complete', {
221
+ callsProcessed,
222
+ edgesCreated,
223
+ unresolvedCalls,
224
+ noParams,
225
+ time: `${totalTime}s`
226
+ });
227
+
228
+ return createSuccessResult(
229
+ { nodes: 0, edges: edgesCreated },
230
+ {
231
+ callsProcessed,
232
+ edgesCreated,
233
+ unresolvedCalls,
234
+ noParams,
235
+ timeMs: Date.now() - startTime
236
+ },
237
+ errors
238
+ );
239
+ }
240
+ }
@@ -0,0 +1,267 @@
1
+ /**
2
+ * ClosureCaptureEnricher - tracks transitive closure captures
3
+ *
4
+ * Problem: CAPTURES edges only exist for immediate parent scope (depth=1).
5
+ * Multi-level captures (grandparent, great-grandparent) are not tracked.
6
+ *
7
+ * Solution: Walk scope chains upward to find ALL captured variables,
8
+ * creating CAPTURES edges with depth metadata.
9
+ *
10
+ * USES:
11
+ * - SCOPE nodes with scopeType='closure'
12
+ * - SCOPE.parentScopeId for scope chain navigation
13
+ * - VARIABLE nodes with parentScopeId
14
+ * - CONSTANT nodes with parentScopeId
15
+ * - PARAMETER nodes with parentFunctionId (resolved via HAS_SCOPE)
16
+ *
17
+ * CREATES:
18
+ * - SCOPE -> CAPTURES -> VARIABLE/CONSTANT/PARAMETER (with metadata: { depth: N })
19
+ *
20
+ * NOTE: Depth=1 edges are created by JSASTAnalyzer without depth metadata.
21
+ * This enricher only creates edges for depth > 1.
22
+ */
23
+
24
+ import { Plugin, createSuccessResult } from '../Plugin.js';
25
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
26
+ import type { BaseNodeRecord } from '@grafema/types';
27
+
28
+ interface ScopeNode extends BaseNodeRecord {
29
+ scopeType?: string;
30
+ parentScopeId?: string;
31
+ capturesFrom?: string;
32
+ }
33
+
34
+ interface VariableNode extends BaseNodeRecord {
35
+ parentScopeId?: string;
36
+ }
37
+
38
+ interface ParameterNode extends BaseNodeRecord {
39
+ parentFunctionId?: string;
40
+ }
41
+
42
+ interface ScopeChainEntry {
43
+ scopeId: string;
44
+ depth: number;
45
+ }
46
+
47
+ export class ClosureCaptureEnricher extends Plugin {
48
+ static MAX_DEPTH = 10;
49
+
50
+ get metadata(): PluginMetadata {
51
+ return {
52
+ name: 'ClosureCaptureEnricher',
53
+ phase: 'ENRICHMENT',
54
+ priority: 40, // Lower number = runs later. Runs after ImportExportLinker (90)
55
+ creates: {
56
+ nodes: [],
57
+ edges: ['CAPTURES']
58
+ },
59
+ dependencies: ['JSASTAnalyzer'] // Requires SCOPE and VARIABLE nodes
60
+ };
61
+ }
62
+
63
+ async execute(context: PluginContext): Promise<PluginResult> {
64
+ const { graph, onProgress } = context;
65
+ const logger = this.log(context);
66
+
67
+ logger.info('Starting transitive capture resolution');
68
+
69
+ let closuresProcessed = 0;
70
+ let capturesCreated = 0;
71
+ let existingCapturesSkipped = 0;
72
+
73
+ // Step 1: Build scope index for fast lookup
74
+ const scopeIndex = await this.buildScopeIndex(graph);
75
+ logger.debug('Indexed scopes', { count: scopeIndex.size });
76
+
77
+ // Step 2: Build variable index (scopeId -> variables/constants/parameters)
78
+ const variablesByScopeIndex = await this.buildVariablesByScopeIndex(graph);
79
+ logger.debug('Indexed variables by scope', { scopes: variablesByScopeIndex.size });
80
+
81
+ // Step 3: Find all closure scopes
82
+ const closureScopes: ScopeNode[] = [];
83
+ for await (const node of graph.queryNodes({ type: 'SCOPE' })) {
84
+ const scope = node as ScopeNode;
85
+ if (scope.scopeType === 'closure') {
86
+ closureScopes.push(scope);
87
+ }
88
+ }
89
+
90
+ logger.info('Found closure scopes', { count: closureScopes.length });
91
+
92
+ // Step 4: Build existing CAPTURES edge set to avoid duplicates
93
+ const existingCaptures = await this.buildExistingCapturesSet(graph);
94
+ logger.debug('Existing CAPTURES edges', { count: existingCaptures.size });
95
+
96
+ // Step 5: Process each closure
97
+ for (const closure of closureScopes) {
98
+ closuresProcessed++;
99
+
100
+ // Progress reporting
101
+ if (onProgress && closuresProcessed % 50 === 0) {
102
+ onProgress({
103
+ phase: 'enrichment',
104
+ currentPlugin: 'ClosureCaptureEnricher',
105
+ message: `Processing closures ${closuresProcessed}/${closureScopes.length}`,
106
+ totalFiles: closureScopes.length,
107
+ processedFiles: closuresProcessed
108
+ });
109
+ }
110
+
111
+ // Walk scope chain upward
112
+ const ancestors = this.walkScopeChain(closure.id, scopeIndex);
113
+
114
+ // For each ancestor scope (depth > 1), find variables and create edges
115
+ for (const ancestor of ancestors) {
116
+ if (ancestor.depth <= 1) continue; // Skip immediate parent (already handled by JSASTAnalyzer)
117
+
118
+ const variables = variablesByScopeIndex.get(ancestor.scopeId) || [];
119
+
120
+ for (const variable of variables) {
121
+ const edgeKey = `${closure.id}:${variable.id}`;
122
+
123
+ if (existingCaptures.has(edgeKey)) {
124
+ existingCapturesSkipped++;
125
+ continue;
126
+ }
127
+
128
+ await graph.addEdge({
129
+ src: closure.id,
130
+ dst: variable.id,
131
+ type: 'CAPTURES',
132
+ metadata: { depth: ancestor.depth }
133
+ });
134
+
135
+ capturesCreated++;
136
+ existingCaptures.add(edgeKey); // Track to avoid duplicates
137
+ }
138
+ }
139
+ }
140
+
141
+ const summary = {
142
+ closuresProcessed,
143
+ capturesCreated,
144
+ existingCapturesSkipped
145
+ };
146
+
147
+ logger.info('Summary', summary);
148
+
149
+ return createSuccessResult({ nodes: 0, edges: capturesCreated }, summary);
150
+ }
151
+
152
+ /**
153
+ * Build index: scopeId -> ScopeNode
154
+ */
155
+ private async buildScopeIndex(graph: PluginContext['graph']): Promise<Map<string, ScopeNode>> {
156
+ const index = new Map<string, ScopeNode>();
157
+
158
+ for await (const node of graph.queryNodes({ type: 'SCOPE' })) {
159
+ index.set(node.id, node as ScopeNode);
160
+ }
161
+
162
+ return index;
163
+ }
164
+
165
+ /**
166
+ * Build index: scopeId -> VariableNode[]
167
+ * Includes VARIABLE, CONSTANT, and PARAMETER nodes
168
+ */
169
+ private async buildVariablesByScopeIndex(graph: PluginContext['graph']): Promise<Map<string, VariableNode[]>> {
170
+ const index = new Map<string, VariableNode[]>();
171
+
172
+ // Index VARIABLE nodes via parentScopeId
173
+ for await (const node of graph.queryNodes({ type: 'VARIABLE' })) {
174
+ const variable = node as VariableNode;
175
+ if (!variable.parentScopeId) continue;
176
+
177
+ const vars = index.get(variable.parentScopeId) || [];
178
+ vars.push(variable);
179
+ index.set(variable.parentScopeId, vars);
180
+ }
181
+
182
+ // Index CONSTANT nodes via parentScopeId
183
+ for await (const node of graph.queryNodes({ type: 'CONSTANT' })) {
184
+ const constant = node as VariableNode;
185
+ if (!constant.parentScopeId) continue;
186
+
187
+ const vars = index.get(constant.parentScopeId) || [];
188
+ vars.push(constant);
189
+ index.set(constant.parentScopeId, vars);
190
+ }
191
+
192
+ // Index PARAMETER nodes via parentFunctionId -> HAS_SCOPE lookup
193
+ for await (const node of graph.queryNodes({ type: 'PARAMETER' })) {
194
+ const param = node as ParameterNode;
195
+ if (!param.parentFunctionId) continue;
196
+
197
+ // Find the function's scope via HAS_SCOPE edge
198
+ // FUNCTION -[HAS_SCOPE]-> SCOPE
199
+ const scopeEdges = await graph.getOutgoingEdges(param.parentFunctionId, ['HAS_SCOPE']);
200
+ if (scopeEdges.length === 0) continue;
201
+
202
+ const scopeId = scopeEdges[0].dst;
203
+ const params = index.get(scopeId) || [];
204
+ params.push(param as unknown as VariableNode);
205
+ index.set(scopeId, params);
206
+ }
207
+
208
+ return index;
209
+ }
210
+
211
+ /**
212
+ * Build set of existing CAPTURES edges: "srcId:dstId"
213
+ */
214
+ private async buildExistingCapturesSet(graph: PluginContext['graph']): Promise<Set<string>> {
215
+ const set = new Set<string>();
216
+
217
+ // Query all SCOPE nodes and get their CAPTURES edges
218
+ for await (const node of graph.queryNodes({ type: 'SCOPE' })) {
219
+ const edges = await graph.getOutgoingEdges(node.id, ['CAPTURES']);
220
+ for (const edge of edges) {
221
+ set.add(`${edge.src}:${edge.dst}`);
222
+ }
223
+ }
224
+
225
+ return set;
226
+ }
227
+
228
+ /**
229
+ * Walk scope chain upward from startScopeId
230
+ * Returns ancestor scopes with depth (1 = immediate parent, 2 = grandparent, etc.)
231
+ *
232
+ * Walks ALL scopes in the chain (including if/for/while blocks),
233
+ * not just closures.
234
+ */
235
+ private walkScopeChain(
236
+ startScopeId: string,
237
+ scopeIndex: Map<string, ScopeNode>
238
+ ): ScopeChainEntry[] {
239
+ const result: ScopeChainEntry[] = [];
240
+ const visited = new Set<string>();
241
+
242
+ const currentScope = scopeIndex.get(startScopeId);
243
+ if (!currentScope) return result;
244
+
245
+ // Start walking from the closure's capturesFrom (immediate parent) or parentScopeId
246
+ let parentId = currentScope.capturesFrom || currentScope.parentScopeId;
247
+ let depth = 1;
248
+
249
+ while (parentId && depth <= ClosureCaptureEnricher.MAX_DEPTH) {
250
+ // Cycle protection
251
+ if (visited.has(parentId)) break;
252
+ visited.add(parentId);
253
+
254
+ result.push({ scopeId: parentId, depth });
255
+
256
+ // Get parent scope
257
+ const parentScope = scopeIndex.get(parentId);
258
+ if (!parentScope) break;
259
+
260
+ // Move up the chain via parentScopeId
261
+ parentId = parentScope.parentScopeId;
262
+ depth++;
263
+ }
264
+
265
+ return result;
266
+ }
267
+ }