@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
@@ -17,6 +17,15 @@ import { Plugin, createSuccessResult } from '../Plugin.js';
17
17
  import type { PluginMetadata, PluginContext, PluginResult } from '../Plugin.js';
18
18
  import type { NodeRecord } from '@grafema/types';
19
19
  import type { EdgeRecord } from '@grafema/types';
20
+ import {
21
+ traceValues,
22
+ aggregateValues,
23
+ NONDETERMINISTIC_PATTERNS,
24
+ NONDETERMINISTIC_OBJECTS,
25
+ } from '../../queries/traceValues.js';
26
+
27
+ // Re-export for backward compatibility
28
+ export { NONDETERMINISTIC_PATTERNS, NONDETERMINISTIC_OBJECTS };
20
29
 
21
30
  interface ComputedCallNode {
22
31
  id: string;
@@ -42,22 +51,6 @@ interface VariableNode {
42
51
  [key: string]: unknown;
43
52
  }
44
53
 
45
- interface ExpressionNode {
46
- id: string;
47
- type: string;
48
- name?: string;
49
- file?: string;
50
- line?: number;
51
- expressionType?: string;
52
- object?: string;
53
- property?: string;
54
- attrs?: {
55
- expressionType?: string;
56
- object?: string;
57
- property?: string;
58
- };
59
- }
60
-
61
54
  interface ScopeNode {
62
55
  id: string;
63
56
  type: string;
@@ -65,7 +58,6 @@ interface ScopeNode {
65
58
  file?: string;
66
59
  line?: number;
67
60
  originalId?: string;
68
- stableId?: string;
69
61
  parentScopeId?: string;
70
62
  constraints?: Constraint[];
71
63
  }
@@ -90,17 +82,13 @@ interface ValueSetAtNodeResult extends ValueSetResult {
90
82
  globalHasUnknown: boolean;
91
83
  }
92
84
 
93
- interface NondeterministicPattern {
94
- object: string;
95
- property: string;
96
- }
97
-
98
85
  interface Graph {
99
86
  queryNodes(filter: { nodeType: string }): AsyncIterable<NodeRecord>;
100
87
  getNode(id: string): Promise<NodeRecord | null>;
101
88
  getOutgoingEdges(nodeId: string): Promise<EdgeRecord[]>;
102
89
  getIncomingEdges(nodeId: string): Promise<EdgeRecord[]>;
103
90
  addEdge(edge: { src: string; dst: string; type: string; metadata?: Record<string, unknown> }): Promise<void> | void;
91
+ deleteEdge?(src: string, dst: string, type: string): Promise<void>; // Optional for edge updates
104
92
  }
105
93
 
106
94
  interface ProgressCallback {
@@ -116,37 +104,6 @@ interface ProgressCallback {
116
104
  export class ValueDomainAnalyzer extends Plugin {
117
105
  static MAX_DEPTH = 10; // Maximum depth for tracing
118
106
 
119
- // Nondeterministic MemberExpression patterns
120
- // object.property patterns that are external/user input
121
- static NONDETERMINISTIC_PATTERNS: NondeterministicPattern[] = [
122
- // Environment variables
123
- { object: 'process', property: 'env' },
124
- // HTTP request data (Express.js patterns)
125
- { object: 'req', property: 'body' },
126
- { object: 'req', property: 'query' },
127
- { object: 'req', property: 'params' },
128
- { object: 'req', property: 'headers' },
129
- { object: 'req', property: 'cookies' },
130
- { object: 'request', property: 'body' },
131
- { object: 'request', property: 'query' },
132
- { object: 'request', property: 'params' },
133
- // Context patterns (Koa, etc.)
134
- { object: 'ctx', property: 'request' },
135
- { object: 'ctx', property: 'body' },
136
- { object: 'ctx', property: 'query' },
137
- { object: 'ctx', property: 'params' },
138
- ];
139
-
140
- // Nondeterministic object prefixes (any property access is nondeterministic)
141
- static NONDETERMINISTIC_OBJECTS: string[] = [
142
- 'process.env', // process.env.ANY_VAR
143
- 'req.body', // req.body.userId
144
- 'req.query', // req.query.filter
145
- 'req.params', // req.params.id
146
- 'request.body',
147
- 'ctx.request',
148
- ];
149
-
150
107
  get metadata(): PluginMetadata {
151
108
  return {
152
109
  name: 'ValueDomainAnalyzer',
@@ -154,17 +111,18 @@ export class ValueDomainAnalyzer extends Plugin {
154
111
  priority: 65, // After AliasTracker (60)
155
112
  creates: {
156
113
  nodes: [],
157
- edges: ['CALLS']
114
+ edges: ['CALLS', 'FLOWS_INTO'] // Added FLOWS_INTO (modifies existing)
158
115
  }
159
116
  };
160
117
  }
161
118
 
162
119
  async execute(context: PluginContext): Promise<PluginResult> {
163
120
  const { graph } = context;
121
+ const logger = this.log(context);
164
122
  const onProgress = (context as unknown as { onProgress?: ProgressCallback }).onProgress;
165
123
  const graphTyped = graph as unknown as Graph;
166
124
 
167
- console.log('[ValueDomainAnalyzer] Starting value domain analysis...');
125
+ logger.info('Starting value domain analysis');
168
126
 
169
127
  let callsProcessed = 0;
170
128
  let callsResolved = 0;
@@ -182,7 +140,7 @@ export class ValueDomainAnalyzer extends Plugin {
182
140
  }
183
141
  }
184
142
 
185
- console.log(`[ValueDomainAnalyzer] Found ${computedCalls.length} computed member calls`);
143
+ logger.info('Found computed member calls', { count: computedCalls.length });
186
144
 
187
145
  // 2. For each computed call get value set
188
146
  for (const call of computedCalls) {
@@ -249,18 +207,24 @@ export class ValueDomainAnalyzer extends Plugin {
249
207
  }
250
208
  }
251
209
 
210
+ // 5. Resolve computed property mutations in FLOWS_INTO edges
211
+ logger.debug('Resolving computed property mutations');
212
+ const mutationStats = await this.resolveComputedMutations(graphTyped, logger);
213
+ logger.debug('Mutation resolution stats', mutationStats);
214
+
252
215
  const summary = {
253
216
  callsProcessed,
254
217
  callsResolved,
255
218
  edgesCreated,
256
219
  conditionalCalls,
257
- partialCalls
220
+ partialCalls,
221
+ computedMutations: mutationStats
258
222
  };
259
223
 
260
- console.log('[ValueDomainAnalyzer] Summary:', summary);
224
+ logger.info('Summary', summary);
261
225
 
262
226
  return createSuccessResult(
263
- { nodes: 0, edges: edgesCreated },
227
+ { nodes: 0, edges: edgesCreated + mutationStats.resolved + mutationStats.conditional },
264
228
  summary
265
229
  );
266
230
  }
@@ -294,13 +258,10 @@ export class ValueDomainAnalyzer extends Plugin {
294
258
  }
295
259
 
296
260
  if (variables.length === 0) {
297
- console.log(`[ValueDomainAnalyzer] No variable found for ${variableName} in ${file}`);
298
261
  result.hasUnknown = true;
299
262
  return result;
300
263
  }
301
264
 
302
- console.log(`[ValueDomainAnalyzer] Found ${variables.length} variable(s) for ${variableName}`);
303
-
304
265
  // Trace ASSIGNED_FROM to LITERAL or nondeterministic sources
305
266
  const visited = new Set<string>();
306
267
  const valueSet = new Set<unknown>();
@@ -377,8 +338,7 @@ export class ValueDomainAnalyzer extends Plugin {
377
338
  for await (const s of graph.queryNodes({ nodeType: 'SCOPE' })) {
378
339
  const scopeNode = s as ScopeNode;
379
340
  if (scopeNode.id === currentScopeId ||
380
- scopeNode.originalId === currentScopeId ||
381
- scopeNode.stableId === currentScopeId) {
341
+ scopeNode.originalId === currentScopeId) {
382
342
  scope = scopeNode;
383
343
  break;
384
344
  }
@@ -505,135 +465,69 @@ export class ValueDomainAnalyzer extends Plugin {
505
465
  }
506
466
 
507
467
  /**
508
- * Check if an EXPRESSION node represents a nondeterministic source
509
- */
510
- isNondeterministicExpression(node: ExpressionNode): boolean {
511
- const expressionType = node.expressionType || node.attrs?.expressionType;
512
- if (expressionType !== 'MemberExpression') {
513
- return false;
514
- }
515
-
516
- const object = node.object || node.attrs?.object;
517
- const property = node.property || node.attrs?.property;
518
-
519
- if (!object || !property) {
520
- return false;
521
- }
522
-
523
- // Check exact patterns (object.property)
524
- for (const pattern of ValueDomainAnalyzer.NONDETERMINISTIC_PATTERNS) {
525
- if (object === pattern.object && property === pattern.property) {
526
- return true;
527
- }
528
- }
529
-
530
- // Check if object is a known nondeterministic prefix
531
- // e.g., process.env.VAR where object is 'process.env'
532
- for (const prefix of ValueDomainAnalyzer.NONDETERMINISTIC_OBJECTS) {
533
- if (object === prefix || object.startsWith(prefix + '.')) {
534
- return true;
535
- }
536
- }
537
-
538
- return false;
539
- }
540
-
541
- /**
542
- * Recursive value set tracing through ASSIGNED_FROM edges
468
+ * Recursive value set tracing through ASSIGNED_FROM edges.
469
+ * Delegates to shared traceValues utility (REG-244).
543
470
  */
544
471
  async traceValueSet(
545
472
  node: NodeRecord,
546
473
  graph: Graph,
547
- visited: Set<string>,
474
+ _visited: Set<string>,
548
475
  depth: number
549
476
  ): Promise<ValueSetResult> {
550
- const result: ValueSetResult = { values: [], hasUnknown: false };
551
-
552
- // Cycle protection
553
- if (visited.has(node.id)) {
554
- return result;
555
- }
556
- visited.add(node.id);
557
-
558
- // Depth protection
559
- if (depth > ValueDomainAnalyzer.MAX_DEPTH) {
560
- result.hasUnknown = true;
561
- return result;
562
- }
563
-
564
- // Support both fields: nodeType (from getNode) and type (alias)
565
- const nodeType = (node as { nodeType?: string; type?: string }).nodeType ||
566
- (node as { type?: string }).type;
567
-
568
- // If it's a LITERAL - add value
569
- if (nodeType === 'LITERAL') {
570
- const value = (node as { value?: unknown }).value;
571
- if (value !== undefined && value !== null) {
572
- result.values.push(value);
573
- }
574
- return result;
575
- }
576
-
577
- // If it's a PARAMETER or nondeterministic source
578
- if (nodeType === 'PARAMETER') {
579
- result.hasUnknown = true;
580
- return result;
581
- }
582
-
583
- // If it's a CALL - consider nondeterministic (for now)
584
- if (nodeType === 'CALL') {
585
- result.hasUnknown = true;
586
- return result;
587
- }
588
-
589
- // If it's an EXPRESSION - check nondeterministic patterns
590
- if (nodeType === 'EXPRESSION') {
591
- if (this.isNondeterministicExpression(node as ExpressionNode)) {
592
- result.hasUnknown = true;
593
- return result;
594
- }
595
- }
477
+ // Create adapter from Graph interface to TraceValuesGraphBackend
478
+ const backend = {
479
+ getNode: async (id: string) => {
480
+ const n = await graph.getNode(id);
481
+ if (!n) return null;
482
+ return {
483
+ id: n.id,
484
+ type: (n as { type?: string }).type,
485
+ nodeType: (n as { nodeType?: string }).nodeType,
486
+ value: (n as { value?: unknown }).value,
487
+ file: (n as { file?: string }).file,
488
+ line: (n as { line?: number }).line,
489
+ expressionType: (n as { expressionType?: string }).expressionType,
490
+ object: (n as { object?: string }).object,
491
+ property: (n as { property?: string }).property,
492
+ };
493
+ },
494
+ getOutgoingEdges: async (nodeId: string, edgeTypes: string[] | null) => {
495
+ const edges = await graph.getOutgoingEdges(nodeId);
496
+ const filtered = edgeTypes === null
497
+ ? edges
498
+ : edges.filter(e => edgeTypes.includes(e.type));
499
+ return filtered.map(e => ({
500
+ src: (e as { src?: string; source_id?: string }).src ||
501
+ (e as { source_id?: string }).source_id || '',
502
+ dst: (e as { dst?: string; target_id?: string }).dst ||
503
+ (e as { target_id?: string }).target_id || '',
504
+ type: e.type,
505
+ }));
506
+ },
507
+ // REG-334: getIncomingEdges required for Promise tracing
508
+ getIncomingEdges: async (nodeId: string, edgeTypes: string[] | null) => {
509
+ const edges = await graph.getIncomingEdges(nodeId);
510
+ const filtered = edgeTypes === null
511
+ ? edges
512
+ : edges.filter(e => edgeTypes.includes(e.type));
513
+ return filtered.map(e => ({
514
+ src: (e as { src?: string; source_id?: string }).src ||
515
+ (e as { source_id?: string }).source_id || '',
516
+ dst: (e as { dst?: string; target_id?: string }).dst ||
517
+ (e as { target_id?: string }).target_id || '',
518
+ type: e.type,
519
+ }));
520
+ },
521
+ };
596
522
 
597
- // Follow ASSIGNED_FROM and DERIVES_FROM edges
598
- // DERIVES_FROM is used for template literals and other composite expressions
599
- const outgoing = await graph.getOutgoingEdges(node.id);
600
- // edgeType (from getOutgoingEdges) or edge_type (from other APIs)
601
- const dataFlowEdges = outgoing.filter(e => {
602
- const edgeType = (e as { edgeType?: string; edge_type?: string }).edgeType ||
603
- (e as { edge_type?: string }).edge_type;
604
- return edgeType === 'ASSIGNED_FROM' || edgeType === 'DERIVES_FROM';
523
+ // Use shared utility
524
+ const traced = await traceValues(backend, node.id, {
525
+ maxDepth: ValueDomainAnalyzer.MAX_DEPTH - depth,
526
+ followDerivesFrom: true,
527
+ detectNondeterministic: true,
605
528
  });
606
529
 
607
- if (dataFlowEdges.length === 0) {
608
- // No sources - unknown
609
- result.hasUnknown = true;
610
- return result;
611
- }
612
-
613
- // Recursively trace each source
614
- for (const edge of dataFlowEdges) {
615
- // dst (from getOutgoingEdges) or target_id (from other APIs)
616
- const targetId = (edge as { dst?: string; target_id?: string }).dst ||
617
- (edge as { target_id?: string }).target_id;
618
- if (!targetId) continue;
619
-
620
- const sourceNode = await graph.getNode(targetId);
621
- if (!sourceNode) continue;
622
-
623
- const sourceResult = await this.traceValueSet(
624
- sourceNode,
625
- graph,
626
- visited,
627
- depth + 1
628
- );
629
-
630
- sourceResult.values.forEach(v => result.values.push(v));
631
- if (sourceResult.hasUnknown) {
632
- result.hasUnknown = true;
633
- }
634
- }
635
-
636
- return result;
530
+ return aggregateValues(traced);
637
531
  }
638
532
 
639
533
  /**
@@ -652,11 +546,7 @@ export class ValueDomainAnalyzer extends Plugin {
652
546
  // Check if this is a method of the right object
653
547
  // Simplified: check via incoming CONTAINS edges from CLASS
654
548
  const incoming = await graph.getIncomingEdges(node.id);
655
- const containsEdges = incoming.filter(e => {
656
- const edgeType = (e as { edgeType?: string; edge_type?: string }).edgeType ||
657
- (e as { edge_type?: string }).edge_type;
658
- return edgeType === 'CONTAINS';
659
- });
549
+ const containsEdges = incoming.filter(e => e.type === 'CONTAINS');
660
550
 
661
551
  for (const edge of containsEdges) {
662
552
  const sourceId = (edge as { src?: string; source_id?: string }).src ||
@@ -677,6 +567,136 @@ export class ValueDomainAnalyzer extends Plugin {
677
567
 
678
568
  return null;
679
569
  }
570
+
571
+ /**
572
+ * Resolve computed property names for object mutations.
573
+ * Finds FLOWS_INTO edges with mutationType: 'computed' and resolves
574
+ * the property name using value set tracing.
575
+ *
576
+ * @param graph - Graph backend with edge operations
577
+ * @returns Statistics about resolution
578
+ */
579
+ async resolveComputedMutations(graph: Graph, logger: ReturnType<typeof this.log>): Promise<{
580
+ resolved: number;
581
+ conditional: number;
582
+ unknownParameter: number;
583
+ unknownRuntime: number;
584
+ deferredCrossFile: number;
585
+ total: number;
586
+ }> {
587
+ const stats = {
588
+ resolved: 0,
589
+ conditional: 0,
590
+ unknownParameter: 0,
591
+ unknownRuntime: 0,
592
+ deferredCrossFile: 0,
593
+ total: 0
594
+ };
595
+
596
+ // Process edges by finding all VARIABLE and CONSTANT nodes and checking their outgoing edges
597
+ const processedEdges = new Set<string>();
598
+
599
+ // Helper to process a node's outgoing edges
600
+ const processNodeEdges = async (node: NodeRecord): Promise<void> => {
601
+ const outgoing = await graph.getOutgoingEdges(node.id);
602
+
603
+ for (const edge of outgoing) {
604
+ if (edge.type !== 'FLOWS_INTO') continue;
605
+
606
+ const edgeKey = `${edge.src}->${edge.dst}:FLOWS_INTO`;
607
+ if (processedEdges.has(edgeKey)) continue;
608
+ processedEdges.add(edgeKey);
609
+
610
+ const mutationType = edge.metadata?.mutationType as string | undefined;
611
+ const computedPropertyVar = edge.metadata?.computedPropertyVar as string | undefined;
612
+
613
+ if (mutationType !== 'computed' || !computedPropertyVar) continue;
614
+
615
+ stats.total++;
616
+
617
+ // Get file from source node
618
+ const sourceNode = await graph.getNode(edge.src);
619
+ const file = (sourceNode as { file?: string })?.file;
620
+ if (!file) continue;
621
+
622
+ // Resolve the computed property variable using existing getValueSet
623
+ const valueSet = await this.getValueSet(computedPropertyVar, file, graph);
624
+
625
+ // Check if the variable is a PARAMETER node
626
+ let isParameter = false;
627
+ for await (const node of graph.queryNodes({ nodeType: 'PARAMETER' })) {
628
+ const paramNode = node as { name?: string; file?: string; attrs?: { name?: string; file?: string } };
629
+ const nodeName = paramNode.name || paramNode.attrs?.name;
630
+ const nodeFile = paramNode.file || paramNode.attrs?.file;
631
+ if (nodeName === computedPropertyVar && nodeFile === file) {
632
+ isParameter = true;
633
+ break;
634
+ }
635
+ }
636
+
637
+ // Determine resolution status based on value set
638
+ let resolutionStatus: string;
639
+ let resolvedPropertyNames: string[] = [];
640
+
641
+ if (valueSet.values.length === 0 && isParameter) {
642
+ // Variable is a function parameter - cannot be statically resolved
643
+ resolutionStatus = 'UNKNOWN_PARAMETER';
644
+ stats.unknownParameter++;
645
+ } else if (valueSet.values.length === 0 && valueSet.hasUnknown) {
646
+ // Completely nondeterministic - runtime value (function call result, etc.)
647
+ resolutionStatus = 'UNKNOWN_RUNTIME';
648
+ stats.unknownRuntime++;
649
+ } else if (valueSet.values.length === 0) {
650
+ // No values found at all - treat as unknown
651
+ resolutionStatus = 'UNKNOWN_RUNTIME';
652
+ stats.unknownRuntime++;
653
+ } else if (valueSet.values.length === 1 && !valueSet.hasUnknown) {
654
+ // Single deterministic value
655
+ resolutionStatus = 'RESOLVED';
656
+ resolvedPropertyNames = valueSet.values.map(v => String(v));
657
+ stats.resolved++;
658
+ } else {
659
+ // Multiple values (conditional) or partial resolution
660
+ resolutionStatus = 'RESOLVED_CONDITIONAL';
661
+ resolvedPropertyNames = valueSet.values.map(v => String(v));
662
+ stats.conditional++;
663
+ }
664
+
665
+ // Update edge: delete old, create new with resolved data
666
+ // Following the same pattern as InstanceOfResolver
667
+ if (graph.deleteEdge) {
668
+ await graph.deleteEdge(edge.src, edge.dst, 'FLOWS_INTO');
669
+ }
670
+
671
+ // Preserve original edge data and add resolution info
672
+ // For UNKNOWN cases, keep propertyName as '<computed>' and resolvedPropertyNames empty
673
+ await graph.addEdge({
674
+ src: edge.src,
675
+ dst: edge.dst,
676
+ type: 'FLOWS_INTO',
677
+ metadata: {
678
+ mutationType,
679
+ propertyName: resolvedPropertyNames[0] || '<computed>',
680
+ computedPropertyVar,
681
+ resolvedPropertyNames,
682
+ resolutionStatus
683
+ }
684
+ });
685
+ }
686
+ };
687
+
688
+ // Process VARIABLE nodes
689
+ for await (const node of graph.queryNodes({ nodeType: 'VARIABLE' })) {
690
+ await processNodeEdges(node);
691
+ }
692
+
693
+ // Process CONSTANT nodes
694
+ for await (const node of graph.queryNodes({ nodeType: 'CONSTANT' })) {
695
+ await processNodeEdges(node);
696
+ }
697
+
698
+ return stats;
699
+ }
680
700
  }
681
701
 
682
702
  export default ValueDomainAnalyzer;
@@ -151,12 +151,13 @@ export class IncrementalModuleIndexer extends Plugin {
151
151
 
152
152
  return imports;
153
153
  } catch (err) {
154
- console.error(` ⚠️ Failed to parse imports from ${relative(projectRoot, filePath)}: ${(err as Error).message}`);
154
+ // Parse error will be logged by execute() when it needs logger context
155
155
  return [];
156
156
  }
157
157
  }
158
158
 
159
159
  async execute(context: PluginContext): Promise<PluginResult> {
160
+ const logger = this.log(context);
160
161
  try {
161
162
  const { manifest, graph } = context;
162
163
  // Cast manifest to expected shape
@@ -175,7 +176,7 @@ export class IncrementalModuleIndexer extends Plugin {
175
176
  let totalImportsParsed = 0;
176
177
  let unresolvedImports = 0;
177
178
 
178
- console.log(`📦 Starting incremental indexing from: ${relative(projectPath, entryFile)}\n`);
179
+ logger.info('Starting incremental indexing', { entryFile: relative(projectPath, entryFile) });
179
180
 
180
181
  while (queue.length > 0) {
181
182
  const file = queue.shift()!;
@@ -183,12 +184,13 @@ export class IncrementalModuleIndexer extends Plugin {
183
184
  if (processed.has(file)) continue;
184
185
  processed.add(file);
185
186
 
186
- // Create MODULE node
187
+ // Create MODULE node with semantic ID
187
188
  const fileHash = this.calculateFileHash(file);
188
189
  const relativePath = relative(projectPath, file);
190
+ const semanticId = `${relativePath}->global->MODULE->module`;
189
191
 
190
192
  const moduleNode: NodeRecord = {
191
- id: `${file}:MODULE:${file}:0`,
193
+ id: semanticId,
192
194
  type: 'MODULE',
193
195
  name: relativePath,
194
196
  file: file,
@@ -211,10 +213,12 @@ export class IncrementalModuleIndexer extends Plugin {
211
213
  const imports = this.parseImports(file, projectPath);
212
214
  totalImportsParsed += imports.length;
213
215
  for (const importFile of imports) {
214
- // Store for later edge creation
216
+ // Store for later edge creation with semantic ID format
217
+ const importRelativePath = relative(projectPath, importFile);
218
+ const importSemanticId = `${importRelativePath}->global->MODULE->module`;
215
219
  pendingImports.push({
216
220
  src: moduleNode.id,
217
- dst: `${importFile}:MODULE:${importFile}:0`
221
+ dst: importSemanticId
218
222
  });
219
223
 
220
224
  if (!processed.has(importFile)) {
@@ -251,14 +255,16 @@ export class IncrementalModuleIndexer extends Plugin {
251
255
  }
252
256
 
253
257
  if (processed.size % 10 === 0) {
254
- process.stdout.write(`\r 📦 Indexed ${processed.size} modules (${queue.length} in queue)...`);
258
+ logger.debug('Indexing progress', { indexed: processed.size, queueLength: queue.length });
255
259
  }
256
260
  }
257
261
 
258
- console.log(`\r ✅ Indexed ${processed.size} modules\n`);
259
- console.log(` 📥 Parsed ${totalImportsParsed} import specifiers (unresolved: ${unresolvedImports})`);
260
- console.log(` 🔗 Pending IMPORTS edges to create: ${pendingImports.length}\n`);
261
- console.log(` 📊 Creating IMPORTS edges...\n`);
262
+ logger.info('Modules indexed', { count: processed.size });
263
+ logger.debug('Import statistics', {
264
+ totalImportsParsed,
265
+ unresolvedImports,
266
+ pendingEdges: pendingImports.length
267
+ });
262
268
 
263
269
  // Now create all IMPORTS edges after all MODULE nodes exist
264
270
  for (const { src, dst } of pendingImports) {
@@ -271,8 +277,11 @@ export class IncrementalModuleIndexer extends Plugin {
271
277
  edgesCreated++;
272
278
  }
273
279
 
274
- console.log(` 📊 Created ${nodesCreated} MODULE nodes and ${edgesCreated} edges`);
275
- console.log(` 📈 IMPORTS edges created: ${pendingImports.length}\n`);
280
+ logger.info('Indexing complete', {
281
+ nodesCreated,
282
+ edgesCreated,
283
+ importsEdgesCreated: pendingImports.length
284
+ });
276
285
 
277
286
  return createSuccessResult(
278
287
  { nodes: nodesCreated, edges: edgesCreated },
@@ -280,7 +289,7 @@ export class IncrementalModuleIndexer extends Plugin {
280
289
  );
281
290
 
282
291
  } catch (error) {
283
- console.error(`[IncrementalModuleIndexer] Error:`, error);
292
+ logger.error('Indexing failed', { error });
284
293
  return createErrorResult(error as Error);
285
294
  }
286
295
  }