@grafema/core 0.1.0-alpha.1

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 (402) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +76 -0
  3. package/dist/Orchestrator.d.ts +142 -0
  4. package/dist/Orchestrator.d.ts.map +1 -0
  5. package/dist/Orchestrator.js +481 -0
  6. package/dist/api/GraphAPI.d.ts +87 -0
  7. package/dist/api/GraphAPI.d.ts.map +1 -0
  8. package/dist/api/GraphAPI.js +210 -0
  9. package/dist/api/GuaranteeAPI.d.ts +147 -0
  10. package/dist/api/GuaranteeAPI.d.ts.map +1 -0
  11. package/dist/api/GuaranteeAPI.js +288 -0
  12. package/dist/core/ASTWorker.d.ts +133 -0
  13. package/dist/core/ASTWorker.d.ts.map +1 -0
  14. package/dist/core/ASTWorker.js +352 -0
  15. package/dist/core/ASTWorkerPool.d.ts +85 -0
  16. package/dist/core/ASTWorkerPool.d.ts.map +1 -0
  17. package/dist/core/ASTWorkerPool.js +207 -0
  18. package/dist/core/AnalysisQueue.d.ts +104 -0
  19. package/dist/core/AnalysisQueue.d.ts.map +1 -0
  20. package/dist/core/AnalysisQueue.js +299 -0
  21. package/dist/core/AnalysisWorker.d.ts +14 -0
  22. package/dist/core/AnalysisWorker.d.ts.map +1 -0
  23. package/dist/core/AnalysisWorker.js +307 -0
  24. package/dist/core/GraphBackend.d.ts +156 -0
  25. package/dist/core/GraphBackend.d.ts.map +1 -0
  26. package/dist/core/GraphBackend.js +85 -0
  27. package/dist/core/GuaranteeManager.d.ts +230 -0
  28. package/dist/core/GuaranteeManager.d.ts.map +1 -0
  29. package/dist/core/GuaranteeManager.js +352 -0
  30. package/dist/core/ManifestStore.d.ts +71 -0
  31. package/dist/core/ManifestStore.d.ts.map +1 -0
  32. package/dist/core/ManifestStore.js +146 -0
  33. package/dist/core/NodeFactory.d.ts +160 -0
  34. package/dist/core/NodeFactory.d.ts.map +1 -0
  35. package/dist/core/NodeFactory.js +137 -0
  36. package/dist/core/NodeId.d.ts +88 -0
  37. package/dist/core/NodeId.d.ts.map +1 -0
  38. package/dist/core/NodeId.js +170 -0
  39. package/dist/core/ParallelAnalyzer.d.ts +120 -0
  40. package/dist/core/ParallelAnalyzer.d.ts.map +1 -0
  41. package/dist/core/ParallelAnalyzer.js +331 -0
  42. package/dist/core/PriorityQueue.d.ts +106 -0
  43. package/dist/core/PriorityQueue.d.ts.map +1 -0
  44. package/dist/core/PriorityQueue.js +168 -0
  45. package/dist/core/Profiler.d.ts +75 -0
  46. package/dist/core/Profiler.d.ts.map +1 -0
  47. package/dist/core/Profiler.js +149 -0
  48. package/dist/core/QueueWorker.d.ts +12 -0
  49. package/dist/core/QueueWorker.d.ts.map +1 -0
  50. package/dist/core/QueueWorker.js +567 -0
  51. package/dist/core/RFDBClient.d.ts +179 -0
  52. package/dist/core/RFDBClient.d.ts.map +1 -0
  53. package/dist/core/RFDBClient.js +429 -0
  54. package/dist/core/Task.d.ts +56 -0
  55. package/dist/core/Task.d.ts.map +1 -0
  56. package/dist/core/Task.js +85 -0
  57. package/dist/core/TaskTypes.d.ts +20 -0
  58. package/dist/core/TaskTypes.d.ts.map +1 -0
  59. package/dist/core/TaskTypes.js +10 -0
  60. package/dist/core/VersionManager.d.ts +166 -0
  61. package/dist/core/VersionManager.d.ts.map +1 -0
  62. package/dist/core/VersionManager.js +237 -0
  63. package/dist/core/WorkerPool.d.ts +82 -0
  64. package/dist/core/WorkerPool.d.ts.map +1 -0
  65. package/dist/core/WorkerPool.js +109 -0
  66. package/dist/core/nodes/CallSiteNode.d.ts +26 -0
  67. package/dist/core/nodes/CallSiteNode.d.ts.map +1 -0
  68. package/dist/core/nodes/CallSiteNode.js +44 -0
  69. package/dist/core/nodes/ClassNode.d.ts +25 -0
  70. package/dist/core/nodes/ClassNode.d.ts.map +1 -0
  71. package/dist/core/nodes/ClassNode.js +40 -0
  72. package/dist/core/nodes/ConstantNode.d.ts +24 -0
  73. package/dist/core/nodes/ConstantNode.d.ts.map +1 -0
  74. package/dist/core/nodes/ConstantNode.js +39 -0
  75. package/dist/core/nodes/DatabaseQueryNode.d.ts +22 -0
  76. package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -0
  77. package/dist/core/nodes/DatabaseQueryNode.js +37 -0
  78. package/dist/core/nodes/EntrypointNode.d.ts +102 -0
  79. package/dist/core/nodes/EntrypointNode.d.ts.map +1 -0
  80. package/dist/core/nodes/EntrypointNode.js +119 -0
  81. package/dist/core/nodes/EventListenerNode.d.ts +25 -0
  82. package/dist/core/nodes/EventListenerNode.d.ts.map +1 -0
  83. package/dist/core/nodes/EventListenerNode.js +39 -0
  84. package/dist/core/nodes/ExportNode.d.ts +26 -0
  85. package/dist/core/nodes/ExportNode.d.ts.map +1 -0
  86. package/dist/core/nodes/ExportNode.js +40 -0
  87. package/dist/core/nodes/ExternalStdioNode.d.ts +17 -0
  88. package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -0
  89. package/dist/core/nodes/ExternalStdioNode.js +26 -0
  90. package/dist/core/nodes/FunctionNode.d.ts +27 -0
  91. package/dist/core/nodes/FunctionNode.d.ts.map +1 -0
  92. package/dist/core/nodes/FunctionNode.js +53 -0
  93. package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
  94. package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
  95. package/dist/core/nodes/GuaranteeNode.js +117 -0
  96. package/dist/core/nodes/HttpRequestNode.d.ts +24 -0
  97. package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -0
  98. package/dist/core/nodes/HttpRequestNode.js +38 -0
  99. package/dist/core/nodes/ImportNode.d.ts +27 -0
  100. package/dist/core/nodes/ImportNode.d.ts.map +1 -0
  101. package/dist/core/nodes/ImportNode.js +43 -0
  102. package/dist/core/nodes/LiteralNode.d.ts +26 -0
  103. package/dist/core/nodes/LiteralNode.d.ts.map +1 -0
  104. package/dist/core/nodes/LiteralNode.js +40 -0
  105. package/dist/core/nodes/MethodCallNode.d.ts +29 -0
  106. package/dist/core/nodes/MethodCallNode.d.ts.map +1 -0
  107. package/dist/core/nodes/MethodCallNode.js +47 -0
  108. package/dist/core/nodes/MethodNode.d.ts +29 -0
  109. package/dist/core/nodes/MethodNode.d.ts.map +1 -0
  110. package/dist/core/nodes/MethodNode.js +44 -0
  111. package/dist/core/nodes/ModuleNode.d.ts +29 -0
  112. package/dist/core/nodes/ModuleNode.d.ts.map +1 -0
  113. package/dist/core/nodes/ModuleNode.js +49 -0
  114. package/dist/core/nodes/NodeKind.d.ts +91 -0
  115. package/dist/core/nodes/NodeKind.d.ts.map +1 -0
  116. package/dist/core/nodes/NodeKind.js +146 -0
  117. package/dist/core/nodes/ParameterNode.d.ts +26 -0
  118. package/dist/core/nodes/ParameterNode.d.ts.map +1 -0
  119. package/dist/core/nodes/ParameterNode.js +43 -0
  120. package/dist/core/nodes/ScopeNode.d.ts +32 -0
  121. package/dist/core/nodes/ScopeNode.d.ts.map +1 -0
  122. package/dist/core/nodes/ScopeNode.js +47 -0
  123. package/dist/core/nodes/ServiceNode.d.ts +44 -0
  124. package/dist/core/nodes/ServiceNode.d.ts.map +1 -0
  125. package/dist/core/nodes/ServiceNode.js +49 -0
  126. package/dist/core/nodes/VariableDeclarationNode.d.ts +22 -0
  127. package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -0
  128. package/dist/core/nodes/VariableDeclarationNode.js +38 -0
  129. package/dist/core/nodes/index.d.ts +25 -0
  130. package/dist/core/nodes/index.d.ts.map +1 -0
  131. package/dist/core/nodes/index.js +30 -0
  132. package/dist/index.d.ts +57 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +63 -0
  135. package/dist/plugins/Plugin.d.ts +44 -0
  136. package/dist/plugins/Plugin.d.ts.map +1 -0
  137. package/dist/plugins/Plugin.js +46 -0
  138. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts +23 -0
  139. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -0
  140. package/dist/plugins/analysis/DatabaseAnalyzer.js +260 -0
  141. package/dist/plugins/analysis/ExpressAnalyzer.d.ts +19 -0
  142. package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -0
  143. package/dist/plugins/analysis/ExpressAnalyzer.js +306 -0
  144. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts +17 -0
  145. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -0
  146. package/dist/plugins/analysis/ExpressRouteAnalyzer.js +308 -0
  147. package/dist/plugins/analysis/FetchAnalyzer.d.ts +38 -0
  148. package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -0
  149. package/dist/plugins/analysis/FetchAnalyzer.js +344 -0
  150. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +65 -0
  151. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -0
  152. package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +472 -0
  153. package/dist/plugins/analysis/JSASTAnalyzer.d.ts +84 -0
  154. package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -0
  155. package/dist/plugins/analysis/JSASTAnalyzer.js +1378 -0
  156. package/dist/plugins/analysis/ReactAnalyzer.d.ts +90 -0
  157. package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -0
  158. package/dist/plugins/analysis/ReactAnalyzer.js +1153 -0
  159. package/dist/plugins/analysis/RustAnalyzer.d.ts +13 -0
  160. package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -0
  161. package/dist/plugins/analysis/RustAnalyzer.js +259 -0
  162. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts +21 -0
  163. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -0
  164. package/dist/plugins/analysis/SQLiteAnalyzer.js +317 -0
  165. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts +35 -0
  166. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -0
  167. package/dist/plugins/analysis/ServiceLayerAnalyzer.js +303 -0
  168. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +33 -0
  169. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -0
  170. package/dist/plugins/analysis/SocketIOAnalyzer.js +283 -0
  171. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts +27 -0
  172. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -0
  173. package/dist/plugins/analysis/SystemDbAnalyzer.js +211 -0
  174. package/dist/plugins/analysis/ast/ConditionParser.d.ts +85 -0
  175. package/dist/plugins/analysis/ast/ConditionParser.d.ts.map +1 -0
  176. package/dist/plugins/analysis/ast/ConditionParser.js +277 -0
  177. package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts +15 -0
  178. package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts.map +1 -0
  179. package/dist/plugins/analysis/ast/ExpressionEvaluator.js +91 -0
  180. package/dist/plugins/analysis/ast/GraphBuilder.d.ts +77 -0
  181. package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -0
  182. package/dist/plugins/analysis/ast/GraphBuilder.js +1077 -0
  183. package/dist/plugins/analysis/ast/OxcAdapter.d.ts +41 -0
  184. package/dist/plugins/analysis/ast/OxcAdapter.d.ts.map +1 -0
  185. package/dist/plugins/analysis/ast/OxcAdapter.js +40 -0
  186. package/dist/plugins/analysis/ast/types.d.ts +346 -0
  187. package/dist/plugins/analysis/ast/types.d.ts.map +1 -0
  188. package/dist/plugins/analysis/ast/types.js +4 -0
  189. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +93 -0
  190. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -0
  191. package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +24 -0
  192. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +77 -0
  193. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -0
  194. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +377 -0
  195. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +27 -0
  196. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -0
  197. package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +232 -0
  198. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +25 -0
  199. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -0
  200. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +172 -0
  201. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +29 -0
  202. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -0
  203. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +180 -0
  204. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +14 -0
  205. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -0
  206. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +200 -0
  207. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +45 -0
  208. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -0
  209. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +150 -0
  210. package/dist/plugins/analysis/ast/visitors/index.d.ts +17 -0
  211. package/dist/plugins/analysis/ast/visitors/index.d.ts.map +1 -0
  212. package/dist/plugins/analysis/ast/visitors/index.js +13 -0
  213. package/dist/plugins/discovery/DiscoveryPlugin.d.ts +34 -0
  214. package/dist/plugins/discovery/DiscoveryPlugin.d.ts.map +1 -0
  215. package/dist/plugins/discovery/DiscoveryPlugin.js +26 -0
  216. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts +26 -0
  217. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -0
  218. package/dist/plugins/discovery/MonorepoServiceDiscovery.js +79 -0
  219. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts +14 -0
  220. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -0
  221. package/dist/plugins/discovery/SimpleProjectDiscovery.js +65 -0
  222. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +19 -0
  223. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +1 -0
  224. package/dist/plugins/discovery/ZonServiceDiscovery.js +204 -0
  225. package/dist/plugins/enrichment/AliasTracker.d.ts +40 -0
  226. package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -0
  227. package/dist/plugins/enrichment/AliasTracker.js +290 -0
  228. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +30 -0
  229. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -0
  230. package/dist/plugins/enrichment/HTTPConnectionEnricher.js +135 -0
  231. package/dist/plugins/enrichment/ImportExportLinker.d.ts +30 -0
  232. package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -0
  233. package/dist/plugins/enrichment/ImportExportLinker.js +176 -0
  234. package/dist/plugins/enrichment/InstanceOfResolver.d.ts +21 -0
  235. package/dist/plugins/enrichment/InstanceOfResolver.d.ts.map +1 -0
  236. package/dist/plugins/enrichment/InstanceOfResolver.js +117 -0
  237. package/dist/plugins/enrichment/MethodCallResolver.d.ts +41 -0
  238. package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -0
  239. package/dist/plugins/enrichment/MethodCallResolver.js +252 -0
  240. package/dist/plugins/enrichment/MountPointResolver.d.ts +26 -0
  241. package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -0
  242. package/dist/plugins/enrichment/MountPointResolver.js +189 -0
  243. package/dist/plugins/enrichment/PrefixEvaluator.d.ts +89 -0
  244. package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -0
  245. package/dist/plugins/enrichment/PrefixEvaluator.js +415 -0
  246. package/dist/plugins/enrichment/RustFFIEnricher.d.ts +25 -0
  247. package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -0
  248. package/dist/plugins/enrichment/RustFFIEnricher.js +170 -0
  249. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +114 -0
  250. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -0
  251. package/dist/plugins/enrichment/ValueDomainAnalyzer.js +464 -0
  252. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts +27 -0
  253. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -0
  254. package/dist/plugins/indexing/IncrementalModuleIndexer.js +238 -0
  255. package/dist/plugins/indexing/JSModuleIndexer.d.ts +33 -0
  256. package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -0
  257. package/dist/plugins/indexing/JSModuleIndexer.js +299 -0
  258. package/dist/plugins/indexing/RustModuleIndexer.d.ts +28 -0
  259. package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -0
  260. package/dist/plugins/indexing/RustModuleIndexer.js +140 -0
  261. package/dist/plugins/indexing/ServiceDetector.d.ts +46 -0
  262. package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -0
  263. package/dist/plugins/indexing/ServiceDetector.js +164 -0
  264. package/dist/plugins/validation/CallResolverValidator.d.ts +23 -0
  265. package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -0
  266. package/dist/plugins/validation/CallResolverValidator.js +108 -0
  267. package/dist/plugins/validation/DataFlowValidator.d.ts +24 -0
  268. package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -0
  269. package/dist/plugins/validation/DataFlowValidator.js +148 -0
  270. package/dist/plugins/validation/EvalBanValidator.d.ts +25 -0
  271. package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -0
  272. package/dist/plugins/validation/EvalBanValidator.js +123 -0
  273. package/dist/plugins/validation/GraphConnectivityValidator.d.ts +11 -0
  274. package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -0
  275. package/dist/plugins/validation/GraphConnectivityValidator.js +135 -0
  276. package/dist/plugins/validation/SQLInjectionValidator.d.ts +43 -0
  277. package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -0
  278. package/dist/plugins/validation/SQLInjectionValidator.js +251 -0
  279. package/dist/plugins/validation/ShadowingDetector.d.ts +26 -0
  280. package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -0
  281. package/dist/plugins/validation/ShadowingDetector.js +119 -0
  282. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts +21 -0
  283. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -0
  284. package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +151 -0
  285. package/dist/plugins/vcs/GitPlugin.d.ts +84 -0
  286. package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -0
  287. package/dist/plugins/vcs/GitPlugin.js +295 -0
  288. package/dist/plugins/vcs/VCSPlugin.d.ts +133 -0
  289. package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -0
  290. package/dist/plugins/vcs/VCSPlugin.js +82 -0
  291. package/dist/plugins/vcs/index.d.ts +10 -0
  292. package/dist/plugins/vcs/index.d.ts.map +1 -0
  293. package/dist/plugins/vcs/index.js +18 -0
  294. package/dist/storage/backends/RFDBServerBackend.d.ts +258 -0
  295. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
  296. package/dist/storage/backends/RFDBServerBackend.js +565 -0
  297. package/dist/storage/backends/typeValidation.d.ts +47 -0
  298. package/dist/storage/backends/typeValidation.d.ts.map +1 -0
  299. package/dist/storage/backends/typeValidation.js +137 -0
  300. package/dist/validation/PathValidator.d.ts +81 -0
  301. package/dist/validation/PathValidator.d.ts.map +1 -0
  302. package/dist/validation/PathValidator.js +251 -0
  303. package/package.json +57 -0
  304. package/src/.rfguard/current-session.txt +1 -0
  305. package/src/Orchestrator.ts +673 -0
  306. package/src/api/GraphAPI.ts +305 -0
  307. package/src/api/GuaranteeAPI.ts +401 -0
  308. package/src/core/ASTWorker.ts +567 -0
  309. package/src/core/ASTWorkerPool.ts +299 -0
  310. package/src/core/AnalysisQueue.ts +447 -0
  311. package/src/core/AnalysisWorker.ts +410 -0
  312. package/src/core/GraphBackend.ts +265 -0
  313. package/src/core/GuaranteeManager.ts +581 -0
  314. package/src/core/ManifestStore.ts +196 -0
  315. package/src/core/NodeFactory.ts +274 -0
  316. package/src/core/NodeId.ts +257 -0
  317. package/src/core/ParallelAnalyzer.ts +476 -0
  318. package/src/core/PriorityQueue.ts +227 -0
  319. package/src/core/Profiler.ts +188 -0
  320. package/src/core/QueueWorker.ts +780 -0
  321. package/src/core/Task.ts +107 -0
  322. package/src/core/TaskTypes.ts +40 -0
  323. package/src/core/VersionManager.ts +404 -0
  324. package/src/core/WorkerPool.ts +180 -0
  325. package/src/core/nodes/CallSiteNode.ts +72 -0
  326. package/src/core/nodes/ClassNode.ts +69 -0
  327. package/src/core/nodes/ConstantNode.ts +63 -0
  328. package/src/core/nodes/DatabaseQueryNode.ts +60 -0
  329. package/src/core/nodes/EntrypointNode.ts +164 -0
  330. package/src/core/nodes/EventListenerNode.ts +64 -0
  331. package/src/core/nodes/ExportNode.ts +71 -0
  332. package/src/core/nodes/ExternalStdioNode.ts +36 -0
  333. package/src/core/nodes/FunctionNode.ts +78 -0
  334. package/src/core/nodes/GuaranteeNode.ts +162 -0
  335. package/src/core/nodes/HttpRequestNode.ts +63 -0
  336. package/src/core/nodes/ImportNode.ts +75 -0
  337. package/src/core/nodes/LiteralNode.ts +67 -0
  338. package/src/core/nodes/MethodCallNode.ts +79 -0
  339. package/src/core/nodes/MethodNode.ts +78 -0
  340. package/src/core/nodes/ModuleNode.ts +74 -0
  341. package/src/core/nodes/NodeKind.ts +171 -0
  342. package/src/core/nodes/ParameterNode.ts +73 -0
  343. package/src/core/nodes/ScopeNode.ts +80 -0
  344. package/src/core/nodes/ServiceNode.ts +86 -0
  345. package/src/core/nodes/VariableDeclarationNode.ts +60 -0
  346. package/src/core/nodes/index.ts +49 -0
  347. package/src/index.ts +93 -0
  348. package/src/plugins/Plugin.ts +74 -0
  349. package/src/plugins/analysis/DatabaseAnalyzer.ts +322 -0
  350. package/src/plugins/analysis/ExpressAnalyzer.ts +401 -0
  351. package/src/plugins/analysis/ExpressRouteAnalyzer.ts +414 -0
  352. package/src/plugins/analysis/FetchAnalyzer.ts +441 -0
  353. package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +686 -0
  354. package/src/plugins/analysis/JSASTAnalyzer.ts +1680 -0
  355. package/src/plugins/analysis/ReactAnalyzer.ts +1368 -0
  356. package/src/plugins/analysis/RustAnalyzer.ts +438 -0
  357. package/src/plugins/analysis/SQLiteAnalyzer.ts +388 -0
  358. package/src/plugins/analysis/ServiceLayerAnalyzer.ts +429 -0
  359. package/src/plugins/analysis/SocketIOAnalyzer.ts +395 -0
  360. package/src/plugins/analysis/SystemDbAnalyzer.ts +284 -0
  361. package/src/plugins/analysis/ast/ConditionParser.ts +333 -0
  362. package/src/plugins/analysis/ast/ExpressionEvaluator.ts +117 -0
  363. package/src/plugins/analysis/ast/GraphBuilder.ts +1371 -0
  364. package/src/plugins/analysis/ast/OxcAdapter.ts +63 -0
  365. package/src/plugins/analysis/ast/types.ts +400 -0
  366. package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +137 -0
  367. package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +528 -0
  368. package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +339 -0
  369. package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +273 -0
  370. package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +259 -0
  371. package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +235 -0
  372. package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +268 -0
  373. package/src/plugins/analysis/ast/visitors/index.ts +36 -0
  374. package/src/plugins/discovery/DiscoveryPlugin.ts +50 -0
  375. package/src/plugins/discovery/MonorepoServiceDiscovery.ts +117 -0
  376. package/src/plugins/discovery/SimpleProjectDiscovery.ts +102 -0
  377. package/src/plugins/enrichment/AliasTracker.ts +399 -0
  378. package/src/plugins/enrichment/HTTPConnectionEnricher.ts +192 -0
  379. package/src/plugins/enrichment/ImportExportLinker.ts +221 -0
  380. package/src/plugins/enrichment/InstanceOfResolver.ts +165 -0
  381. package/src/plugins/enrichment/MethodCallResolver.ts +333 -0
  382. package/src/plugins/enrichment/MountPointResolver.ts +264 -0
  383. package/src/plugins/enrichment/PrefixEvaluator.ts +527 -0
  384. package/src/plugins/enrichment/RustFFIEnricher.ts +218 -0
  385. package/src/plugins/enrichment/ValueDomainAnalyzer.ts +682 -0
  386. package/src/plugins/indexing/IncrementalModuleIndexer.ts +287 -0
  387. package/src/plugins/indexing/JSModuleIndexer.ts +374 -0
  388. package/src/plugins/indexing/RustModuleIndexer.ts +160 -0
  389. package/src/plugins/indexing/ServiceDetector.ts +230 -0
  390. package/src/plugins/validation/CallResolverValidator.ts +170 -0
  391. package/src/plugins/validation/DataFlowValidator.ts +233 -0
  392. package/src/plugins/validation/EvalBanValidator.ts +175 -0
  393. package/src/plugins/validation/GraphConnectivityValidator.ts +201 -0
  394. package/src/plugins/validation/SQLInjectionValidator.ts +363 -0
  395. package/src/plugins/validation/ShadowingDetector.ts +173 -0
  396. package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +203 -0
  397. package/src/plugins/vcs/GitPlugin.ts +344 -0
  398. package/src/plugins/vcs/VCSPlugin.ts +190 -0
  399. package/src/plugins/vcs/index.ts +32 -0
  400. package/src/storage/backends/RFDBServerBackend.ts +687 -0
  401. package/src/storage/backends/typeValidation.ts +151 -0
  402. package/src/validation/PathValidator.ts +342 -0
