@grafema/core 0.1.0-alpha.5 → 0.1.1-alpha

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 (391) hide show
  1. package/README.md +0 -1
  2. package/dist/Orchestrator.d.ts +24 -2
  3. package/dist/Orchestrator.d.ts.map +1 -1
  4. package/dist/Orchestrator.js +197 -24
  5. package/dist/config/ConfigLoader.d.ts +72 -0
  6. package/dist/config/ConfigLoader.d.ts.map +1 -0
  7. package/dist/config/ConfigLoader.js +187 -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/FileNodeManager.d.ts +40 -0
  18. package/dist/core/FileNodeManager.d.ts.map +1 -0
  19. package/dist/core/FileNodeManager.js +84 -0
  20. package/dist/core/GraphFreshnessChecker.d.ts +33 -0
  21. package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
  22. package/dist/core/GraphFreshnessChecker.js +101 -0
  23. package/dist/core/HashUtils.d.ts +24 -0
  24. package/dist/core/HashUtils.d.ts.map +1 -0
  25. package/dist/core/HashUtils.js +45 -0
  26. package/dist/core/IncrementalReanalyzer.d.ts +36 -0
  27. package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
  28. package/dist/core/IncrementalReanalyzer.js +132 -0
  29. package/dist/core/NodeFactory.d.ts +225 -17
  30. package/dist/core/NodeFactory.d.ts.map +1 -1
  31. package/dist/core/NodeFactory.js +208 -18
  32. package/dist/core/ScopeTracker.d.ts +84 -0
  33. package/dist/core/ScopeTracker.d.ts.map +1 -0
  34. package/dist/core/ScopeTracker.js +116 -0
  35. package/dist/core/SemanticId.d.ts +90 -0
  36. package/dist/core/SemanticId.d.ts.map +1 -0
  37. package/dist/core/SemanticId.js +115 -0
  38. package/dist/core/VersionManager.d.ts.map +1 -1
  39. package/dist/core/VersionManager.js +3 -2
  40. package/dist/core/nodes/ArgumentExpressionNode.d.ts +43 -0
  41. package/dist/core/nodes/ArgumentExpressionNode.d.ts.map +1 -0
  42. package/dist/core/nodes/ArgumentExpressionNode.js +60 -0
  43. package/dist/core/nodes/ArrayLiteralNode.d.ts +27 -0
  44. package/dist/core/nodes/ArrayLiteralNode.d.ts.map +1 -0
  45. package/dist/core/nodes/ArrayLiteralNode.js +41 -0
  46. package/dist/core/nodes/CallSiteNode.d.ts +28 -0
  47. package/dist/core/nodes/CallSiteNode.d.ts.map +1 -1
  48. package/dist/core/nodes/CallSiteNode.js +46 -0
  49. package/dist/core/nodes/ClassNode.d.ts +33 -1
  50. package/dist/core/nodes/ClassNode.d.ts.map +1 -1
  51. package/dist/core/nodes/ClassNode.js +46 -2
  52. package/dist/core/nodes/DecoratorNode.d.ts +42 -0
  53. package/dist/core/nodes/DecoratorNode.d.ts.map +1 -0
  54. package/dist/core/nodes/DecoratorNode.js +62 -0
  55. package/dist/core/nodes/EnumNode.d.ts +42 -0
  56. package/dist/core/nodes/EnumNode.d.ts.map +1 -0
  57. package/dist/core/nodes/EnumNode.js +54 -0
  58. package/dist/core/nodes/ExportNode.d.ts +37 -1
  59. package/dist/core/nodes/ExportNode.d.ts.map +1 -1
  60. package/dist/core/nodes/ExportNode.js +48 -2
  61. package/dist/core/nodes/ExpressionNode.d.ts +97 -0
  62. package/dist/core/nodes/ExpressionNode.d.ts.map +1 -0
  63. package/dist/core/nodes/ExpressionNode.js +178 -0
  64. package/dist/core/nodes/ExternalModuleNode.d.ts +28 -0
  65. package/dist/core/nodes/ExternalModuleNode.d.ts.map +1 -0
  66. package/dist/core/nodes/ExternalModuleNode.js +41 -0
  67. package/dist/core/nodes/ExternalStdioNode.d.ts +13 -6
  68. package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -1
  69. package/dist/core/nodes/ExternalStdioNode.js +15 -8
  70. package/dist/core/nodes/FunctionNode.d.ts +36 -0
  71. package/dist/core/nodes/FunctionNode.d.ts.map +1 -1
  72. package/dist/core/nodes/FunctionNode.js +80 -1
  73. package/dist/core/nodes/ImportNode.d.ts +19 -5
  74. package/dist/core/nodes/ImportNode.d.ts.map +1 -1
  75. package/dist/core/nodes/ImportNode.js +23 -5
  76. package/dist/core/nodes/InterfaceNode.d.ts +46 -0
  77. package/dist/core/nodes/InterfaceNode.d.ts.map +1 -0
  78. package/dist/core/nodes/InterfaceNode.js +55 -0
  79. package/dist/core/nodes/IssueNode.d.ts +73 -0
  80. package/dist/core/nodes/IssueNode.d.ts.map +1 -0
  81. package/dist/core/nodes/IssueNode.js +129 -0
  82. package/dist/core/nodes/MethodCallNode.d.ts +30 -0
  83. package/dist/core/nodes/MethodCallNode.d.ts.map +1 -1
  84. package/dist/core/nodes/MethodCallNode.js +49 -0
  85. package/dist/core/nodes/MethodNode.d.ts +32 -0
  86. package/dist/core/nodes/MethodNode.d.ts.map +1 -1
  87. package/dist/core/nodes/MethodNode.js +48 -0
  88. package/dist/core/nodes/ModuleNode.d.ts +31 -0
  89. package/dist/core/nodes/ModuleNode.d.ts.map +1 -1
  90. package/dist/core/nodes/ModuleNode.js +37 -0
  91. package/dist/core/nodes/NetworkRequestNode.d.ts +54 -0
  92. package/dist/core/nodes/NetworkRequestNode.d.ts.map +1 -0
  93. package/dist/core/nodes/NetworkRequestNode.js +65 -0
  94. package/dist/core/nodes/ObjectLiteralNode.d.ts +27 -0
  95. package/dist/core/nodes/ObjectLiteralNode.d.ts.map +1 -0
  96. package/dist/core/nodes/ObjectLiteralNode.js +41 -0
  97. package/dist/core/nodes/ScopeNode.d.ts +31 -0
  98. package/dist/core/nodes/ScopeNode.d.ts.map +1 -1
  99. package/dist/core/nodes/ScopeNode.js +49 -0
  100. package/dist/core/nodes/TypeNode.d.ts +36 -0
  101. package/dist/core/nodes/TypeNode.d.ts.map +1 -0
  102. package/dist/core/nodes/TypeNode.js +53 -0
  103. package/dist/core/nodes/VariableDeclarationNode.d.ts +27 -0
  104. package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -1
  105. package/dist/core/nodes/VariableDeclarationNode.js +40 -0
  106. package/dist/core/nodes/index.d.ts +12 -1
  107. package/dist/core/nodes/index.d.ts.map +1 -1
  108. package/dist/core/nodes/index.js +14 -0
  109. package/dist/diagnostics/DiagnosticCollector.d.ts +98 -0
  110. package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
  111. package/dist/diagnostics/DiagnosticCollector.js +129 -0
  112. package/dist/diagnostics/DiagnosticReporter.d.ts +77 -0
  113. package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
  114. package/dist/diagnostics/DiagnosticReporter.js +159 -0
  115. package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
  116. package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
  117. package/dist/diagnostics/DiagnosticWriter.js +43 -0
  118. package/dist/diagnostics/index.d.ts +14 -0
  119. package/dist/diagnostics/index.d.ts.map +1 -0
  120. package/dist/diagnostics/index.js +11 -0
  121. package/dist/errors/GrafemaError.d.ts +118 -0
  122. package/dist/errors/GrafemaError.d.ts.map +1 -0
  123. package/dist/errors/GrafemaError.js +131 -0
  124. package/dist/index.d.ts +57 -1
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +54 -1
  127. package/dist/logging/Logger.d.ts +48 -0
  128. package/dist/logging/Logger.d.ts.map +1 -0
  129. package/dist/logging/Logger.js +134 -0
  130. package/dist/plugins/Plugin.d.ts +5 -1
  131. package/dist/plugins/Plugin.d.ts.map +1 -1
  132. package/dist/plugins/Plugin.js +33 -0
  133. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -1
  134. package/dist/plugins/analysis/DatabaseAnalyzer.js +13 -6
  135. package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
  136. package/dist/plugins/analysis/ExpressAnalyzer.js +27 -19
  137. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -1
  138. package/dist/plugins/analysis/ExpressRouteAnalyzer.js +21 -14
  139. package/dist/plugins/analysis/FetchAnalyzer.d.ts +1 -0
  140. package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
  141. package/dist/plugins/analysis/FetchAnalyzer.js +34 -14
  142. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +6 -3
  143. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -1
  144. package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +76 -80
  145. package/dist/plugins/analysis/JSASTAnalyzer.d.ts +180 -17
  146. package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
  147. package/dist/plugins/analysis/JSASTAnalyzer.js +1171 -471
  148. package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -1
  149. package/dist/plugins/analysis/ReactAnalyzer.js +56 -57
  150. package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -1
  151. package/dist/plugins/analysis/RustAnalyzer.js +15 -10
  152. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
  153. package/dist/plugins/analysis/SQLiteAnalyzer.js +9 -7
  154. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -1
  155. package/dist/plugins/analysis/ServiceLayerAnalyzer.js +21 -9
  156. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -1
  157. package/dist/plugins/analysis/SocketIOAnalyzer.js +27 -15
  158. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -1
  159. package/dist/plugins/analysis/SystemDbAnalyzer.js +15 -5
  160. package/dist/plugins/analysis/ast/GraphBuilder.d.ts +34 -4
  161. package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
  162. package/dist/plugins/analysis/ast/GraphBuilder.js +318 -298
  163. package/dist/plugins/analysis/ast/IdGenerator.d.ts +105 -0
  164. package/dist/plugins/analysis/ast/IdGenerator.d.ts.map +1 -0
  165. package/dist/plugins/analysis/ast/IdGenerator.js +116 -0
  166. package/dist/plugins/analysis/ast/types.d.ts +176 -5
  167. package/dist/plugins/analysis/ast/types.d.ts.map +1 -1
  168. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts +33 -0
  169. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts.map +1 -0
  170. package/dist/plugins/analysis/ast/utils/createParameterNodes.js +89 -0
  171. package/dist/plugins/analysis/ast/utils/index.d.ts +6 -0
  172. package/dist/plugins/analysis/ast/utils/index.d.ts.map +1 -0
  173. package/dist/plugins/analysis/ast/utils/index.js +5 -0
  174. package/dist/plugins/analysis/ast/utils/location.d.ts +87 -0
  175. package/dist/plugins/analysis/ast/utils/location.d.ts.map +1 -0
  176. package/dist/plugins/analysis/ast/utils/location.js +78 -0
  177. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +9 -4
  178. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -1
  179. package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +6 -5
  180. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +99 -9
  181. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
  182. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +663 -125
  183. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +4 -1
  184. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -1
  185. package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +72 -32
  186. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +4 -1
  187. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
  188. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +128 -63
  189. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -1
  190. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +11 -8
  191. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +12 -1
  192. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -1
  193. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +36 -14
  194. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +4 -1
  195. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
  196. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +17 -13
  197. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -1
  198. package/dist/plugins/discovery/MonorepoServiceDiscovery.js +3 -2
  199. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -1
  200. package/dist/plugins/discovery/SimpleProjectDiscovery.js +5 -1
  201. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts +22 -0
  202. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts.map +1 -0
  203. package/dist/plugins/discovery/WorkspaceDiscovery.js +136 -0
  204. package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts +46 -0
  205. package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts.map +1 -0
  206. package/dist/plugins/discovery/resolveSourceEntrypoint.js +86 -0
  207. package/dist/plugins/discovery/workspaces/detector.d.ts +21 -0
  208. package/dist/plugins/discovery/workspaces/detector.d.ts.map +1 -0
  209. package/dist/plugins/discovery/workspaces/detector.js +49 -0
  210. package/dist/plugins/discovery/workspaces/globResolver.d.ts +35 -0
  211. package/dist/plugins/discovery/workspaces/globResolver.d.ts.map +1 -0
  212. package/dist/plugins/discovery/workspaces/globResolver.js +184 -0
  213. package/dist/plugins/discovery/workspaces/index.d.ts +9 -0
  214. package/dist/plugins/discovery/workspaces/index.d.ts.map +1 -0
  215. package/dist/plugins/discovery/workspaces/index.js +8 -0
  216. package/dist/plugins/discovery/workspaces/parsers.d.ts +38 -0
  217. package/dist/plugins/discovery/workspaces/parsers.d.ts.map +1 -0
  218. package/dist/plugins/discovery/workspaces/parsers.js +80 -0
  219. package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -1
  220. package/dist/plugins/enrichment/AliasTracker.js +14 -8
  221. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -1
  222. package/dist/plugins/enrichment/HTTPConnectionEnricher.js +14 -7
  223. package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -1
  224. package/dist/plugins/enrichment/ImportExportLinker.js +23 -6
  225. package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -1
  226. package/dist/plugins/enrichment/MethodCallResolver.js +18 -12
  227. package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -1
  228. package/dist/plugins/enrichment/MountPointResolver.js +8 -3
  229. package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -1
  230. package/dist/plugins/enrichment/PrefixEvaluator.js +16 -7
  231. package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -1
  232. package/dist/plugins/enrichment/RustFFIEnricher.js +6 -5
  233. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +17 -0
  234. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
  235. package/dist/plugins/enrichment/ValueDomainAnalyzer.js +129 -10
  236. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -1
  237. package/dist/plugins/indexing/IncrementalModuleIndexer.js +23 -14
  238. package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -1
  239. package/dist/plugins/indexing/JSModuleIndexer.js +63 -31
  240. package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -1
  241. package/dist/plugins/indexing/RustModuleIndexer.js +5 -4
  242. package/dist/plugins/indexing/ServiceDetector.d.ts +10 -0
  243. package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -1
  244. package/dist/plugins/indexing/ServiceDetector.js +28 -15
  245. package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -1
  246. package/dist/plugins/validation/CallResolverValidator.js +8 -7
  247. package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -1
  248. package/dist/plugins/validation/DataFlowValidator.js +17 -12
  249. package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -1
  250. package/dist/plugins/validation/EvalBanValidator.js +17 -16
  251. package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -1
  252. package/dist/plugins/validation/GraphConnectivityValidator.js +19 -23
  253. package/dist/plugins/validation/NodeCreationValidator.d.ts +85 -0
  254. package/dist/plugins/validation/NodeCreationValidator.d.ts.map +1 -0
  255. package/dist/plugins/validation/NodeCreationValidator.js +415 -0
  256. package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -1
  257. package/dist/plugins/validation/SQLInjectionValidator.js +59 -16
  258. package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -1
  259. package/dist/plugins/validation/ShadowingDetector.js +6 -5
  260. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -1
  261. package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +12 -11
  262. package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -1
  263. package/dist/plugins/vcs/GitPlugin.js +10 -12
  264. package/dist/plugins/vcs/VCSPlugin.d.ts +3 -2
  265. package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -1
  266. package/dist/plugins/vcs/VCSPlugin.js +5 -5
  267. package/dist/storage/backends/RFDBServerBackend.d.ts +10 -17
  268. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
  269. package/dist/storage/backends/RFDBServerBackend.js +31 -10
  270. package/dist/validation/PathValidator.d.ts +1 -2
  271. package/dist/validation/PathValidator.d.ts.map +1 -1
  272. package/package.json +3 -3
  273. package/src/Orchestrator.ts +237 -24
  274. package/src/config/ConfigLoader.ts +263 -0
  275. package/src/config/index.ts +5 -0
  276. package/src/core/ASTWorker.ts +143 -139
  277. package/src/core/CoverageAnalyzer.ts +243 -0
  278. package/src/core/FileNodeManager.ts +100 -0
  279. package/src/core/GraphFreshnessChecker.ts +143 -0
  280. package/src/core/HashUtils.ts +48 -0
  281. package/src/core/IncrementalReanalyzer.ts +192 -0
  282. package/src/core/NodeFactory.ts +401 -18
  283. package/src/core/ScopeTracker.ts +154 -0
  284. package/src/core/SemanticId.ts +192 -0
  285. package/src/core/VersionManager.ts +3 -2
  286. package/src/core/nodes/ArgumentExpressionNode.ts +89 -0
  287. package/src/core/nodes/ArrayLiteralNode.ts +65 -0
  288. package/src/core/nodes/CallSiteNode.ts +58 -0
  289. package/src/core/nodes/ClassNode.ts +63 -2
  290. package/src/core/nodes/DecoratorNode.ts +91 -0
  291. package/src/core/nodes/EnumNode.ts +86 -0
  292. package/src/core/nodes/ExportNode.ts +70 -2
  293. package/src/core/nodes/ExpressionNode.ts +231 -0
  294. package/src/core/nodes/ExternalModuleNode.ts +56 -0
  295. package/src/core/nodes/ExternalStdioNode.ts +17 -9
  296. package/src/core/nodes/FunctionNode.ts +101 -1
  297. package/src/core/nodes/ImportNode.ts +32 -10
  298. package/src/core/nodes/InterfaceNode.ts +91 -0
  299. package/src/core/nodes/IssueNode.ts +177 -0
  300. package/src/core/nodes/MethodCallNode.ts +64 -0
  301. package/src/core/nodes/MethodNode.ts +63 -0
  302. package/src/core/nodes/ModuleNode.ts +50 -0
  303. package/src/core/nodes/NetworkRequestNode.ts +77 -0
  304. package/src/core/nodes/ObjectLiteralNode.ts +65 -0
  305. package/src/core/nodes/ScopeNode.ts +65 -0
  306. package/src/core/nodes/TypeNode.ts +78 -0
  307. package/src/core/nodes/VariableDeclarationNode.ts +52 -0
  308. package/src/core/nodes/index.ts +18 -1
  309. package/src/diagnostics/DiagnosticCollector.ts +163 -0
  310. package/src/diagnostics/DiagnosticReporter.ts +204 -0
  311. package/src/diagnostics/DiagnosticWriter.ts +50 -0
  312. package/src/diagnostics/index.ts +16 -0
  313. package/src/errors/GrafemaError.ts +174 -0
  314. package/src/index.ts +148 -1
  315. package/src/logging/Logger.ts +152 -0
  316. package/src/plugins/Plugin.ts +42 -0
  317. package/src/plugins/analysis/DatabaseAnalyzer.ts +14 -8
  318. package/src/plugins/analysis/ExpressAnalyzer.ts +29 -19
  319. package/src/plugins/analysis/ExpressRouteAnalyzer.ts +22 -21
  320. package/src/plugins/analysis/FetchAnalyzer.ts +39 -16
  321. package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +84 -101
  322. package/src/plugins/analysis/JSASTAnalyzer.ts +1483 -503
  323. package/src/plugins/analysis/ReactAnalyzer.ts +57 -57
  324. package/src/plugins/analysis/RustAnalyzer.ts +15 -10
  325. package/src/plugins/analysis/SQLiteAnalyzer.ts +10 -7
  326. package/src/plugins/analysis/ServiceLayerAnalyzer.ts +22 -16
  327. package/src/plugins/analysis/SocketIOAnalyzer.ts +31 -22
  328. package/src/plugins/analysis/SystemDbAnalyzer.ts +16 -11
  329. package/src/plugins/analysis/ast/GraphBuilder.ts +439 -327
  330. package/src/plugins/analysis/ast/IdGenerator.ts +177 -0
  331. package/src/plugins/analysis/ast/types.ts +209 -6
  332. package/src/plugins/analysis/ast/utils/createParameterNodes.ts +104 -0
  333. package/src/plugins/analysis/ast/utils/index.ts +12 -0
  334. package/src/plugins/analysis/ast/utils/location.ts +103 -0
  335. package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +11 -8
  336. package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +909 -83
  337. package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +97 -44
  338. package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +159 -93
  339. package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +12 -8
  340. package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +41 -14
  341. package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +37 -17
  342. package/src/plugins/discovery/MonorepoServiceDiscovery.ts +3 -2
  343. package/src/plugins/discovery/SimpleProjectDiscovery.ts +6 -1
  344. package/src/plugins/discovery/WorkspaceDiscovery.ts +177 -0
  345. package/src/plugins/discovery/resolveSourceEntrypoint.ts +103 -0
  346. package/src/plugins/discovery/workspaces/detector.ts +63 -0
  347. package/src/plugins/discovery/workspaces/globResolver.ts +229 -0
  348. package/src/plugins/discovery/workspaces/index.ts +23 -0
  349. package/src/plugins/discovery/workspaces/parsers.ts +99 -0
  350. package/src/plugins/enrichment/AliasTracker.ts +14 -8
  351. package/src/plugins/enrichment/HTTPConnectionEnricher.ts +14 -7
  352. package/src/plugins/enrichment/ImportExportLinker.ts +24 -6
  353. package/src/plugins/enrichment/MethodCallResolver.ts +18 -12
  354. package/src/plugins/enrichment/MountPointResolver.ts +8 -3
  355. package/src/plugins/enrichment/PrefixEvaluator.ts +16 -7
  356. package/src/plugins/enrichment/RustFFIEnricher.ts +6 -5
  357. package/src/plugins/enrichment/ValueDomainAnalyzer.ts +149 -12
  358. package/src/plugins/indexing/IncrementalModuleIndexer.ts +23 -14
  359. package/src/plugins/indexing/JSModuleIndexer.ts +74 -34
  360. package/src/plugins/indexing/RustModuleIndexer.ts +5 -4
  361. package/src/plugins/validation/CallResolverValidator.ts +8 -7
  362. package/src/plugins/validation/DataFlowValidator.ts +16 -12
  363. package/src/plugins/validation/EvalBanValidator.ts +17 -16
  364. package/src/plugins/validation/GraphConnectivityValidator.ts +19 -23
  365. package/src/plugins/validation/NodeCreationValidator.ts +554 -0
  366. package/src/plugins/validation/SQLInjectionValidator.ts +61 -15
  367. package/src/plugins/validation/ShadowingDetector.ts +6 -5
  368. package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +12 -11
  369. package/src/plugins/vcs/GitPlugin.ts +40 -12
  370. package/src/plugins/vcs/VCSPlugin.ts +7 -5
  371. package/src/storage/backends/RFDBServerBackend.ts +43 -29
  372. package/src/validation/PathValidator.ts +1 -1
  373. package/dist/core/AnalysisWorker.d.ts +0 -14
  374. package/dist/core/AnalysisWorker.d.ts.map +0 -1
  375. package/dist/core/AnalysisWorker.js +0 -307
  376. package/dist/core/ParallelAnalyzer.d.ts +0 -120
  377. package/dist/core/ParallelAnalyzer.d.ts.map +0 -1
  378. package/dist/core/ParallelAnalyzer.js +0 -331
  379. package/dist/core/QueueWorker.d.ts +0 -12
  380. package/dist/core/QueueWorker.d.ts.map +0 -1
  381. package/dist/core/QueueWorker.js +0 -567
  382. package/dist/core/RFDBClient.d.ts +0 -179
  383. package/dist/core/RFDBClient.d.ts.map +0 -1
  384. package/dist/core/RFDBClient.js +0 -429
  385. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +0 -19
  386. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +0 -1
  387. package/dist/plugins/discovery/ZonServiceDiscovery.js +0 -204
  388. package/src/core/AnalysisWorker.ts +0 -410
  389. package/src/core/ParallelAnalyzer.ts +0 -476
  390. package/src/core/QueueWorker.ts +0 -780
  391. package/src/plugins/indexing/ServiceDetector.ts +0 -230
