@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
@@ -1,780 +0,0 @@
1
- /**
2
- * QueueWorker - Worker thread for queue-based analysis
3
- *
4
- * Runs in a worker_thread, receives file tasks, runs applicable plugins,
5
- * writes results directly to RFDB.
6
- *
7
- * Protocol:
8
- * Main -> Worker: { type: 'process', taskId, file, moduleId, moduleName, plugins }
9
- * Worker -> Main: { type: 'done', taskId, stats } | { type: 'error', taskId, error }
10
- */
11
-
12
- import { parentPort, workerData } from 'worker_threads';
13
- import { readFileSync } from 'fs';
14
- import { parse, ParserPlugin } from '@babel/parser';
15
- import traverseModule from '@babel/traverse';
16
- import type { NodePath } from '@babel/traverse';
17
- import type * as t from '@babel/types';
18
-
19
- import { RFDBClient } from '@grafema/rfdb-client';
20
- import type { WireNode, WireEdge } from '@grafema/types';
21
-
22
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
- const traverse = (traverseModule as any).default || traverseModule;
24
-
25
- // === MESSAGE TYPES ===
26
- interface ProcessMessage {
27
- type: 'process';
28
- taskId: string;
29
- file: string;
30
- moduleId: string;
31
- moduleName: string;
32
- plugins: string[];
33
- }
34
-
35
- interface ExitMessage {
36
- type: 'exit';
37
- }
38
-
39
- type IncomingMessage = ProcessMessage | ExitMessage;
40
-
41
- interface ReadyMessage {
42
- type: 'ready';
43
- workerId: number;
44
- }
45
-
46
- interface DoneMessage {
47
- type: 'done';
48
- taskId: string;
49
- file: string;
50
- stats: PluginStats;
51
- workerId: number;
52
- }
53
-
54
- interface ErrorMessage {
55
- type: 'error';
56
- taskId?: string;
57
- file?: string;
58
- error: string;
59
- workerId?: number;
60
- }
61
-
62
- type OutgoingMessage = ReadyMessage | DoneMessage | ErrorMessage;
63
-
64
- // === STATS TYPES ===
65
- interface SinglePluginStats {
66
- nodes?: number;
67
- edges?: number;
68
- routes?: number;
69
- error?: string;
70
- }
71
-
72
- interface PluginStats {
73
- nodes: number;
74
- edges: number;
75
- plugins: Record<string, SinglePluginStats>;
76
- }
77
-
78
- // === INTERNAL NODE/EDGE TYPES ===
79
- interface GraphNode {
80
- id: string;
81
- type: string;
82
- name: string;
83
- file: string;
84
- line?: number;
85
- [key: string]: unknown;
86
- }
87
-
88
- interface GraphEdge {
89
- src: string;
90
- dst: string;
91
- type: string;
92
- }
93
-
94
- // === PLUGIN ANALYZER TYPE ===
95
- type PluginAnalyzer = (
96
- filePath: string,
97
- moduleId: string,
98
- moduleName: string,
99
- ast: t.File,
100
- client: RFDBClient
101
- ) => Promise<SinglePluginStats>;
102
-
103
- // Worker state
104
- let client: RFDBClient | null = null;
105
- const workerId: number = (workerData as { workerId?: number })?.workerId || 0;
106
- const socketPath: string = (workerData as { socketPath?: string })?.socketPath || '/tmp/rfdb.sock';
107
- let connected = false;
108
-
109
- // Plugin registry - maps plugin names to analyzer functions
110
- const pluginAnalyzers = new Map<string, PluginAnalyzer>();
111
-
112
- /**
113
- * Register built-in analysis plugins
114
- */
115
- function registerBuiltinPlugins(): void {
116
- pluginAnalyzers.set('JSASTAnalyzer', analyzeJSAST);
117
- pluginAnalyzers.set('ExpressRouteAnalyzer', analyzeExpressRoutes);
118
- pluginAnalyzers.set('SocketIOAnalyzer', analyzeSocketIO);
119
- pluginAnalyzers.set('DatabaseAnalyzer', analyzeDatabase);
120
- pluginAnalyzers.set('FetchAnalyzer', analyzeFetch);
121
- pluginAnalyzers.set('ReactAnalyzer', analyzeReact);
122
- }
123
-
124
- /**
125
- * Connect to RFDB server
126
- */
127
- async function connect(): Promise<void> {
128
- if (connected) return;
129
-
130
- client = new RFDBClient(socketPath);
131
- await client.connect();
132
- connected = true;
133
-
134
- registerBuiltinPlugins();
135
- parentPort?.postMessage({ type: 'ready', workerId } as ReadyMessage);
136
- }
137
-
138
- /**
139
- * Process a file with specified plugins
140
- */
141
- async function processFile(
142
- taskId: string,
143
- filePath: string,
144
- moduleId: string,
145
- moduleName: string,
146
- pluginNames: string[]
147
- ): Promise<PluginStats> {
148
- const stats: PluginStats = {
149
- nodes: 0,
150
- edges: 0,
151
- plugins: {},
152
- };
153
-
154
- try {
155
- const code = readFileSync(filePath, 'utf-8');
156
- const ast = parse(code, {
157
- sourceType: 'module',
158
- plugins: ['jsx', 'typescript'] as ParserPlugin[],
159
- errorRecovery: true,
160
- });
161
-
162
- for (const pluginName of pluginNames) {
163
- const analyzer = pluginAnalyzers.get(pluginName);
164
- if (!analyzer) {
165
- console.warn(`[Worker ${workerId}] Unknown plugin: ${pluginName}`);
166
- continue;
167
- }
168
-
169
- try {
170
- const pluginStats = await analyzer(filePath, moduleId, moduleName, ast, client!);
171
- stats.nodes += pluginStats.nodes || 0;
172
- stats.edges += pluginStats.edges || 0;
173
- stats.plugins[pluginName] = pluginStats;
174
- } catch (err) {
175
- console.error(`[Worker ${workerId}] Plugin ${pluginName} error on ${filePath}:`, (err as Error).message);
176
- stats.plugins[pluginName] = { error: (err as Error).message };
177
- }
178
- }
179
-
180
- return stats;
181
- } catch (err) {
182
- throw new Error(`Failed to process ${filePath}: ${(err as Error).message}`);
183
- }
184
- }
185
-
186
- // =============================================================================
187
- // Plugin Implementations
188
- // =============================================================================
189
-
190
- /**
191
- * JSASTAnalyzer - Base AST analysis
192
- */
193
- async function analyzeJSAST(
194
- filePath: string,
195
- moduleId: string,
196
- moduleName: string,
197
- ast: t.File,
198
- client: RFDBClient
199
- ): Promise<SinglePluginStats> {
200
- const nodes: GraphNode[] = [];
201
- const edges: GraphEdge[] = [];
202
- let callCounter = 0;
203
-
204
- nodes.push({
205
- id: moduleId,
206
- type: 'MODULE',
207
- name: moduleName,
208
- file: filePath,
209
- });
210
-
211
- // Extract imports
212
- traverse(ast, {
213
- ImportDeclaration(path: NodePath<t.ImportDeclaration>) {
214
- const node = path.node;
215
- const source = node.source.value;
216
-
217
- node.specifiers.forEach((spec) => {
218
- let importedName: string;
219
- let localName: string;
220
-
221
- if (spec.type === 'ImportDefaultSpecifier') {
222
- importedName = 'default';
223
- localName = spec.local.name;
224
- } else if (spec.type === 'ImportNamespaceSpecifier') {
225
- importedName = '*';
226
- localName = spec.local.name;
227
- } else {
228
- const imported = spec.imported;
229
- importedName = imported.type === 'Identifier' ? imported.name : imported.value;
230
- localName = spec.local.name;
231
- }
232
-
233
- const importId = `IMPORT#${localName}#${filePath}#${node.loc?.start.line || 0}`;
234
- nodes.push({
235
- id: importId,
236
- type: 'IMPORT',
237
- name: localName,
238
- file: filePath,
239
- line: node.loc?.start.line || 0,
240
- importedName,
241
- source,
242
- });
243
-
244
- edges.push({ src: moduleId, dst: importId, type: 'CONTAINS' });
245
- });
246
- },
247
- });
248
-
249
- // Extract functions
250
- traverse(ast, {
251
- FunctionDeclaration(path: NodePath<t.FunctionDeclaration>) {
252
- if (path.getFunctionParent()) return;
253
-
254
- const node = path.node;
255
- if (!node.id) return;
256
-
257
- const funcName = node.id.name;
258
- const line = node.loc?.start.line || 0;
259
- const functionId = `FUNCTION#${funcName}#${filePath}#${line}`;
260
-
261
- nodes.push({
262
- id: functionId,
263
- type: 'FUNCTION',
264
- name: funcName,
265
- file: filePath,
266
- line,
267
- async: node.async || false,
268
- generator: node.generator || false,
269
- exported: path.parent?.type?.includes('Export') || false,
270
- });
271
-
272
- edges.push({ src: moduleId, dst: functionId, type: 'CONTAINS' });
273
-
274
- // Extract parameters
275
- node.params.forEach((param, index) => {
276
- if (param.type === 'Identifier') {
277
- const paramId = `PARAMETER#${param.name}#${functionId}#${index}`;
278
- nodes.push({
279
- id: paramId,
280
- type: 'PARAMETER',
281
- name: param.name,
282
- file: filePath,
283
- index,
284
- });
285
- edges.push({ src: functionId, dst: paramId, type: 'HAS_PARAMETER' });
286
- }
287
- });
288
- },
289
-
290
- ArrowFunctionExpression(path: NodePath<t.ArrowFunctionExpression>) {
291
- if (path.getFunctionParent()) return;
292
- const parent = path.parent;
293
- if (parent.type !== 'VariableDeclarator') return;
294
- const varDecl = parent as t.VariableDeclarator;
295
- if (!varDecl.id || varDecl.id.type !== 'Identifier') return;
296
-
297
- const funcName = varDecl.id.name;
298
- const line = path.node.loc?.start.line || 0;
299
- const functionId = `FUNCTION#${funcName}#${filePath}#${line}`;
300
-
301
- nodes.push({
302
- id: functionId,
303
- type: 'FUNCTION',
304
- name: funcName,
305
- file: filePath,
306
- line,
307
- async: path.node.async || false,
308
- arrowFunction: true,
309
- });
310
-
311
- edges.push({ src: moduleId, dst: functionId, type: 'CONTAINS' });
312
- },
313
- });
314
-
315
- // Extract classes
316
- traverse(ast, {
317
- ClassDeclaration(path: NodePath<t.ClassDeclaration>) {
318
- if (path.getFunctionParent()) return;
319
-
320
- const node = path.node;
321
- if (!node.id) return;
322
-
323
- const className = node.id.name;
324
- const line = node.loc?.start.line || 0;
325
- const classId = `CLASS#${className}#${filePath}#${line}`;
326
-
327
- nodes.push({
328
- id: classId,
329
- type: 'CLASS',
330
- name: className,
331
- file: filePath,
332
- line,
333
- superClass: node.superClass && node.superClass.type === 'Identifier' ? node.superClass.name : null,
334
- });
335
-
336
- edges.push({ src: moduleId, dst: classId, type: 'CONTAINS' });
337
-
338
- // Extract methods
339
- node.body.body.forEach((member) => {
340
- if (member.type === 'ClassMethod' && member.key.type === 'Identifier') {
341
- const methodName = member.key.name;
342
- const methodLine = member.loc?.start.line || 0;
343
- const methodId = `METHOD#${className}.${methodName}#${filePath}#${methodLine}`;
344
-
345
- nodes.push({
346
- id: methodId,
347
- type: 'METHOD',
348
- name: methodName,
349
- file: filePath,
350
- line: methodLine,
351
- className,
352
- async: member.async || false,
353
- static: member.static || false,
354
- isConstructor: member.kind === 'constructor',
355
- });
356
-
357
- edges.push({ src: classId, dst: methodId, type: 'CONTAINS' });
358
- }
359
- });
360
- },
361
- });
362
-
363
- // Extract call expressions
364
- traverse(ast, {
365
- CallExpression(path: NodePath<t.CallExpression>) {
366
- const node = path.node;
367
-
368
- if (node.callee.type === 'Identifier') {
369
- const line = node.loc?.start.line || 0;
370
- const callId = `CALL#${node.callee.name}#${filePath}#${line}:${callCounter++}`;
371
-
372
- nodes.push({
373
- id: callId,
374
- type: 'CALL',
375
- name: node.callee.name,
376
- file: filePath,
377
- line,
378
- argsCount: node.arguments.length,
379
- });
380
-
381
- const parentFunc = path.getFunctionParent();
382
- if (parentFunc) {
383
- const parentNode = parentFunc.node as t.FunctionDeclaration | t.ArrowFunctionExpression;
384
- const parentName = (parentNode as t.FunctionDeclaration).id?.name ||
385
- ((parentFunc.parent as t.VariableDeclarator)?.id as t.Identifier)?.name ||
386
- 'anonymous';
387
- const parentLine = parentNode.loc?.start.line || 0;
388
- edges.push({
389
- src: `FUNCTION#${parentName}#${filePath}#${parentLine}`,
390
- dst: callId,
391
- type: 'CONTAINS'
392
- });
393
- } else {
394
- edges.push({ src: moduleId, dst: callId, type: 'CONTAINS' });
395
- }
396
- }
397
- },
398
- });
399
-
400
- if (nodes.length > 0) {
401
- await client.addNodes(nodes as Parameters<typeof client.addNodes>[0]);
402
- }
403
- if (edges.length > 0) {
404
- await client.addEdges(edges as Parameters<typeof client.addEdges>[0], true);
405
- }
406
-
407
- return { nodes: nodes.length, edges: edges.length };
408
- }
409
-
410
- /**
411
- * ExpressRouteAnalyzer - HTTP routes
412
- */
413
- async function analyzeExpressRoutes(
414
- filePath: string,
415
- moduleId: string,
416
- _moduleName: string,
417
- ast: t.File,
418
- client: RFDBClient
419
- ): Promise<SinglePluginStats> {
420
- const nodes: GraphNode[] = [];
421
- const edges: GraphEdge[] = [];
422
- const HTTP_METHODS = ['get', 'post', 'put', 'delete', 'patch', 'options', 'head', 'all'];
423
-
424
- traverse(ast, {
425
- CallExpression(path: NodePath<t.CallExpression>) {
426
- const node = path.node;
427
-
428
- if (node.callee.type === 'MemberExpression' &&
429
- node.callee.property?.type === 'Identifier' &&
430
- HTTP_METHODS.includes(node.callee.property.name)) {
431
-
432
- const method = node.callee.property.name.toUpperCase();
433
- const pathArg = node.arguments[0];
434
-
435
- if (pathArg?.type === 'StringLiteral') {
436
- const routePath = pathArg.value;
437
- const line = node.loc?.start.line || 0;
438
- const routeId = `http:route#${method}#${routePath}#${filePath}#${line}`;
439
-
440
- nodes.push({
441
- id: routeId,
442
- type: 'http:route',
443
- name: `${method} ${routePath}`,
444
- method,
445
- path: routePath,
446
- file: filePath,
447
- line,
448
- });
449
-
450
- edges.push({ src: moduleId, dst: routeId, type: 'CONTAINS' });
451
- }
452
- }
453
- },
454
- });
455
-
456
- if (nodes.length > 0) {
457
- await client.addNodes(nodes as Parameters<typeof client.addNodes>[0]);
458
- }
459
- if (edges.length > 0) {
460
- await client.addEdges(edges as Parameters<typeof client.addEdges>[0], true);
461
- }
462
-
463
- return { nodes: nodes.length, edges: edges.length, routes: nodes.length };
464
- }
465
-
466
- /**
467
- * SocketIOAnalyzer - Socket.IO events
468
- */
469
- async function analyzeSocketIO(
470
- filePath: string,
471
- moduleId: string,
472
- _moduleName: string,
473
- ast: t.File,
474
- client: RFDBClient
475
- ): Promise<SinglePluginStats> {
476
- const nodes: GraphNode[] = [];
477
- const edges: GraphEdge[] = [];
478
-
479
- traverse(ast, {
480
- CallExpression(path: NodePath<t.CallExpression>) {
481
- const node = path.node;
482
-
483
- if (node.callee.type === 'MemberExpression' &&
484
- node.callee.property?.type === 'Identifier') {
485
-
486
- const method = node.callee.property.name;
487
- const line = node.loc?.start.line || 0;
488
-
489
- if (method === 'on' && node.arguments[0]?.type === 'StringLiteral') {
490
- const eventName = node.arguments[0].value;
491
- const eventId = `socketio:on#${eventName}#${filePath}#${line}`;
492
-
493
- nodes.push({
494
- id: eventId,
495
- type: 'socketio:on',
496
- name: eventName,
497
- file: filePath,
498
- line,
499
- });
500
-
501
- edges.push({ src: moduleId, dst: eventId, type: 'CONTAINS' });
502
- }
503
-
504
- if (method === 'emit' && node.arguments[0]?.type === 'StringLiteral') {
505
- const eventName = node.arguments[0].value;
506
- const eventId = `socketio:emit#${eventName}#${filePath}#${line}`;
507
-
508
- nodes.push({
509
- id: eventId,
510
- type: 'socketio:emit',
511
- name: eventName,
512
- file: filePath,
513
- line,
514
- });
515
-
516
- edges.push({ src: moduleId, dst: eventId, type: 'CONTAINS' });
517
- }
518
- }
519
- },
520
- });
521
-
522
- if (nodes.length > 0) {
523
- await client.addNodes(nodes as Parameters<typeof client.addNodes>[0]);
524
- }
525
- if (edges.length > 0) {
526
- await client.addEdges(edges as Parameters<typeof client.addEdges>[0], true);
527
- }
528
-
529
- return { nodes: nodes.length, edges: edges.length };
530
- }
531
-
532
- /**
533
- * DatabaseAnalyzer - SQL queries
534
- */
535
- async function analyzeDatabase(
536
- filePath: string,
537
- moduleId: string,
538
- _moduleName: string,
539
- ast: t.File,
540
- client: RFDBClient
541
- ): Promise<SinglePluginStats> {
542
- const nodes: GraphNode[] = [];
543
- const edges: GraphEdge[] = [];
544
-
545
- traverse(ast, {
546
- CallExpression(path: NodePath<t.CallExpression>) {
547
- const node = path.node;
548
-
549
- if (node.callee.type === 'MemberExpression' &&
550
- node.callee.property?.type === 'Identifier') {
551
-
552
- const method = node.callee.property.name;
553
-
554
- if (method === 'query' && node.arguments[0]?.type === 'StringLiteral') {
555
- const sql = node.arguments[0].value;
556
- const line = node.loc?.start.line || 0;
557
- const queryId = `db:query#${filePath}#${line}`;
558
-
559
- nodes.push({
560
- id: queryId,
561
- type: 'db:query',
562
- name: sql.slice(0, 50) + (sql.length > 50 ? '...' : ''),
563
- sql,
564
- file: filePath,
565
- line,
566
- });
567
-
568
- edges.push({ src: moduleId, dst: queryId, type: 'CONTAINS' });
569
- }
570
- }
571
- },
572
- });
573
-
574
- if (nodes.length > 0) {
575
- await client.addNodes(nodes as Parameters<typeof client.addNodes>[0]);
576
- }
577
- if (edges.length > 0) {
578
- await client.addEdges(edges as Parameters<typeof client.addEdges>[0], true);
579
- }
580
-
581
- return { nodes: nodes.length, edges: edges.length };
582
- }
583
-
584
- /**
585
- * FetchAnalyzer - HTTP requests
586
- */
587
- async function analyzeFetch(
588
- filePath: string,
589
- moduleId: string,
590
- _moduleName: string,
591
- ast: t.File,
592
- client: RFDBClient
593
- ): Promise<SinglePluginStats> {
594
- const nodes: GraphNode[] = [];
595
- const edges: GraphEdge[] = [];
596
-
597
- traverse(ast, {
598
- CallExpression(path: NodePath<t.CallExpression>) {
599
- const node = path.node;
600
- const line = node.loc?.start.line || 0;
601
-
602
- if (node.callee.type === 'Identifier' && node.callee.name === 'fetch') {
603
- const urlArg = node.arguments[0];
604
- const url = urlArg?.type === 'StringLiteral' ? urlArg.value : '<dynamic>';
605
-
606
- const requestId = `http:request#${filePath}#${line}`;
607
-
608
- nodes.push({
609
- id: requestId,
610
- type: 'http:request',
611
- name: `fetch ${url.slice(0, 40)}`,
612
- url,
613
- file: filePath,
614
- line,
615
- });
616
-
617
- edges.push({ src: moduleId, dst: requestId, type: 'CONTAINS' });
618
- }
619
-
620
- if (node.callee.type === 'MemberExpression' &&
621
- node.callee.object?.type === 'Identifier' &&
622
- node.callee.object.name === 'axios') {
623
- const prop = node.callee.property;
624
- const method = (prop?.type === 'Identifier' ? prop.name : 'request').toUpperCase();
625
- const urlArg = node.arguments[0];
626
- const url = urlArg?.type === 'StringLiteral' ? urlArg.value : '<dynamic>';
627
-
628
- const requestId = `http:request#${filePath}#${line}`;
629
-
630
- nodes.push({
631
- id: requestId,
632
- type: 'http:request',
633
- name: `${method} ${url.slice(0, 40)}`,
634
- url,
635
- method,
636
- file: filePath,
637
- line,
638
- });
639
-
640
- edges.push({ src: moduleId, dst: requestId, type: 'CONTAINS' });
641
- }
642
- },
643
- });
644
-
645
- if (nodes.length > 0) {
646
- await client.addNodes(nodes as Parameters<typeof client.addNodes>[0]);
647
- }
648
- if (edges.length > 0) {
649
- await client.addEdges(edges as Parameters<typeof client.addEdges>[0], true);
650
- }
651
-
652
- return { nodes: nodes.length, edges: edges.length };
653
- }
654
-
655
- /**
656
- * ReactAnalyzer - React components
657
- */
658
- async function analyzeReact(
659
- filePath: string,
660
- moduleId: string,
661
- _moduleName: string,
662
- ast: t.File,
663
- client: RFDBClient
664
- ): Promise<SinglePluginStats> {
665
- const nodes: GraphNode[] = [];
666
- const edges: GraphEdge[] = [];
667
-
668
- traverse(ast, {
669
- FunctionDeclaration(path: NodePath<t.FunctionDeclaration>) {
670
- const node = path.node;
671
- if (!node.id) return;
672
-
673
- const name = node.id.name;
674
- if (name[0] === name[0].toUpperCase()) {
675
- let returnsJSX = false;
676
- path.traverse({
677
- ReturnStatement(retPath: NodePath<t.ReturnStatement>) {
678
- if (retPath.node.argument?.type === 'JSXElement' ||
679
- retPath.node.argument?.type === 'JSXFragment') {
680
- returnsJSX = true;
681
- }
682
- },
683
- });
684
-
685
- if (returnsJSX) {
686
- const line = node.loc?.start.line || 0;
687
- const componentId = `react:component#${name}#${filePath}#${line}`;
688
- nodes.push({
689
- id: componentId,
690
- type: 'react:component',
691
- name,
692
- file: filePath,
693
- line,
694
- });
695
- edges.push({ src: moduleId, dst: componentId, type: 'CONTAINS' });
696
- }
697
- }
698
- },
699
-
700
- CallExpression(path: NodePath<t.CallExpression>) {
701
- const node = path.node;
702
- if (node.callee.type === 'Identifier' && node.callee.name.startsWith('use')) {
703
- const hookName = node.callee.name;
704
- const line = node.loc?.start.line || 0;
705
- const hookId = `react:hook#${hookName}#${filePath}#${line}`;
706
-
707
- let hookType = 'react:hook';
708
- if (hookName === 'useState') hookType = 'react:state';
709
- if (hookName === 'useEffect' || hookName === 'useLayoutEffect') hookType = 'react:effect';
710
- if (hookName === 'useRef') hookType = 'react:ref';
711
-
712
- nodes.push({
713
- id: hookId,
714
- type: hookType,
715
- name: hookName,
716
- file: filePath,
717
- line,
718
- });
719
-
720
- edges.push({ src: moduleId, dst: hookId, type: 'CONTAINS' });
721
- }
722
- },
723
- });
724
-
725
- if (nodes.length > 0) {
726
- await client.addNodes(nodes as Parameters<typeof client.addNodes>[0]);
727
- }
728
- if (edges.length > 0) {
729
- await client.addEdges(edges as Parameters<typeof client.addEdges>[0], true);
730
- }
731
-
732
- return { nodes: nodes.length, edges: edges.length };
733
- }
734
-
735
- // =============================================================================
736
- // Message Handler
737
- // =============================================================================
738
-
739
- parentPort?.on('message', async (msg: IncomingMessage) => {
740
- switch (msg.type) {
741
- case 'process':
742
- try {
743
- const stats = await processFile(
744
- msg.taskId,
745
- msg.file,
746
- msg.moduleId,
747
- msg.moduleName,
748
- msg.plugins
749
- );
750
- parentPort?.postMessage({
751
- type: 'done',
752
- taskId: msg.taskId,
753
- file: msg.file,
754
- stats,
755
- workerId,
756
- } as DoneMessage);
757
- } catch (err) {
758
- parentPort?.postMessage({
759
- type: 'error',
760
- taskId: msg.taskId,
761
- file: msg.file,
762
- error: (err as Error).message,
763
- workerId,
764
- } as ErrorMessage);
765
- }
766
- break;
767
-
768
- case 'exit':
769
- if (client) {
770
- await client.close();
771
- }
772
- process.exit(0);
773
- break;
774
- }
775
- });
776
-
777
- // Auto-connect on start
778
- connect().catch((err: Error) => {
779
- parentPort?.postMessage({ type: 'error', error: err.message } as ErrorMessage);
780
- });