@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,636 @@
1
+ /**
2
+ * ExpressResponseAnalyzer - detects Express response patterns
3
+ *
4
+ * For each http:route node:
5
+ * 1. Follow HANDLED_BY edge to get handler function
6
+ * 2. Traverse handler AST for res.json(...), res.send(...) patterns
7
+ * 3. Create RESPONDS_WITH edge from http:route to response argument node
8
+ *
9
+ * Patterns:
10
+ * - res.json({ data })
11
+ * - res.send(variable)
12
+ * - res.status(200).json(data)
13
+ */
14
+
15
+ import { readFileSync } from 'fs';
16
+ import { parse, ParserPlugin } from '@babel/parser';
17
+ import traverseModule from '@babel/traverse';
18
+ import type { CallExpression, Identifier, MemberExpression, Node, ArrowFunctionExpression, FunctionExpression } from '@babel/types';
19
+ import type { NodePath } from '@babel/traverse';
20
+ import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
21
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
22
+ import type { NodeRecord } from '@grafema/types';
23
+ import { getLine } from './ast/utils/location.js';
24
+
25
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
+ const traverse = (traverseModule as any).default || traverseModule;
27
+
28
+ const RESPONSE_METHODS = ['json', 'send'];
29
+
30
+ /**
31
+ * Response call info
32
+ */
33
+ interface ResponseCallInfo {
34
+ method: string; // 'json' or 'send'
35
+ argLine: number; // Line of the argument
36
+ argColumn: number; // Column of the argument
37
+ argType: string; // Type of the argument ('ObjectExpression', 'Identifier', etc.)
38
+ line: number;
39
+ identifierName?: string; // Actual variable name for Identifier arguments
40
+ }
41
+
42
+ export class ExpressResponseAnalyzer extends Plugin {
43
+ private responseNodeCounter = 0;
44
+
45
+ get metadata(): PluginMetadata {
46
+ return {
47
+ name: 'ExpressResponseAnalyzer',
48
+ phase: 'ANALYSIS',
49
+ priority: 74, // After ExpressRouteAnalyzer (75)
50
+ creates: {
51
+ nodes: [],
52
+ edges: ['RESPONDS_WITH']
53
+ },
54
+ dependencies: ['ExpressRouteAnalyzer', 'JSASTAnalyzer']
55
+ };
56
+ }
57
+
58
+ async execute(context: PluginContext): Promise<PluginResult> {
59
+ const logger = this.log(context);
60
+
61
+ try {
62
+ const { graph } = context;
63
+
64
+ // Get all http:route nodes
65
+ const routes: NodeRecord[] = [];
66
+ for await (const node of graph.queryNodes({ type: 'http:route' })) {
67
+ routes.push(node);
68
+ }
69
+
70
+ logger.info('Processing routes', { count: routes.length });
71
+
72
+ let edgesCreated = 0;
73
+
74
+ for (const route of routes) {
75
+ const result = await this.analyzeRouteResponses(route, graph);
76
+ edgesCreated += result;
77
+ }
78
+
79
+ logger.info('Analysis complete', { edgesCreated });
80
+
81
+ return createSuccessResult(
82
+ { nodes: 0, edges: edgesCreated },
83
+ { routesAnalyzed: routes.length }
84
+ );
85
+ } catch (error) {
86
+ logger.error('Analysis failed', { error });
87
+ return createErrorResult(error as Error);
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Analyze a single http:route for response patterns
93
+ */
94
+ private async analyzeRouteResponses(
95
+ route: NodeRecord,
96
+ graph: PluginContext['graph']
97
+ ): Promise<number> {
98
+ let edgesCreated = 0;
99
+
100
+ try {
101
+ // Get HANDLED_BY edges to find handler function
102
+ const handledByEdges = await graph.getOutgoingEdges(route.id, ['HANDLED_BY']);
103
+
104
+ if (handledByEdges.length === 0) {
105
+ return 0;
106
+ }
107
+
108
+ // Get handler function node
109
+ const handlerEdge = handledByEdges[0];
110
+ const handlerNode = await graph.getNode(handlerEdge.dst);
111
+
112
+ if (!handlerNode || !handlerNode.file) {
113
+ return 0;
114
+ }
115
+
116
+ // Parse the file and find response calls in handler
117
+ const code = readFileSync(handlerNode.file, 'utf-8');
118
+ const ast = parse(code, {
119
+ sourceType: 'module',
120
+ plugins: ['jsx', 'typescript'] as ParserPlugin[]
121
+ });
122
+
123
+ // Find response calls within the handler's line range
124
+ const responseCalls = this.findResponseCalls(
125
+ ast,
126
+ handlerNode.file,
127
+ handlerNode.line as number
128
+ );
129
+
130
+ // Create RESPONDS_WITH edges
131
+ for (const call of responseCalls) {
132
+ // Try to resolve to existing variable, or create a unique response node
133
+ const dstNodeId = await this.resolveOrCreateResponseNode(
134
+ graph,
135
+ handlerNode.file,
136
+ call,
137
+ route.id,
138
+ handlerNode.id // Handler's semantic ID for scope resolution
139
+ );
140
+
141
+ await graph.addEdge({
142
+ type: 'RESPONDS_WITH',
143
+ src: route.id,
144
+ dst: dstNodeId,
145
+ metadata: {
146
+ responseMethod: call.method
147
+ }
148
+ });
149
+ edgesCreated++;
150
+ }
151
+ } catch {
152
+ // Silent - per-route errors shouldn't spam logs
153
+ }
154
+
155
+ return edgesCreated;
156
+ }
157
+
158
+ /**
159
+ * Find res.json/res.send calls within a function at given line
160
+ */
161
+ private findResponseCalls(
162
+ ast: ReturnType<typeof parse>,
163
+ file: string,
164
+ handlerLine: number
165
+ ): ResponseCallInfo[] {
166
+ const calls: ResponseCallInfo[] = [];
167
+ // Using object wrapper to satisfy TypeScript's control flow analysis
168
+ const found: { path: NodePath | null } = { path: null };
169
+
170
+ // First pass: find the handler function at the specified line
171
+ traverse(ast, {
172
+ 'ArrowFunctionExpression|FunctionExpression|FunctionDeclaration': (path: NodePath) => {
173
+ const node = path.node as Node;
174
+ const line = getLine(node);
175
+
176
+ if (line === handlerLine) {
177
+ found.path = path;
178
+ path.stop();
179
+ }
180
+ }
181
+ });
182
+
183
+ if (!found.path) {
184
+ return calls;
185
+ }
186
+
187
+ const handlerPath = found.path;
188
+
189
+ // Second pass: traverse only within the handler to find response calls
190
+ const handlerNode = handlerPath.node as ArrowFunctionExpression | FunctionExpression;
191
+
192
+ // Get parameter names to identify 'res'
193
+ const resParamName = this.getResponseParamName(handlerNode);
194
+ if (!resParamName) {
195
+ return calls;
196
+ }
197
+
198
+ // Traverse the handler body for res.json/res.send calls
199
+ handlerPath.traverse({
200
+ CallExpression: (callPath: NodePath<CallExpression>) => {
201
+ const callNode = callPath.node;
202
+ const callee = callNode.callee;
203
+
204
+ // Check for res.json() or res.send() or res.status().json() patterns
205
+ const responseInfo = this.extractResponseInfo(callee, resParamName);
206
+ if (!responseInfo) {
207
+ return;
208
+ }
209
+
210
+ // Get the argument being sent
211
+ if (callNode.arguments.length === 0) {
212
+ return;
213
+ }
214
+
215
+ const arg = callNode.arguments[0] as Node;
216
+ const argLine = getLine(arg);
217
+ const argColumn = arg.loc?.start.column ?? 0;
218
+
219
+ calls.push({
220
+ method: responseInfo.method,
221
+ argLine,
222
+ argColumn,
223
+ argType: arg.type,
224
+ line: getLine(callNode),
225
+ identifierName: arg.type === 'Identifier' ? (arg as Identifier).name : undefined
226
+ });
227
+ }
228
+ });
229
+
230
+ return calls;
231
+ }
232
+
233
+ /**
234
+ * Get response parameter name from function params (typically 'res')
235
+ */
236
+ private getResponseParamName(
237
+ func: ArrowFunctionExpression | FunctionExpression
238
+ ): string | null {
239
+ const params = func.params;
240
+ // Express handlers: (req, res) or (req, res, next)
241
+ if (params.length >= 2) {
242
+ const resParam = params[1];
243
+ if (resParam.type === 'Identifier') {
244
+ return (resParam as Identifier).name;
245
+ }
246
+ }
247
+ return null;
248
+ }
249
+
250
+ /**
251
+ * Extract response method info from callee
252
+ * Handles: res.json(), res.send(), res.status(200).json()
253
+ */
254
+ private extractResponseInfo(
255
+ callee: Node,
256
+ resParamName: string
257
+ ): { method: string } | null {
258
+ // Direct call: res.json() or res.send()
259
+ if (callee.type === 'MemberExpression') {
260
+ const memberExpr = callee as MemberExpression;
261
+ const property = memberExpr.property;
262
+
263
+ if (property.type !== 'Identifier') {
264
+ return null;
265
+ }
266
+
267
+ const methodName = (property as Identifier).name;
268
+
269
+ // Check for res.json() or res.send()
270
+ if (
271
+ memberExpr.object.type === 'Identifier' &&
272
+ (memberExpr.object as Identifier).name === resParamName &&
273
+ RESPONSE_METHODS.includes(methodName)
274
+ ) {
275
+ return { method: methodName };
276
+ }
277
+
278
+ // Check for res.status(200).json() chain
279
+ if (
280
+ memberExpr.object.type === 'CallExpression' &&
281
+ RESPONSE_METHODS.includes(methodName)
282
+ ) {
283
+ const chainedCall = memberExpr.object as CallExpression;
284
+ if (this.isResMethodCall(chainedCall.callee, resParamName, 'status')) {
285
+ return { method: methodName };
286
+ }
287
+ }
288
+ }
289
+
290
+ return null;
291
+ }
292
+
293
+ /**
294
+ * Check if callee is res.methodName()
295
+ */
296
+ private isResMethodCall(
297
+ callee: Node,
298
+ resParamName: string,
299
+ methodName: string
300
+ ): boolean {
301
+ if (callee.type !== 'MemberExpression') {
302
+ return false;
303
+ }
304
+
305
+ const memberExpr = callee as MemberExpression;
306
+ return (
307
+ memberExpr.object.type === 'Identifier' &&
308
+ (memberExpr.object as Identifier).name === resParamName &&
309
+ memberExpr.property.type === 'Identifier' &&
310
+ (memberExpr.property as Identifier).name === methodName
311
+ );
312
+ }
313
+
314
+ /**
315
+ * Resolve response node: find existing variable or create stub.
316
+ *
317
+ * For Identifier arguments (e.g., res.json(statusData)):
318
+ * 1. Try to find existing VARIABLE/PARAMETER/CONSTANT with same name in handler scope
319
+ * 2. If found, return existing node ID (no stub needed)
320
+ * 3. If not found, fall back to creating stub (external/global variables)
321
+ *
322
+ * For non-Identifier arguments (ObjectExpression, CallExpression, etc.):
323
+ * - Always create stub node (existing behavior)
324
+ *
325
+ * @param graph - Graph backend
326
+ * @param file - Handler file path
327
+ * @param call - Response call info (includes identifierName)
328
+ * @param routeId - Route ID (for metadata)
329
+ * @param handlerSemanticId - Handler function's semantic ID (for scope matching)
330
+ * @returns Node ID (existing or newly created)
331
+ */
332
+ private async resolveOrCreateResponseNode(
333
+ graph: PluginContext['graph'],
334
+ file: string,
335
+ call: ResponseCallInfo,
336
+ routeId: string,
337
+ handlerSemanticId: string
338
+ ): Promise<string> {
339
+ const { argLine, argColumn, argType, identifierName } = call;
340
+
341
+ // For Identifier arguments, try to find existing variable/parameter
342
+ if (argType === 'Identifier' && identifierName) {
343
+ const existingNodeId = await this.findIdentifierInScope(
344
+ graph,
345
+ file,
346
+ identifierName,
347
+ handlerSemanticId,
348
+ argLine
349
+ );
350
+
351
+ if (existingNodeId) {
352
+ return existingNodeId; // Use existing node, no stub needed
353
+ }
354
+ // Fall through to create stub if not found (external/global variables)
355
+ }
356
+
357
+ // For non-Identifier or not-found, create stub node (existing logic)
358
+ return this.createResponseArgumentNode(
359
+ graph,
360
+ file,
361
+ argLine,
362
+ argColumn,
363
+ argType,
364
+ routeId
365
+ );
366
+ }
367
+
368
+ /**
369
+ * Find existing VARIABLE/CONSTANT/PARAMETER node in handler scope.
370
+ *
371
+ * Strategy:
372
+ * 1. Parse handler semantic ID to extract scope prefix
373
+ * 2. Query VARIABLE/CONSTANT nodes: match by name, file, scope prefix, and line <= useLine
374
+ * 3. Query PARAMETER nodes: match by name, file, parentFunctionId === handlerSemanticId
375
+ *
376
+ * Scope matching:
377
+ * - Handler ID: "routes.js->anonymous[1]->FUNCTION->anonymous[1]"
378
+ * - Scope prefix: "routes.js->anonymous[1]->"
379
+ * - Variable ID: "routes.js->anonymous[1]->VARIABLE->statusData" (matches prefix)
380
+ * - External ID: "utils.js->VARIABLE->config" (different file)
381
+ *
382
+ * @param graph - Graph backend
383
+ * @param file - File path
384
+ * @param name - Variable name to find
385
+ * @param handlerSemanticId - Handler function's semantic ID
386
+ * @param useLine - Line where identifier is used (variable must be declared before this)
387
+ * @returns Node ID if found, null otherwise
388
+ */
389
+ private async findIdentifierInScope(
390
+ graph: PluginContext['graph'],
391
+ file: string,
392
+ name: string,
393
+ handlerSemanticId: string,
394
+ useLine: number
395
+ ): Promise<string | null> {
396
+ // Extract scope prefix from handler semantic ID
397
+ const handlerScopePrefix = this.extractScopePrefix(handlerSemanticId);
398
+
399
+ // Query VARIABLE nodes
400
+ for await (const node of graph.queryNodes({ type: 'VARIABLE' })) {
401
+ if (node.name === name && node.file === file) {
402
+ // Check if in handler scope and declared before usage
403
+ if (node.id.startsWith(handlerScopePrefix) && (node.line as number) <= useLine) {
404
+ return node.id;
405
+ }
406
+ }
407
+ }
408
+
409
+ // Query CONSTANT nodes
410
+ for await (const node of graph.queryNodes({ type: 'CONSTANT' })) {
411
+ if (node.name === name && node.file === file) {
412
+ if (node.id.startsWith(handlerScopePrefix) && (node.line as number) <= useLine) {
413
+ return node.id;
414
+ }
415
+ }
416
+ }
417
+
418
+ // Query PARAMETER nodes
419
+ for await (const node of graph.queryNodes({ type: 'PARAMETER' })) {
420
+ if (node.name === name && node.file === file) {
421
+ // Parameters belong to the function directly
422
+ const parentFunctionId = (node as NodeRecord & { parentFunctionId?: string }).parentFunctionId;
423
+ if (parentFunctionId === handlerSemanticId) {
424
+ return node.id;
425
+ }
426
+ }
427
+ }
428
+
429
+ // Also check module-level variables (scope prefix would be just "file.js->")
430
+ // For module-level constants, they should be accessible from any function in the file
431
+ const modulePrefix = this.extractModulePrefix(handlerSemanticId);
432
+ if (modulePrefix) {
433
+ // Check module-level VARIABLE
434
+ for await (const node of graph.queryNodes({ type: 'VARIABLE' })) {
435
+ if (node.name === name && node.file === file) {
436
+ // Module-level variables have IDs like "file.js->VARIABLE->name" (3 parts)
437
+ // Function-local variables have IDs like "file.js->funcName->VARIABLE->name" (4+ parts)
438
+ // Only match true module-level variables by checking structure
439
+ if (this.isModuleLevelId(node.id, modulePrefix) && (node.line as number) <= useLine) {
440
+ return node.id;
441
+ }
442
+ }
443
+ }
444
+
445
+ // Check module-level CONSTANT
446
+ for await (const node of graph.queryNodes({ type: 'CONSTANT' })) {
447
+ if (node.name === name && node.file === file) {
448
+ if (this.isModuleLevelId(node.id, modulePrefix) && (node.line as number) <= useLine) {
449
+ return node.id;
450
+ }
451
+ }
452
+ }
453
+ }
454
+
455
+ return null; // Not found - will create stub
456
+ }
457
+
458
+ /**
459
+ * Extract scope prefix from handler function's semantic ID.
460
+ *
461
+ * Handler function semantic IDs follow the pattern:
462
+ * {file}->{scope_path}->{type}->{name}
463
+ *
464
+ * Variables declared INSIDE the handler have IDs where the handler's NAME
465
+ * becomes part of THEIR scope path:
466
+ * {file}->{handler_name}->{type}->{var_name}
467
+ *
468
+ * Examples:
469
+ * - Handler: "index.js->global->FUNCTION->anonymous[0]"
470
+ * -> Variables inside: "index.js->anonymous[0]->CONSTANT->statusData"
471
+ * -> Scope prefix: "index.js->anonymous[0]->"
472
+ *
473
+ * - Handler: "routes.js->anonymous[1]->FUNCTION->anonymous[1]"
474
+ * -> Variables inside: "routes.js->anonymous[1]->VARIABLE->data"
475
+ * -> Scope prefix: "routes.js->anonymous[1]->"
476
+ *
477
+ * - Handler: "app.js->global->FUNCTION->handleRequest"
478
+ * -> Variables inside: "app.js->handleRequest->VARIABLE->result"
479
+ * -> Scope prefix: "app.js->handleRequest->"
480
+ *
481
+ * Algorithm:
482
+ * 1. Split by "->"
483
+ * 2. Take file (first part) and handler name (last part)
484
+ * 3. Join with "->" and add trailing "->"
485
+ *
486
+ * @param semanticId - Handler function's semantic ID
487
+ * @returns Scope prefix for matching variables declared inside the handler
488
+ */
489
+ private extractScopePrefix(semanticId: string): string {
490
+ const parts = semanticId.split('->');
491
+ // Semantic ID format: file->scope->TYPE->name
492
+ // We need file + function name (last part) to match variables inside the function
493
+ if (parts.length >= 4) {
494
+ const file = parts[0];
495
+ const functionName = parts[parts.length - 1]; // Function name is the last part
496
+ return `${file}->${functionName}->`;
497
+ }
498
+ // Fallback: use first two parts (shouldn't happen for well-formed IDs)
499
+ if (parts.length >= 2) {
500
+ return `${parts[0]}->${parts[1]}->`;
501
+ }
502
+ return semanticId;
503
+ }
504
+
505
+ /**
506
+ * Extract module prefix from semantic ID (for module-level variable access).
507
+ *
508
+ * Examples:
509
+ * - "routes.js->anonymous[1]->FUNCTION->anonymous[1]" -> "routes.js->"
510
+ * - "app.js->startServer->FUNCTION->startServer" -> "app.js->"
511
+ *
512
+ * @param semanticId - Handler function's semantic ID
513
+ * @returns Module prefix for matching module-level variables
514
+ */
515
+ private extractModulePrefix(semanticId: string): string | null {
516
+ const parts = semanticId.split('->');
517
+ if (parts.length >= 1 && parts[0]) {
518
+ return `${parts[0]}->`;
519
+ }
520
+ return null;
521
+ }
522
+
523
+ /**
524
+ * Check if a semantic ID represents a true module-level variable.
525
+ *
526
+ * Semantic IDs have format: file->scope->TYPE->name
527
+ * - Module-level variables have "global" as the scope: "file.js->global->TYPE->name"
528
+ * - Function-local variables have function name as scope: "file.js->funcName->TYPE->name"
529
+ *
530
+ * Examples:
531
+ * - "index.js->global->CONSTANT->CONFIG" -> true (module-level)
532
+ * - "index.js->global->VARIABLE->counter" -> true (module-level)
533
+ * - "index.js->anonymous[0]->CONSTANT->data" -> false (function-local)
534
+ * - "routes.js->handler->VARIABLE->result" -> false (function-local)
535
+ *
536
+ * @param nodeId - The node's semantic ID
537
+ * @param modulePrefix - The module prefix (e.g., "index.js->")
538
+ * @returns true if this is a module-level variable
539
+ */
540
+ private isModuleLevelId(nodeId: string, modulePrefix: string): boolean {
541
+ if (!nodeId.startsWith(modulePrefix)) {
542
+ return false;
543
+ }
544
+
545
+ // Check if the scope part (second component) is "global"
546
+ const parts = nodeId.split('->');
547
+ // Expected format: ["file.js", "global", "TYPE", "name"]
548
+ // Check that second part is "global" (module scope)
549
+ return parts.length >= 4 && parts[1] === 'global';
550
+ }
551
+
552
+ /**
553
+ * Create a node for the response argument
554
+ */
555
+ private async createResponseArgumentNode(
556
+ graph: PluginContext['graph'],
557
+ file: string,
558
+ line: number,
559
+ column: number,
560
+ astType: string,
561
+ routeId: string
562
+ ): Promise<string> {
563
+ // Map AST type to node type and create appropriate node
564
+ switch (astType) {
565
+ case 'ObjectExpression': {
566
+ // Include counter to make the node unique even for same location
567
+ const counter = this.responseNodeCounter++;
568
+ const id = `OBJECT_LITERAL#response:${counter}#${file}#${line}:${column}`;
569
+ await graph.addNode({
570
+ id,
571
+ type: 'OBJECT_LITERAL',
572
+ name: '<response>',
573
+ file,
574
+ line,
575
+ column,
576
+ parentRouteId: routeId
577
+ } as NodeRecord);
578
+ return id;
579
+ }
580
+ case 'Identifier': {
581
+ // For identifiers, we link to the variable that's being returned
582
+ const counter = this.responseNodeCounter++;
583
+ const id = `VARIABLE#response:${counter}#${file}#${line}:${column}`;
584
+ await graph.addNode({
585
+ id,
586
+ type: 'VARIABLE',
587
+ name: '<response>',
588
+ file,
589
+ line,
590
+ column
591
+ } as NodeRecord);
592
+ return id;
593
+ }
594
+ case 'CallExpression': {
595
+ const counter = this.responseNodeCounter++;
596
+ const id = `CALL#response:${counter}#${file}#${line}:${column}`;
597
+ await graph.addNode({
598
+ id,
599
+ type: 'CALL',
600
+ name: '<response>',
601
+ file,
602
+ line,
603
+ column
604
+ } as NodeRecord);
605
+ return id;
606
+ }
607
+ case 'ArrayExpression': {
608
+ const counter = this.responseNodeCounter++;
609
+ const id = `ARRAY_LITERAL#response:${counter}#${file}#${line}:${column}`;
610
+ await graph.addNode({
611
+ id,
612
+ type: 'ARRAY_LITERAL',
613
+ name: '<response>',
614
+ file,
615
+ line,
616
+ column
617
+ } as NodeRecord);
618
+ return id;
619
+ }
620
+ default: {
621
+ // Generic expression node
622
+ const counter = this.responseNodeCounter++;
623
+ const id = `EXPRESSION#response:${counter}#${file}#${line}:${column}`;
624
+ await graph.addNode({
625
+ id,
626
+ type: 'EXPRESSION',
627
+ name: '<response>',
628
+ file,
629
+ line,
630
+ column
631
+ } as NodeRecord);
632
+ return id;
633
+ }
634
+ }
635
+ }
636
+ }