@@ -0,0 +1,65 @@
1
+ /**
2
+ * CoverageAnalyzer - Calculates analysis coverage for a project
3
+ *
4
+ * Determines which files in a project have been analyzed and categorizes
5
+ * files into three groups:
6
+ * - Analyzed: Files that appear as MODULE nodes in the graph
7
+ * - Unsupported: Files with extensions that no indexer can handle
8
+ * - Unreachable: Files with supported extensions but not in the graph
9
+ *
10
+ * Usage:
11
+ * const analyzer = new CoverageAnalyzer(graphBackend, '/path/to/project');
12
+ * const result = await analyzer.analyze();
13
+ */
14
+ import type { GraphBackend } from '@grafema/types';
15
+ /**
16
+ * Coverage analysis result
17
+ */
18
+ export interface CoverageResult {
19
+ projectPath: string;
20
+ total: number;
21
+ analyzed: {
22
+ count: number;
23
+ files: string[];
24
+ };
25
+ unsupported: {
26
+ count: number;
27
+ byExtension: Record<string, string[]>;
28
+ };
29
+ unreachable: {
30
+ count: number;
31
+ files: string[];
32
+ byExtension: Record<string, string[]>;
33
+ };
34
+ percentages: {
35
+ analyzed: number;
36
+ unsupported: number;
37
+ unreachable: number;
38
+ };
39
+ }
40
+ /**
41
+ * CoverageAnalyzer calculates what percentage of a codebase has been analyzed.
42
+ */
43
+ export declare class CoverageAnalyzer {
44
+ private graph;
45
+ private projectPath;
46
+ constructor(graph: GraphBackend, projectPath: string);
47
+ /**
48
+ * Analyze the project and return coverage statistics
49
+ */
50
+ analyze(): Promise<CoverageResult>;
51
+ /**
52
+ * Get list of analyzed files from the graph (MODULE nodes)
53
+ */
54
+ private getAnalyzedFiles;
55
+ /**
56
+ * Scan project directory for all code files
57
+ * Respects common ignore patterns (node_modules, .git, etc.)
58
+ */
59
+ private scanProjectFiles;
60
+ /**
61
+ * Recursively walk directory and collect code files
62
+ */
63
+ private walkDirectory;
64
+ }
65
+ //# sourceMappingURL=CoverageAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoverageAnalyzer.d.ts","sourceRoot":"","sources":["../../src/core/CoverageAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,gBAAgB,CAAC;AAwC/D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KACvC,CAAC;IACF,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KACvC,CAAC;IACF,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,WAAW,CAAS;gBAEhB,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM;IAKpD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC;IAsExC;;OAEG;YACW,gBAAgB;IAiB9B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,aAAa;CA0CtB"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * CoverageAnalyzer - Calculates analysis coverage for a project
3
+ *
4
+ * Determines which files in a project have been analyzed and categorizes
5
+ * files into three groups:
6
+ * - Analyzed: Files that appear as MODULE nodes in the graph
7
+ * - Unsupported: Files with extensions that no indexer can handle
8
+ * - Unreachable: Files with supported extensions but not in the graph
9
+ *
10
+ * Usage:
11
+ * const analyzer = new CoverageAnalyzer(graphBackend, '/path/to/project');
12
+ * const result = await analyzer.analyze();
13
+ */
14
+ import { readdirSync, existsSync, lstatSync } from 'fs';
15
+ import { join, relative, extname } from 'path';
16
+ /**
17
+ * Supported file extensions by language
18
+ */
19
+ const JS_SUPPORTED = ['.js', '.mjs', '.cjs', '.jsx', '.ts', '.tsx'];
20
+ const RUST_SUPPORTED = ['.rs'];
21
+ const SUPPORTED_EXTENSIONS = new Set([...JS_SUPPORTED, ...RUST_SUPPORTED]);
22
+ /**
23
+ * Known code file extensions (for scanning)
24
+ * Files with these extensions are considered source code
25
+ */
26
+ const CODE_EXTENSIONS = new Set([
27
+ // Supported
28
+ ...JS_SUPPORTED,
29
+ ...RUST_SUPPORTED,
30
+ // Unsupported but tracked
31
+ '.go', '.kt', '.java', '.py', '.rb', '.php', '.c', '.cpp', '.h', '.hpp',
32
+ '.cs', '.swift', '.scala', '.sql', '.graphql', '.gql',
33
+ ]);
34
+ /**
35
+ * Directories to always skip during scanning
36
+ */
37
+ const SKIP_DIRS = new Set([
38
+ 'node_modules',
39
+ '.git',
40
+ '.grafema',
41
+ 'dist',
42
+ 'build',
43
+ 'out',
44
+ 'coverage',
45
+ '.next',
46
+ '.nuxt',
47
+ '__pycache__',
48
+ 'target', // Rust
49
+ 'vendor',
50
+ ]);
51
+ /**
52
+ * CoverageAnalyzer calculates what percentage of a codebase has been analyzed.
53
+ */
54
+ export class CoverageAnalyzer {
55
+ graph;
56
+ projectPath;
57
+ constructor(graph, projectPath) {
58
+ this.graph = graph;
59
+ this.projectPath = projectPath;
60
+ }
61
+ /**
62
+ * Analyze the project and return coverage statistics
63
+ */
64
+ async analyze() {
65
+ // Step 1: Get all MODULE nodes from the graph
66
+ const analyzedFiles = await this.getAnalyzedFiles();
67
+ const analyzedSet = new Set(analyzedFiles);
68
+ // Step 2: Scan project for all code files
69
+ const allCodeFiles = this.scanProjectFiles();
70
+ // Step 3: Categorize files
71
+ const unsupportedByExt = {};
72
+ const unreachableByExt = {};
73
+ const unreachableFiles = [];
74
+ for (const file of allCodeFiles) {
75
+ if (analyzedSet.has(file)) {
76
+ continue; // Already analyzed
77
+ }
78
+ const ext = extname(file).toLowerCase();
79
+ if (SUPPORTED_EXTENSIONS.has(ext)) {
80
+ // Supported but not in graph = unreachable
81
+ unreachableFiles.push(file);
82
+ if (!unreachableByExt[ext]) {
83
+ unreachableByExt[ext] = [];
84
+ }
85
+ unreachableByExt[ext].push(file);
86
+ }
87
+ else {
88
+ // Not supported = unsupported
89
+ if (!unsupportedByExt[ext]) {
90
+ unsupportedByExt[ext] = [];
91
+ }
92
+ unsupportedByExt[ext].push(file);
93
+ }
94
+ }
95
+ // Calculate counts
96
+ const unsupportedCount = Object.values(unsupportedByExt)
97
+ .reduce((sum, files) => sum + files.length, 0);
98
+ const unreachableCount = unreachableFiles.length;
99
+ const analyzedCount = analyzedFiles.length;
100
+ const total = analyzedCount + unsupportedCount + unreachableCount;
101
+ // Calculate percentages (handle division by zero)
102
+ const percentages = {
103
+ analyzed: total > 0 ? Math.round((analyzedCount / total) * 100) : 0,
104
+ unsupported: total > 0 ? Math.round((unsupportedCount / total) * 100) : 0,
105
+ unreachable: total > 0 ? Math.round((unreachableCount / total) * 100) : 0,
106
+ };
107
+ return {
108
+ projectPath: this.projectPath,
109
+ total,
110
+ analyzed: {
111
+ count: analyzedCount,
112
+ files: analyzedFiles,
113
+ },
114
+ unsupported: {
115
+ count: unsupportedCount,
116
+ byExtension: unsupportedByExt,
117
+ },
118
+ unreachable: {
119
+ count: unreachableCount,
120
+ files: unreachableFiles,
121
+ byExtension: unreachableByExt,
122
+ },
123
+ percentages,
124
+ };
125
+ }
126
+ /**
127
+ * Get list of analyzed files from the graph (MODULE nodes)
128
+ */
129
+ async getAnalyzedFiles() {
130
+ const files = [];
131
+ // Use queryNodes with type: 'MODULE'
132
+ for await (const node of this.graph.queryNodes({ type: 'MODULE' })) {
133
+ if (node.file) {
134
+ // Store relative path for consistency
135
+ const relativePath = node.file.startsWith(this.projectPath)
136
+ ? relative(this.projectPath, node.file)
137
+ : node.file;
138
+ files.push(relativePath);
139
+ }
140
+ }
141
+ return files;
142
+ }
143
+ /**
144
+ * Scan project directory for all code files
145
+ * Respects common ignore patterns (node_modules, .git, etc.)
146
+ */
147
+ scanProjectFiles() {
148
+ const files = [];
149
+ this.walkDirectory(this.projectPath, files);
150
+ return files;
151
+ }
152
+ /**
153
+ * Recursively walk directory and collect code files
154
+ */
155
+ walkDirectory(dir, files, depth = 0) {
156
+ // Safety: limit recursion depth
157
+ if (depth > 20)
158
+ return;
159
+ if (!existsSync(dir))
160
+ return;
161
+ let entries;
162
+ try {
163
+ entries = readdirSync(dir);
164
+ }
165
+ catch {
166
+ return; // Skip directories we can't read
167
+ }
168
+ for (const entry of entries) {
169
+ // Skip hidden files and directories
170
+ if (entry.startsWith('.'))
171
+ continue;
172
+ // Skip known non-source directories
173
+ if (SKIP_DIRS.has(entry))
174
+ continue;
175
+ const fullPath = join(dir, entry);
176
+ // Skip symlinks to avoid infinite loops
177
+ try {
178
+ const stat = lstatSync(fullPath);
179
+ if (stat.isSymbolicLink())
180
+ continue;
181
+ if (stat.isDirectory()) {
182
+ this.walkDirectory(fullPath, files, depth + 1);
183
+ }
184
+ else if (stat.isFile()) {
185
+ const ext = extname(entry).toLowerCase();
186
+ if (CODE_EXTENSIONS.has(ext)) {
187
+ // Store relative path
188
+ files.push(relative(this.projectPath, fullPath));
189
+ }
190
+ }
191
+ }
192
+ catch {
193
+ // Skip files we can't stat
194
+ continue;
195
+ }
196
+ }
197
+ }
198
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * FileNodeManager - utility for idempotent file node clearing
3
+ *
4
+ * Problem: Multiple phases create nodes for the same file:
5
+ * - INDEXING creates MODULE nodes
6
+ * - ANALYSIS creates FUNCTION, CLASS, SCOPE, etc. nodes
7
+ *
8
+ * When re-analyzing with forceAnalysis=true, we need to clear existing
9
+ * nodes BEFORE any phase creates new nodes for that file.
10
+ *
11
+ * Solution: Track "touched" files. First touch clears all nodes for that file.
12
+ * Subsequent touches (from other phases) are no-ops.
13
+ */
14
+ import type { GraphBackend } from '@grafema/types';
15
+ /**
16
+ * Clear all nodes for a file if it hasn't been touched yet in this analysis run.
17
+ *
18
+ * Thread-safety note: The touchedFiles Set is shared across concurrent Promise.all
19
+ * calls, but this is safe because:
20
+ * 1. The check (has) and add are synchronous operations
21
+ * 2. We add to the set BEFORE the async clear operation
22
+ * 3. Other concurrent calls will see the file as touched immediately
23
+ *
24
+ * @param graph - Graph backend with deleteNode support
25
+ * @param file - Absolute file path to clear nodes for
26
+ * @param touchedFiles - Set tracking files already touched in this run
27
+ * @returns Number of nodes deleted (0 if file was already touched or backend doesn't support delete)
28
+ */
29
+ export declare function clearFileNodesIfNeeded(graph: GraphBackend, file: string, touchedFiles: Set<string>): Promise<number>;
30
+ /**
31
+ * Clear a SERVICE node by ID.
32
+ * SERVICE nodes have file=directory_path (not individual files), so they need
33
+ * explicit clearing separate from file-based clearing.
34
+ *
35
+ * @param graph - Graph backend with deleteNode support
36
+ * @param serviceId - SERVICE node ID (e.g., "SERVICE:apps/api")
37
+ * @returns true if node was deleted, false otherwise
38
+ */
39
+ export declare function clearServiceNodeIfExists(graph: GraphBackend, serviceId: string): Promise<boolean>;
40
+ //# sourceMappingURL=FileNodeManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileNodeManager.d.ts","sourceRoot":"","sources":["../../src/core/FileNodeManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GACxB,OAAO,CAAC,MAAM,CAAC,CAsCjB;AAED;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAalB"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * FileNodeManager - utility for idempotent file node clearing
3
+ *
4
+ * Problem: Multiple phases create nodes for the same file:
5
+ * - INDEXING creates MODULE nodes
6
+ * - ANALYSIS creates FUNCTION, CLASS, SCOPE, etc. nodes
7
+ *
8
+ * When re-analyzing with forceAnalysis=true, we need to clear existing
9
+ * nodes BEFORE any phase creates new nodes for that file.
10
+ *
11
+ * Solution: Track "touched" files. First touch clears all nodes for that file.
12
+ * Subsequent touches (from other phases) are no-ops.
13
+ */
14
+ /**
15
+ * Clear all nodes for a file if it hasn't been touched yet in this analysis run.
16
+ *
17
+ * Thread-safety note: The touchedFiles Set is shared across concurrent Promise.all
18
+ * calls, but this is safe because:
19
+ * 1. The check (has) and add are synchronous operations
20
+ * 2. We add to the set BEFORE the async clear operation
21
+ * 3. Other concurrent calls will see the file as touched immediately
22
+ *
23
+ * @param graph - Graph backend with deleteNode support
24
+ * @param file - Absolute file path to clear nodes for
25
+ * @param touchedFiles - Set tracking files already touched in this run
26
+ * @returns Number of nodes deleted (0 if file was already touched or backend doesn't support delete)
27
+ */
28
+ export async function clearFileNodesIfNeeded(graph, file, touchedFiles) {
29
+ // Already touched in this run - nothing to clear
30
+ if (touchedFiles.has(file)) {
31
+ return 0;
32
+ }
33
+ // Mark as touched BEFORE clearing (sync operation, makes subsequent concurrent calls no-op)
34
+ touchedFiles.add(file);
35
+ // Skip if backend doesn't support deletion
36
+ if (!graph.deleteNode) {
37
+ return 0;
38
+ }
39
+ // Collect all nodes for this file
40
+ const nodesToDelete = [];
41
+ for await (const node of graph.queryNodes({ file })) {
42
+ nodesToDelete.push(node.id);
43
+ }
44
+ // Delete all of them - NO EXCLUSIONS
45
+ // MODULE nodes will be recreated by INDEXING phase
46
+ // FUNCTION/CLASS/etc will be recreated by ANALYSIS phase
47
+ for (const id of nodesToDelete) {
48
+ try {
49
+ await graph.deleteNode(id);
50
+ }
51
+ catch (err) {
52
+ // Log but continue - node might already be deleted by concurrent operation
53
+ console.warn(`[FileNodeManager] Failed to delete ${id}:`, err.message);
54
+ }
55
+ }
56
+ if (nodesToDelete.length > 0) {
57
+ const fileName = file.split('/').pop() || file;
58
+ console.log(`[FileNodeManager] Cleared ${nodesToDelete.length} nodes for ${fileName}`);
59
+ }
60
+ return nodesToDelete.length;
61
+ }
62
+ /**
63
+ * Clear a SERVICE node by ID.
64
+ * SERVICE nodes have file=directory_path (not individual files), so they need
65
+ * explicit clearing separate from file-based clearing.
66
+ *
67
+ * @param graph - Graph backend with deleteNode support
68
+ * @param serviceId - SERVICE node ID (e.g., "SERVICE:apps/api")
69
+ * @returns true if node was deleted, false otherwise
70
+ */
71
+ export async function clearServiceNodeIfExists(graph, serviceId) {
72
+ if (!graph.deleteNode) {
73
+ return false;
74
+ }
75
+ try {
76
+ await graph.deleteNode(serviceId);
77
+ console.log(`[FileNodeManager] Cleared SERVICE node: ${serviceId}`);
78
+ return true;
79
+ }
80
+ catch (err) {
81
+ // Node might not exist on fresh analysis - that's OK
82
+ return false;
83
+ }
84
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * GraphFreshnessChecker - checks if graph data matches current files
3
+ *
4
+ * Compares contentHash stored in MODULE nodes against current file hashes.
5
+ * Used by `grafema check` to detect when files have changed since analysis.
6
+ */
7
+ import type { NodeRecord } from '@grafema/types';
8
+ export interface StaleModule {
9
+ id: string;
10
+ file: string;
11
+ storedHash: string;
12
+ currentHash: string | null;
13
+ reason: 'changed' | 'deleted' | 'unreadable';
14
+ }
15
+ export interface FreshnessResult {
16
+ isFresh: boolean;
17
+ staleModules: StaleModule[];
18
+ freshCount: number;
19
+ staleCount: number;
20
+ deletedCount: number;
21
+ checkDurationMs: number;
22
+ }
23
+ export interface FreshnessGraph {
24
+ queryNodes(query: {
25
+ type: string;
26
+ }): AsyncGenerator<NodeRecord, void, unknown>;
27
+ }
28
+ export declare class GraphFreshnessChecker {
29
+ checkFreshness(graph: FreshnessGraph): Promise<FreshnessResult>;
30
+ private _checkModuleFreshness;
31
+ private _fileExists;
32
+ }
33
+ //# sourceMappingURL=GraphFreshnessChecker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphFreshnessChecker.d.ts","sourceRoot":"","sources":["../../src/core/GraphFreshnessChecker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;CAC9C;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;CAChF;AAUD,qBAAa,qBAAqB;IAC1B,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;YAyDvD,qBAAqB;YAoCrB,WAAW;CAQ1B"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * GraphFreshnessChecker - checks if graph data matches current files
3
+ *
4
+ * Compares contentHash stored in MODULE nodes against current file hashes.
5
+ * Used by `grafema check` to detect when files have changed since analysis.
6
+ */
7
+ import { access, constants } from 'fs/promises';
8
+ import { calculateFileHashAsync } from './HashUtils.js';
9
+ const BATCH_SIZE = 50;
10
+ export class GraphFreshnessChecker {
11
+ async checkFreshness(graph) {
12
+ const startTime = Date.now();
13
+ const modules = [];
14
+ for await (const node of graph.queryNodes({ type: 'MODULE' })) {
15
+ if (node.file && typeof node.contentHash === 'string') {
16
+ modules.push({
17
+ id: node.id,
18
+ file: node.file,
19
+ contentHash: node.contentHash
20
+ });
21
+ }
22
+ }
23
+ if (modules.length === 0) {
24
+ return {
25
+ isFresh: true,
26
+ staleModules: [],
27
+ freshCount: 0,
28
+ staleCount: 0,
29
+ deletedCount: 0,
30
+ checkDurationMs: Date.now() - startTime
31
+ };
32
+ }
33
+ const staleModules = [];
34
+ let freshCount = 0;
35
+ let deletedCount = 0;
36
+ for (let i = 0; i < modules.length; i += BATCH_SIZE) {
37
+ const batch = modules.slice(i, i + BATCH_SIZE);
38
+ const results = await Promise.all(batch.map(module => this._checkModuleFreshness(module)));
39
+ for (const result of results) {
40
+ if (result === null) {
41
+ freshCount++;
42
+ }
43
+ else {
44
+ staleModules.push(result);
45
+ if (result.reason === 'deleted') {
46
+ deletedCount++;
47
+ }
48
+ }
49
+ }
50
+ }
51
+ return {
52
+ isFresh: staleModules.length === 0,
53
+ staleModules,
54
+ freshCount,
55
+ staleCount: staleModules.length,
56
+ deletedCount,
57
+ checkDurationMs: Date.now() - startTime
58
+ };
59
+ }
60
+ async _checkModuleFreshness(module) {
61
+ const exists = await this._fileExists(module.file);
62
+ if (!exists) {
63
+ return {
64
+ id: module.id,
65
+ file: module.file,
66
+ storedHash: module.contentHash,
67
+ currentHash: null,
68
+ reason: 'deleted'
69
+ };
70
+ }
71
+ const currentHash = await calculateFileHashAsync(module.file);
72
+ if (currentHash === null) {
73
+ return {
74
+ id: module.id,
75
+ file: module.file,
76
+ storedHash: module.contentHash,
77
+ currentHash: null,
78
+ reason: 'unreadable'
79
+ };
80
+ }
81
+ if (currentHash !== module.contentHash) {
82
+ return {
83
+ id: module.id,
84
+ file: module.file,
85
+ storedHash: module.contentHash,
86
+ currentHash,
87
+ reason: 'changed'
88
+ };
89
+ }
90
+ return null;
91
+ }
92
+ async _fileExists(filePath) {
93
+ try {
94
+ await access(filePath, constants.R_OK);
95
+ return true;
96
+ }
97
+ catch {
98
+ return false;
99
+ }
100
+ }
101
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * HashUtils - unified hash computation for Grafema
3
+ *
4
+ * WHY THIS EXISTS:
5
+ * - 6 copies of the same hash computation existed across the codebase
6
+ * - Single source of truth ensures consistent hashing everywhere
7
+ * - Makes future algorithm changes (e.g., SHA-256 -> BLAKE3) trivial
8
+ */
9
+ /**
10
+ * Calculate hash from a file path (synchronous).
11
+ * Returns null if file doesn't exist or is unreadable.
12
+ */
13
+ export declare function calculateFileHash(filePath: string): string | null;
14
+ /**
15
+ * Calculate hash from a file path (asynchronous).
16
+ * Returns null if file doesn't exist or is unreadable.
17
+ */
18
+ export declare function calculateFileHashAsync(filePath: string): Promise<string | null>;
19
+ /**
20
+ * Calculate hash from content string.
21
+ * Always returns a hash (never null).
22
+ */
23
+ export declare function calculateContentHash(content: string): string;
24
+ //# sourceMappingURL=HashUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HashUtils.d.ts","sourceRoot":"","sources":["../../src/core/HashUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOjE;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOrF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * HashUtils - unified hash computation for Grafema
3
+ *
4
+ * WHY THIS EXISTS:
5
+ * - 6 copies of the same hash computation existed across the codebase
6
+ * - Single source of truth ensures consistent hashing everywhere
7
+ * - Makes future algorithm changes (e.g., SHA-256 -> BLAKE3) trivial
8
+ */
9
+ import { createHash } from 'crypto';
10
+ import { readFileSync } from 'fs';
11
+ import { readFile } from 'fs/promises';
12
+ const HASH_ALGORITHM = 'sha256';
13
+ /**
14
+ * Calculate hash from a file path (synchronous).
15
+ * Returns null if file doesn't exist or is unreadable.
16
+ */
17
+ export function calculateFileHash(filePath) {
18
+ try {
19
+ const content = readFileSync(filePath, 'utf-8');
20
+ return createHash(HASH_ALGORITHM).update(content).digest('hex');
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ /**
27
+ * Calculate hash from a file path (asynchronous).
28
+ * Returns null if file doesn't exist or is unreadable.
29
+ */
30
+ export async function calculateFileHashAsync(filePath) {
31
+ try {
32
+ const content = await readFile(filePath, 'utf-8');
33
+ return createHash(HASH_ALGORITHM).update(content).digest('hex');
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ /**
40
+ * Calculate hash from content string.
41
+ * Always returns a hash (never null).
42
+ */
43
+ export function calculateContentHash(content) {
44
+ return createHash(HASH_ALGORITHM).update(content).digest('hex');
45
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * IncrementalReanalyzer - selective re-analysis of stale modules
3
+ *
4
+ * HOW IT WORKS:
5
+ * 1. Clear all nodes for stale files (using clearFileNodesIfNeeded)
6
+ * 2. Re-create MODULE nodes with updated contentHash
7
+ * 3. Run JSASTAnalyzer.analyzeModule() for each stale module
8
+ * 4. Re-run enrichment plugins to rebuild cross-file edges
9
+ */
10
+ import type { GraphBackend } from '@grafema/types';
11
+ import type { StaleModule } from './GraphFreshnessChecker.js';
12
+ export interface ReanalysisOptions {
13
+ skipEnrichment?: boolean;
14
+ onProgress?: (info: ReanalysisProgress) => void;
15
+ }
16
+ export interface ReanalysisProgress {
17
+ phase: 'clearing' | 'indexing' | 'analysis' | 'enrichment';
18
+ current: number;
19
+ total: number;
20
+ currentFile?: string;
21
+ }
22
+ export interface ReanalysisResult {
23
+ modulesReanalyzed: number;
24
+ modulesDeleted: number;
25
+ nodesCreated: number;
26
+ edgesCreated: number;
27
+ nodesCleared: number;
28
+ durationMs: number;
29
+ }
30
+ export declare class IncrementalReanalyzer {
31
+ private graph;
32
+ private projectPath;
33
+ constructor(graph: GraphBackend, projectPath: string);
34
+ reanalyze(staleModules: StaleModule[], options?: ReanalysisOptions): Promise<ReanalysisResult>;
35
+ }
36
+ //# sourceMappingURL=IncrementalReanalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncrementalReanalyzer.d.ts","sourceRoot":"","sources":["../../src/core/IncrementalReanalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAYD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,WAAW,CAAS;gBAEhB,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM;IAK9C,SAAS,CACb,YAAY,EAAE,WAAW,EAAE,EAC3B,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC;CAkI7B"}