@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
@@ -104,18 +104,21 @@ export class SQLInjectionValidator extends Plugin {
104
104
  phase: 'VALIDATION',
105
105
  priority: 90, // After ValueDomainAnalyzer (65)
106
106
  creates: {
107
- nodes: [],
108
- edges: []
107
+ nodes: ['issue:security'],
108
+ edges: ['AFFECTS']
109
109
  }
110
110
  };
111
111
  }
112
112
 
113
113
  async execute(context: PluginContext): Promise<PluginResult> {
114
114
  const { graph } = context;
115
+ const logger = this.log(context);
115
116
 
116
- console.log('[SQLInjectionValidator] Checking for SQL injection vulnerabilities...');
117
+ logger.info('Starting SQL injection vulnerability check');
117
118
 
118
119
  const issues: SQLInjectionIssue[] = [];
120
+ let issueNodeCount = 0;
121
+ let affectsEdgeCount = 0;
119
122
 
120
123
  // 1. Find all CALL nodes that look like SQL queries
121
124
  const sqlCalls: CallNode[] = [];
@@ -127,13 +130,13 @@ export class SQLInjectionValidator extends Plugin {
127
130
  }
128
131
  }
129
132
 
130
- console.log(`[SQLInjectionValidator] Found ${sqlCalls.length} potential SQL calls`);
133
+ logger.debug('SQL calls collected', { count: sqlCalls.length });
131
134
 
132
135
  // 2. For each SQL call, analyze the query argument
133
136
  for (const call of sqlCalls) {
134
137
  const result = await this.analyzeQueryCall(call, graph);
135
138
  if (result.isVulnerable) {
136
- issues.push({
139
+ const issue: SQLInjectionIssue = {
137
140
  type: 'SQL_INJECTION',
138
141
  severity: 'ERROR',
139
142
  message: `Potential SQL injection at ${call.file}:${call.line || '?'} - ${result.reason}`,
@@ -142,37 +145,79 @@ export class SQLInjectionValidator extends Plugin {
142
145
  line: call.line as number | undefined,
143
146
  reason: result.reason!,
144
147
  nondeterministicSources: result.sources
145
- });
148
+ };
149
+ issues.push(issue);
150
+
151
+ // Persist issue to graph if reportIssue is available
152
+ if (context.reportIssue) {
153
+ await context.reportIssue({
154
+ category: 'security',
155
+ severity: 'error',
156
+ message: issue.message,
157
+ file: call.file || '',
158
+ line: call.line || 0,
159
+ column: call.column || 0,
160
+ targetNodeId: call.id,
161
+ context: {
162
+ type: 'SQL_INJECTION',
163
+ reason: result.reason,
164
+ nondeterministicSources: result.sources
165
+ }
166
+ });
167
+ issueNodeCount++;
168
+ affectsEdgeCount++;
169
+ }
146
170
  }
147
171
  }
148
172
 
149
173
  // 3. Also check via graph pattern - CALL nodes that have ARGUMENT -> PARAMETER paths
150
- const patternViolations = await this.checkViaGraphPattern(graph, sqlCalls);
174
+ const patternViolations = await this.checkViaGraphPattern(graph, logger, sqlCalls);
151
175
  for (const violation of patternViolations) {
152
176
  // Avoid duplicates
153
177
  if (!issues.find(i => i.nodeId === violation.nodeId)) {
154
178
  issues.push(violation);
179
+
180
+ // Persist issue to graph if reportIssue is available
181
+ if (context.reportIssue) {
182
+ await context.reportIssue({
183
+ category: 'security',
184
+ severity: 'error',
185
+ message: violation.message,
186
+ file: violation.file || '',
187
+ line: violation.line || 0,
188
+ targetNodeId: violation.nodeId,
189
+ context: {
190
+ type: 'SQL_INJECTION',
191
+ reason: violation.reason,
192
+ nondeterministicSources: violation.nondeterministicSources
193
+ }
194
+ });
195
+ issueNodeCount++;
196
+ affectsEdgeCount++;
197
+ }
155
198
  }
156
199
  }
157
200
 
158
201
  const summary = {
159
202
  sqlCallsChecked: sqlCalls.length,
160
- vulnerabilitiesFound: issues.length
203
+ vulnerabilitiesFound: issues.length,
204
+ issueNodesCreated: issueNodeCount,
205
+ affectsEdgesCreated: affectsEdgeCount
161
206
  };
162
207
 
163
- console.log('[SQLInjectionValidator] Summary:', summary);
208
+ logger.info('Validation complete', summary);
164
209
 
165
210
  if (issues.length > 0) {
166
- console.log('[SQLInjectionValidator] ❌ SQL injection vulnerabilities found:');
211
+ logger.warn('SQL injection vulnerabilities found', { count: issues.length });
167
212
  for (const issue of issues) {
168
- console.log(` 🚫 ${issue.message}`);
213
+ logger.warn(issue.message);
169
214
  }
170
215
  } else {
171
- console.log('[SQLInjectionValidator] ✅ No SQL injection vulnerabilities detected');
216
+ logger.info('No SQL injection vulnerabilities detected');
172
217
  }
173
218
 
174
219
  return createSuccessResult(
175
- { nodes: 0, edges: 0 },
220
+ { nodes: issueNodeCount, edges: affectsEdgeCount },
176
221
  { summary, issues }
177
222
  );
178
223
  }