@@ -0,0 +1,303 @@
1
+ /**
2
+ * ServiceLayerAnalyzer - детектит Service Layer Pattern
3
+ *
4
+ * Паттерны:
5
+ * - class XxxService { ... } - Service classes
6
+ * - new XxxService() - Service instantiation
7
+ * - app.set('service', instance) - DI registration
8
+ * - req.app.get('service') - Service usage
9
+ * - export class XxxService - Service exports
10
+ */
11
+ import { readFileSync } from 'fs';
12
+ import { parse } from '@babel/parser';
13
+ import traverseModule from '@babel/traverse';
14
+ import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ const traverse = traverseModule.default || traverseModule;
17
+ export class ServiceLayerAnalyzer extends Plugin {
18
+ get metadata() {
19
+ return {
20
+ name: 'ServiceLayerAnalyzer',
21
+ phase: 'ANALYSIS',
22
+ priority: 75, // После JSASTAnalyzer (80)
23
+ creates: {
24
+ nodes: ['SERVICE_CLASS', 'SERVICE_INSTANCE', 'SERVICE_REGISTRATION', 'SERVICE_USAGE'],
25
+ edges: ['CONTAINS', 'INSTANTIATES', 'REGISTERS', 'USES_SERVICE']
26
+ },
27
+ dependencies: ['JSModuleIndexer', 'JSASTAnalyzer']
28
+ };
29
+ }
30
+ async execute(context) {
31
+ try {
32
+ const { graph } = context;
33
+ // Получаем все модули
34
+ const modules = await this.getModules(graph);
35
+ console.log(`[ServiceLayerAnalyzer] Processing ${modules.length} modules...`);
36
+ let classesCount = 0;
37
+ let instancesCount = 0;
38
+ let registrationsCount = 0;
39
+ let usagesCount = 0;
40
+ const startTime = Date.now();
41
+ for (let i = 0; i < modules.length; i++) {
42
+ const module = modules[i];
43
+ const result = await this.analyzeModule(module, graph);
44
+ classesCount += result.classes;
45
+ instancesCount += result.instances;
46
+ registrationsCount += result.registrations;
47
+ usagesCount += result.usages;
48
+ // Progress every 20 modules
49
+ if ((i + 1) % 20 === 0 || i === modules.length - 1) {
50
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
51
+ const avgTime = ((Date.now() - startTime) / (i + 1)).toFixed(0);
52
+ console.log(`[ServiceLayerAnalyzer] Progress: ${i + 1}/${modules.length} (${elapsed}s, avg ${avgTime}ms/module)`);
53
+ }
54
+ }
55
+ console.log(`[ServiceLayerAnalyzer] Found ${classesCount} service classes, ${instancesCount} instances, ${registrationsCount} registrations, ${usagesCount} usages`);
56
+ return createSuccessResult({
57
+ nodes: classesCount + instancesCount + registrationsCount + usagesCount,
58
+ edges: 0
59
+ }, {
60
+ classesCount,
61
+ instancesCount,
62
+ registrationsCount,
63
+ usagesCount
64
+ });
65
+ }
66
+ catch (error) {
67
+ console.error('[ServiceLayerAnalyzer] Error:', error);
68
+ return createErrorResult(error);
69
+ }
70
+ }
71
+ async analyzeModule(module, graph) {
72
+ try {
73
+ const code = readFileSync(module.file, 'utf-8');
74
+ const ast = parse(code, {
75
+ sourceType: 'module',
76
+ plugins: [
77
+ 'jsx',
78
+ 'typescript',
79
+ 'classProperties',
80
+ 'decorators-legacy',
81
+ 'asyncGenerators',
82
+ 'dynamicImport',
83
+ 'optionalChaining',
84
+ 'nullishCoalescingOperator'
85
+ ]
86
+ });
87
+ const serviceClasses = [];
88
+ const serviceInstances = [];
89
+ const serviceRegistrations = [];
90
+ const serviceUsages = [];
91
+ // Детект Service паттернов
92
+ traverse(ast, {
93
+ // Pattern 1: class XxxService { ... }
94
+ ClassDeclaration: (path) => {
95
+ const node = path.node;
96
+ const className = node.id?.name;
97
+ if (className && this.isServiceClass(className)) {
98
+ const line = node.loc.start.line;
99
+ // Извлекаем методы сервиса
100
+ const methods = node.body.body
101
+ .filter(m => m.type === 'ClassMethod' && m.kind === 'method')
102
+ .map(m => m.key.name);
103
+ serviceClasses.push({
104
+ id: `${module.file}:SERVICE_CLASS:${className}:${line}`,
105
+ type: 'SERVICE_CLASS',
106
+ name: className,
107
+ methods: methods,
108
+ file: module.file,
109
+ line: line
110
+ });
111
+ }
112
+ },
113
+ // Pattern 2: new XxxService()
114
+ NewExpression: (path) => {
115
+ const node = path.node;
116
+ const callee = node.callee;
117
+ if (callee.type === 'Identifier') {
118
+ const className = callee.name;
119
+ if (this.isServiceClass(className)) {
120
+ const line = node.loc.start.line;
121
+ serviceInstances.push({
122
+ id: `${module.file}:SERVICE_INSTANCE:${className}:${line}`,
123
+ type: 'SERVICE_INSTANCE',
124
+ serviceClass: className,
125
+ file: module.file,
126
+ line: line
127
+ });
128
+ }
129
+ }
130
+ },
131
+ // Pattern 3: app.set('serviceName', serviceInstance)
132
+ CallExpression: (path) => {
133
+ const node = path.node;
134
+ const callee = node.callee;
135
+ // app.set('service', instance)
136
+ if (callee.type === 'MemberExpression' &&
137
+ callee.property.type === 'Identifier' &&
138
+ callee.property.name === 'set') {
139
+ const objectName = this.getObjectName(callee.object);
140
+ if (objectName === 'app' && node.arguments.length >= 2) {
141
+ const serviceName = this.extractStringArg(node.arguments[0]);
142
+ const line = node.loc.start.line;
143
+ // Проверяем что это похоже на service (имя содержит 'service' или '*Service')
144
+ if (serviceName.toLowerCase().includes('service') ||
145
+ this.isServiceClass(serviceName)) {
146
+ serviceRegistrations.push({
147
+ id: `${module.file}:SERVICE_REGISTRATION:${serviceName}:${line}`,
148
+ type: 'SERVICE_REGISTRATION',
149
+ serviceName: serviceName,
150
+ objectName: objectName,
151
+ file: module.file,
152
+ line: line
153
+ });
154
+ }
155
+ }
156
+ }
157
+ // req.app.get('service') - service usage
158
+ if (callee.type === 'MemberExpression' &&
159
+ callee.property.type === 'Identifier' &&
160
+ callee.property.name === 'get') {
161
+ // Проверяем что это req.app.get или app.get
162
+ const objectChain = this.getObjectChain(callee.object);
163
+ if ((objectChain.includes('req') && objectChain.includes('app')) ||
164
+ objectChain.includes('app')) {
165
+ if (node.arguments.length >= 1) {
166
+ const serviceName = this.extractStringArg(node.arguments[0]);
167
+ const line = node.loc.start.line;
168
+ // Проверяем что это похоже на service
169
+ if (serviceName.toLowerCase().includes('service') ||
170
+ this.isServiceClass(serviceName)) {
171
+ serviceUsages.push({
172
+ id: `${module.file}:SERVICE_USAGE:${serviceName}:${line}`,
173
+ type: 'SERVICE_USAGE',
174
+ serviceName: serviceName,
175
+ file: module.file,
176
+ line: line
177
+ });
178
+ }
179
+ }
180
+ }
181
+ }
182
+ }
183
+ });
184
+ // Создаём ноды в графе
185
+ for (const serviceClass of serviceClasses) {
186
+ await graph.addNode(serviceClass);
187
+ // Создаём ребро от модуля к service class
188
+ await graph.addEdge({
189
+ type: 'CONTAINS',
190
+ src: module.id,
191
+ dst: serviceClass.id
192
+ });
193
+ }
194
+ for (const instance of serviceInstances) {
195
+ await graph.addNode(instance);
196
+ // Создаём ребро от модуля к instance
197
+ await graph.addEdge({
198
+ type: 'CONTAINS',
199
+ src: module.id,
200
+ dst: instance.id
201
+ });
202
+ // Ищем SERVICE_CLASS ноду и создаём ребро INSTANTIATES
203
+ for await (const n of graph.queryNodes({ type: 'SERVICE_CLASS' })) {
204
+ if (n.name === instance.serviceClass) {
205
+ await graph.addEdge({
206
+ type: 'INSTANTIATES',
207
+ src: instance.id,
208
+ dst: n.id
209
+ });
210
+ break;
211
+ }
212
+ }
213
+ }
214
+ for (const registration of serviceRegistrations) {
215
+ await graph.addNode(registration);
216
+ // Создаём ребро от модуля к registration
217
+ await graph.addEdge({
218
+ type: 'CONTAINS',
219
+ src: module.id,
220
+ dst: registration.id
221
+ });
222
+ }
223
+ for (const usage of serviceUsages) {
224
+ await graph.addNode(usage);
225
+ // Создаём ребро от модуля к usage
226
+ await graph.addEdge({
227
+ type: 'CONTAINS',
228
+ src: module.id,
229
+ dst: usage.id
230
+ });
231
+ }
232
+ return {
233
+ classes: serviceClasses.length,
234
+ instances: serviceInstances.length,
235
+ registrations: serviceRegistrations.length,
236
+ usages: serviceUsages.length
237
+ };
238
+ }
239
+ catch (error) {
240
+ console.error(`[ServiceLayerAnalyzer] Error analyzing ${module.file}:`, error.message);
241
+ return { classes: 0, instances: 0, registrations: 0, usages: 0 };
242
+ }
243
+ }
244
+ /**
245
+ * Проверяет является ли класс Service классом
246
+ * (заканчивается на Service или содержит Service в имени)
247
+ */
248
+ isServiceClass(className) {
249
+ if (!className)
250
+ return false;
251
+ return (className.endsWith('Service') ||
252
+ className.includes('Service') ||
253
+ /Service[A-Z]/.test(className));
254
+ }
255
+ /**
256
+ * Извлекает имя объекта из MemberExpression
257
+ */
258
+ getObjectName(node) {
259
+ if (node.type === 'Identifier') {
260
+ return node.name;
261
+ }
262
+ else if (node.type === 'MemberExpression') {
263
+ return this.getObjectName(node.object);
264
+ }
265
+ else if (node.type === 'CallExpression') {
266
+ return this.getObjectName(node.callee);
267
+ }
268
+ return 'unknown';
269
+ }
270
+ /**
271
+ * Извлекает цепочку объектов (для req.app.get)
272
+ */
273
+ getObjectChain(node, chain = []) {
274
+ if (node.type === 'Identifier') {
275
+ chain.unshift(node.name);
276
+ }
277
+ else if (node.type === 'MemberExpression') {
278
+ const memberExpr = node;
279
+ if (memberExpr.property.type === 'Identifier') {
280
+ chain.push(memberExpr.property.name);
281
+ }
282
+ this.getObjectChain(memberExpr.object, chain);
283
+ }
284
+ return chain;
285
+ }
286
+ /**
287
+ * Извлекает строковое значение из аргумента
288
+ */
289
+ extractStringArg(arg) {
290
+ if (!arg)
291
+ return 'unknown';
292
+ if (arg.type === 'StringLiteral') {
293
+ return arg.value;
294
+ }
295
+ else if (arg.type === 'TemplateLiteral') {
296
+ const tl = arg;
297
+ if (tl.quasis.length === 1) {
298
+ return tl.quasis[0].value.raw;
299
+ }
300
+ }
301
+ return 'dynamic';
302
+ }
303
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * SocketIOAnalyzer - детектит Socket.IO operations
3
+ *
4
+ * Паттерны Server:
5
+ * - io.emit(event, data)
6
+ * - io.to(room).emit(event, data)
7
+ * - io.of(namespace).emit(event, data)
8
+ * - socket.on(event, handler)
9
+ * - socket.join(room)
10
+ * - socket.broadcast.emit(event, data)
11
+ *
12
+ * Паттерны Client:
13
+ * - socket.emit(event, data)
14
+ * - socket.on(event, handler)
15
+ * - socket.off(event, handler)
16
+ */
17
+ import { Plugin } from '../Plugin.js';
18
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
19
+ export declare class SocketIOAnalyzer extends Plugin {
20
+ get metadata(): PluginMetadata;
21
+ execute(context: PluginContext): Promise<PluginResult>;
22
+ private analyzeModule;
23
+ /**
24
+ * Извлекает имя объекта из MemberExpression
25
+ * Например: socket.emit → 'socket', io.to('room').emit → 'io'
26
+ */
27
+ private getObjectName;
28
+ /**
29
+ * Извлекает строковое значение из аргумента
30
+ */
31
+ private extractStringArg;
32
+ }
33
+ //# sourceMappingURL=SocketIOAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SocketIOAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/plugins/analysis/SocketIOAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,EAAE,MAAM,EAA0C,MAAM,cAAc,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAyDhF,qBAAa,gBAAiB,SAAQ,MAAM;IAC1C,IAAI,QAAQ,IAAI,cAAc,CAW7B;IAEK,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;YA+C9C,aAAa;IA+M3B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAWrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CA4BzB"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * SocketIOAnalyzer - детектит Socket.IO operations
3
+ *
4
+ * Паттерны Server:
5
+ * - io.emit(event, data)
6
+ * - io.to(room).emit(event, data)
7
+ * - io.of(namespace).emit(event, data)
8
+ * - socket.on(event, handler)
9
+ * - socket.join(room)
10
+ * - socket.broadcast.emit(event, data)
11
+ *
12
+ * Паттерны Client:
13
+ * - socket.emit(event, data)
14
+ * - socket.on(event, handler)
15
+ * - socket.off(event, handler)
16
+ */
17
+ import { readFileSync } from 'fs';
18
+ import { parse } from '@babel/parser';
19
+ import traverseModule from '@babel/traverse';
20
+ import { Plugin, createSuccessResult, createErrorResult } from '../Plugin.js';
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ const traverse = traverseModule.default || traverseModule;
23
+ export class SocketIOAnalyzer extends Plugin {
24
+ get metadata() {
25
+ return {
26
+ name: 'SocketIOAnalyzer',
27
+ phase: 'ANALYSIS',
28
+ priority: 75, // После JSASTAnalyzer (80)
29
+ creates: {
30
+ nodes: ['socketio:emit', 'socketio:on', 'socketio:room'],
31
+ edges: ['CONTAINS', 'EMITS_EVENT', 'LISTENS_TO', 'JOINS_ROOM']
32
+ },
33
+ dependencies: ['JSModuleIndexer', 'JSASTAnalyzer']
34
+ };
35
+ }
36
+ async execute(context) {
37
+ try {
38
+ const { graph } = context;
39
+ // Получаем все модули
40
+ const modules = await this.getModules(graph);
41
+ console.log(`[SocketIOAnalyzer] Processing ${modules.length} modules...`);
42
+ let emitsCount = 0;
43
+ let listenersCount = 0;
44
+ let roomsCount = 0;
45
+ const startTime = Date.now();
46
+ for (let i = 0; i < modules.length; i++) {
47
+ const module = modules[i];
48
+ const result = await this.analyzeModule(module, graph);
49
+ emitsCount += result.emits;
50
+ listenersCount += result.listeners;
51
+ roomsCount += result.rooms;
52
+ // Progress every 20 modules
53
+ if ((i + 1) % 20 === 0 || i === modules.length - 1) {
54
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
55
+ const avgTime = ((Date.now() - startTime) / (i + 1)).toFixed(0);
56
+ console.log(`[SocketIOAnalyzer] Progress: ${i + 1}/${modules.length} (${elapsed}s, avg ${avgTime}ms/module)`);
57
+ }
58
+ }
59
+ console.log(`[SocketIOAnalyzer] Found ${emitsCount} emits, ${listenersCount} listeners, ${roomsCount} rooms`);
60
+ return createSuccessResult({
61
+ nodes: emitsCount + listenersCount + roomsCount,
62
+ edges: 0
63
+ }, { emitsCount, listenersCount, roomsCount });
64
+ }
65
+ catch (error) {
66
+ console.error('[SocketIOAnalyzer] Error:', error);
67
+ return createErrorResult(error);
68
+ }
69
+ }
70
+ async analyzeModule(module, graph) {
71
+ try {
72
+ const code = readFileSync(module.file, 'utf-8');
73
+ const ast = parse(code, {
74
+ sourceType: 'module',
75
+ plugins: [
76
+ 'jsx',
77
+ 'typescript',
78
+ 'classProperties',
79
+ 'decorators-legacy',
80
+ 'asyncGenerators',
81
+ 'dynamicImport',
82
+ 'optionalChaining',
83
+ 'nullishCoalescingOperator'
84
+ ]
85
+ });
86
+ const emits = [];
87
+ const listeners = [];
88
+ const rooms = [];
89
+ // Детект Socket.IO паттернов
90
+ traverse(ast, {
91
+ CallExpression: (path) => {
92
+ const node = path.node;
93
+ const callee = node.callee;
94
+ // Pattern: socket.emit(event, data) или io.emit(event, data)
95
+ if (callee.type === 'MemberExpression' &&
96
+ callee.property.type === 'Identifier' &&
97
+ callee.property.name === 'emit') {
98
+ const objectName = this.getObjectName(callee.object);
99
+ const event = this.extractStringArg(node.arguments[0]);
100
+ const line = node.loc.start.line;
101
+ const column = node.loc.start.column;
102
+ // io.to('room').emit() - room-based emit
103
+ let room = null;
104
+ if (callee.object.type === 'CallExpression' &&
105
+ callee.object.callee.type === 'MemberExpression' &&
106
+ callee.object.callee.property.name === 'to') {
107
+ room = this.extractStringArg(callee.object.arguments[0]);
108
+ }
109
+ // io.of('/namespace').emit() - namespace emit
110
+ let namespace = null;
111
+ if (callee.object.type === 'CallExpression' &&
112
+ callee.object.callee.type === 'MemberExpression' &&
113
+ callee.object.callee.property.name === 'of') {
114
+ namespace = this.extractStringArg(callee.object.arguments[0]);
115
+ }
116
+ // socket.broadcast.emit() - broadcast to all except sender
117
+ let broadcast = false;
118
+ if (callee.object.type === 'MemberExpression' &&
119
+ callee.object.property.name === 'broadcast') {
120
+ broadcast = true;
121
+ }
122
+ emits.push({
123
+ id: `socketio:emit#${event}#${module.file}#${line}`,
124
+ type: 'socketio:emit',
125
+ event: event,
126
+ room: room,
127
+ namespace: namespace,
128
+ broadcast: broadcast,
129
+ objectName: objectName,
130
+ file: module.file,
131
+ line: line,
132
+ column: column
133
+ });
134
+ }
135
+ // Pattern: socket.on(event, handler) или io.on(event, handler)
136
+ if (callee.type === 'MemberExpression' &&
137
+ callee.property.type === 'Identifier' &&
138
+ callee.property.name === 'on') {
139
+ const objectName = this.getObjectName(callee.object);
140
+ const event = this.extractStringArg(node.arguments[0]);
141
+ const line = node.loc.start.line;
142
+ const handler = node.arguments[1];
143
+ // Извлекаем имя handler функции
144
+ let handlerName = 'anonymous';
145
+ let handlerLine = line;
146
+ if (handler) {
147
+ if (handler.type === 'FunctionExpression' ||
148
+ handler.type === 'ArrowFunctionExpression') {
149
+ handlerName = `anonymous:${handler.loc.start.line}`;
150
+ handlerLine = handler.loc.start.line;
151
+ }
152
+ else if (handler.type === 'Identifier') {
153
+ handlerName = handler.name;
154
+ }
155
+ }
156
+ listeners.push({
157
+ id: `socketio:on#${event}#${module.file}#${line}`,
158
+ type: 'socketio:on',
159
+ event: event,
160
+ objectName: objectName,
161
+ handlerName: handlerName,
162
+ handlerLine: handlerLine,
163
+ file: module.file,
164
+ line: line
165
+ });
166
+ }
167
+ // Pattern: socket.join(room)
168
+ if (callee.type === 'MemberExpression' &&
169
+ callee.property.type === 'Identifier' &&
170
+ callee.property.name === 'join') {
171
+ const objectName = this.getObjectName(callee.object);
172
+ const roomName = this.extractStringArg(node.arguments[0]);
173
+ const line = node.loc.start.line;
174
+ if (objectName === 'socket') {
175
+ rooms.push({
176
+ id: `socketio:room#${roomName}#${module.file}#${line}`,
177
+ type: 'socketio:room',
178
+ room: roomName,
179
+ objectName: objectName,
180
+ file: module.file,
181
+ line: line
182
+ });
183
+ }
184
+ }
185
+ }
186
+ });
187
+ // Создаём ноды в графе
188
+ for (const emit of emits) {
189
+ await graph.addNode(emit);
190
+ // Создаём ребро от модуля к event
191
+ await graph.addEdge({
192
+ type: 'CONTAINS',
193
+ src: module.id,
194
+ dst: emit.id
195
+ });
196
+ }
197
+ for (const listener of listeners) {
198
+ await graph.addNode(listener);
199
+ // Создаём ребро от модуля к listener
200
+ await graph.addEdge({
201
+ type: 'CONTAINS',
202
+ src: module.id,
203
+ dst: listener.id
204
+ });
205
+ // Ищем FUNCTION node для handler и создаём ребро LISTENS_TO
206
+ const handlerFunctionId = `FUNCTION#${listener.handlerName}#${listener.file}#${listener.handlerLine}`;
207
+ const handlerFunction = await graph.getNode(handlerFunctionId);
208
+ if (handlerFunction) {
209
+ await graph.addEdge({
210
+ type: 'LISTENS_TO',
211
+ src: listener.id,
212
+ dst: handlerFunctionId
213
+ });
214
+ }
215
+ }
216
+ for (const room of rooms) {
217
+ await graph.addNode(room);
218
+ // Создаём ребро от модуля к room
219
+ await graph.addEdge({
220
+ type: 'CONTAINS',
221
+ src: module.id,
222
+ dst: room.id
223
+ });
224
+ }
225
+ return {
226
+ emits: emits.length,
227
+ listeners: listeners.length,
228
+ rooms: rooms.length
229
+ };
230
+ }
231
+ catch (error) {
232
+ console.error(`[SocketIOAnalyzer] Error analyzing ${module.file}:`, error.message);
233
+ return { emits: 0, listeners: 0, rooms: 0 };
234
+ }
235
+ }
236
+ /**
237
+ * Извлекает имя объекта из MemberExpression
238
+ * Например: socket.emit → 'socket', io.to('room').emit → 'io'
239
+ */
240
+ getObjectName(node) {
241
+ if (node.type === 'Identifier') {
242
+ return node.name;
243
+ }
244
+ else if (node.type === 'MemberExpression') {
245
+ return this.getObjectName(node.object);
246
+ }
247
+ else if (node.type === 'CallExpression') {
248
+ return this.getObjectName(node.callee);
249
+ }
250
+ return 'unknown';
251
+ }
252
+ /**
253
+ * Извлекает строковое значение из аргумента
254
+ */
255
+ extractStringArg(arg) {
256
+ if (!arg)
257
+ return 'unknown';
258
+ if (arg.type === 'StringLiteral') {
259
+ return arg.value;
260
+ }
261
+ else if (arg.type === 'TemplateLiteral') {
262
+ const tl = arg;
263
+ if (tl.quasis.length === 1) {
264
+ // Простой template literal без интерполяции
265
+ return tl.quasis[0].value.raw;
266
+ }
267
+ else {
268
+ // Template literal с переменными - возвращаем паттерн
269
+ const parts = tl.quasis.map(q => q.value.raw);
270
+ const expressions = tl.expressions.map(() => '${...}');
271
+ let result = '';
272
+ for (let i = 0; i < parts.length; i++) {
273
+ result += parts[i];
274
+ if (i < expressions.length) {
275
+ result += expressions[i];
276
+ }
277
+ }
278
+ return result;
279
+ }
280
+ }
281
+ return 'dynamic';
282
+ }
283
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * SystemDbAnalyzer - специализированный плагин для анализа system_db API
3
+ *
4
+ * Понимает семантику system_db и добавляет ноды для сайд-эффектов:
5
+ * - system_db.use(view, server) -> регистрирует VIEW через get_view()
6
+ * - system_db.subscribe(servers) -> проверяет все зарегистрированные VIEW'ы
7
+ * - local.use(view) -> регистрирует VIEW в get_hosts()
8
+ *
9
+ * Добавляет специальные ноды:
10
+ * - SYSTEM_DB_VIEW_REGISTRATION - регистрация VIEW'а
11
+ * - SYSTEM_DB_SUBSCRIPTION - подписка на сервер
12
+ */
13
+ import { Plugin } from '../Plugin.js';
14
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
15
+ export declare class SystemDbAnalyzer extends Plugin {
16
+ get metadata(): PluginMetadata;
17
+ execute(context: PluginContext): Promise<PluginResult>;
18
+ /**
19
+ * Extract literal value from AST node
20
+ */
21
+ private extractLiteral;
22
+ /**
23
+ * Extract server list from subscribe() argument
24
+ */
25
+ private extractServerList;
26
+ }
27
+ //# sourceMappingURL=SystemDbAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SystemDbAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/plugins/analysis/SystemDbAnalyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,EAAE,MAAM,EAA0C,MAAM,cAAc,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA2BhF,qBAAa,gBAAiB,SAAQ,MAAM;IAC1C,IAAI,QAAQ,IAAI,cAAc,CAU7B;IAEK,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAuL5D;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAkB1B"}