@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
@@ -0,0 +1,456 @@
1
+ /**
2
+ * FunctionCallResolver - creates CALLS edges for imported function calls
3
+ *
4
+ * This enrichment plugin runs AFTER ImportExportLinker (priority 80 vs 90) and:
5
+ * 1. Finds CALL_SITE nodes without CALLS edges (excluding method calls)
6
+ * 2. For each, looks for IMPORT with matching local name in same file
7
+ * 3. Follows IMPORTS_FROM -> EXPORT -> FUNCTION chain
8
+ * 4. Creates CALLS edge to target FUNCTION
9
+ *
10
+ * CREATES EDGES:
11
+ * - CALL_SITE -> CALLS -> FUNCTION (for imported functions)
12
+ */
13
+
14
+ import { Plugin, createSuccessResult } from '../Plugin.js';
15
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
16
+ import type { BaseNodeRecord } from '@grafema/types';
17
+ import { dirname, resolve } from 'path';
18
+ import { StrictModeError } from '../../errors/GrafemaError.js';
19
+
20
+ // === INTERFACES ===
21
+
22
+ interface CallNode extends BaseNodeRecord {
23
+ object?: string; // If present, this is a method call - skip
24
+ }
25
+
26
+ interface ImportNode extends BaseNodeRecord {
27
+ source?: string;
28
+ importType?: string; // 'default' | 'named' | 'namespace'
29
+ imported?: string; // Original name in source file
30
+ local?: string; // Local binding name
31
+ }
32
+
33
+ interface ExportNode extends BaseNodeRecord {
34
+ exportType?: string; // 'default' | 'named' | 'all'
35
+ local?: string; // Local name in exporting file
36
+ source?: string; // Re-export source (if re-exporting)
37
+ }
38
+
39
+ interface ExportIndexEntry {
40
+ node: ExportNode;
41
+ exportKey: string; // "default" | "named:functionName"
42
+ }
43
+
44
+ interface ExternalModuleResult {
45
+ type: 'external';
46
+ packageName: string;
47
+ exportedName: string;
48
+ }
49
+
50
+ type ResolveChainResult = ExportNode | ExternalModuleResult | null;
51
+
52
+ type FunctionNode = BaseNodeRecord;
53
+
54
+ // === PLUGIN CLASS ===
55
+
56
+ export class FunctionCallResolver extends Plugin {
57
+ get metadata(): PluginMetadata {
58
+ return {
59
+ name: 'FunctionCallResolver',
60
+ phase: 'ENRICHMENT',
61
+ priority: 80, // After ImportExportLinker (90)
62
+ creates: {
63
+ nodes: ['EXTERNAL_MODULE'],
64
+ edges: ['CALLS']
65
+ },
66
+ dependencies: ['ImportExportLinker'] // Requires IMPORTS_FROM edges
67
+ };
68
+ }
69
+
70
+ async execute(context: PluginContext): Promise<PluginResult> {
71
+ const { graph } = context;
72
+ const logger = this.log(context);
73
+
74
+ logger.info('Starting function call resolution');
75
+
76
+ const startTime = Date.now();
77
+
78
+ // Step 1: Build Import Index - Map<file:local, ImportNode>
79
+ const importIndex = new Map<string, ImportNode>();
80
+ for await (const node of graph.queryNodes({ nodeType: 'IMPORT' })) {
81
+ const imp = node as ImportNode;
82
+ if (!imp.file || !imp.local) continue;
83
+
84
+ // Skip external imports (non-relative)
85
+ const isRelative = imp.source && (imp.source.startsWith('./') || imp.source.startsWith('../'));
86
+ if (!isRelative) continue;
87
+
88
+ const key = `${imp.file}:${imp.local}`;
89
+ importIndex.set(key, imp);
90
+ }
91
+ logger.debug('Indexed imports', { count: importIndex.size });
92
+
93
+ // Step 2: Build Function Index - Map<file, Map<name, FunctionNode>>
94
+ const functionIndex = new Map<string, Map<string, FunctionNode>>();
95
+ for await (const node of graph.queryNodes({ nodeType: 'FUNCTION' })) {
96
+ const func = node as FunctionNode;
97
+ if (!func.file || !func.name) continue;
98
+
99
+ if (!functionIndex.has(func.file)) {
100
+ functionIndex.set(func.file, new Map());
101
+ }
102
+ functionIndex.get(func.file)!.set(func.name, func);
103
+ }
104
+ logger.debug('Indexed functions', { files: functionIndex.size });
105
+
106
+ // Step 2.5: Build Export Index - Map<file, Map<exportKey, ExportNode>>
107
+ // This enables O(1) lookup when following re-export chains
108
+ const exportIndex = new Map<string, Map<string, ExportNode>>();
109
+ for await (const node of graph.queryNodes({ nodeType: 'EXPORT' })) {
110
+ const exp = node as ExportNode;
111
+ if (!exp.file) continue;
112
+
113
+ if (!exportIndex.has(exp.file)) {
114
+ exportIndex.set(exp.file, new Map());
115
+ }
116
+
117
+ const fileExports = exportIndex.get(exp.file)!;
118
+ fileExports.set(this.buildExportKey(exp), exp);
119
+ }
120
+ logger.debug('Indexed exports', { files: exportIndex.size });
121
+
122
+ // Step 2.6: Build set of known files for path resolution
123
+ const knownFiles = new Set<string>();
124
+ for (const file of exportIndex.keys()) {
125
+ knownFiles.add(file);
126
+ }
127
+ for (const file of functionIndex.keys()) {
128
+ knownFiles.add(file);
129
+ }
130
+ logger.debug('Indexed known files', { count: knownFiles.size });
131
+
132
+ // Step 3: Collect unresolved CALL_SITE nodes
133
+ const callSitesToResolve: CallNode[] = [];
134
+ for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
135
+ const call = node as CallNode;
136
+
137
+ // Skip method calls (have object attribute)
138
+ if (call.object) continue;
139
+
140
+ // Skip if already has CALLS edge
141
+ const existingEdges = await graph.getOutgoingEdges(call.id, ['CALLS']);
142
+ if (existingEdges.length > 0) continue;
143
+
144
+ callSitesToResolve.push(call);
145
+ }
146
+ logger.info('Found call sites to resolve', { count: callSitesToResolve.length });
147
+
148
+ // Step 4: Resolution
149
+ let edgesCreated = 0;
150
+ const skipped = {
151
+ alreadyResolved: 0,
152
+ methodCalls: 0,
153
+ external: 0,
154
+ missingImport: 0,
155
+ missingImportsFrom: 0,
156
+ reExportsBroken: 0 // Re-export chain broken (missing export, file not found, or circular)
157
+ };
158
+
159
+ let reExportsResolved = 0; // Counter for successfully resolved re-export chains
160
+ const errors: Error[] = [];
161
+
162
+ for (const callSite of callSitesToResolve) {
163
+ const calledName = callSite.name;
164
+ const file = callSite.file;
165
+
166
+ if (!calledName || !file) continue;
167
+
168
+ // Step 4.1: Find matching import in same file
169
+ const importKey = `${file}:${calledName}`;
170
+ const imp = importIndex.get(importKey);
171
+
172
+ if (!imp) {
173
+ skipped.missingImport++;
174
+ continue;
175
+ }
176
+
177
+ // Step 4.2: Follow IMPORTS_FROM edge to find EXPORT
178
+ const importsFromEdges = await graph.getOutgoingEdges(imp.id, ['IMPORTS_FROM']);
179
+ if (importsFromEdges.length === 0) {
180
+ skipped.missingImportsFrom++;
181
+ continue;
182
+ }
183
+
184
+ const exportNodeId = importsFromEdges[0].dst;
185
+ const exportNode = await graph.getNode(exportNodeId) as ExportNode | null;
186
+
187
+ if (!exportNode) {
188
+ skipped.missingImportsFrom++;
189
+ continue;
190
+ }
191
+
192
+ // Step 4.3: Resolve re-export chain (if applicable)
193
+ let finalExport = exportNode;
194
+
195
+ if (exportNode.source) {
196
+ // This is a re-export - follow the chain
197
+ const resolved = this.resolveExportChain(
198
+ exportNode,
199
+ exportIndex,
200
+ knownFiles
201
+ );
202
+
203
+ if (!resolved) {
204
+ // Chain broken or circular
205
+ // Distinguish: if visited set would show cycle, it's circular
206
+ // For simplicity, count as broken (can add nuance later)
207
+ skipped.reExportsBroken++;
208
+
209
+ // In strict mode, collect error
210
+ if (context.strictMode) {
211
+ const error = new StrictModeError(
212
+ `Cannot resolve re-export chain for: ${calledName}`,
213
+ 'STRICT_BROKEN_IMPORT',
214
+ {
215
+ filePath: file,
216
+ lineNumber: callSite.line as number | undefined,
217
+ phase: 'ENRICHMENT',
218
+ plugin: 'FunctionCallResolver',
219
+ calledFunction: calledName,
220
+ importSource: imp.source,
221
+ },
222
+ `Check if the module "${imp.source}" exists and exports "${calledName}"`
223
+ );
224
+ errors.push(error);
225
+ }
226
+ continue;
227
+ }
228
+
229
+ // Check if resolved to external module
230
+ if ('type' in resolved && resolved.type === 'external') {
231
+ // Type narrowing: resolved is ExternalModuleResult
232
+ const externalResult = resolved as ExternalModuleResult;
233
+
234
+ // Find or create EXTERNAL_MODULE node and create CALLS edge
235
+ const externalModuleId = `EXTERNAL_MODULE:${externalResult.packageName}`;
236
+
237
+ // Check if node exists
238
+ let externalNode = await graph.getNode(externalModuleId);
239
+ if (!externalNode) {
240
+ // Create EXTERNAL_MODULE node
241
+ await graph.addNode({
242
+ id: externalModuleId,
243
+ type: 'EXTERNAL_MODULE',
244
+ name: externalResult.packageName,
245
+ file: '',
246
+ line: 0
247
+ });
248
+ }
249
+
250
+ // Create CALLS edge with metadata
251
+ await graph.addEdge({
252
+ type: 'CALLS',
253
+ src: callSite.id,
254
+ dst: externalModuleId,
255
+ metadata: { exportedName: externalResult.exportedName }
256
+ });
257
+
258
+ edgesCreated++;
259
+ reExportsResolved++;
260
+ continue;
261
+ }
262
+
263
+ // At this point, resolved must be ExportNode (not external)
264
+ finalExport = resolved as ExportNode;
265
+ reExportsResolved++;
266
+ }
267
+
268
+ // Step 4.4: Find target FUNCTION via final export's local name
269
+ const targetFile = finalExport.file;
270
+ const targetFunctionName = finalExport.local || finalExport.name;
271
+
272
+ if (!targetFile || !targetFunctionName) continue;
273
+
274
+ const fileFunctions = functionIndex.get(targetFile);
275
+ if (!fileFunctions) continue;
276
+
277
+ const targetFunction = fileFunctions.get(targetFunctionName);
278
+ if (!targetFunction) continue;
279
+
280
+ // Step 4.5: Create CALLS edge
281
+ await graph.addEdge({
282
+ type: 'CALLS',
283
+ src: callSite.id,
284
+ dst: targetFunction.id
285
+ });
286
+
287
+ edgesCreated++;
288
+ }
289
+
290
+ const totalTime = ((Date.now() - startTime) / 1000).toFixed(2);
291
+ logger.info('Complete', {
292
+ edgesCreated,
293
+ skipped,
294
+ time: `${totalTime}s`
295
+ });
296
+
297
+ return createSuccessResult(
298
+ { nodes: 0, edges: edgesCreated },
299
+ {
300
+ callSitesProcessed: callSitesToResolve.length,
301
+ edgesCreated,
302
+ reExportsResolved,
303
+ skipped,
304
+ timeMs: Date.now() - startTime
305
+ },
306
+ errors
307
+ );
308
+ }
309
+
310
+ /**
311
+ * Build a key string for export index lookup.
312
+ *
313
+ * @param exp - Export node to build key for
314
+ * @returns Key in format "default" or "named:name"
315
+ */
316
+ private buildExportKey(exp: ExportNode): string {
317
+ if (exp.exportType === 'default') {
318
+ return 'default';
319
+ }
320
+ return `named:${exp.name || exp.local || 'anonymous'}`;
321
+ }
322
+
323
+ /**
324
+ * Extract package name from import source.
325
+ * Handles: 'lodash', '@tanstack/react-query', 'lodash/map', '@scope/pkg/sub'
326
+ */
327
+ private extractPackageName(source: string): string | null {
328
+ if (!source) return null;
329
+
330
+ // Handle scoped packages (@scope/package)
331
+ if (source.startsWith('@')) {
332
+ const parts = source.split('/');
333
+ if (parts.length >= 2) {
334
+ return `${parts[0]}/${parts[1]}`;
335
+ }
336
+ return null;
337
+ }
338
+
339
+ // Non-scoped package: lodash or lodash/map
340
+ const slashIndex = source.indexOf('/');
341
+ if (slashIndex === -1) {
342
+ return source;
343
+ }
344
+ return source.substring(0, slashIndex);
345
+ }
346
+
347
+ /**
348
+ * Resolve module specifier to actual file path using extension fallbacks.
349
+ * Pattern reused from ImportExportLinker (lines 101-122).
350
+ *
351
+ * @param currentDir - Directory of the file containing the import/re-export
352
+ * @param specifier - The module specifier (e.g., "./utils", "../lib/helpers")
353
+ * @param fileIndex - Set or Map of known file paths for existence checking
354
+ * @returns Resolved file path or null if not found
355
+ */
356
+ private resolveModulePath(
357
+ currentDir: string,
358
+ specifier: string,
359
+ fileIndex: Set<string>
360
+ ): string | null {
361
+ const basePath = resolve(currentDir, specifier);
362
+ const extensions = ['', '.js', '.ts', '.jsx', '.tsx', '/index.js', '/index.ts'];
363
+
364
+ for (const ext of extensions) {
365
+ const testPath = basePath + ext;
366
+ if (fileIndex.has(testPath)) {
367
+ return testPath;
368
+ }
369
+ }
370
+
371
+ return null;
372
+ }
373
+
374
+ /**
375
+ * Follow re-export chain to find the final EXPORT node (without source field).
376
+ *
377
+ * Algorithm:
378
+ * 1. If current export has no source -> return it (base case)
379
+ * 2. Resolve source path to file
380
+ * 3. Find matching export in that file
381
+ * 4. Recurse (with cycle detection)
382
+ *
383
+ * @param exportNode - Starting export node (may be re-export)
384
+ * @param exportIndex - Pre-built export index for O(1) lookups
385
+ * @param knownFiles - Set of known file paths
386
+ * @param visited - Set of visited export IDs for cycle detection
387
+ * @param maxDepth - Maximum chain depth (safety limit)
388
+ * @returns Final export node (without source), external module result, or null if chain broken/circular
389
+ */
390
+ private resolveExportChain(
391
+ exportNode: ExportNode,
392
+ exportIndex: Map<string, Map<string, ExportNode>>,
393
+ knownFiles: Set<string>,
394
+ visited: Set<string> = new Set(),
395
+ maxDepth: number = 10
396
+ ): ResolveChainResult {
397
+ // Safety: max depth exceeded
398
+ if (maxDepth <= 0) {
399
+ return null;
400
+ }
401
+
402
+ // Cycle detection
403
+ if (visited.has(exportNode.id)) {
404
+ return null;
405
+ }
406
+ visited.add(exportNode.id);
407
+
408
+ // Base case: not a re-export
409
+ if (!exportNode.source) {
410
+ return exportNode;
411
+ }
412
+
413
+ // Recursive case: follow re-export
414
+ const currentDir = dirname(exportNode.file!);
415
+ const targetFile = this.resolveModulePath(currentDir, exportNode.source, knownFiles);
416
+
417
+ if (!targetFile) {
418
+ // Check if this is an external module (non-relative source)
419
+ const source = exportNode.source!;
420
+ const isExternal = !source.startsWith('./') && !source.startsWith('../');
421
+
422
+ if (isExternal) {
423
+ const packageName = this.extractPackageName(source);
424
+ if (packageName) {
425
+ return {
426
+ type: 'external',
427
+ packageName,
428
+ exportedName: exportNode.local || exportNode.name || ''
429
+ };
430
+ }
431
+ }
432
+ return null; // Source file not found and not external
433
+ }
434
+
435
+ const targetExports = exportIndex.get(targetFile);
436
+ if (!targetExports) {
437
+ return null; // No exports in target file
438
+ }
439
+
440
+ // Find matching export by name
441
+ // Re-export: export { foo } from './other' - look for named:foo
442
+ // Re-export default: export { default } from './other' - look for default
443
+ const nextExport = targetExports.get(this.buildExportKey(exportNode));
444
+ if (!nextExport) {
445
+ return null; // Export not found in target
446
+ }
447
+
448
+ return this.resolveExportChain(
449
+ nextExport,
450
+ exportIndex,
451
+ knownFiles,
452
+ visited,
453
+ maxDepth - 1
454
+ );
455
+ }
456
+ }
@@ -19,6 +19,7 @@ import type { BaseNodeRecord } from '@grafema/types';
19
19
  interface HTTPRouteNode extends BaseNodeRecord {
20
20
  method?: string;
21
21
  path?: string;
22
+ fullPath?: string; // Set by MountPointResolver for mounted routes
22
23
  url?: string;
23
24
  }