@@ -192,9 +237,7 @@ export class SQLInjectionValidator extends Plugin {
192
237
 
193
238
  // Check if this call has PASSES_ARGUMENT edges
194
239
  const outgoing = await graph.getOutgoingEdges(call.id) as unknown as EdgeRecord[];
195
- const argEdges = outgoing.filter(e =>
196
- (e.edgeType || e.edge_type) === 'PASSES_ARGUMENT'
197
- );
240
+ const argEdges = outgoing.filter(e => e.type === 'PASSES_ARGUMENT');
198
241
 
199
242
  if (argEdges.length === 0) {
200
243
  // No tracked arguments - check via queryArgName attribute if available
@@ -272,8 +315,7 @@ export class SQLInjectionValidator extends Plugin {
272
315
  // Check DERIVES_FROM edges
273
316
  const outgoing = await graph.getOutgoingEdges(exprNode.id) as unknown as EdgeRecord[];
274
317
  const derivesFromEdges = outgoing.filter(e =>
275
- (e.edgeType || e.edge_type) === 'DERIVES_FROM' ||
276
- (e.edgeType || e.edge_type) === 'ASSIGNED_FROM'
318
+ e.type === 'DERIVES_FROM' || e.type === 'ASSIGNED_FROM'
277
319
  );
278
320
 
279
321
  for (const edge of derivesFromEdges) {
@@ -307,6 +349,7 @@ export class SQLInjectionValidator extends Plugin {
307
349
  */
308
350
  private async checkViaGraphPattern(
309
351
  graph: PluginContext['graph'],
352
+ logger: ReturnType<typeof this.log>,
310
353
  excludeCalls: CallNode[] = []
311
354
  ): Promise<SQLInjectionIssue[]> {
312
355
  const issues: SQLInjectionIssue[] = [];
@@ -316,7 +359,7 @@ export class SQLInjectionValidator extends Plugin {
316
359
  try {
317
360
  // Check if graph supports checkGuarantee
318
361
  if (!graph.checkGuarantee) {
319
- console.log('[SQLInjectionValidator] Graph does not support checkGuarantee, skipping pattern-based check');
362
+ logger.debug('Graph does not support checkGuarantee, skipping pattern-based check');
320
363
  return issues;
321
364
  }
322
365
 
@@ -353,7 +396,7 @@ export class SQLInjectionValidator extends Plugin {
353
396
  }
354
397
  } catch (err) {
355
398
  // Datalog query might fail if backend doesn't support it
356
- console.log('[SQLInjectionValidator] Datalog check skipped:', (err as Error).message);
399
+ logger.debug('Datalog check skipped', { error: (err as Error).message });
357
400
  }
358
401
 
359
402
  return issues;
@@ -70,8 +70,9 @@ export class ShadowingDetector extends Plugin {
70
70
 
71
71
  async execute(context: PluginContext): Promise<PluginResult> {
72
72
  const { graph } = context;
73
+ const logger = this.log(context);
73
74
 
74
- console.log('[ShadowingDetector] Checking for variable shadowing...');
75
+ logger.info('Starting variable shadowing detection');
75
76
 
76
77
  const issues: ShadowingIssue[] = [];
77
78
 
@@ -154,15 +155,15 @@ export class ShadowingDetector extends Plugin {
154
155
  totalIssues: issues.length
155
156
  };
156
157
 
157
- console.log('[ShadowingDetector] Summary:', summary);
158
+ logger.info('Detection complete', { ...summary });
158
159
 
159
160
  if (issues.length > 0) {
160
- console.log('[ShadowingDetector] Shadowing issues found:');
161
+ logger.warn('Shadowing issues found', { count: issues.length });
161
162
  for (const issue of issues) {
162
- console.log(` ${issue.type === 'CROSS_FILE_SHADOW' ? '📁' : '🔒'} ${issue.message}`);
163
+ logger.warn(issue.message, { type: issue.type });
163
164
  }
164
165
  } else {
165
- console.log('[ShadowingDetector] No shadowing issues detected');
166
+ logger.info('No shadowing issues detected');
166
167
  }
167
168
 
168
169
  return createSuccessResult(
@@ -58,14 +58,15 @@ export class TypeScriptDeadCodeValidator extends Plugin {
58
58
 
59
59
  async execute(context: PluginContext): Promise<PluginResult> {
60
60
  const { graph } = context;
61
+ const logger = this.log(context);
61
62
 
62
- console.log('[TypeScriptDeadCodeValidator] Checking for dead TypeScript code...');
63
+ logger.info('Starting TypeScript dead code analysis');
63
64
  const startTime = Date.now();
64
65
 
65
66
  const issues: DeadCodeIssue[] = [];
66
67
 
67
68
  // Collect all interfaces
68
- console.log('[TypeScriptDeadCodeValidator] Collecting interfaces...');
69
+ logger.debug('Collecting interfaces');
69
70
  const interfaces: Map<string, { id: string; name: string; file?: string; line?: number; properties?: unknown[] }> = new Map();
70
71
 
71
72
  for await (const node of graph.queryNodes({ nodeType: 'INTERFACE' })) {
@@ -80,10 +81,10 @@ export class TypeScriptDeadCodeValidator extends Plugin {
80
81
  properties: (node as { properties?: unknown[] }).properties
81
82
  });
82
83
  }
83
- console.log(`[TypeScriptDeadCodeValidator] Found ${interfaces.size} interfaces`);
84
+ logger.debug('Interfaces collected', { count: interfaces.size });
84
85
 
85
86
  // Find interfaces with IMPLEMENTS or EXTENDS edges
86
- console.log('[TypeScriptDeadCodeValidator] Checking implementations...');
87
+ logger.debug('Checking implementations');
87
88
  const implementedInterfaces: Map<string, number> = new Map();
88
89
 
89
90
  // Get all edges and filter by type (no queryEdges in GraphBackend yet)
@@ -168,31 +169,31 @@ export class TypeScriptDeadCodeValidator extends Plugin {
168
169
  timeSeconds: totalTime
169
170
  };
170
171
 
171
- console.log('[TypeScriptDeadCodeValidator] Summary:', summary);
172
+ logger.info('Analysis complete', { ...summary });
172
173
 
173
174
  // Report issues
174
175
  const warnings = issues.filter(i => i.severity === 'WARNING');
175
176
  const infos = issues.filter(i => i.severity === 'INFO');
176
177
 
177
178
  if (warnings.length > 0) {
178
- console.log(`[TypeScriptDeadCodeValidator] ⚠️ ${warnings.length} warning(s):`);
179
+ logger.warn('Warnings found', { count: warnings.length });
179
180
  for (const issue of warnings) {
180
- console.log(` ⚠️ ${issue.message}`);
181
+ logger.warn(issue.message);
181
182
  }
182
183
  }
183
184
 
184
185
  if (infos.length > 0) {
185
- console.log(`[TypeScriptDeadCodeValidator] ℹ️ ${infos.length} info(s):`);
186
+ logger.info('Info messages', { count: infos.length });
186
187
  for (const issue of infos.slice(0, 5)) { // Limit to first 5
187
- console.log(` ℹ️ ${issue.message}`);
188
+ logger.info(issue.message);
188
189
  }
189
190
  if (infos.length > 5) {
190
- console.log(` ... and ${infos.length - 5} more`);
191
+ logger.debug(`... and ${infos.length - 5} more`);
191
192
  }
192
193
  }
193
194
 
194
195
  if (issues.length === 0) {
195
- console.log('[TypeScriptDeadCodeValidator] ✅ No dead TypeScript code detected');
196
+ logger.info('No dead TypeScript code detected');
196
197
  }
197
198
 
198
199
  return createSuccessResult(
@@ -7,6 +7,7 @@
7
7
 
8
8
  import { VCSPlugin, FileStatus } from './VCSPlugin.js';
9
9
  import type { VCSConfig, VCSPluginMetadata, ChangedFile, FileDiff, DiffHunk } from './VCSPlugin.js';
10
+ import { FileAccessError } from '../../errors/GrafemaError.js';
10
11
  import { exec } from 'child_process';
11
12
  import { promisify } from 'util';
12
13
  import { join } from 'path';
@@ -113,8 +114,12 @@ export class GitPlugin extends VCSPlugin {
113
114
 
114
115
  return files;
115
116
  } catch (error) {
116
- console.error('[GitPlugin] Failed to get changed files:', (error as Error).message);
117
- return [];
117
+ throw new FileAccessError(
118
+ `Failed to get changed files: ${(error as Error).message}`,
119
+ 'ERR_GIT_ACCESS_DENIED',
120
+ { plugin: 'GitPlugin' },
121
+ 'Check that git is installed and this is a valid git repository'
122
+ );
118
123
  }
119
124
  }
120
125
 
@@ -152,8 +157,12 @@ export class GitPlugin extends VCSPlugin {
152
157
  // Парсим unified diff
153
158
  return this._parseUnifiedDiff(filePath, stdout);
154
159
  } catch (error) {
155
- console.error(`[GitPlugin] Failed to get diff for ${filePath}:`, (error as Error).message);
156
- return { path: filePath, hunks: [] };
160
+ throw new FileAccessError(
161
+ `Failed to get diff for ${filePath}: ${(error as Error).message}`,
162
+ 'ERR_GIT_ACCESS_DENIED',
163
+ { plugin: 'GitPlugin', filePath },
164
+ 'Ensure the file is tracked by git and the working directory is accessible'
165
+ );
157
166
  }
158
167
  }
159
168
 
@@ -164,8 +173,13 @@ export class GitPlugin extends VCSPlugin {
164
173
  try {
165
174
  const { stdout } = await this._exec('git rev-parse --abbrev-ref HEAD');
166
175
  return stdout.trim();
167
- } catch {
168
- return 'unknown';
176
+ } catch (error) {
177
+ throw new FileAccessError(
178
+ `Failed to get current branch: ${(error as Error).message}`,
179
+ 'ERR_GIT_ACCESS_DENIED',
180
+ { plugin: 'GitPlugin' },
181
+ 'Ensure this is a valid git repository with at least one commit'
182
+ );
169
183
  }
170
184
  }
171
185
 
@@ -176,8 +190,13 @@ export class GitPlugin extends VCSPlugin {
176
190
  try {
177
191
  const { stdout } = await this._exec('git rev-parse HEAD');
178
192
  return stdout.trim();
179
- } catch {
180
- return null;
193
+ } catch (error) {
194
+ throw new FileAccessError(
195
+ `Failed to get last commit hash: ${(error as Error).message}`,
196
+ 'ERR_GIT_NOT_FOUND',
197
+ { plugin: 'GitPlugin' },
198
+ 'Ensure this is a valid git repository with at least one commit'
199
+ );
181
200
  }
182
201
  }
183
202
 
@@ -309,8 +328,12 @@ export class GitPlugin extends VCSPlugin {
309
328
  const { stdout } = await this._exec('git ls-files');
310
329
  return stdout.trim().split('\n').filter(line => line.length > 0);
311
330
  } catch (error) {
312
- console.error('[GitPlugin] Failed to get tracked files:', (error as Error).message);
313
- return [];
331
+ throw new FileAccessError(
332
+ `Failed to get tracked files: ${(error as Error).message}`,
333
+ 'ERR_GIT_ACCESS_DENIED',
334
+ { plugin: 'GitPlugin' },
335
+ 'Check that git is installed and this is a valid git repository'
336
+ );
314
337
  }
315
338
  }
316
339
 
@@ -329,8 +352,13 @@ export class GitPlugin extends VCSPlugin {
329
352
  timestamp: parseInt(lines[3]) * 1000,
330
353
  message: lines[4]
331
354
  };
332
- } catch {
333
- return null;
355
+ } catch (error) {
356
+ throw new FileAccessError(
357
+ `Failed to get last commit info: ${(error as Error).message}`,
358
+ 'ERR_GIT_NOT_FOUND',
359
+ { plugin: 'GitPlugin' },
360
+ 'Ensure this is a valid git repository with at least one commit'
361
+ );
334
362
  }
335
363
  }
336
364
 
@@ -12,6 +12,8 @@
12
12
  * - Perforce
13
13
  */
14
14
 
15
+ import type { Logger } from '../../logging/Logger.js';
16
+
15
17
  /**
16
18
  * VCS Plugin configuration
17
19
  */
@@ -154,13 +156,13 @@ export class VCSPluginFactory {
154
156
  /**
155
157
  * Автоматически определить и создать подходящий VCS плагин
156
158
  */
157
- static async detect(config: VCSConfig = {}): Promise<VCSPlugin | null> {
159
+ static async detect(config: VCSConfig = {}, logger?: Logger): Promise<VCSPlugin | null> {
158
160
  for (const PluginClass of this.availablePlugins) {
159
161
  const plugin = new PluginClass(config);
160
162
 
161
163
  try {
162
164
  if (await plugin.isAvailable()) {
163
- console.log(`[VCS] Detected ${plugin.metadata.name}`);
165
+ logger?.info('VCS detected', { name: plugin.metadata.name });
164
166
  return plugin;
165
167
  }
166
168
  } catch {
@@ -168,20 +170,20 @@ export class VCSPluginFactory {
168
170
  }
169
171
  }
170
172
 
171
- console.warn('[VCS] No VCS system detected');
173
+ logger?.warn('No VCS system detected');
172
174
  return null;
173
175
  }
174
176
 
175
177
  /**
176
178
  * Создать плагин по имени
177
179
  */
178
- static create(name: string, config: VCSConfig = {}): VCSPlugin | null {
180
+ static create(name: string, config: VCSConfig = {}, logger?: Logger): VCSPlugin | null {
179
181
  const PluginClass = this.availablePlugins.find(
180
182
  Plugin => new Plugin(config).metadata.name === name
181
183
  );
182
184
 
183
185
  if (!PluginClass) {
184
- console.error(`[VCS] Plugin "${name}" not found`);
186
+ logger?.error('VCS plugin not found', { name });
185
187
  return null;
186
188
  }
187
189
 
@@ -0,0 +1,46 @@
1
+ # Graph Query Utilities
2
+
3
+ ## Graph Structure
4
+
5
+ ### Function Containment
6
+
7
+ ```
8
+ FUNCTION -[HAS_SCOPE]-> SCOPE (function_body)
9
+ SCOPE -[CONTAINS]-> SCOPE (nested blocks: if, for, etc.)
10
+ SCOPE -[CONTAINS]-> CALL (function call)
11
+ SCOPE -[CONTAINS]-> METHOD_CALL (method call)
12
+ SCOPE -[DECLARES]-> VARIABLE
13
+ ```
14
+
15
+ **Key Points:**
16
+ - FUNCTION nodes do NOT have CONTAINS edges directly
17
+ - FUNCTION has exactly one HAS_SCOPE edge to its body SCOPE
18
+ - All content (calls, variables, nested scopes) is inside SCOPEs
19
+ - Nested functions have their own HAS_SCOPE -> SCOPE hierarchy
20
+ - Variables are connected via DECLARES (not CONTAINS)
21
+
22
+ ### Call Resolution
23
+
24
+ ```
25
+ CALL/METHOD_CALL -[CALLS]-> FUNCTION (target)
26
+ ```
27
+
28
+ - CALLS edge exists only if target function was resolved
29
+ - Resolved = we found the function definition in the graph
30
+ - Unresolved = external function, dynamic call, or import issue
31
+
32
+ ### Backward Traversal (finding container)
33
+
34
+ To find the function containing a CALL:
35
+
36
+ ```
37
+ CALL <- CONTAINS <- SCOPE <- CONTAINS <- SCOPE <- HAS_SCOPE <- FUNCTION
38
+ ```
39
+
40
+ To find the function containing a VARIABLE:
41
+
42
+ ```
43
+ VARIABLE <- DECLARES <- SCOPE <- CONTAINS <- SCOPE <- HAS_SCOPE <- FUNCTION
44
+ ```
45
+
46
+ Walk up via CONTAINS, DECLARES, and HAS_SCOPE edges.
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Find all CALL and METHOD_CALL nodes inside a function.
3
+ *
4
+ * Graph structure:
5
+ * ```
6
+ * FUNCTION -[HAS_SCOPE]-> SCOPE -[CONTAINS]-> CALL
7
+ * SCOPE -[CONTAINS]-> METHOD_CALL
8
+ * SCOPE -[CONTAINS]-> SCOPE (nested blocks)
9
+ * ```
10
+ *
11
+ * Algorithm:
12
+ * 1. Get function's scope via HAS_SCOPE edge
13
+ * 2. BFS through CONTAINS edges, collecting CALL and METHOD_CALL nodes
14
+ * 3. Stop at nested FUNCTION/CLASS boundaries (don't enter inner functions)
15
+ * 4. For each call, check CALLS edge to determine if resolved
16
+ * 5. If transitive=true, recursively follow resolved CALLS edges
17
+ *
18
+ * Performance: O(S + C) where S = scopes, C = calls
19
+ * For functions with 100 calls, expect ~200 DB operations.
20
+ *
21
+ * @module queries/findCallsInFunction
22
+ */
23
+
24
+ import type { CallInfo, FindCallsOptions } from './types.js';
25
+
26
+ /**
27
+ * Graph backend interface (minimal surface)
28
+ */
29
+ interface GraphBackend {
30
+ getNode(id: string): Promise<{
31
+ id: string;
32
+ type: string;
33
+ name: string;
34
+ file?: string;
35
+ line?: number;
36
+ object?: string;
37
+ } | null>;
38
+ getOutgoingEdges(
39
+ nodeId: string,
40
+ edgeTypes: string[] | null
41
+ ): Promise<Array<{ src: string; dst: string; type: string }>>;
42
+ }
43
+
44
+ /**
45
+ * Find all CALL and METHOD_CALL nodes inside a function.
46
+ *
47
+ * @param backend - Graph backend for queries
48
+ * @param functionId - ID of the FUNCTION node
49
+ * @param options - Options for traversal
50
+ * @returns Array of CallInfo objects
51
+ */
52
+ export async function findCallsInFunction(
53
+ backend: GraphBackend,
54
+ functionId: string,
55
+ options: FindCallsOptions = {}
56
+ ): Promise<CallInfo[]> {
57
+ const {
58
+ maxDepth = 10,
59
+ transitive = false,
60
+ transitiveDepth = 5,
61
+ } = options;
62
+
63
+ const calls: CallInfo[] = [];
64
+ const visited = new Set<string>();
65
+ const seenTargets = new Set<string>(); // For deduplication in transitive mode
66
+
67
+ // Add the starting function to seenTargets to prevent cycles back to it
68
+ if (transitive) {
69
+ seenTargets.add(functionId);
70
+ }
71
+
72
+ // Step 1: Get function's scope via HAS_SCOPE
73
+ const hasScopeEdges = await backend.getOutgoingEdges(functionId, ['HAS_SCOPE']);
74
+
75
+ // BFS queue: { nodeId, currentDepth }
76
+ const queue: Array<{ id: string; depth: number }> = [];
77
+
78
+ for (const edge of hasScopeEdges) {
79
+ queue.push({ id: edge.dst, depth: 0 });
80
+ }
81
+
82
+ // Step 2: BFS through scopes
83
+ while (queue.length > 0) {
84
+ const { id, depth } = queue.shift()!;
85
+
86
+ if (visited.has(id) || depth > maxDepth) continue;
87
+ visited.add(id);
88
+
89
+ const containsEdges = await backend.getOutgoingEdges(id, ['CONTAINS']);
90
+
91
+ for (const edge of containsEdges) {
92
+ const child = await backend.getNode(edge.dst);
93
+ if (!child) continue;
94
+
95
+ // Collect CALL and METHOD_CALL nodes
96
+ if (child.type === 'CALL' || child.type === 'METHOD_CALL') {
97
+ const callInfo = await buildCallInfo(backend, child, 0);
98
+ calls.push(callInfo);
99
+
100
+ // Transitive: follow resolved calls
101
+ if (transitive && callInfo.resolved && callInfo.target) {
102
+ await collectTransitiveCalls(
103
+ backend,
104
+ callInfo.target.id,
105
+ 1, // Starting at depth 1
106
+ transitiveDepth,
107
+ calls,
108
+ seenTargets
109
+ );
110
+ }
111
+ }
112
+
113
+ // Continue into nested scopes, but NOT into nested functions/classes
114
+ if (child.type === 'SCOPE') {
115
+ queue.push({ id: child.id, depth: depth + 1 });
116
+ }
117
+ // Skip FUNCTION, CLASS - they have their own scope hierarchy
118
+ }
119
+ }
120
+
121
+ return calls;
122
+ }
123
+
124
+ /**
125
+ * Build CallInfo from a call node
126
+ */
127
+ async function buildCallInfo(
128
+ backend: GraphBackend,
129
+ callNode: { id: string; type: string; name: string; file?: string; line?: number; object?: string },
130
+ depth: number
131
+ ): Promise<CallInfo> {
132
+ // Check for CALLS edge (resolved target)
133
+ const callsEdges = await backend.getOutgoingEdges(callNode.id, ['CALLS']);
134
+ const isResolved = callsEdges.length > 0;
135
+
136
+ let target = undefined;
137
+ if (isResolved) {
138
+ const targetNode = await backend.getNode(callsEdges[0].dst);
139
+ if (targetNode) {
140
+ target = {
141
+ id: targetNode.id,
142
+ name: targetNode.name,
143
+ file: targetNode.file,
144
+ line: targetNode.line,
145
+ };
146
+ }
147
+ }
148
+
149
+ return {
150
+ id: callNode.id,
151
+ name: callNode.name,
152
+ type: callNode.type as 'CALL' | 'METHOD_CALL',
153
+ object: callNode.object,
154
+ resolved: isResolved,
155
+ target,
156
+ file: callNode.file,
157
+ line: callNode.line,
158
+ depth,
159
+ };
160
+ }
161
+
162
+ /**
163
+ * Recursively collect transitive calls
164
+ *
165
+ * Infinite loop prevention:
166
+ * - Track seen function IDs in seenTargets
167
+ * - Stop when we've seen a function before (handles recursion)
168
+ * - Stop at transitiveDepth limit
169
+ */
170
+ async function collectTransitiveCalls(
171
+ backend: GraphBackend,
172
+ functionId: string,
173
+ currentDepth: number,
174
+ maxTransitiveDepth: number,
175
+ calls: CallInfo[],
176
+ seenTargets: Set<string>
177
+ ): Promise<void> {
178
+ // Prevent infinite loops and limit depth
179
+ if (seenTargets.has(functionId) || currentDepth > maxTransitiveDepth) {
180
+ return;
181
+ }
182
+ seenTargets.add(functionId);
183
+
184
+ // Find calls in this function (non-transitive to avoid recursion)
185
+ const innerCalls = await findCallsInFunction(backend, functionId, {
186
+ maxDepth: 10,
187
+ transitive: false,
188
+ });
189
+
190
+ for (const call of innerCalls) {
191
+ // Add with updated depth
192
+ calls.push({ ...call, depth: currentDepth });
193
+
194
+ // Continue transitively if resolved
195
+ if (call.resolved && call.target) {
196
+ await collectTransitiveCalls(
197
+ backend,
198
+ call.target.id,
199
+ currentDepth + 1,
200
+ maxTransitiveDepth,
201
+ calls,
202
+ seenTargets
203
+ );
204
+ }
205
+ }
206
+ }