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