@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,299 @@
1
+ /**
2
+ * Value Tracing Utility (REG-244)
3
+ *
4
+ * Traces a node through ASSIGNED_FROM/DERIVES_FROM edges to find
5
+ * all possible literal values or mark as unknown.
6
+ *
7
+ * Graph structure:
8
+ * ```
9
+ * VARIABLE -[ASSIGNED_FROM]-> LITERAL (concrete value)
10
+ * VARIABLE -[ASSIGNED_FROM]-> PARAMETER (unknown: runtime input)
11
+ * VARIABLE -[ASSIGNED_FROM]-> CALL (unknown: function return)
12
+ * VARIABLE -[DERIVES_FROM]-> EXPRESSION (check nondeterministic patterns)
13
+ * VARIABLE -[ASSIGNED_FROM]-> VARIABLE (chain - recurse)
14
+ * ```
15
+ *
16
+ * Used by:
17
+ * - CLI trace command (sink-based tracing)
18
+ * - ValueDomainAnalyzer (computed member access resolution)
19
+ *
20
+ * @module queries/traceValues
21
+ */
22
+ // =============================================================================
23
+ // NONDETERMINISTIC PATTERNS (moved from ValueDomainAnalyzer)
24
+ // =============================================================================
25
+ /**
26
+ * Nondeterministic MemberExpression patterns.
27
+ * object.property combinations that represent external/user input.
28
+ */
29
+ export const NONDETERMINISTIC_PATTERNS = [
30
+ // Environment variables
31
+ { object: 'process', property: 'env' },
32
+ // HTTP request data (Express.js patterns)
33
+ { object: 'req', property: 'body' },
34
+ { object: 'req', property: 'query' },
35
+ { object: 'req', property: 'params' },
36
+ { object: 'req', property: 'headers' },
37
+ { object: 'req', property: 'cookies' },
38
+ { object: 'request', property: 'body' },
39
+ { object: 'request', property: 'query' },
40
+ { object: 'request', property: 'params' },
41
+ // Context patterns (Koa, etc.)
42
+ { object: 'ctx', property: 'request' },
43
+ { object: 'ctx', property: 'body' },
44
+ { object: 'ctx', property: 'query' },
45
+ { object: 'ctx', property: 'params' },
46
+ ];
47
+ /**
48
+ * Nondeterministic object prefixes.
49
+ * Any property access on these is nondeterministic.
50
+ */
51
+ export const NONDETERMINISTIC_OBJECTS = [
52
+ 'process.env', // process.env.ANY_VAR
53
+ 'req.body', // req.body.userId
54
+ 'req.query', // req.query.filter
55
+ 'req.params', // req.params.id
56
+ 'request.body',
57
+ 'ctx.request',
58
+ ];
59
+ // =============================================================================
60
+ // MAIN FUNCTION
61
+ // =============================================================================
62
+ /**
63
+ * Trace a node to all its possible literal values.
64
+ *
65
+ * Starting from the given node, follows ASSIGNED_FROM (and optionally
66
+ * DERIVES_FROM) edges backwards to find:
67
+ * - LITERAL nodes: concrete values
68
+ * - PARAMETER nodes: runtime inputs (unknown)
69
+ * - CALL nodes: function return values (unknown)
70
+ * - EXPRESSION nodes: checks for nondeterministic patterns
71
+ *
72
+ * @param backend - Graph backend for queries
73
+ * @param nodeId - Starting node ID
74
+ * @param options - Traversal options
75
+ * @returns Array of traced values with sources
76
+ *
77
+ * @example
78
+ * const values = await traceValues(backend, variableId);
79
+ * for (const v of values) {
80
+ * if (v.isUnknown) {
81
+ * console.log(`Unknown from ${v.source.file}:${v.source.line} (${v.reason})`);
82
+ * } else {
83
+ * console.log(`Value: ${v.value} from ${v.source.file}:${v.source.line}`);
84
+ * }
85
+ * }
86
+ */
87
+ export async function traceValues(backend, nodeId, options) {
88
+ const results = [];
89
+ const visited = new Set();
90
+ const maxDepth = options?.maxDepth ?? 10;
91
+ const followDerivesFrom = options?.followDerivesFrom ?? true;
92
+ const detectNondeterministic = options?.detectNondeterministic ?? true;
93
+ await traceRecursive(backend, nodeId, visited, 0, maxDepth, followDerivesFrom, detectNondeterministic, results);
94
+ return results;
95
+ }
96
+ /**
97
+ * Recursive tracing function
98
+ */
99
+ async function traceRecursive(backend, nodeId, visited, depth, maxDepth, followDerivesFrom, detectNondeterministic, results) {
100
+ // Cycle protection
101
+ if (visited.has(nodeId)) {
102
+ return;
103
+ }
104
+ visited.add(nodeId);
105
+ // Get node
106
+ const node = await backend.getNode(nodeId);
107
+ if (!node) {
108
+ return;
109
+ }
110
+ const nodeType = node.type || node.nodeType;
111
+ const source = {
112
+ id: node.id,
113
+ file: node.file || '',
114
+ line: node.line || 0,
115
+ };
116
+ // Depth protection - check after getting node for source info
117
+ if (depth > maxDepth) {
118
+ results.push({
119
+ value: undefined,
120
+ source,
121
+ isUnknown: true,
122
+ reason: 'max_depth',
123
+ });
124
+ return;
125
+ }
126
+ // Terminal: LITERAL - found concrete value
127
+ if (nodeType === 'LITERAL') {
128
+ results.push({
129
+ value: node.value,
130
+ source,
131
+ isUnknown: false,
132
+ });
133
+ return;
134
+ }
135
+ // Terminal: PARAMETER - runtime input
136
+ if (nodeType === 'PARAMETER') {
137
+ results.push({
138
+ value: undefined,
139
+ source,
140
+ isUnknown: true,
141
+ reason: 'parameter',
142
+ });
143
+ return;
144
+ }
145
+ // Terminal: CALL / METHOD_CALL - function return value
146
+ if (nodeType === 'CALL' || nodeType === 'METHOD_CALL') {
147
+ // Check for HTTP_RECEIVES edges (cross-service data flow)
148
+ const httpEdges = await backend.getOutgoingEdges(nodeId, ['HTTP_RECEIVES']);
149
+ if (httpEdges.length > 0) {
150
+ // Follow HTTP boundary to backend response
151
+ for (const edge of httpEdges) {
152
+ await traceRecursive(backend, edge.dst, visited, depth + 1, maxDepth, followDerivesFrom, detectNondeterministic, results);
153
+ }
154
+ return; // Traced through HTTP boundary, don't mark as unknown
155
+ }
156
+ // Original behavior - mark as unknown
157
+ results.push({
158
+ value: undefined,
159
+ source,
160
+ isUnknown: true,
161
+ reason: 'call_result',
162
+ });
163
+ return;
164
+ }
165
+ // Check nondeterministic EXPRESSION patterns
166
+ if (nodeType === 'EXPRESSION' && detectNondeterministic) {
167
+ if (isNondeterministicExpression(node)) {
168
+ results.push({
169
+ value: undefined,
170
+ source,
171
+ isUnknown: true,
172
+ reason: 'nondeterministic',
173
+ });
174
+ return;
175
+ }
176
+ }
177
+ // Terminal: OBJECT_LITERAL - a valid structured value
178
+ // OBJECT_LITERAL without edges is valid (e.g., {} or {key: value})
179
+ if (nodeType === 'OBJECT_LITERAL') {
180
+ results.push({
181
+ value: node.value,
182
+ source,
183
+ isUnknown: false,
184
+ });
185
+ return;
186
+ }
187
+ // REG-334: Special case - CONSTRUCTOR_CALL for Promise
188
+ // Follow RESOLVES_TO edges to find actual data sources from resolve() calls
189
+ if (nodeType === 'CONSTRUCTOR_CALL') {
190
+ const className = node.className;
191
+ if (className === 'Promise') {
192
+ // Look for incoming RESOLVES_TO edges (resolve/reject calls)
193
+ const resolveEdges = await backend.getIncomingEdges(nodeId, ['RESOLVES_TO']);
194
+ if (resolveEdges.length > 0) {
195
+ // Follow resolve/reject calls to their arguments
196
+ for (const edge of resolveEdges) {
197
+ // edge.src is the resolve(value) CALL node
198
+ // We need to find what value was passed to resolve()
199
+ // The CALL node should have PASSES_ARGUMENT edge to the value
200
+ const argEdges = await backend.getOutgoingEdges(edge.src, ['PASSES_ARGUMENT']);
201
+ for (const argEdge of argEdges) {
202
+ // Check if this is the first argument (argIndex 0)
203
+ const argIndex = argEdge.metadata?.argIndex;
204
+ if (argIndex === 0) {
205
+ // Recursively trace the argument value
206
+ await traceRecursive(backend, argEdge.dst, visited, depth + 1, maxDepth, followDerivesFrom, detectNondeterministic, results);
207
+ }
208
+ }
209
+ }
210
+ return; // Traced through resolve, don't mark as unknown
211
+ }
212
+ }
213
+ // Non-Promise constructor or no resolve edges - mark as unknown
214
+ results.push({
215
+ value: undefined,
216
+ source,
217
+ isUnknown: true,
218
+ reason: 'constructor_call',
219
+ });
220
+ return;
221
+ }
222
+ // Get outgoing data flow edges
223
+ const edgeTypes = ['ASSIGNED_FROM'];
224
+ if (followDerivesFrom) {
225
+ edgeTypes.push('DERIVES_FROM');
226
+ }
227
+ const edges = await backend.getOutgoingEdges(nodeId, edgeTypes);
228
+ // No edges case - unknown
229
+ if (edges.length === 0) {
230
+ results.push({
231
+ value: undefined,
232
+ source,
233
+ isUnknown: true,
234
+ reason: 'no_sources',
235
+ });
236
+ return;
237
+ }
238
+ // Recurse through sources
239
+ for (const edge of edges) {
240
+ await traceRecursive(backend, edge.dst, visited, depth + 1, maxDepth, followDerivesFrom, detectNondeterministic, results);
241
+ }
242
+ }
243
+ // =============================================================================
244
+ // HELPERS
245
+ // =============================================================================
246
+ /**
247
+ * Check if an EXPRESSION node represents a nondeterministic pattern.
248
+ * E.g., process.env.VAR, req.body.userId, etc.
249
+ */
250
+ function isNondeterministicExpression(node) {
251
+ if (node.expressionType !== 'MemberExpression') {
252
+ return false;
253
+ }
254
+ const object = node.object;
255
+ const property = node.property;
256
+ if (!object || !property) {
257
+ return false;
258
+ }
259
+ // Check exact patterns (object.property)
260
+ for (const pattern of NONDETERMINISTIC_PATTERNS) {
261
+ if (object === pattern.object && property === pattern.property) {
262
+ return true;
263
+ }
264
+ }
265
+ // Check if object is a known nondeterministic prefix
266
+ // e.g., process.env.VAR where object is 'process.env'
267
+ for (const prefix of NONDETERMINISTIC_OBJECTS) {
268
+ if (object === prefix || object.startsWith(prefix + '.')) {
269
+ return true;
270
+ }
271
+ }
272
+ return false;
273
+ }
274
+ /**
275
+ * Aggregate traced values into a simplified result.
276
+ * Useful for consumers who don't need source locations.
277
+ *
278
+ * Note: null and undefined values are NOT included in the values array.
279
+ * If you need to detect "assigned to null", check the raw TracedValue[] instead.
280
+ *
281
+ * @param traced - Array of traced values
282
+ * @returns Aggregated result with unique values and hasUnknown flag
283
+ */
284
+ export function aggregateValues(traced) {
285
+ const valueSet = new Set();
286
+ let hasUnknown = false;
287
+ for (const t of traced) {
288
+ if (t.isUnknown) {
289
+ hasUnknown = true;
290
+ }
291
+ else if (t.value !== undefined && t.value !== null) {
292
+ valueSet.add(t.value);
293
+ }
294
+ }
295
+ return {
296
+ values: Array.from(valueSet),
297
+ hasUnknown,
298
+ };
299
+ }
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Shared Types for Graph Query Utilities
3
+ *
4
+ * These types are used by findCallsInFunction, findContainingFunction,
5
+ * and other query utilities.
6
+ *
7
+ * @module queries/types
8
+ */
9
+ /**
10
+ * Information about a function/method call found in code
11
+ */
12
+ export interface CallInfo {
13
+ /** Node ID of the call site */
14
+ id: string;
15
+ /** Called function/method name */
16
+ name: string;
17
+ /** Node type: 'CALL' or 'METHOD_CALL' */
18
+ type: 'CALL' | 'METHOD_CALL';
19
+ /** Object name for method calls (e.g., 'response' for response.json()) */
20
+ object?: string;
21
+ /** Whether the call target was resolved (has CALLS edge) */
22
+ resolved: boolean;
23
+ /** Target function info if resolved */
24
+ target?: {
25
+ id: string;
26
+ name: string;
27
+ file?: string;
28
+ line?: number;
29
+ };
30
+ /** File where call occurs */
31
+ file?: string;
32
+ /** Line number of call */
33
+ line?: number;
34
+ /** Depth in transitive call chain (0 = direct call) */
35
+ depth?: number;
36
+ }
37
+ /**
38
+ * Information about a function that calls another function
39
+ */
40
+ export interface CallerInfo {
41
+ /** Caller function ID */
42
+ id: string;
43
+ /** Caller function name */
44
+ name: string;
45
+ /** Caller function type (FUNCTION, CLASS, MODULE) */
46
+ type: string;
47
+ /** File containing the caller */
48
+ file?: string;
49
+ /** Line of the call site */
50
+ line?: number;
51
+ }
52
+ /**
53
+ * Options for finding calls in a function
54
+ */
55
+ export interface FindCallsOptions {
56
+ /** Maximum depth for scope traversal (default: 10) */
57
+ maxDepth?: number;
58
+ /** Follow transitive calls (default: false) */
59
+ transitive?: boolean;
60
+ /** Maximum depth for transitive traversal (default: 5) */
61
+ transitiveDepth?: number;
62
+ }
63
+ /**
64
+ * Location of a value source in the graph
65
+ */
66
+ export interface ValueSource {
67
+ /** Node ID in the graph */
68
+ id: string;
69
+ /** File path */
70
+ file: string;
71
+ /** Line number (1-based) */
72
+ line: number;
73
+ }
74
+ /**
75
+ * Reason why a value could not be determined statically.
76
+ * Used for debugging and user-facing messages.
77
+ */
78
+ export type UnknownReason = 'parameter' | 'call_result' | 'constructor_call' | 'nondeterministic' | 'max_depth' | 'no_sources';
79
+ /**
80
+ * A single traced value from the graph.
81
+ * Represents either a concrete value (from LITERAL) or an unknown value
82
+ * (from PARAMETER, CALL, nondeterministic source, etc.)
83
+ */
84
+ export interface TracedValue {
85
+ /** The literal value (undefined if unknown) */
86
+ value: unknown;
87
+ /** Source location in the codebase */
88
+ source: ValueSource;
89
+ /** Whether value could not be determined statically */
90
+ isUnknown: boolean;
91
+ /** Why the value is unknown (for debugging/display) */
92
+ reason?: UnknownReason;
93
+ }
94
+ /**
95
+ * Options for traceValues()
96
+ */
97
+ export interface TraceValuesOptions {
98
+ /** Maximum traversal depth (default: 10) */
99
+ maxDepth?: number;
100
+ /** Follow DERIVES_FROM edges in addition to ASSIGNED_FROM (default: true) */
101
+ followDerivesFrom?: boolean;
102
+ /** Detect nondeterministic patterns like process.env (default: true) */
103
+ detectNondeterministic?: boolean;
104
+ }
105
+ /**
106
+ * Aggregated result from tracing.
107
+ * Convenience type for consumers who don't need individual sources.
108
+ */
109
+ export interface ValueSetResult {
110
+ /** All unique concrete values found */
111
+ values: unknown[];
112
+ /** Whether any path led to unknown value */
113
+ hasUnknown: boolean;
114
+ }
115
+ /**
116
+ * Edge record for traceValues
117
+ */
118
+ export interface TraceValuesEdge {
119
+ src: string;
120
+ dst: string;
121
+ type: string;
122
+ metadata?: {
123
+ argIndex?: number;
124
+ isReject?: boolean;
125
+ };
126
+ }
127
+ /**
128
+ * Node record for traceValues
129
+ */
130
+ export interface TraceValuesNode {
131
+ id: string;
132
+ type?: string;
133
+ nodeType?: string;
134
+ value?: unknown;
135
+ file?: string;
136
+ line?: number;
137
+ expressionType?: string;
138
+ object?: string;
139
+ property?: string;
140
+ className?: string;
141
+ }
142
+ /**
143
+ * Minimal graph backend interface for traceValues().
144
+ * Works with both RFDBServerBackend and internal Graph interface.
145
+ */
146
+ export interface TraceValuesGraphBackend {
147
+ getNode(id: string): Promise<TraceValuesNode | null>;
148
+ getOutgoingEdges(nodeId: string, edgeTypes: string[] | null): Promise<TraceValuesEdge[]>;
149
+ /**
150
+ * Get incoming edges to a node (REG-334: needed for RESOLVES_TO)
151
+ * Required for Promise tracing - must be implemented by all backends
152
+ */
153
+ getIncomingEdges(nodeId: string, edgeTypes: string[] | null): Promise<TraceValuesEdge[]>;
154
+ }
155
+ /**
156
+ * Nondeterministic MemberExpression pattern.
157
+ * object.property combinations that represent external/user input.
158
+ */
159
+ export interface NondeterministicPattern {
160
+ object: string;
161
+ property: string;
162
+ }
163
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/queries/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Shared Types for Graph Query Utilities
3
+ *
4
+ * These types are used by findCallsInFunction, findContainingFunction,
5
+ * and other query utilities.
6
+ *
7
+ * @module queries/types
8
+ */
9
+ export {};
@@ -0,0 +1,53 @@
1
+ /**
2
+ * GraphSchemaExtractor - Extracts graph node/edge type schemas
3
+ *
4
+ * Usage:
5
+ * const extractor = new GraphSchemaExtractor(backend);
6
+ * const schema = await extractor.extract();
7
+ *
8
+ * When to use:
9
+ * - Export graph schema for contract tracking
10
+ * - Track node/edge type changes via checksum
11
+ * - Generate graph documentation
12
+ */
13
+ import type { RFDBServerBackend } from '../storage/backends/RFDBServerBackend.js';
14
+ export interface NodeTypeSchema {
15
+ category: 'base' | 'namespaced';
16
+ namespace?: string;
17
+ count: number;
18
+ }
19
+ export interface EdgeTypeSchema {
20
+ count: number;
21
+ }
22
+ export interface GraphSchema {
23
+ $schema: 'grafema-graph-v1';
24
+ extractedAt: string;
25
+ nodeTypes: Record<string, NodeTypeSchema>;
26
+ edgeTypes: Record<string, EdgeTypeSchema>;
27
+ statistics: {
28
+ totalNodes: number;
29
+ totalEdges: number;
30
+ nodeTypeCount: number;
31
+ edgeTypeCount: number;
32
+ };
33
+ checksum: string;
34
+ }
35
+ export interface GraphExtractOptions {
36
+ /** Include all defined types, not just used ones (default: false) */
37
+ includeAll?: boolean;
38
+ }
39
+ export declare class GraphSchemaExtractor {
40
+ private backend;
41
+ constructor(backend: RFDBServerBackend);
42
+ /**
43
+ * Extract graph schema from current database
44
+ *
45
+ * @param options.includeAll - If true, include all defined types even with count=0
46
+ */
47
+ extract(options?: GraphExtractOptions): Promise<GraphSchema>;
48
+ /**
49
+ * Sort object keys alphabetically for deterministic output
50
+ */
51
+ private sortObject;
52
+ }
53
+ //# sourceMappingURL=GraphSchemaExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphSchemaExtractor.d.ts","sourceRoot":"","sources":["../../src/schema/GraphSchemaExtractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAMlF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,UAAU,EAAE;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,oBAAoB;IACnB,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,iBAAiB;IAE9C;;;;OAIG;IACG,OAAO,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAuGlE;;OAEG;IACH,OAAO,CAAC,UAAU;CAQnB"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * GraphSchemaExtractor - Extracts graph node/edge type schemas
3
+ *
4
+ * Usage:
5
+ * const extractor = new GraphSchemaExtractor(backend);
6
+ * const schema = await extractor.extract();
7
+ *
8
+ * When to use:
9
+ * - Export graph schema for contract tracking
10
+ * - Track node/edge type changes via checksum
11
+ * - Generate graph documentation
12
+ */
13
+ import { createHash } from 'crypto';
14
+ import { NODE_TYPE, NAMESPACED_TYPE, EDGE_TYPE } from '@grafema/types';
15
+ export class GraphSchemaExtractor {
16
+ backend;
17
+ constructor(backend) {
18
+ this.backend = backend;
19
+ }
20
+ /**
21
+ * Extract graph schema from current database
22
+ *
23
+ * @param options.includeAll - If true, include all defined types even with count=0
24
+ */
25
+ async extract(options) {
26
+ const includeAll = options?.includeAll ?? false;
27
+ // Get actual counts from graph
28
+ const nodeCounts = await this.backend.countNodesByType();
29
+ const edgeCounts = await this.backend.countEdgesByType();
30
+ // Build node types from definitions + counts
31
+ const nodeTypes = {};
32
+ // Base node types
33
+ for (const [_key, value] of Object.entries(NODE_TYPE)) {
34
+ nodeTypes[value] = {
35
+ category: 'base',
36
+ count: nodeCounts[value] || 0,
37
+ };
38
+ }
39
+ // Namespaced node types
40
+ for (const [_key, value] of Object.entries(NAMESPACED_TYPE)) {
41
+ const namespace = value.split(':')[0];
42
+ nodeTypes[value] = {
43
+ category: 'namespaced',
44
+ namespace,
45
+ count: nodeCounts[value] || 0,
46
+ };
47
+ }
48
+ // Add any additional types found in the graph but not in definitions
49
+ for (const [type, count] of Object.entries(nodeCounts)) {
50
+ if (!nodeTypes[type]) {
51
+ const namespace = type.includes(':') ? type.split(':')[0] : undefined;
52
+ nodeTypes[type] = {
53
+ category: namespace ? 'namespaced' : 'base',
54
+ namespace,
55
+ count,
56
+ };
57
+ }
58
+ }
59
+ // Build edge types from definitions + counts
60
+ const edgeTypes = {};
61
+ for (const [_key, value] of Object.entries(EDGE_TYPE)) {
62
+ edgeTypes[value] = {
63
+ count: edgeCounts[value] || 0,
64
+ };
65
+ }
66
+ // Add any additional edge types found in the graph
67
+ for (const [type, count] of Object.entries(edgeCounts)) {
68
+ if (!edgeTypes[type]) {
69
+ edgeTypes[type] = { count };
70
+ }
71
+ }
72
+ // Calculate totals
73
+ const totalNodes = Object.values(nodeCounts).reduce((sum, n) => sum + n, 0);
74
+ const totalEdges = Object.values(edgeCounts).reduce((sum, n) => sum + n, 0);
75
+ // Filter out types with count=0 unless includeAll is true
76
+ const filteredNodeTypes = {};
77
+ for (const [type, info] of Object.entries(nodeTypes)) {
78
+ if (includeAll || info.count > 0) {
79
+ filteredNodeTypes[type] = info;
80
+ }
81
+ }
82
+ const filteredEdgeTypes = {};
83
+ for (const [type, info] of Object.entries(edgeTypes)) {
84
+ if (includeAll || info.count > 0) {
85
+ filteredEdgeTypes[type] = info;
86
+ }
87
+ }
88
+ // Sort for deterministic output
89
+ const sortedNodeTypes = this.sortObject(filteredNodeTypes);
90
+ const sortedEdgeTypes = this.sortObject(filteredEdgeTypes);
91
+ // Compute checksum from normalized content (based on filtered types)
92
+ const checksumContent = {
93
+ nodeTypes: Object.keys(sortedNodeTypes).sort(),
94
+ edgeTypes: Object.keys(sortedEdgeTypes).sort(),
95
+ };
96
+ const checksum = createHash('sha256')
97
+ .update(JSON.stringify(checksumContent))
98
+ .digest('hex');
99
+ return {
100
+ $schema: 'grafema-graph-v1',
101
+ extractedAt: new Date().toISOString(),
102
+ nodeTypes: sortedNodeTypes,
103
+ edgeTypes: sortedEdgeTypes,
104
+ statistics: {
105
+ totalNodes,
106
+ totalEdges,
107
+ nodeTypeCount: Object.keys(sortedNodeTypes).length,
108
+ edgeTypeCount: Object.keys(sortedEdgeTypes).length,
109
+ },
110
+ checksum: `sha256:${checksum}`,
111
+ };
112
+ }
113
+ /**
114
+ * Sort object keys alphabetically for deterministic output
115
+ */
116
+ sortObject(obj) {
117
+ const sorted = {};
118
+ const keys = Object.keys(obj).sort();
119
+ for (const key of keys) {
120
+ sorted[key] = obj[key];
121
+ }
122
+ return sorted;
123
+ }
124
+ }