24
25
 
@@ -28,6 +29,7 @@ interface HTTPRouteNode extends BaseNodeRecord {
28
29
  interface HTTPRequestNode extends BaseNodeRecord {
29
30
  method?: string;
30
31
  url?: string;
32
+ responseDataNode?: string; // ID of response.json() CALL node (set by FetchAnalyzer)
31
33
  }
32
34
 
33
35
  /**
@@ -48,14 +50,15 @@ export class HTTPConnectionEnricher extends Plugin {
48
50
  priority: 50, // После основных enrichers
49
51
  creates: {
50
52
  nodes: [],
51
- edges: ['INTERACTS_WITH']
53
+ edges: ['INTERACTS_WITH', 'HTTP_RECEIVES']
52
54
  },
53
- dependencies: ['ExpressRouteAnalyzer', 'FetchAnalyzer']
55
+ dependencies: ['ExpressRouteAnalyzer', 'FetchAnalyzer', 'ExpressResponseAnalyzer']
54
56
  };
55
57
  }
56
58
 
57
59
  async execute(context: PluginContext): Promise<PluginResult> {
58
60
  const { graph } = context;
61
+ const logger = this.log(context);
59
62
 
60
63
  try {
61
64
  // Собираем все http:route (backend endpoints)
@@ -70,13 +73,19 @@ export class HTTPConnectionEnricher extends Plugin {
70
73
  requests.push(node as HTTPRequestNode);
71
74
  }
72
75
 
73
- console.log(`[HTTPConnectionEnricher] Found ${routes.length} routes, ${requests.length} requests`);
76
+ logger.debug('Found routes and requests', {
77
+ routes: routes.length,
78
+ requests: requests.length
79
+ });
74
80
 
75
81
  // Дедуплицируем по ID (из-за multi-service анализа)
76
82
  const uniqueRoutes = this.deduplicateById(routes);
77
83
  const uniqueRequests = this.deduplicateById(requests);
78
84
 
79
- console.log(`[HTTPConnectionEnricher] Unique: ${uniqueRoutes.length} routes, ${uniqueRequests.length} requests`);
85
+ logger.info('Unique routes and requests', {
86
+ routes: uniqueRoutes.length,
87
+ requests: uniqueRequests.length
88
+ });
80
89
 
81
90
  let edgesCreated = 0;
82
91
  const connections: ConnectionInfo[] = [];
@@ -94,10 +103,11 @@ export class HTTPConnectionEnricher extends Plugin {
94
103
  // Ищем matching route
95
104
  for (const route of uniqueRoutes) {
96
105
  const routeMethod = (route.method || 'GET').toUpperCase();
97
- const routePath = route.path;
106
+ // Use fullPath (from MountPointResolver) if available, fallback to local path
107
+ const routePath = route.fullPath || route.path;
98
108
 
99
109
  if (routePath && method === routeMethod && this.pathsMatch(url, routePath)) {
100
- // Создаём edge
110
+ // 1. Create INTERACTS_WITH edge (existing)
101
111
  await graph.addEdge({
102
112
  type: 'INTERACTS_WITH',
103
113
  src: request.id,
@@ -105,6 +115,28 @@ export class HTTPConnectionEnricher extends Plugin {
105
115
  matchType: this.hasParams(routePath) ? 'parametric' : 'exact'
106
116
  });
107
117
 
118
+ edgesCreated++;
119
+
120
+ // 2. Create HTTP_RECEIVES edges if both sides have data nodes
121
+ const responseDataNode = request.responseDataNode;
122
+ if (responseDataNode) {
123
+ const respondsWithEdges = await graph.getOutgoingEdges(route.id, ['RESPONDS_WITH']);
124
+ for (const respEdge of respondsWithEdges) {
125
+ await graph.addEdge({
126
+ type: 'HTTP_RECEIVES',
127
+ src: responseDataNode,
128
+ dst: respEdge.dst,
129
+ metadata: {
130
+ method: request.method,
131
+ path: request.url,
132
+ viaRequest: request.id,
133
+ viaRoute: route.id
134
+ }
135
+ });
136
+ edgesCreated++;
137
+ }
138
+ }
139
+
108
140
  connections.push({
109
141
  request: `${method} ${url}`,
110
142
  route: `${routeMethod} ${routePath}`,
@@ -112,7 +144,6 @@ export class HTTPConnectionEnricher extends Plugin {
112
144
  routeFile: route.file
113
145
  });
114
146
 
115
- edgesCreated++;
116
147
  break; // Один request → один route
117
148
  }
118
149
  }
@@ -120,10 +151,10 @@ export class HTTPConnectionEnricher extends Plugin {
120
151
 
121
152
  // Логируем найденные связи
122
153
  if (connections.length > 0) {
123
- console.log(`[HTTPConnectionEnricher] Connections found:`);
124
- for (const conn of connections) {
125
- console.log(` ${conn.request} → ${conn.route}`);
126
- }
154
+ logger.info('Connections found', {
155
+ count: connections.length,
156
+ examples: connections.slice(0, 5).map(c => `${c.request} → ${c.route}`)
157
+ });
127
158
  }
128
159
 
129
160
  return createSuccessResult(
@@ -136,41 +167,67 @@ export class HTTPConnectionEnricher extends Plugin {
136
167
  );
137
168
 
138
169
  } catch (error) {
139
- console.error(`[HTTPConnectionEnricher] Error:`, error);
170
+ logger.error('Error in HTTPConnectionEnricher', { error });
140
171
  return createErrorResult(error instanceof Error ? error : new Error(String(error)));
141
172
  }
142
173
  }
143
174
 
144
175
  /**
145
- * Проверяет совпадают ли пути
146
- * Поддерживает параметризованные пути: /api/users/:id матчится с /api/users/123
176
+ * Normalize URL to canonical form for comparison.
177
+ * Converts both Express params (:id) and template literals (${...}) to {param}.
178
+ */
179
+ private normalizeUrl(url: string): string {
180
+ return url
181
+ .replace(/:[^/]+/g, '{param}') // :id -> {param}
182
+ .replace(/\$\{[^}]*\}/g, '{param}'); // ${...} -> {param}, ${userId} -> {param}
183
+ }
184
+
185
+ /**
186
+ * Check if URL has any parameter placeholders (after normalization)
187
+ */
188
+ private hasParamsNormalized(normalizedUrl: string): boolean {
189
+ return normalizedUrl.includes('{param}');
190
+ }
191
+
192
+ /**
193
+ * Check if request URL matches route path.
194
+ * Supports:
195
+ * - Exact match
196
+ * - Express params (:id)
197
+ * - Template literals (${...})
198
+ * - Concrete values matching params (/users/123 matches /users/:id)
147
199
  */
148
200
  private pathsMatch(requestUrl: string, routePath: string): boolean {
149
- // Точное совпадение
150
- if (requestUrl === routePath) {
201
+ // Normalize both to canonical form
202
+ const normRequest = this.normalizeUrl(requestUrl);
203
+ const normRoute = this.normalizeUrl(routePath);
204
+
205
+ // If both normalize to same string, they match
206
+ if (normRequest === normRoute) {
151
207
  return true;
152
208
  }
153
209
 
154
- // Если route не имеет параметров, требуем точное совпадение
155
- if (!this.hasParams(routePath)) {
210
+ // If route has no params after normalization, require exact match
211
+ if (!this.hasParamsNormalized(normRoute)) {
156
212
  return false;
157
213
  }
158
214
 
159
- // Преобразуем route path в regex
160
- // /api/users/:id /api/users/[^/]+
161
- const regexPattern = routePath
162
- .replace(/:[^/]+/g, '[^/]+') // :param [^/]+
163
- .replace(/\//g, '\\/'); // / \/
215
+ // Handle case where request has concrete value (e.g., '/users/123')
216
+ // and route has param (e.g., '/users/{param}')
217
+ const routeRegex = normRoute
218
+ .replace(/\{param\}/g, '[^/]+') // {param} -> [^/]+
219
+ .replace(/\//g, '\\/'); // / -> \/
164
220
 
165
- const regex = new RegExp(`^${regexPattern}$`);
166
- return regex.test(requestUrl);
221
+ return new RegExp(`^${routeRegex}$`).test(normRequest);
167
222
  }
168
223
 
169
224
  /**
170
- * Проверяет есть ли параметры в пути
225
+ * Check if path has parameters (for edge matchType metadata)
171
226
  */
172
227
  private hasParams(path: string): boolean {
173
- return Boolean(path && path.includes(':'));
228
+ if (!path) return false;
229
+ // Check for Express params or template literals
230
+ return path.includes(':') || path.includes('${');
174
231
  }
175
232
 
176
233
  /**